如果你不想将数据放在云端,可以选择搭建一台自己的Nextcloud私有网盘。下面是一个详细的教程,教你如何搭建Nextcloud私有网盘并配置HTTPS。
### 准备工作
1. "服务器":一台运行Linux的服务器(如Ubuntu、CentOS等)。
2. "域名":一个域名,用于访问你的Nextcloud服务器。
3. "SSL证书":用于配置HTTPS的SSL证书。你可以使用Let's Encrypt免费获取SSL证书。
### 安装Nextcloud
#### 更新系统
首先,更新你的系统包:
```bash
sudo apt update && sudo apt upgrade -y
```
#### 安装必要的依赖
安装Nextcloud所需的依赖包:
```bash
sudo apt install -y php php-cli php-fpm php-json php-mysql php-curl php-zip php-gd php-mbstring php-intl php-xml php-ldap php-bcmath
```
#### 创建Nextcloud用户和数据库
创建一个专门用于运行Nextcloud的用户和数据库:
```bash
sudo mysql -u root -p
```
在MySQL提示符中,执行以下命令:
```sql
CREATE DATABASE nextcloud;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON nextcloud. TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
#### 下载并安装Nextcloud
下载Next
相关内容:
很多人不放心把照片、文档全部交给大厂云盘,又想要「随时随地、多端同步」的体验。
其实,你完全可以在家里或一台小云服务器上,部署一套属于自己的 Nextcloud 私有网盘:
- 数据完全掌握在自己手里
- 支持 Web 页面、手机 App、桌面客户端访问
- 能安装插件扩展网盘功能
本文演示如何在一台 Ubuntu 服务器 上,使用 Docker + Docker Compose 部署:
- Nextcloud
- MariaDB 数据库
- Nginx 反向代理(HTTPS)
并通过一个 自定义 HTTPS 端口 1507 对外提供访问,特别适合:
- 家用宽带 / 小型 VPS
- 不能直接对公网开放 80/443 接口(如:未备案的国内云服务器)
- 希望数据完全掌握在自己手里
如果你的服务器已备案、可以直接开放 80/443,也可以根据文中说明做少量改动即可。
使用相关技术文档参考:Ubuntu安装Docker和加速,免费拿到泛域名证书并自动续期
一、整体功能与方案概览
1. 客户端支持
Nextcloud 提供官方客户端,覆盖常见平台:
- 桌面:Windows / macOS / Linux
- 移动端:Android / iOS
- Web:Chrome / Firefox / Edge / Safari 等浏览器
2. 部署方案关键点
- 使用 Docker Compose 一键编排:Nextcloud + MariaDB + Nginx
- SSL 证书 由宿主机上的 Let’s Encrypt 获取,然后挂载进 Nginx 容器使用
- Nextcloud 文件、数据库等全部做 本地持久化存储,方便备份与迁移
- 使用 自定义 HTTPS 端口(示例:1507),绕开国内对 80/443 的常见限制
二、环境准备
正式部署前,请确认以下条件已经满足。
1. 服务器与网络
- 一台 Ubuntu 服务器(物理机 / 家里 NAS / VPS 均可)
- 计划使用的对外端口(本文示例:1507)已经放行,包括:
- 服务器防火墙(如 ufw、安全组)
- 家用路由器端口转发(如果是家宽)
2. 域名与解析
- 准备一个已经注册好的域名,例如:
nextcloud.example.cn - 将该域名的 A 记录 指向你的服务器公网 IP
3. Docker 环境
在 Ubuntu 上提前安装好:
- Docker
- Docker Compose(Docker 的 compose 插件也可以)
安装完成后,确保命令可以正常运行:
docker version
docker compose version4. SSL 证书(Let’s Encrypt)
推荐直接使用 Let’s Encrypt 免费证书,可以通过 certbot 或 acme.sh 获取。
确保你已经拿到以下两份文件:
- fullchain.pem
- privkey.pem
假设证书存放路径为:
etc/letsencrypt/live/example.cn/后面 Nginx 配置会用到这个路径,注意根据自己实际的域名与路径进行替换。
5. 端口规划(示例)
- Nginx 对外暴露:1507(HTTPS)
- 容器内部通信:
- MariaDB:3306
- Nextcloud:80
- 内部端口只在容器网络中访问,不直接暴露到公网。
如果在国内使用未备案云服务器,不建议直接对外开放 80/443,可以像本文一样用 1507 等自定义端口,更稳妥。
三、编写 docker-compose.yml
在服务器上创建项目目录:
sudo mkdir -p /srv/nextcloud
cd /srv/nextcloud
sudo vim docker-compose.yml在 docker-compose.yml 中写入以下内容(可按需改密码、路径、端口):
services:
db:
image: mariadb
restart: always
environment:
- MYSQL_ROOT_PASSWORD=Test123456
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=Test123456
volumes:
- /srv/nextcloud/db:/var/lib/mysql
nextcloud:
image: nextcloud
restart: always
depends_on:
- db
environment:
- MYSQL_PASSWORD=Test123456
- MYSQL_USER=nextcloud
- MYSQL_DATABASE=nextcloud
- MYSQL_HOST=db
- PHP_UPLOAD_MAX_FILESIZE=2G
- PHP_POST_MAX_SIZE=2G
- PHP_MEMORY_LIMIT=2G
volumes:
- /srv/nextcloud/www/html:/var/www/html
nginx:
image: nginx:alpine
restart: always
depends_on:
- nextcloud
ports:
- "1507:1507"
volumes:
- /srv/nextcloud/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- /srv/nextcloud/www/html:/var/www/html:ro
- /etc/letsencrypt:/etc/letsencrypt:ro关键说明
- 所有数据都持久化在宿主机 /srv/nextcloud 下:
- /srv/nextcloud/db:MariaDB 数据
- /srv/nextcloud/www/html:Nextcloud 程序与配置、用户文件等
- Nginx 容器挂载:
- 自定义配置:/srv/nextcloud/nginx/nginx.conf
- Nextcloud Web 根目录:/srv/nextcloud/www/html
- 宿主机 SSL 证书目录:/etc/letsencrypt
- 对外只暴露 1507 端口,数据库与 Nextcloud 只在容器网络中通讯。
强烈建议:生产环境一定要修改数据库账号和密码,不要使用文中的演示密码。
四、配置 Nginx HTTPS 反向代理
创建 Nginx 配置文件目录与文件:
sudo mkdir -p /srv/nextcloud/nginx
sudo vim /srv/nextcloud/nginx/nginx.conf写入如下配置(注意替换为你的域名和证书路径):
worker_processes 2;
events { worker_connections 4096; }
http {
server {
listen 1507 ssl;
server_name nextcloud.example.cn;
# SSL 证书(改成你的实际路径与域名)
ssl_certificate /etc/letsencrypt/live/example.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.cn/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
client_max_body_size 2G;
# 安全相关 Header(建议保留)
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
location / {
proxy_pass http://nextcloud:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
}配置要点说明
- listen 1507 ssl;
只监听 HTTPS 的 1507 端口,对应我们在 docker-compose.yml 中的暴露端口。 - proxy_set_header X-Forwarded-Proto https;
告诉后端 Nextcloud,前端是通过 HTTPS 访问的。 - client_max_body_size 2G;
配合前文的 PHP 环境变量设置,支持单文件最高 2G 上传。 - SSL、HSTS、安全 Headers 等配置能提升基础安全性。
如果以后要改用 443 标准端口,只需:
- 把 listen 1507 ssl; 改为 listen 443 ssl;
- docker-compose.yml 中 ports 改为 "443:443"
- 同时放行服务器与防火墙的 443 端口即可。
五、启动容器并完成 Nextcloud 初始化
1. 启动容器
进入 docker-compose.yml 所在目录,执行:
cd /srv/nextcloud
docker compose up -d- Docker 会自动拉取 mariadb、nextcloud、nginx 镜像
- 启动后,大约需要等待 30–60 秒,等待数据库和 Nextcloud 完成初始化

可以用以下命令实时查看 Nextcloud 初始化日志:
docker compose logs -f nextcloud2. 首次访问并创建管理员账号
如果你使用自定义端口 1507,在浏览器中访问:
https://nextcloud.example.cn:1507如果证书正确,浏览器会提示连接安全。
首次进入时,Nextcloud 会引导你设置:
- 管理员账号
- 管理员密码
如果使用的443按界面提示完成初始化就结束了。

如果是非443会跳转到:

这是没有问题的,需要进行下一步修改即可。
注意:如果你使用的是自签名证书,浏览器第一次访问时会提示不受信任,需要手动添加信任。
六、修改 Nextcloud 配置 config.php(适配自定义端口)
Nextcloud 的 config.php 会在 首次初始化完成后 自动生成,因此建议:
- 完成上一步管理员账号创建
- 确认容器运行正常,再修改配置
1. 确认 config.php 文件存在
ls -l /srv/nextcloud/www/html/config/config.php- 如果文件存在,说明 Nextcloud 初始化完毕,可以修改。
- 如果不存在:
- 再等一会儿(初始化可能还没完成)
- 检查 volume 映射是否正确
- 检查宿主机目录权限是否足够
2. 编辑 config.php
sudo vim /srv/nextcloud/www/html/config/config.php参考下面的示例配置,对关键字段进行调整(只要对照修改关键项即可,不一定要一模一样):
<?php
$CONFIG = array (
'htaccess.RewriteBase' => '/',
'memcache.local' => 'OCMemcacheAPCu',
'apps_paths' =>
array (
0 =>
array (
'path' => '/var/www/html/apps',
'url' => '/apps',
'writable' => false,
),
1 =>
array (
'path' => '/var/www/html/custom_apps',
'url' => '/custom_apps',
'writable' => true,
),
),
'upgrade.disable-web' => true,
'instanceid' => 'oc8ol5oe23rr',
'passwordsalt' => 'bPxcqZE7e6ydzmkez5V851h0AWHJ+S',
'secret' => '0Gb+H4JxAmO9LJ3x7xTh2hD2K6p+uclcObR1Cb2R9C5dA+3g',
'trusted_domains' =>
array (
0 => 'nextcloud.example.cn',
1 => 'nextcloud.example.cn:1507',
),
'datadirectory' => '/var/www/html/data',
'dbtype' => 'mysql',
'version' => '32.0.2.2',
'overwritehost' => 'nextcloud.example.cn:1507',
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'https://nextcloud.example.cn:1507',
'overwritecondaddr' => '^.*#39;,
'overwriteport' => 1507,
'maxfilesize' => '2G',
'dbname' => 'nextcloud',
'dbhost' => 'db',
'dbtableprefix' => 'oc_',
'mysql.utf8mb4' => true,
'dbuser' => 'nextcloud',
'dbpassword' => 'Test123456',
'installed' => true,
);关键配置说明
- trusted_domains
必须包括你的访问域名 + 端口,例如: - nextcloud.example.cn
- nextcloud.example.cn:1507
- overwritehost / overwriteprotocol / overwrite.cli.url / overwriteport
告诉 Nextcloud:对外访问地址是
https://nextcloud.example.cn:1507。 - 数据库相关:
- dbname / dbhost / dbuser / dbpassword
必须与 docker-compose.yml 中的环境变量保持一致。 - dbhost 填 db,对应 Compose 里服务名 db。
- upgrade.disable-web
设置为 true 可以避免用户误点 Web 页面升级,推荐日后用「升级 Docker 镜像」的方式统一升级,更安全、更可控。 - 前后配置对比图

七、重启并正式访问
修改完 config.php 后,重启容器使配置生效:
cd /srv/nextcloud
docker compose down
docker compose up -d稍等片刻,在浏览器访问:
https://nextcloud.example.cn:1507- 正常情况下,浏览器显示「连接安全」,进入登录界面。
- 用刚才创建的管理员账号登录,即可开始使用。

八、运维与安全建议
1. 定期备份
建议定期打包备份整个 /srv/nextcloud 目录,包括:
- Nextcloud 程序与配置:/srv/nextcloud/www/html
- 用户上传的文件(data 目录)
- 数据库数据:/srv/nextcloud/db
可以使用 tar + 定时任务,或结合其他备份工具(如 rsync、restic 等)备份到异地。
2. 升级镜像
- 升级 Nextcloud / MariaDB / Nginx:
cd /srv/nextcloud
docker compose pull
docker compose up -d3. 性能优化方向
- 增加 Redis 容器,作为缓存与文件锁,减少并发冲突、加快访问速度。
- 根据用户量调整:
- PHP 内存限制:PHP_MEMORY_LIMIT
- 上传大小:PHP_UPLOAD_MAX_FILESIZE、PHP_POST_MAX_SIZE
4. 安全加固建议
- 使用复杂管理员密码,并启用 两步验证(2FA)
- 使用防火墙(如 ufw)限制不必要端口,只开放:
- 1507(或你自定义的 HTTPS 端口)
- SSH 远程管理端口
- 可搭配 fail2ban 等工具,对暴力破解 IP 进行自动封禁
九、常见问题答疑
1. 为什么示例使用 1507,而不是 443?
在国内,大多数云服务商如果要对公网开放 80 / 443 端口,一般要求网站做 ICP 备案。
很多个人 / 家庭自托管场景不打算备案,这时可以使用 自定义端口(如 1507),访问时带上端口即可:
https://nextcloud.example.cn:1507只要本地防火墙和云服务器安全组中放行了该端口,就可以正常使用。
2. 上传大文件时提示大小超限怎么办?
本文已在两处设置上传上限为 2G:
- Nginx:
client_max_body_size 2G;- Nextcloud PHP 环境变量:
PHP_UPLOAD_MAX_FILESIZE=2G
PHP_POST_MAX_SIZE=2G如果仍有限制,请检查:
- Nextcloud 后台「管理 → 系统」中的上传大小设置
- 客户端(Web / 桌面 / 手机)的自身限制
十、为什么值得花一个晚上,自建一台 Nextcloud?
总结一下这套方案的价值:
- 数据掌握在自己手里:不依赖第三方网盘企业,不用担心服务突然关停或内容被扫描。
- 使用体验不打折:跨平台同步、Web 访问、分享链接、版本历史等功能一个不少。
- 顺便练手一整套技能:Docker、Compose 编排、Nginx 反向代理、TLS/HTTPS、备份策略、安全加固……这些经验在其他自建服务中也能直接复用。
如果你已经有一台闲置的 Ubuntu 机器,或者在用的小 VPS,这篇教程足够你在 一个晚上 搭好属于自己的 Nextcloud 私有网盘。

微信扫一扫打赏
支付宝扫一扫打赏