编辑
2025-11-19
技术漫谈
00
请注意,本文编写于 41 天前,最后修改于 38 天前,其中某些信息可能已经过时。

目录

核心架构图
第一步:准备工作 (清理环境)
第二步:部署 AIO (反向代理模式)
第三步:配置 FRP (内网穿透)
第四步:配置 Nginx Proxy Manager (云端)
第五步:初始化安装
第六步:解决“应用商店空白”问题 (配置代理)

Gemini_Generated_Image_8xe5g28xe5g28xe5.png

如果你正在使用个人NAS,并且希望通过 Nextcloud AIO (All-in-One) 获得最完整、最稳定的私人云体验(包括高性能文件管理、日历、通讯录等),那么,这篇文章就是为你准备的。

核心架构图

我们将采用以下架构,在本地部署nextcloud:

  1. 本地 (极空间): 运行 Nextcloud AIO(配置为反向代理模式,仅监听本地端口)。
  2. 本地 (极空间): 运行 FRP 客户端 (frpc),将 AIO 的端口加密穿透到云端。
  3. 云端 (VPS): 运行 FRP 服务端 (frps) 和 Nginx Proxy Manager (NPM)。
  4. 云端 (VPS): NPM 负责处理 SSL 证书和公网访问,将流量转发给 FRP。

第一步:准备工作 (清理环境)

如果你之前尝试安装过 AIO 但失败了,必须先进行彻底清理,否则新配置不会生效。

  1. 停止并删除容器:
    在极空间 SSH 或 Docker 管理器中,停止所有 nextcloud-aio-* 开头的容器。
    docker compose down

  2. 关键:删除配置卷 (必须做!)
    AIO 的配置文件存储在 Docker 卷中,必须删除它才能让新的环境变量生效。
    docker volume rm nextcloud_aio_mastercontainer

    (注意:这只会重置 AIO 的安装向导配置,不会删除你的 NEXTCLOUD_DATADIR 里的用户文件)

第二步:部署 AIO (反向代理模式)

这是最关键的一步。我们要通过特殊的配置,告诉 AIO 不要自己管理 SSL,而是把 HTTP 服务暴露出来给我们的代理用。

创建一个新的 docker-compose.yml 文件:

js
services: nextcloud-aio-mastercontainer: image: ghcr.io/nextcloud-releases/all-in-one:latest init: true restart: always container\_name: nextcloud-aio-mastercontainer privileged: true \# 推荐加上,赋予更高权限以减少网络问题 volumes: \- nextcloud\_aio\_mastercontainer:/mnt/docker-aio-config \- /var/run/docker.sock:/var/run/docker.sock:ro ports: \# AIO 管理界面端口 (仅本地访问) \- 8082:8080 environment: \# \--- 核心配置:开启反向代理模式 \--- \# 告诉 AIO11000 端口提供未加密的 HTTP 服务 \- APACHE\_PORT=11000 \# 关键:绑定到 127.0.0.1,防止局域网直接未加密访问,只允许本机 FRP 抓取 \- APACHE\_IP\_BINDING=127.0.0.1 \# \--- 数据目录配置 (根据你的实际情况修改) \--- \# MOUNT 是父目录,DATADIR 是子目录 \- NEXTCLOUD\_MOUNT=/mnt/ \- NEXTCLOUD\_DATADIR=/mnt/nextcloud\_data \# \--- 首次启动自动安装的应用 \--- \- NEXTCLOUD\_STARTUP\_APPS=deck twofactor\_totp tasks calendar contacts notes volumes: nextcloud\_aio\_mastercontainer: name: nextcloud\_aio\_mastercontainer

启动命令:

docker compose up \-d

docker-compose完整版

js
services: nextcloud-aio-mastercontainer: image: ghcr.io/nextcloud-releases/all-in-one:latest # 这是使用的容器镜像。如果你想帮助测试新版本,可以切换到 ghcr.io/nextcloud-releases/all-in-one:beta。详见 https://github.com/nextcloud/all-in-one#how-to-switch-the-channel init: true # 此设置确保容器内主进程的信号能正确转发给子进程。详见 https://docs.docker.com/reference/compose-file/services/#init restart: always # 这能确保容器总是随着宿主机操作系统一起启动。详见 https://docs.docker.com/reference/compose-file/services/#restart container_name: nextcloud-aio-mastercontainer # 这一行不允许更改,否则 AIO 将无法正常工作 volumes: - nextcloud_aio_mastercontainer:/mnt/docker-aio-config # 这一行不允许更改,否则内置的备份解决方案将无法工作 - /var/run/docker.sock:/var/run/docker.sock:ro # 在 macOS, Windows 或 docker rootless 模式下可能需要更改。请参阅相关文档。如果调整了此项,别忘了也设置 'WATCHTOWER_DOCKER_SOCKET_PATH'network_mode: bridge # 这会将容器添加到 docker run 默认会使用的网络中。如果你想为 docker 网络定义自定义 MTU 大小,请注释掉此行,并取消注释下面一行的 'networks' 以及文件末尾的 networks 部分 # networks: ["nextcloud-aio"] ports: - 80:80 # 当在 Web 服务器或反向代理(如 Apache, Nginx, Caddy, Cloudflare Tunnel 等)后运行时可以移除。详见 https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md - 8080:8080 # 这是 AIO 的管理界面,通过 https 和自签名证书提供服务。详见 https://github.com/nextcloud/all-in-one#explanation-of-used-ports - 8443:8443 # 当在 Web 服务器或反向代理(如 Apache, Nginx, Caddy, Cloudflare Tunnel 等)后运行时可以移除。详见 https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md # security_opt: ["label:disable"] # 在使用 SELinux 时需要此项。详见 https://github.com/nextcloud/all-in-one#are-there-known-problems-when-selinux-is-enabled # environment: # 当使用以下任何选项时需要 # # AIO_DISABLE_BACKUP_SECTION: false # 设置为 true 可以在 AIO 界面中隐藏备份部分。详见 https://github.com/nextcloud/all-in-one#how-to-disable-the-backup-section # # APACHE_PORT: 11000 # 当在 Web 服务器或反向代理(如 Apache, Nginx, Caddy, Cloudflare Tunnel 等)后运行时需要。详见 https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md # # APACHE_IP_BINDING: 127.0.0.1 # 当在同一主机上运行的 Web 服务器或反向代理(如 Apache, Nginx, Caddy, Cloudflare Tunnel 等)后运行时应设置此项。详见 https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md # # APACHE_ADDITIONAL_NETWORK: frontend_net # (可选) 将 Apache 容器连接到一个额外的 docker 网络。当反向代理在同一台服务器的不同 docker 网络中运行时需要。详见 https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md # # BORG_RETENTION_POLICY: --keep-within=7d --keep-weekly=4 --keep-monthly=6 # 允许调整 Borg 的备份保留策略。详见 https://github.com/nextcloud/all-in-one#how-to-adjust-borgs-retention-policy # # COLLABORA_SECCOMP_DISABLED: false # 设置为 true 允许禁用 CollaboraSeccomp 功能。详见 https://github.com/nextcloud/all-in-one#how-to-disable-collaboras-seccomp-feature # # FULLTEXTSEARCH_JAVA_OPTIONS: "-Xms1024M -Xmx1024M" # 允许调整全文搜索的 java 选项。详见 https://github.com/nextcloud/all-in-one#how-to-adjust-the-fulltextsearch-java-options # # NEXTCLOUD_DATADIR: /mnt/ncdata # 允许设置 Nextcloud 数据目录的宿主机路径。⚠️⚠️⚠️ 警告:在 Nextcloud 首次安装完成后,不要设置或调整此值!详见 https://github.com/nextcloud/all-in-one#how-to-change-the-default-location-of-nextclouds-datadir # # NEXTCLOUD_MOUNT: /mnt/ # 允许 Nextcloud 容器访问宿主机上的所选目录。详见 https://github.com/nextcloud/all-in-one#how-to-allow-the-nextcloud-container-to-access-directories-on-the-host # # NEXTCLOUD_UPLOAD_LIMIT: 16G # 如果你需要更大的值,可以调整。详见 https://github.com/nextcloud/all-in-one#how-to-adjust-the-upload-limit-for-nextcloud # # NEXTCLOUD_MAX_TIME: 3600 # 如果你需要更长的时间,可以调整。详见 https://github.com/nextcloud/all-in-one#how-to-adjust-the-max-execution-time-for-nextcloud # # NEXTCLOUD_MEMORY_LIMIT: 512M # 如果你需要更多内存,可以调整。详见 https://github.com/nextcloud/all-in-one#how-to-adjust-the-php-memory-limit-for-nextcloud # # NEXTCLOUD_TRUSTED_CACERTS_DIR: /path/to/my/cacerts # 此目录中的 CA 证书将被 Nextcloud 容器的操作系统信任 (例如,对 LDAPS 很有用)。详见 https://github.com/nextcloud/all-in-one#how-to-trust-user-defined-certification-authorities-ca # # NEXTCLOUD_STARTUP_APPS: deck twofactor_totp tasks calendar contacts notes # 允许修改首次启动 AIO 时安装的 Nextcloud 应用。详见 https://github.com/nextcloud/all-in-one#how-to-change-the-nextcloud-apps-that-are-installed-on-the-first-startup # # NEXTCLOUD_ADDITIONAL_APKS: imagemagick # 允许向 Nextcloud 容器永久添加额外的软件包。默认为 imagemagick,但可以通过修改此值来覆盖。详见 https://github.com/nextcloud/all-in-one#how-to-add-os-packages-permanently-to-the-nextcloud-container # # NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS: imagick # 允许向 Nextcloud 容器永久添加额外的 PHP 扩展。默认为 imagick,但可以通过修改此值来覆盖。详见 https://github.com/nextcloud/all-in-one#how-to-add-php-extensions-permanently-to-the-nextcloud-container # # NEXTCLOUD_ENABLE_DRI_DEVICE: true # 允许为能从中受益的容器启用 /dev/dri 设备。⚠️⚠️⚠️ 警告:这仅在宿主机上存在 '/dev/dri' 设备时才有效!如果你的宿主机上没有它,请不要将此值设置为 true,否则 Nextcloud 容器将启动失败!详见 https://github.com/nextcloud/all-in-one#how-to-enable-hardware-acceleration-for-nextcloud # # NEXTCLOUD_ENABLE_NVIDIA_GPU: true # 允许为能从中受益的容器启用 NVIDIA 运行时和 GPU 访问。⚠️⚠️⚠️ 警告:这仅在服务器上安装了 NVIDIA GPU 时才有效。详见 https://github.com/nextcloud/all-in-one#how-to-enable-hardware-acceleration-for-nextcloud # # NEXTCLOUD_KEEP_DISABLED_APPS: false # 设置为 true 将保留在 AIO 界面中被禁用的 Nextcloud 应用,并且在它们已安装的情况下不会卸载它们。详见 https://github.com/nextcloud/all-in-one#how-to-keep-disabled-apps # # SKIP_DOMAIN_VALIDATION: false # 仅在所有配置都正确的情况下才应设置为 true。详见 https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-skip-the-domain-validation # # TALK_PORT: 3478 # 允许调整 Talk 容器在宿主机上暴露的端口。详见 https://github.com/nextcloud/all-in-one#how-to-adjust-the-talk-port # # WATCHTOWER_DOCKER_SOCKET_PATH: /var/run/docker.sock # 当宿主机上的 docker socket 不在默认的 '/var/run/docker.sock' 位置时需要指定。否则 mastercontainer 更新将失败。对于 macos,它需要是 '/var/run/docker.sock' # # 可选:Caddy 反向代理。详见 https://github.com/nextcloud/all-in-one/discussions/575 # # 或者,如果你还没有域名,可以使用 Tailscale。详见 https://github.com/nextcloud/all-in-one/discussions/6817 # # 提示:你需要取消注释上面的 APACHE_PORT: 11000,将 cloud.example.com 调整为你的域名,并取消注释此文件底部必要的 docker volumes 才能使其工作 # # 你可以在这里找到更多示例:https://github.com/nextcloud/all-in-one/discussions/588 # caddy: # image: caddy:alpine # restart: always # container_name: caddy # volumes: # - caddy_certs:/certs # - caddy_config:/config # - caddy_data:/data # - caddy_sites:/srv # network_mode: "host" # configs: # - source: Caddyfile # target: /etc/caddy/Caddyfile # configs: # Caddyfile: # content: | # # 下面将 cloud.example.com 调整为你的域名 # https://cloud.example.com:443 { # reverse_proxy localhost:11000 # } volumes: # 如果你想将数据存储在不同的驱动器上,请参阅 https://github.com/nextcloud/all-in-one#how-to-store-the-filesinstallation-on-a-separate-drive nextcloud_aio_mastercontainer: name: nextcloud_aio_mastercontainer # 这一行不允许更改,否则内置的备份解决方案将无法工作 # caddy_certs: # caddy_config: # caddy_data: # caddy_sites: # # 调整 docker 网络的 MTU 大小。详见 https://github.com/nextcloud/all-in-one#how-to-adjust-the-mtu-size-of-the-docker-network # networks: # nextcloud-aio: # name: nextcloud-aio # driver_opts: # com.docker.network.driver.mtu: 1440

第三步:配置 FRP (内网穿透)

我们需要把极空间本地的 127.0.0.1:11000 (Nextcloud) 和 127.0.0.1:8082 (AIO 管理后台,可选) 穿透出去。

本地 frpc.ini 配置参考:

js
\[common\] server\_addr \= \<你的云服务器IP\> server\_port \= 7000 \# ... 其他配置 ... \# 转发 Nextcloud 主程序 \[nextcloud-http\] type \= tcp local\_ip \= 127.0.0.1 local\_port \= 11000 remote\_port \= 11000 \# 云服务器上对应的端口 \# (可选) 转发 AIO 管理后台,仅在需要维护时开启 \[nextcloud-aio-admin\] type \= tcp local\_ip \= 127.0.0.1 local\_port \= 8082 remote\_port \= 8082

第四步:配置 Nginx Proxy Manager (云端)

登录你云服务器上的 NPM 管理后台,添加一个新的 Proxy Host

  1. Domain Names: 你的域名 (如 cloud.zym588.space)
  2. Scheme: http (注意是 http,因为 FRP 转发出来的是未加密的流量)
  3. Forward Hostname / IP: 127.0.0.1 (因为 frps 就在这台云服务器上)
  4. Forward Port: 11000 (对应 frpc 里的 remote_port)
  5. Websockets Support: 开启 (Nextcloud 需要)
  6. SSL: 申请并开启 Let's Encrypt 证书,勾选 Force SSL 和 HTTP/2 Support。

第五步:初始化安装

  1. 访问 AIO 管理后台:
    在浏览器打开 https://\<你的局域网IP\>:8082 (或者通过 FRP 的https://\<域名\>:8082)。
    注意:必须使用 HTTPS 访问,接受自签名证书警告。
  2. 输入域名:
    在 "New AIO instance" 页面,输入你的公网域名 cloud.zym588.space
    原理: 因为我们配置了 APACHE_PORT,AIO 会自动识别为“反向代理模式”,并跳过复杂的域名验证步骤。
  3. 启动容器:
    选择时区 (Asia/Shanghai),不勾选 "Install Nextcloud Hub 25" (以安装最新版),然后点击 "Download and start containers"。
  4. 耐心等待:
    这将花费 5-20 分钟。你可以刷新页面查看进度。
  5. 获取密码:
    当所有容器变绿后,AIO 页面会显示初始的 admin 账号和密码。务必保存!

第六步:解决“应用商店空白”问题 (配置代理)

由于 AIO 容器在极空间网络环境下无法直接访问外网(Docker Hub 或 Nextcloud 应用商店),你需要为它配置代理。

注意:AIO 界面没有提供代理设置框,我们必须修改配置文件。

  1. 进入 SSH 终端,连接到极空间。
  2. 使用临时容器修改配置:
    运行以下命令,用 vi 编辑 Nextcloud 的 config.php:
    docker run \-it \--rm \--volume nextcloud\_aio\_nextcloud:/var/www/html:rw alpine sh \-c "vi /var/www/html/config/config.php"
  3. 添加代理代码:
    在文件末尾的 ); 之前,插入以下代码(替换为你自己的代理地址):
js
'proxy' \=\> 'http://\<代理账号\>:\<代理密码\>@\<代理IP\>:\<端口\>', 'proxyexclude' \=\> array ( 0 \=\> 'localhost', 1 \=\> '127.0.0.1', 2 \=\> 'nextcloud-aio-database', 3 \=\> 'nextcloud-aio-redis', 4 \=\> 'nextcloud-aio-apache', 5 \=\> 'nextcloud-aio-mastercontainer', 6 \=\> '你的域名 (cloud.zym588.space)', 7 \=\> '你的极空间内网IP (192.168.31.221)', ),

本文作者:小转圈

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!