一、创建mysql数据库的docker容器
注意:由于nextcloud现行使用的最高版本mysql数据库是8.4,版本太高或太低均会产生一系列问题。因此在部署前需要前往nextcloud官网查看支持的版本。
mysql的docker-compose文件书写如下:
services:
mysql:
container_name: mysql
image: mysql:8.4 #自己选择版本,nextcloud推荐版本为8.0和8.4
hostname: mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 12345678 #设置为自己的密码
TZ: Asia/Shanghai
networks:
macvlan:
ipv4_address: 192.168.1.x #设置为自己的IP地址
volumes:
- /path/mysql:/var/lib/mysql #数据库储存地址
- /path/mysql:/etc/mysql/conf.d #配置文件的地址
- /path/mysql/logs:/var/log/mysql #配置文件的地址
networks: #创建macvlan网络
macvlan:
driver: macvlan
driver_opts:
parent: eth0 # 改成你主机上接入局域网的网卡名
ipam:
config:
- subnet: 192.168.1.0/24 # 你的局域网网段
gateway: 192.168.1.1 # 你的网关/路由器
1、手动创建nextcloud和其余软件(如 onlyoffice)的数据库
进入mysql容器
docker exec -it mysql bash
进入mysql软件
mysql -uroot -p123456789 //-p后面填写自己设置的密码
创建Nextcloud数据库
CREATE USER 'nextcloud' IDENTIFIED by 'Password'; //password处填写自己设置的密码 CREATE DATABASE IF NOT EXISTS nextcloud; GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'%';
为数据库设置权限(可选)
chmod 777 /var/lib/mysql -R
二、创建nextcloud网盘的docker容器
本文会对nextcloud的https和hsts设置进行持久化的设计,因此使用起来和其余的有一定区别。
1、进行nextcloud的https持久化设置(保证在更新程序后,不需要对https进行重新设置)
- 通过truenas的WEBUI界面进行创建,设定拥有者和组拥有者的名字为www-data,并且如果需要进行相关用户访问,则需要加上对应用户的组编号和用户编号。
- 通过truenas的WEBUI界面进行证书的创建,在
WEB UI的证书获取中,我们可以通过cloudflare和Let‘s Encrypt完成证书的创建,并通过定时命令,将证书转移到相关的文件夹。
cp /etc/certificates/fullchain.crt /path/certs/ && cp /etc/certificates/privkey.key /path/certs/
2、进行apache2文件夹的提取工作(需要两个shell界面进行操作)
运行一次短时间的nextcloud容器并自动删除。
docker run --rm --name tmpnextcloud nextcloud:latest sleep 60
运行apache2文件夹的提取命令。
docker cp tmpnextcloud:/etc/apache2 /path/ #apache2文件夹宿主机所在的路径
修改/mnt/application/nextcloud/apache2/sites-available/default-ssl.conf的ssl路径。
SSLCertificateFile /etc/ssl/nextcloud/fullchain.pem SSLCertificateKeyFile /etc/ssl/nextcloud/privkey.pem
在“离线”目录预启用模块和站点。
docker run --rm -v /mnt/application/nextcloud/apache2:/etc/apache2 nextcloud:latest \ bash -lc "a2enmod ssl headers rewrite && a2ensite default-ssl"
3、创建nextcloud的docker容器
nextcloud的docker-compose文件书写如下:
version: "3.8"
services:
nextcloud:
image: nextcloud:latest
container_name: nextcloud
restart: unless-stopped
group_add:
- 1000 #添加其他用户的组,保证用户可以通过truenas的smb协议进行访问
networks:
backend: {}
macvlan:
ipv4_address: 192.168.1.x #设置为自己的IP地址
volumes:
- /path/html:/var/www/html #nextcloud配置文件夹映射
- /path/certs:/etc/ssl/nextcloud #SSL的配置文件夹映射
- /path/apache2:/etc/apache2 #apache2的配置文件映射
- /path/nextcloud:/var/www/html/data #数据储存路径映射
command: apache2-foreground
networks:
macvlan:
external: true
backend:
driver: bridge
4、创建nextcloud使用的redis的docker容器
redis的docker-compose文件书写如下
version: "3.8"
services:
redis:
image: redis:latest
container_name: redis
restart: unless-stopped
networks:
- backend
command: ["redis-server", "--appendonly", "yes"]
volumes:
- /path/redis:/data
networks:
backend:
external: true
5、修复关于nextcloud的若干问题
(1)config.php相关的一系列问题
修改/html/config/config.php文件
添加redis
'memcache.locking' => '\OC\Memcache\Redis', 'redis' => array ( 'host' => 'redis', 'port' => 6379, 'timeout' => 1.5, ),
添加维护时间,默认时区,默认电话区域,其中文件自动扫描设置为关,因为耗费资源
'default_phone_region' => 'CN', 'maintenance_window_start' => 1, 'filesystem_check_changes' => 0, 'logtimezone' => 'Asia/Shanghai', 'default_timezone' => 'Asia/Shanghai',
(2) 修复数据库的一系列问题
有 mimetype 迁移可用
sudo -u www-data php occ maintenance:repair --include-expensive
缺少数据库索引(多条)
sudo -u www-data php occ db:add-missing-indices
(3)设置严格传输安全 (HSTS)
修改/hmtl/.htaccess文件
添加 Header always set Strict-Transport-Security “max-age=15552000; includeSubDomains” 代码,位置如下:
Header onsuccess unset X-XSS-Protection Header always set X-XSS-Protection "1; mode=block" Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" SetEnv modHeadersAvailable true
6、通过smb等应用为nextcloud导入文件
由于导入的文件不会在nextcloud的数据库进行保存,因此需要通过命令扫描导入。
sudo docker exec -u www-data nextcloud php occ files:scan --all
可以通过在config.php设置 ‘filesystem_check_changes’ => 1, 进行文件的变更扫描,但会导致宿主机的开销过大,因此不推荐。
7、Nextcloud 的 corn定时刷新任务
我们可以通过Nextcloud的定时任务进行nextcloud的页面刷新,无需像以前一样通过shell文件和corntab进行页面的刷新,这样的好处是在truenas更新后,不需要重新进行设置。命令如下:
docker exec nextcloud /bin/bash -c "su www-data -s /bin/bash -c 'php cron.php'"
这个命令通过root的权限进行运行,其运行时间按如下图进行设置,方可设定为5分钟运行一次:
