日志
- 2024-03-03:优化“上传>512M的文件”的教程,可以在
28.0.2
或以上的Nextcloud版本生效(旧版本理论上也可以生效,但没测试过)。 - 2024-02-09:Nextcloud更新了
28.0.2
,与27.x.x
版本在设置上有较大区别,包括nginx设置javascript、设置维护开始时间、Activity加载异常的修复、额外CCS设置等。具体见《Docker系列 深度使用nextcloud(十)升级nextcloud》的“升级记录——2024-02-09”、《Docker系列 深度使用nextcloud (十一) 特效》的“特效——其它半透明”等小节。我发现nextcloud-sharing-path
插件在28版本暂时不能正常显示按钮(但链接功能是正常的),如果想使用类似《Docker系列 深度使用nextcloud(六)在博客中嵌入视频》的功能则暂不宜升级。 - 2023-11-26:日常优化教程。
- 2023-07-30:最新版本(2023-07-29)的
nextcloud:fpm
存在bug,其build成full镜像后php的imap.so缺失从而导致初始化失败。具体见该issue:Unable to load dynamic library ‘imap.so’ · Issue #2037 · nextcloud/docker。推荐暂时使用2023-7-21或之前的nextcloud:fpm
来buildfpm-bensz
镜像。 - 2023-06-21:优化Nginx Proxy Manager的教程。感谢
@zeyueguo
的提醒。
前言
之前我在《Docker系列 搭建个人云盘服务nextcloud》中描述了一种基于Apache网络服务器的Nextcloud部署方法,它相对简单,可以体验很多Nextcloud的日常功能。一般来说,VPS这种性能比较差的服务器可以使用这种方案,特别是你没有很多文件/图片预览、视频播放的需求,而只将Nextcloud当作一个文件托管平台时。
不过,如果你准备在一台性能较强的机器(CPU性能高、内存大、磁盘空间大)里安装Nextcloud,我更加推荐本文将要介绍的Nextcloud-FPM-FULL + Nginx服务器
方案。经过合理的配置,Nextcloud可以充分利(ya)用(zha)宿主机的性能,在响应速度和稳定性上有较大提升;功能也因为更多依赖的安装而更加强大,比如原生支持图片/视频的实时预览。如果你有一台性能不错的NAS,可以尝试一下该方案噢!
Nextcloud-FPM
使用 FastCGI 进程管理器 (FPM) 来处理 PHP 请求,包括文件同步、共享、用户管理等功能;但未集成 Web 服务器,因此需要用 Nginx 来处理对 Nextcloud 的请求。FULL
的概念主要来源于官方文档,即在布署Nextcloud时安装所有扩展功能的相关依赖,比如CRON via supervisor、bz2、imap、gmp、smbclient、ffmpeg、imagemagick 甚至是 LibreOffice[可选,默认禁用]等。
不同于以往使用别人制作好的镜像,我们将直接使用自定义的Dockerfile来生成一个本地镜像。自定义Dockerfile可以提供最大的自由度,这应该才是Nextcloud这种灵活而复杂的应用的最好安装方式了。实际上在Docker的高级用户中,基于Dockerfile的安装方式也是比较流行的。
值得注意的是,《Docker系列 搭建个人云盘服务nextcloud》安装的Nextcloud应该可以迁移至本方案中,但目前还没有测试成功(提示504 Gateway Time-out
错误)。所以已经使用了旧版安装方法的小伙伴要考虑一下是否有必要换新,毕竟重构数据也是挺麻烦的。我自己的数据不多(10G+),已经迁移过来了。从长远使用的角度看,本教程的方案是强烈推荐的,毕竟总有一天我们会拥有一台性能强大的机器!
闲话少说,下面咱们讲一下如何部署Nextcloud-FPM-FULL + Nginx服务器
吧!
测试环境
系统环境如下:
uname -a # Linux pveomv 5.19.17-2-pve #1 SMP PREEMPT_DYNAMIC PVE 5.19.17-2 (Sat, 28 Jan 2023 16:40:25 x86_64 GNU/Linux
docker --version # Docker version 23.0.5, build bc4487a
docker-compose --version # Docker Compose version v2.4.1
Nextcloud的版本号为26.0.2
,为2023-06-08时的最新版本。
准备工作
Nextcloud-fpm镜像
本教程使用的是这个镜像:
值得注意的是,官方仓库还有一个类似的镜像,叫fpm-alpine
。fpm
镜像基于基于Debian/PVE操作系统作为基础镜像,它提供更广泛的软件包支持和易用性,但镜像比较大;而fpm-alpine
基于 Alpine Linux 的操作系统作为基础镜像,它比较轻量一些。
我注意到fpm-alpine
管理www目录的用户是82:82
,与Debian系的33:33
不太一样;加上自己是在NAS里安装Nextcloud的,对磁盘容量并不敏感,故没有使用fpm-alpine
。我测试过这两个镜像,都是可以用的,大家根据实际情况选择即可。
我们创建一个工作目录:
work=~/docker/nextcloud-fpm
mkdir -p $work/custom; cd $work
克隆nextcloud/docker项目:
git clone https://github.com/nextcloud/docker.git
进入nextcloud-fpm
的Dockerfile目录:
cd $work/docker/.examples/dockerfiles/full/fpm
build这个镜像:
# docker build -t <容器名> <Dockerfile所在目录>
docker build -t nextcloud:fpm-bensz .
耐心等待。如果错误,一般是apt-get安装依赖的过程不顺利造成的(网络问题),重试直至成功即可。成功时会出现类似字样:
Successfully built 0339xxxxxxxx
Successfully tagged nextcloud:fpm-bensz
# 或者:
# => => writing image # sha256:9e2f042044d24aaxxx 0.0s
# => => naming to docker.io/library/nextcloud:fpm-bensz
如果你的网络环境不好,我也可以考虑将build好的镜像发布到gitee之类的地方。有需要的在评论区留言吧!
我们查看一下该镜像:
docker image list | grep -E 'fpm-bensz'
输出类似:
nextcloud fpm-bensz 033xxxx 3 minutes ago 1.4G
表明该image已经成功安装。如果之后有版本更新,先下线整个stack,然后git pull更新至最新版,再依上述步骤在本地build新镜像即可。强烈推荐RSShub订阅Nextcloud的docker镜像release更新。
部署脚本
地址:https://github.com/nextcloud/docker/tree/master/.examples/docker-compose/insecure/mariadb/fpm
我们主要基于Nextcloud的官方仓库进行布署。首先,进入insecure/mariadb/fpm
中:
请注意,这里的insecure
指的是本地部署后以http://局域网ip:端口
的方式访问Nextcloud,这是我们想要的,因为我的教程体系中常规使用Nginx Proxy Manager进行https反向代理。选mariadb
是因为我们将使用mysql或mariadb作为Nextcloud的后端数据库。
执行以下代码即可复制到docker stack的根目录:
cd $work/docker/.examples/docker-compose/insecure/mariadb/fpm && cp -rp * $work
Dockerfile
web
文件夹只有Dockerfile和nginx配置:
total 9.0K
-rw-r--r-- 1 root bensz 57 Jun 7 16:52 Dockerfile
-rw-r--r-- 1 root bensz 7.4K Jun 7 20:24 nginx.conf
Dockerfile要求安装一个nginx容器并使用定制好的nginx.conf。
nginx.conf
建议在nginx.conf文件中做一些修改,这是一个示例,请大家下载后按需修改。具体如下:
这些改动可以帮助更好地通过Nextcloud的安全检查。
db.env
db.env
指定了MYSQL帐户信息等在多个docker app中会被用到的环境变量:
MYSQL_PASSWORD=
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
在以往的教程中,我一般直接在docker-compose.yml重复地声明这些变量。但在一些有经验的docker使用者中,定义1个或多个*.env
文件是更加流行和方便的策略。感兴趣的小伙伴以后也可以多应用这个技巧!
www.conf
我们需要在custom
目录中创建一个www.conf,这是一个示例,请大家下载后按需修改。它定义了Nextcloud-fpm中PHP的一些行为。在Nextcloud 26.0.2中,该文件在容器中的位置为/usr/local/etc/php-fpm.d/www.conf
。我对这个文件的理解也不多,但知道一些比较重要的参数。
在官方文档 Server tuning — Nextcloud latest Administration Manual latest documentation中有这个描述:For example on a machine with 4GB of RAM and 1GB of MySQL cache following values in your www.conf
file should work:
pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18
目前,我在自己的NAS里也是使用这个配置。大致的原则就是pm.max_children
最大,而pm.start_servers
在pm.min_spare_servers
和pm.max_spare_servers
之间。它们定义了php并发请求的一些基础值和上下限;配置好可以增强Nextcloud在多并发场景的表现。
大家可以使用这个设置,然后根据日志调试。这些参数在www.conf
中的实际位置如下:
最后,记得修改一下文件夹的权限:
sudo chown -R 33:33 $work/custom
其它准备
最后,$work
目录的文件分布大致如下:
├── [ 3] custom
│ └── [ 22K] www.conf
├── [ 78] db.env
├── [1.6K] docker-compose.yml
└── [ 4] web
├── [ 57] Dockerfile
└── [7.4K] nginx.conf
如果你的VPS还使用了ufw等防火墙,要开放相应的端口。这里以1234
为例:
ufw allow 1234/tcp comment 'nextcloud-fpm' && ufw reload
如果VPS后台管理中还有其它防火墙,也要依次放行。
准备好域名解析,比如nextcloudtest.hwb0307.com
。
安装Nextcloud-fpm
db.env
修改文件:
vim $work/db.env
自定义MYSQL数据库的相关信息,比如:
MYSQL_PASSWORD=test0test0!
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
实际使用时一般是这样调用:
env_file:
- db.env
docker-compose.yml
我们在原版的基础上进行了优化,大家要根据实际情况微调:
version: '3'
services:
db:
# image: mariadb:10.6.5-focal # mariadb和mysql二选一即可
image: mysql:8.0
container_name: nextcloud-fpm-db
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW --max-binlog-size=200M --expire-logs-days=2 # 优化mysql配置
restart: unless-stopped
volumes:
- ./db:/var/lib/mysql:Z
environment:
- MYSQL_ROOT_PASSWORD=nextclouddb_root_password
env_file:
- db.env
networks:
- default
cache:
image: redis:latest
container_name: nextcloud-fpm-cache
restart: unless-stopped
expose:
- "6379" # 可用此默认。因为这是暴露而不是映射
volumes:
- ./cache:/data
networks:
- default
app:
image: nextcloud:fpm-bensz
container_name: nextcloud-fpm-app
restart: unless-stopped
volumes:
- ./app:/var/www/html:z
- ./custom/www.conf:/usr/local/etc/php-fpm.d/www.conf
environment:
- MYSQL_HOST=db
- REDIS_HOST=cache
env_file:
- db.env
depends_on:
- db
- cache
networks:
- default
web:
build: ./web
container_name: nextcloud-fpm-web
restart: unless-stopped
ports:
- 1234:80 # 按需要修改
volumes:
- ./app:/var/www/html
depends_on:
- app
networks:
- default
cron:
image: nextcloud:fpm-bensz
container_name: nextcloud-fpm-cron
restart: unless-stopped
volumes:
- ./app:/var/www/html
entrypoint: /cron.sh
depends_on:
- db
- cache
networks:
- default
networks:
default:
name: nextcloud-fpm
请注意,在这里我指定了数据库的版本号mariadb:10.6.5-focal
或mysql:8.0
。你可以改为自己正在使用的版本号,这样比较节省空间。我个人比较推荐mysql,因为mysql可以随便转到mariadb中,但mariadb转到mysql里比较困难。
web
直接使用一个nginx:alpine镜像
+自定义nginx.conf。cron
就是利用nextcloud:fpm
中的/cron.sh
脚本自动配置后台作业。
然后,直接上线整个docker stack即可:
docker-compose up -d
在线安装
耐心等一段时间,之后访问 http://局域网ip:1234
即可。装的过程可能地址会失效,继续访问即可:
整个过程和旧版的安装过程是差不多的。
配置NPM
不了解Nginx Proxy Manager用法的小伙伴,请看《Docker系列 两大神器NPM和ddns-go的安装》。
ddns-go或者域名托管商后台解析好域名nextcloudtest.hwb0307.com
。假设NAS的局域网IP是192.168.1.123
。
添加一个Proxy Host,反代地址是http://192.168.1.123:1234
。可用泛域名的SSL证书。
最后,我们需要在Nginx Proxy Manager的Advanced里添加一些内容:
家用搭建的服务器一般是用别的端口来代替443。假设我们使用2443
作为Nginx Proxy Manager的默认443端口,那么添加内容为:
location /.well-known/carddav {
return 301 $scheme://$host:2443/remote.php/dav;
}
location /.well-known/caldav {
return 301 $scheme://$host:2443/remote.php/dav;
}
location /.well-known/webfinger {
return 301 $scheme://$host:2443/index.php/.well-known/webfinger;
}
location /.well-known/nodeinfo {
return 301 $scheme://$host:2443/index.php/.well-known/nodeinfo;
}
如果你使用的是默认的443端口,则不需要加端口号:
location /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
location /.well-known/webfinger {
return 301 $scheme://$host/index.php/.well-known/webfinger;
}
location /.well-known/nodeinfo {
return 301 $scheme://$host/index.php/.well-known/nodeinfo;
}
这些代码有助于通过Nextcloud的安全检查:
有时候webfinger
和nodeinfo
的安全警告会比较难以消失,可以通过退出帐号重新登陆或docker-compose down && docker-compose up -d
重新部署整个stack等方法进一步去除。
config.php
完成安装后,先不要正式使用Nextcloud,而是检查一下$work/app/config/config.php
文件的内容。这是一个示例。
- Redis缓存信息:
'memcache.local' => '\\OC\\Memcache\\APCu', // 默认是APCu。好像没法改为Redis?
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => 'cache', // 和docker-compose.yml中Redis的“小名”要一致。
'password' => '', // docker-compose.yml中没声明,故留空。
'port' => 6379,
),
- 域名限制性。如果使用的是https访问,可以这样写:
array (
0 => '192.168.1.123',
1 => 'nextcloudtest.hwb0307.com',
),
'overwritehost' => 'nextcloudtest.hwb0307.com:4443',
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'http://nextcloudtest.hwb0307.com:4443',
这里假定使用的443端口为4443
。如果你直接使用443,这个端口号可以不写。
如果仅在本地访问,可以这样写:
array (
0 => '192.168.1.123',
),
'overwritehost' => 'http://192.168.1.123:1234',
修改完成后,直接重启docker stack即可:
docker-compose restart
管理设置
看看管理设置的安全与后台有没有问题,有问题按《Docker系列 搭建个人云盘服务nextcloud》的“警告&Bug”小节。 不过,由于我们使用了Nginx作为Web服务器,一些bug的解决方法和之前的Apache服务器是不同的。具体情况具体分析喽!我暂时是没遇到太多问题:
上传>512M的文件
默认情况下,Nextcloud仅支持单个大小≤512M的文件上传。如果你有上传很大文件的需求,需要在3个地方完成设置;这样即可上传很大的文件:
警告&bug
《Docker系列 搭建个人云盘服务nextcloud》中包含排障教程(
警告&Bug
小节),比如不安全URL、caldav解析、数据库丢失索引、无法预览常见格式的文件等;有需要者自行食用。
设置维护开始时间
v28.x.x之后容易出现:Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks.
在config/config.php
中添加这一项即可:
'maintenance_window_start' => 1,
维护开始的时间包括用于活动过期、可疑登录训练和更新检查。例如,设置'maintenance_window_start' => 1,
,则只会在 UTC 时间凌晨 01:00 到 05:00 之间运行后台作业。
小结
整个布署过程比Nextcloud-Apache稍复杂些。不过,如果你对Docker和Nextcloud比较熟悉,应该难度不大。如果你有一台强大的服务器,这个方案是很推荐的,可拓展性和性能都可以上一个档次!官方仓库的教程也十分贴心,有相见恨晚的感觉!其它使用技巧见学习地图的“Nextcloud”系列,这里不多说了。
以后有什么使用心得会继续更新内容。请拭目以待!
扩展阅读
- Slow uploads with HTTP/2 · Issue #9578 · nextcloud/documentation:关于Nextcloud上传速度慢的相关讨论。
---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍
debian12最新版,apt upgrade更新时速度太慢,只有15K左右的速率,更换了国内的阿里等源,仍然从deb.debian.org更新文件,速度太慢。有什么办法解决吗?
如果你是指build镜像的过程,你可以了解一下docker build image时镜像源是不是可以选。 我暂时没研究过这个问题 (ฅ´ω`ฅ)
在国内因为网络问题,build fpm镜像时多数会出现失败的情况,通过阅读Dockerfile文件,结合build失败信息,能发现build基于Debian/PVE的fpm镜像时apt-get update超时导致build失败,所以建议国内网络用户对Dockerfile稍作优化,使用国内镜像源完成build。我的做法是修改Dockerfile文件,在“apt-get update; ”行前插入两个sed指令,使用国内镜像源来完成build。
干得漂亮 (~ ̄▽ ̄)~
严格按照步骤重新安装(想更新到最新版),在最后一步(登录页面创建管理员帐号和密码)点击安装后,弹出:(Internal Server Error
The server encountered an internal error and was unable to complete your request.
Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.
More details can be found in the server log.)错误。查询nextcloud.log日志,提示:(”fopen(/var/www/html/config/config.php): Failed to open stream: No such file or directory at /var/www/html/lib/private/Config.php#221″)错误。
在网上查找了好久,一直没能解决,能否提供一下解决办法为谢!
之后有时间再看看 ~ 或者您加一下telegram群找一下群友吧 (~ ̄▽ ̄)~
博主你好,我看了你的这个教程成功搭建了nextcloud,不过遇到了几个问题,不知道你有没有遇到过,一个是用windows客户端上传时,若上传的文件只有几百M,可以满速上传,若大于1G的样子,上传只有2m/s左右,看了你下面的链接,根据github评论和cloudflare的blog文章修改了相关设置仍旧无法解决。另一个是上传大量小文件(图片)时,到后面会报错network error 499。(nextcloud论坛只有两个相关提问,无法解决。)
然后就是我想购买你博客的vip,看下上传限制512M的配置(不过已参考官方文件和chatgpt解决)时出现问题,跳转支付提示我请先购买套餐,但实际已选择了。
最后谢谢你写的教程。
谢谢鼓励 ~ 可以在 https://blognas.hwb0307.com/thankyou 这里转我,我在后台给您开vip。我个人的建议时,如果您上传的是一些比较大的文件的时候,基于WebDav的方案是最好的。 具体可见: https://blognas.hwb0307.com/linux/docker/2869
我刚刚修复了VIP支付系统。 可以正常支付。 谢谢!
大佬您好,请问一下如果我部署的时候没有使用Nginx Proxy Manager,那进行大于512M的文件上传的配置的时候,是不是就配置2个地方就可以了,谢谢
大佬您好,注册账号报错
想问一下,如果同时有HTTPS访问和本地访问的需求,该如何设置呀
这个暂时没有研究过。 如果你不添加类似下面的设置:
应该就可以了。因为这3个设置就是将地址强行改为你指定的地址。不强制指定应该就是用原地址。
恩恩,现在只能暂时这样了
大佬,您好。我按照您的教程,部署成功了,能通过http访问,请问如何通过https://内网ip访问,我的是内网,没有域名,只能用局域网IP。看了文章中npm那部分,看不太懂。求赐教。
你使用
http://内网ip:端口号
的方式,则不需要使用Nginx Proxy Manager。另外,config.php——域名限制性的那部分可以这样写:我是想通过https://内网ip:端口号访问,我已经用openssl生成了.key和.crt,nginx.conf要修改吧。
我觉得应该是改Nginx配置(Nginx Proxy Manager那一级而不是Nginx网络服务器那一级)就行,但我也不太了解怎么在NPM中操作。你可以看一下NPM的子文件,里面有一些nginx的config文件,你直接在上面改试试看。 或者看看NPM的官方文档,应该有自定义的内容。
大佬,您好。我用的时ubuntu 22部署的,所有文件都是用您的示例文件,到sudo docker-compose up -d的时候,报以下错。请教一下什么问题?
[+] Building 39.9s (1/1) FINISHED
=> ERROR [internal] booting buildkit 39.9s
=> => pulling image moby/buildkit:buildx-stable-1 25.0s
=> => creating container buildx_buildkit_default 14.9s
这个error没怎么见过喔,看上去有点像是网络连接问题,导致镜像build有问题。
如果您的docker程序是由ubuntu snap安装(snap list),建议使用snap remove卸载docker,apt-get重新安装您的docker相关组件,应该能解决。不要问我为什么,应为我就是这样解决的。