基于Docker-compose秒部署Nextcloud云盘

搭建背景

随着技术发展的日新月异,人们对传统、低效、昂贵的技术嗤之以鼻,使得开源、普惠、高效的项目飞速发展,国内用户迅速拥抱开源。Nextcloud作为一款开源的云盘项目广受好评,同时以插件的形式支持onlyoffice多人编辑功能。而微软旗下的FS(Files servers) 不支持多人编辑文档,且不支持对外访问(需要VPN),所以基于以上情况 我决定在公网部署Nextcloud云盘 进行公测,后续迁移至内网机房。

环境准备

硬件清单:

  1. ECS云主机一台(腾讯、阿里都可以),节点选择中国香港(可访问国外资源),配置:v2CPU,4-8G内存,存储40-100G左右。
  2. 域名(配置SSL证书实现网站https安全加密访问) 当然你也可以选择公网IP直接访问。
  3. 阿里云ECS主机涉及到的准备工作:
    在这里插入图片描述

操作系统:
ECS购买后直接安装centos7 或Ali Cloud os,重置密码后 通过ssh 远程连接。
软件安装:
ECS上安装docker和docker-compose
安全组:
这里需要开放80、443、3306、8000等,新手建议全部开放。
在这里插入图片描述

脚本及插件:
nextcloud.yaml 用于docker-compose 容器部署
config.php 用于nextcloud容器中配置文件
nginx.conf 用于nginx代理,配置SSL证书实现网站https安全加密访问。
nextcloud.yaml 内容如下,其中#注释需要自行修改的内容。

version: '3'

services:
  db:
    image: mysql
    volumes:
      - /root/nextcloud/mr:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: nextcloud
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: nextcloud

  nextcloud:
    image: nextcloud
    depends_on:
      - db
    volumes:
      - /root/nextcloud/nc:/var/www/html
    ports:
      - "80:80"
    environment:
      NEXTCLOUD_TRUSTED_DOMAINS: x.x.x.x
#这里的x.x.x.x 写你的ECS公网ip
  onlyoffice:
    image: onlyoffice/documentserver
    depends_on:
      - db
    volumes:
      - /root/nextcloud/of:/var/www/onlyoffice/Data
    ports:
      - "8000:80"
    environment:
      JWT_ENABLED: 'true'
      JWT_SECRET: '123456'

config.php内容如下:

<?php                                                                                                                       
$CONFIG = array (                                                                                                           
  'htaccess.RewriteBase' => '/',                                                                                            
  'memcache.local' => '\\OC\\Memcache\\APCu',                                                                               
  'apps_paths' =>                                                                                                           
  array (                                                                                                                   
    0 =>                                                                                                                    
    array (                                                                                                                 
      'path' => '/var/www/html/apps',                                                                                       
      'url' => '/apps',                                                                                                     
      'writable' => false,                                                                                                  
    ),                                                                                                                      
    1 =>                                                                                                                    
    array (                                                                                                                 
      'path' => '/var/www/html/custom_apps',                                                                                
      'url' => '/custom_apps',                                                                                              
      'writable' => true,                                                                                                   
    ),                                                                                                                      
  ),                                                                                                                        
  'upgrade.disable-web' => true,                                                                                            
  'instanceid' => 'ocr0ifw6p1ir',                                                                                           
  'passwordsalt' => 'WQ85EVPAZJkV1JqjySfd+WZDtdpl59',                                                                       
  'secret' => 'QtDrfHafNLVS685wLMnVrrgoU6tD/6CSOEsuct8cZtWfbwc6',                                                           
  'trusted_domains' =>                                                                                                      
  array (                                                                                                                   
    0 => 'www.xxx.com',#这里xxx更换成自己的域名                                                                                               
  ),                                                                                                                        
  'datadirectory' => '/var/www/html/data',                                                                                  
  'dbtype' => 'mysql',                                                                                                      
  'version' => '29.0.5.1',                                                                                                  
  'overwrite.cli.url' => 'https://www.xxx.com',   #这里xxx更换成自己的域名                                                                     
  'overwritehost' => 'www.xxx.com:443',   #这里xxx更换成自己的域名                                                                             
  'overwriteprotocol' => 'https',                                                                                           
  'dbname' => 'nextcloud',                                                                                                  
  'dbhost' => 'x.x.x.x:3306', #这里xxx更换成ECS的公网ip                                                                                        
  'dbport' => '',                                                                                                           
  'dbtableprefix' => 'oc_',                                                                                                 
  'mysql.utf8mb4' => true,                                                                                                  
  'dbuser' => 'nextcloud',                                                                                                  
  'dbpassword' => 'nextcloud',                                                                                              
  'installed' => true,                                                                                                      
  'files' => [                                                                                                              
        'ax_chunk_size' => 0,                                                                                               
        'upload_max_size' => '-1',                                                                                          
    ],                                                                                                                      
); 

nginx.conf 内容如下:

events {}                                                                                                                   
                                                                                                                            
http {                                                                                                                      
    client_max_body_size 0;                                                                                                 
    client_body_buffer_size 512k;                                                                                           
    proxy_read_timeout 86400s;                                                                                              
    server {                                                                                                                
        listen 443 ssl;                                                                                                     
        server_name xxx.com;  
        #这里xxx.com 写自己买的域名                                                                                    
                                                                                                                            
        ssl_certificate /etc/nginx/certs/xxx_bundle.crt;                                                          
        ssl_certificate_key /etc/nginx/certs/xxx.com.key;     
        #同理,SSL证书解压后 具体路径和文件名称也要修改。                                                        
                                                                                                                            
        location / {                                                                                                        
            proxy_pass http://x.x.x.x:80;  #这里写公网IP                                                                             
            proxy_set_header Host $host;                                                                                    
            proxy_set_header X-Real-IP $remote_addr;                                                                        
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                                                    
            proxy_set_header X-Forwarded-Proto $scheme;                                                                     
        }                                                                                                                   
    }                                                                                                                       
}  

插件:
SSL证书,从域名供应商后台下载,并解压上传到ECS中,后续通过docker的-v参数 挂载到nginx容器内。

onlyoffice插件,根据nextcloud的版本从官网链接下载,需要翻墙。下载链接:https://apps.nextcloud.com/apps/onlyoffice

正式部署

以上准备完毕后,首先去域名管理后台添加A记录(让ECS的公网ip指向域名) 等待DNS解析生效即可。
接下来ssh 登陆到ECS主机,在/root/路径下创建文件夹,用于volume的挂载:

cd /root/
mkdir -p /root/nextcloud/mr /root/nextcloud/of /root/nextcloud/nc

在这里插入图片描述
创建nextcloud.yaml 文件,把我上面的内容copy进去 里面#注释的地方 改成自己ECS的信息,:wq 保存退出。
接下来运行docker-compose 批量创建容器。

docker-compose -f nextcloud.yaml up -d

运行成功后,可以通过docker ps 查看容器状态。

[root@iZj6c60w7gahvfxraf9xbnZ ~]# docker ps                                                                                 
CONTAINER ID   IMAGE                       COMMAND                  CREATED      STATUS             PORTS                                                  NAMES                                                                                        
60f445edfe23   nginx                       "/docker-entrypoint.…"   2 days ago   Up About an hour   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp          nginx-https                                                                                  
b0a97b9704c8   nextcloud                   "/entrypoint.sh apac…"   3 days ago   Up 22 hours        0.0.0.0:80->80/tcp, :::80->80/tcp                      root-nextcloud-1                                                                             
8f077e82e710   onlyoffice/documentserver   "/app/ds/run-documen…"   3 days ago   Up 2 days          443/tcp, 0.0.0.0:8000->80/tcp, :::8000->80/tcp         root-onlyoffice-1                                                                            
fdd2727a1da4   mysql                       "docker-entrypoint.s…"   3 days ago   Up 2 days          0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   root-db-1                  

理论上,你这里是看不到nginx的,因为我的yaml文件里面没有涵盖,稍后单独run 一个nginx容器。 其他三个容器 状态为UP即可。
在里插入图片描述

恭喜你可以通过ECS主机的公网地址直接访问到nextcloud了,在初始化页面绑定mysql数据库信息 即可。(如果不能访问,检查下你的安全组是否放行了80、443、8000、3306等端口?)
最上面创建管理员用户名和密码 自己随便写,admin/admin ,下面数据库选mysql,用户、密码、数据库名均为nextcloud 详情可查看yaml文件,localhost这里 填ECS主机的IP:3306 。不出意外的话,你就能进入nextcloud的用户界面了。

接下来就是onlyoffice插件配置环节:
1、下载对应版本的onlyoffice文件
2、上传至ECS主机并解压
3、通过docker cp 命令将文件复制到nextcloud容器的apps路径下。(以下命令作为参考,自己修改容器ID 不要抄我的)

[root@iZj6c60w7gahvfxraf9xbnZ ~]# docker ps                                                                                 
CONTAINER ID   IMAGE                       COMMAND                  CREATED      STATUS             PORTS                                                  NAMES                                                                                        
60f445edfe23   nginx                       "/docker-entrypoint.…"   2 days ago   Up About an hour   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp          nginx-https                                                                                  
b0a97b9704c8   nextcloud                   "/entrypoint.sh apac…"   3 days ago   Up 22 hours        0.0.0.0:80->80/tcp, :::80->80/tcp                      root-nextcloud-1                                                                             
8f077e82e710   onlyoffice/documentserver   "/app/ds/run-documen…"   3 days ago   Up 2 days          443/tcp, 0.0.0.0:8000->80/tcp, :::8000->80/tcp         root-onlyoffice-1                                                                            
fdd2727a1da4   mysql                       "docker-entrypoint.s…"   3 days ago   Up 2 days          0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   root-db-1                                                                                    
[root@iZj6c60w7gahvfxraf9xbnZ ~]# docker cp onlyoffice.tar b0a97b9704c8:/www/html/nextcloud/apps/  

上传成功后,刷新nextcloud的web页面 ,点击右上角菜单-应用-您的应用-onlyoffice 点击启用。

在这里插入图片描述
在这里插入图片描述
右上角管理设置-onlyoffice 填写服务器地址和密钥。
服务器地址写你自己的ECS公网地址+端口号8000
密钥:123456(如果你没改我的yaml文件)
在这里插入图片描述
点击保存成功后,恭喜你可以在nextcloud的云盘上使用多人在线编辑协作功能了。赶紧找个小伙伴帮他创建账号,一起测试下吧。

接下来要部署nginx服务,并修改配置文件 实现https安全加密访问,同时解除文件上传大小的限制。
在/root/下面创建 2个文件夹

mkdir -p /root/ssl/certs

把下载好的SSL证书解压后上传到certs目录下,同时在/root/ssl下创建一个nginx.conf 文件,把我上面的nginx.conf配置内容copy进去。
运行下面的docker 命令 创建nginx容器

docker run --name nginx -p 443:443 -v /root/ssl/certs:etc/nginx/certs -v /root/ssl/nginx.conf:/etc/nginx/nginx.conf nginx 

为了使nginx的https代理生效,nextcloud容器中的配置文件 config.php 也需要修改,具体参考我上面写的内容。
最后通过https:xxx.com 实现安全加密访问nextcloud云盘,同时大文件上传的限制也解除了。

在这里插入图片描述

Q&A

容器里面没有vim命令怎么办?
使用以下命令安装即可:

apt-get update
apt-get install vim 

下载的SSL证书或插件怎么上传到ECS主机上呢?
通过scp命令 或者安装第三方工具 ,这里推荐MobaXterm。
下载链接:https://mobaxterm.org/mobaxtermhanhua.html

以上就是全部教程了,大家部署过程中有任何问题可以随时联系我,很乐意答疑解惑。在本文中,我倾尽全力分享了自己的技术见解和实践经验。希望读者能够从中获得启发和帮助。同时,郑重声明,本文为我的原创作品,未经授权,严禁任何形式的转载、抄袭、改编或商业使用。如发现侵权行为,我将保留追究法律责任的权利。尊重知识产权,从你我做起。让我们共同营造一个良好的技术交流和分享环境

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值