拒绝云端存储?手把手教你搭建 Nextcloud 私有网盘并实现 HTTPS 安全访问

如果你不想将数据放在云端,可以选择搭建一台自己的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 version

4. 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 nextcloud

2. 首次访问并创建管理员账号

如果你使用自定义端口 1507,在浏览器中访问:

https://nextcloud.example.cn:1507

如果证书正确,浏览器会提示连接安全。
首次进入时,Nextcloud 会引导你设置:

  • 管理员账号
  • 管理员密码

如果使用的443按界面提示完成初始化就结束了。

如果是非443会跳转到:

这是没有问题的,需要进行下一步修改即可。

注意:如果你使用的是自签名证书,浏览器第一次访问时会提示不受信任,需要手动添加信任。

六、修改 Nextcloud 配置 config.php(适配自定义端口)

Nextcloud 的 config.php 会在 首次初始化完成后 自动生成,因此建议:

  1. 完成上一步管理员账号创建
  2. 确认容器运行正常,再修改配置

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 -d

3. 性能优化方向

  • 增加 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 私有网盘。

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章