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配置即时生效,因此无需等待即可使用。

    Nextcloud私有化部署经验总结