写在前面
早前曾经写过一篇Nextcloud搭建过程,当时是在宿主机上直接部署,需要安装各种组件,最后还要自己进行性能调优,过程相当繁琐
针对这些问题,官方提供了All-in-One (AIO)的docker镜像,集成了搭建所需要的所有组件,可以完全使用docker容器部署,也不用再自己进行各种优化,省去了很多繁琐的步骤
使用AIO进行搭建的一个问题就是对宿主机配置要求略高,建议至少有两个vCPU,内存3GB以上,当然配置越高体验越好(尤其是内存)
搭建
首先确保系统已经安装了docker,docker-compose和nginx
启动主容器(AIO控制面板容器)
新建一个目录用来配置主容器,创建docker-compose.yml
文件并写入下面内容
services:
nextcloud-aio-mastercontainer:
image: nextcloud/all-in-one:latest
init: true
restart: always
container_name: nextcloud-aio-mastercontainer
volumes:
- nextcloud_aio_mastercontainer:/mnt/docker-aio-config
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 8080:8080
environment:
- APACHE_PORT=11000
- APACHE_IP_BINDING=127.0.0.1
- NEXTCLOUD_UPLOAD_LIMIT=100G
- NEXTCLOUD_MEMORY_LIMIT=1024M
volumes:
nextcloud_aio_mastercontainer:
name: nextcloud_aio_mastercontainer
然后执行docker-compose up -d
启动容器
配置域名和反向代理
准备一个访问nextcloud的域名,例如cloud.example.com
,然后使用certbot申请证书
certbot certonly --standalone --agree-tos -d cloud.example.com
新建一个nginx配置文件为nextcloud.conf
并写入下面内容(注意替换为自己的域名和证书路径)
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
if ($scheme = "http") {
return 301 https://$host$request_uri;
}
listen 443 ssl http2; # for nginx versions below v1.25.1
listen [::]:443 ssl http2; # for nginx versions below v1.25.1 - comment to disable IPv6
# listen 443 ssl; # for nginx v1.25.1+
# listen [::]:443 ssl; # for nginx v1.25.1+ - keep comment to disable IPv6
# http2 on; # uncomment to enable HTTP/2 - supported on nginx v1.25.1+
# http3 on; # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+
# quic_retry on; # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+
# add_header Alt-Svc 'h3=":443"; ma=86400'; # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+
# listen 443 quic reuseport; # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+ - please remove "reuseport" if there is already another quic listener on port 443 with enabled reuseport
# listen [::]:443 quic reuseport; # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+ - please remove "reuseport" if there is already another quic listener on port 443 with enabled reuseport - keep comment to disable IPv6
server_name cloud.example.com;
location / {
proxy_pass http://127.0.0.1:11000$request_uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host;
client_body_buffer_size 512k;
proxy_read_timeout 86400s;
client_max_body_size 50000m;
# Websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
# If running nginx on a subdomain (eg. nextcloud.example.com) of a domain that already has an wildcard ssl certificate from certbot on this machine,
# the <your-nc-domain> in the below lines should be replaced with just the domain (eg. example.com), not the subdomain.
# In this case the subdomain should already be secured without additional actions
ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;
}
然后执行systemctl restart nginx
加载nginx配置
安装Nextcloud AIO
完成上面配置后,访问https://ip:8080
即可进入AIO控制面板,准备安装
复制最下面的密码后,进入Open Nextcloud AIO Login
进入下面页面后,输入前面准备好的域名,例如cloud.example.com
根据自己的情况,选择要安装的容器
时区选择Asia/Shanghai
然后下载安装就可以了
稍等一会,等所有容器启动成功后就安装完成了,使用提供的管理员用户名和密码就可以登录了
搭建完成,接下来可以愉快的使用了
一些额外的说明
解决"Security & setup warnings displays the “missing default phone region” after initial install"问题
执行下面这条指令即可
docker exec --user www-data nextcloud-aio-nextcloud php occ config:system:set default_phone_region --value="CN"
可以根据自己的情况将CN替换为其他国家代码
使用OCC指令
执行docker exec --user www-data -it nextcloud-aio-nextcloud php occ your-command
将your-command
替换为你想执行的命令即可
备份问题
以我自己为例,因为我需要向Nextcloud备份数据,备份脚本通常是使用rclone直接利用Nextcloud自带的Webdav服务向其拷贝数据,但直接拷贝过去后,Nextcloud并不会自动索引新的内容,因此需要用OCC扫描文件并更新索引
具体地,需要在备份脚本最后加入一条指令,让远程Nextcloud服务器执行相关的OCC指令,这里可以使用ssh的功能来实现(ssh可以实现登录到宿主机并执行相关指令):
ssh -i /root/.ssh/private.key -p <port> -t [email protected] 'docker exec --user www-data -it nextcloud-aio-nextcloud php occ files:scan --path=admin/files/BackupDir'
关于OCC扫描文件并同步数据的使用方法可以参考这里
移除Nextcloud AIO
注意!执行下面操作将彻底移除Nextcloud AIO实例和所有的数据,不要轻易执行
- 从控制面板停止所有的容器
- 执行
docker stop nextcloud-aio-mastercontainer
停止主容器 - 如果
nextcloud-aio-domaincheck
容器仍在允许,需要手动停止docker stop nextcloud-aio-domaincheck
- 执行
docker ps --format {{.Names}}
检查是否所有AIO容器均已经停止,如果仍有,则手动停止 - 执行
docker ps --filter "status=exited"
查看已停止的容器 - 执行
docker container prune
移除所有停止的容器 - 执行
docker network rm nextcloud-aio
移除docker网络 - 执行
docker volume ls --filter "dangling=true"
查看未使用的卷 - 执行
docker volume prune --filter all=1
移除未使用的卷,如果使用自定路径保存数据则需要手动删除 - 执行
docker volume ls --format {{.Name}}
查看是否已全部删除AIO相关的卷 - 执行
docker image prune -a
移除未使用的镜像,完成
写在最后
整体来说,使用docker搭建相对比较方便,个人使用的话,在我3C4G的机器上运行挺流畅的,不使用情况下内存占用2G多一点,但个别情况(比如加载大量图片的时候)会有CPU和内存全部吃满的时候