用Docker轻松搭建Nextcloud

这几天把腾讯云轻量香港搬回了Ucloud北京,其中有个艰巨的工作就是重新搭建Nextcloud。

使用Nextcloud已经很多年了,我有大概20GB的常用工作资料存放在用Nextcloud搭建的私有云盘中。除此之外,家中NAS还会同步这个私有云盘做二次备份。

这次,在搭建之前选择了如:可道云、Cloudreve等多种网盘方案,同时还仔细研究了如OSS、COS等S3协议对象存储,最后还是无法接受没有【同步】逻辑的网盘,又考虑到其实所有数据本地电脑里都有,就老老实实用回“Nextcloud+本地盘”方案吧。

过去,一直是用常规方式搭建Nextcloud,看起来省事,实际上每次去处理【安全与设置警告】挺麻烦的。这次,尝试用Docker方式搭建,没想到特别省事,遂记录。

 

一、准备工作

因为这台Ucloud北京上还要跑几个站,遂先行配置LNMP环境。

虽然早前宝塔面板爆出敏感问题,但既然都用国内机器了,难道还不老实一点。

 

二、安装Docker

curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker

 

 

三、安装Docker版MySQL与Nextcloud

1、安装Docker版MySQL

docker run -d --name mysql \
    -v 自定义数据库位置:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=密码 \
    -e MYSQL_DATABASE=数据库名 \
    -e MYSQL_USER=数据库用户名 \
    -e MYSQL_PASSWORD=数据库密码 \
    -p 自定义数据库端口:3306 \
    --restart=always \
    mysql:8.0

 

示例:
docker run -d --name mysql \
    -v /root/nextcloud/mysql:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=password \
    -e MYSQL_DATABASE=nextcloud \
    -e MYSQL_USER=nextcloud \
    -e MYSQL_PASSWORD=password \
    -p 3307:3306 \
    --restart=always \
    mysql:8.0

 

 

2、安装Docker版Nextcloud

docker run -d --name nextcloud \
    -v 自定义内容文件夹:/var/www/html \
    --link mysql:mysql \
    --restart=always \
    -p 自定义端口:80 nextcloud

 

示例:
docker run -d --name nextcloud \
    -v /root/nextcloud/data:/var/www/html \
    --link mysql:mysql \
    --restart=always \
    -p 8888:80 nextcloud

 

 

四、配置Nextcloud

可以先查看一下MySQL和Nextcloud是不是正常跑起来了。如果第三步一切顺利,就可以开始配置Nextcloud了。

docker ps -a

 

1、开放端口

在宝塔面板【安全】里,放行刚才设定的MySQL和Nextcloud端口。

 

2、配置伪静态

在宝塔面板【网站】里,新建一个网站,【伪静态】填写

rewrite /.well-known/carddav /remote.php/dav permanent;
rewrite /.well-known/caldav /remote.php/dav permanent;

 

3、开启SSL

常规操作。从【SSL】申请证书,并开启【强制HTTPS】。

 

4、配置反向代理

在新建的网站配置的【反向代理】中,【添加反向代理】。
目标URL填写:

http://127.0.0.1:Nextcloud的自定义端口号

 

示例:
http://127.0.0.1:8888

 

创建后,编辑该反向代理的【配置文件】

在【#Set Nginx Cache】之前添加

add_header Strict-Transport-Security "max-age=63072000;";

 

5、初始化Nextcloud

访问新建的域名,进入熟悉的初始化表单。

重要提示:

HOST栏填写:mysql

 

其他就照着【安装Docker版MySQL】填写的账号密码填写就行。
等待一会儿,就应该能正常进入后台了。

 

五、后续调整

1、调整一下Nginx和PHP关于上传的限制

登录portainer,找到nextcloud容器,【复制/编辑】ENV环境,

将PHP_MEMORY_LIMIT和PHP_UPLOAD_LIMIT改成你希望的数值。

然后【Deploy the container】。即可。

 

2、解决客户端无法登陆的问题

编辑【config/config.php】,在【);】之前添加:

'overwriteprotocol' => 'https'

 

否则,客户端无法验证登录。

【config/config.php】的位置在【安装Docker版Nextcloud】时自定义的目录里。

至此,Docker版的Nextcloud就能正常使用了!!

 

3、报错维修

3.1、您的安装没有设置默认的电话区域。这是在没有国家代码的情况下验证配置文件设置中的电话号码所必需的。如果号码没有国家代码,请添加“默认电话区域”,并加上希望使用的区域对应的ISO 3166-1代码。

#进入Docker
docker exec -it nextcloud bash

#编辑config文件
nano /config/config.php

#在倒数第二行添加
'default_phone_region' => 'CN',

 

 

 

3.2、此实例中的 php-imagick 模块不支持 SVG。为了获得更好的兼容性,建议安装它。

#进入Docker
docker exec -it nextcloud bash

#安装libmagick
apt install libmagickcore-6.q16-6-extra

 

4、Docker安装PMA方便管理MySQL

docker run -d \
    --name pma \
    --link mysql:db \
    -p 自定义端口:80 \
    phpmyadmin/phpmyadmin

 

示例:
docker run -d \
    --name pma \
    --link mysql:db \
    -p 3388:80 \
    phpmyadmin/phpmyadmin

 

六、2021/03/28UPDATE:

最近把NextCloud部署在了德国HZ的大盘机上,500M口不限流量,512G硬盘,在上传文件时选择了直接SFTP上传,遂记录需要在NC中同步数据库的代码:

同步全部ID下文件:
docker exec --user www-data nextcloud php occ files:scan --all
同步指定ID下文件:
docker exec --user www-data nextcloud php occ files:scan 指定ID
同步指定ID的指定文件夹:
docker exec --user www-data nextcloud php occ files:scan --path="/指定ID/files/指定文件夹"
列出全部ID
docker exec --user www-data nextcloud php occ user:list

 

同步以后,还需要递归修改文件夹权限,否则无法再NextCloud中删除文件。

#方法一:进入Docker赋权
docker exec -it nextcloud chown -R www-data:www-data /var/www/html/data/指定ID/files/指定文件夹
#方法二:直接赋权
chown -R www-data:www-data /文件夹绝对路径

 

七、2021/04/12UPDATE:

已经稳定运行一段时间了,今天突然收到监控报警说磁盘空间占用率过高,查了一圈,发现是MySQL的binlog文件造成的。竟然log文件高达10G,遂处理之。

1、进入MySQL的Docker,并激活mysql命令行

docker exec -it mysql bash
mysql -uroot -p

 

2、查看日志的相关配置

show variables like 'log_%';

 

应该会看到

+----------------------------------------+----------------------------------------+
| Variable_name                          | Value                                  |
+----------------------------------------+----------------------------------------+
| log_bin                                | ON                                     |

 

3、清除已保存的日志

PURGE MASTER;

 

4、禁止保存二进制日志

先退出mysql命令行,接着编辑my.cnf文件

nano /etc/mysql/my.cnf

 

在[mysqld]后添加一行【skip-log-bin】,如:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
skip-log-bin

 

5、重启Mysql后,检查是否配置成功

show variables like 'log_%';

 

应该会显示

+----------------------------------------+----------------------------------------+
| Variable_name                          | Value                                  |
+----------------------------------------+----------------------------------------+
| log_bin                                | OFF                                    |

 

八、2021/04/12UPDATE:

后台任务Cron的设置

在宝塔面板添加任务

任务类型:Shell脚本

任务名称:随便填

执行周期:N分钟/5分钟

脚本内容:docker exec -u www-data nextcloud php -f /var/www/html/cron.php 

 

打完收工!

 

阅读剩余
THE END