Nextcloud私有化部署经验总结
October 1, 2025
Nextcloud私有部署
背景
由于Windows 11在某次更新之后会默认开启备份功能,并且占用极高的网络带宽将windows上的某些配置、设置以及大文件传输到Onedrive当中。这点让我极其恼火,于是在尝试寻找各种解决方案,最后选择了私有部署的云文件同步系统。经过一些研究,Nextcloud算是其中比较好用的,且它的一些外在感受和Cloudflare非常相似。
方案
最初选择在一台PVE上开启一个DEBIAN虚拟机,然后在这个虚拟机当中运行nextcloud的docker。之后总觉得有些套壳过多的感觉,于是干脆切换回了另一台笔记本组成的服务器,并使用nextcloud的镜像进行部署,唯一的缺憾是这台笔记本的网口受到限制,不过初次部署之后同步的内容量不大,应该完全满足需求。
在第一次部署的时候,初始化界面建议我不要使用默认的SQLITE数据库,而是要使用MYSQL的方式,于是我选择重新拉取镜像并将MYSQL的镜像也融入其中。
步骤
1. 创建nextcloud的docker子网
由于要将另一个MYSQL的数据库的容器也并入到nextcloud中,因此需要对这两个新的容器创建一个子网:
sudo docker network create nextcloud-net
2. 拉取mysql数据库镜像并创建容器于子网中
sudo docker run -d --name [containerName] --network nextcloud-net -e MYSQL_ROOT_PASSWORD=[mySQLRootPassword] mysql:latest
注意其中MYSQL_ROOT_PASSWORD=后面的变量是该容器的ROOT密码,拥有最高的数据库管理权限,因此要记得
3. 拉取nextcloud镜像并创建容器于子网中
sudo docker run -d --name nextcloud-app --network nextcloud-net -p [NextcloudPort]:80 nextcloud:latest
注意[NextcloudPort]为该容器对外暴露的端口,由于我后续通过cloudflare的zerotrust进行了代理,因此该端口并没有使用默认的8080
4. 为nextcloud在mysql数据库中创建对应的权限
在宿主机上以root身份运行:
docker exec -it [containerName] mysql -u root -p
接下来输入步骤2中的ROOT密码进入该容器进行配置,注意[containerName]也应该和步骤2中的名称一样
执行以下命令——包括最后的分号,因为是SQL语句
CREATE DATABASE nextcloud_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
# 创建用户 nextcloud_user,并允许它从任何主机 ('%') 连接 CREATE USER 'nextcloud_user'@'%' IDENTIFIED BY 'your_db_password'; # 授予 nextcloud_db 数据库的所有权限 GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud_user'@'%'; # 刷新权限 FLUSH PRIVILEGES; # 退出 MySQL EXIT;
'your_db_password'中的内容可以自定义,不过要在后续的nextcloud初始化设置当中进行使用
5. nextcloud初始化
浏览器访问:[宿主机IP]:[NextcloudPort]
先配置好对应的用户名密码等自定义信息 在存储方式部分选择MySQL/MariaDB
数据库用户名填写nextcloud_user
数据库名称填写nextcloud_db
数据密码与步骤4中的your_db_password一致
数据库主机则和步骤2中的[containerName]一致即可
完成点击确认,等待初始化完成
代理问题
如果要通过外网访问,我选择的方案是通过cloudflare的zero trust tunnel进行反向代理,问题在于如果通过外网直接访问会显示该域名并未授权等信息,需要修改config.php
其实这对应的是nextcloud容器中的PHP配置文件,思路在于找到对应的config.php文件进行编辑即可
我最终通过1panel中的容器信息,以及docker ps命令交叉验证找到了对应的挂载地址在:
/var/lib/docker/volumes/53e930c20647f326c155710640bac4b0f4845655de456ca5f0bb47ce45635fab/_data/config
通过AI问答等方式得知只需要将config.php中的文件稍事修改即可:
原文件部分:
'trusted_domains' => array ( 0 => '[localIP:port]', ),
修改为
'trusted_domains' => array ( 0 => '[publicDomain]', 1 => '[localIP:port]', ),
即可,因为PHP配置即时生效,因此无需等待即可使用。