之所以用自签名或者手动设置证书,是考虑国内环境下家用宽带公网IP不开放80和443等Web端口,所以无法使用nginx-proxy这类自动设置Let’s Encrypt证书的容器(可手动使用Let’s Encrypt的DNS Challenge获得证书),如果是正常公网环境,自然用自动的更方便。
关于docker hub上Nextcloud的容器,有官方版(nextcloud/nextcloud)和一些第三方版(比如接下来的linuxserver/nextcloud),官方版的默认功能比较单一,apache版仅提供一个HTTP的Nextcloud服务,fpm版更是需要其他的nginx容器来辅助,也默认也没有cron的功能。
所以我比较倾向于使用linuxserver/nextcloud这个镜像,这个镜像本身就可以提供自签名的HTTPS,之后也可以方便的手动替换别的证书。并且这个镜像还自带了cron服务,无需再手动配置Nextcloud的cron,在小型系统上,一个nginx同时承担nextcloud+https的功能也更高效一些。
为了让Nextcloud发挥最高效率,还需要MySQL和redis,下面给出我目前使用的docker-compose文件,和使用方法。以下操作在fedora server 33 + podman环境上测试无问题(podman是一个docker的替代品),请根据实际需要进行修改。
version: "2.1"
services:
nextcloud:
image: ghcr.io/linuxserver/nextcloud
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- ./config:/config
- ./data:/data
# 如果你有其他路径下的文件数据需要让Nextcloud访问,添加在这里
# 为了方便后续设置,请在容器内使用相同的路径,如:
# - /srv:/srv
ports:
- 443:443
restart: unless-stopped
db:
image: mariadb
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- ./db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=1000%
- MYSQL_PASSWORD=1000%
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
redis:
image: redis:alpine
restart: unless-stopped
volumes:
- ./redis:/data
使用指南:首先创建一个目录,后续Nextcloud应用所有的文件和数据都会存放在此文件夹下,然后进入目录,创建好之后用了存放容器数据的文件夹:
mkdir nextcloud
cd nextcloud
mkdir config data db redis
将上面给出的docker-compose内容保存为docker-compose.yaml
,然后创建并启动所有容器:
docker-compose up -d # 或podman-compose up -d
接下来进入https://<your_host>/进行设置,注意不要用默认的SQLite,需要输入刚才mysql容器的配置,为了降低安装失败的概率,可以取消勾选“安装推荐的应用”:
接下来启用redis,需要修改Nextcloud的配置文件(config/www/nextcloud/config/config.php
),加入以下几行:
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => 'redis',
'port' => 6379,
),
最后,如果你有其他路径下的文件数据需要让Nextcloud访问,比如你有一个已有的samba共享,希望它与Nextcloud协同,并不影响原有的文件结构,并表现的和Nextcloud原生的文件一样,那么可以使用在Nextcloud用户目录下建立符号连接的方式:
注:当然,如果你不想使用这种比较hack的方式,可以简单的通过Nextcloud自带的“外部存储”功能实现类似的效果,无须后续的操作,不过你的“外部存储”会和Nextcloud原生的文件表现地“略有差异”。
首先修改Nextcloud的配置文件,允许符号链接(多用户场景下请注意可能的安全性影响),和一些其他配置:
'localstorage.allowsymlinks' => true, // 允许符号连接
'filesystem_check_changes' => 1, // 实时检测文件系统变化
'quota_include_external_storage' => true, // 打开这个可避免容量限额识别问题
然后到Nextcloud用户的数据目录(data/<nextcloud_username>/files/
),建立符号连接:
ln -s /srv my_smb_share
之后你可能还需要手动让Nextcloud执行一次文件扫描(视文件大小,可能会耗时较久):
docker exec -it <your_nextcloud_container> occ files:scan --all
然后就可以看到你新加进去的目录了:
最后附上一张容器的资源使用情况:(那个xxxxxxxx-infra的容器大概是podman用来实现容器间网络绑定的)
最后关于手机端数据同步,官方客户端在文件数量非常多的情况下可能会卡死,这是可以使用Nextcloud提供的Webdav服务配合第三方APP(如:安卓下的FolderSync)进行同步,甚至速度会更快。
你好,我在配置redis的时候,修改了nextcloud的config.php文件后,重新打开nextcloud出现服务器配置错误(非网上的内部服务器错误页面),请问是什么问题?
请尝试给出更详细的报错信息,比如容器日志和nextcloud日志
另外现在可以尝试使用nextcloud-aio方案进行部署