在 Ubuntu 上用 Docker Compose 部署 Nextcloud AIO
一、结论先行
AIO 的部署确实高度依赖管理界面,但核心的存储路径和反向代理参数,仍然需要在 Docker Compose 的环境变量中预先设定。对于使用 apt install nginx 的 Ubuntu 系统,让 AIO 退居内部端口、由 Nginx 独占 80/443,核心操作如下:
- AIO 侧设置
APACHE_PORT=11000,让 Apache 监听内部端口 - 设置
SKIP_DOMAIN_VALIDATION=true跳过 AIO 自带的域名验证 - 在 Compose 文件中通过
NEXTCLOUD_DATADIR指定用户数据的存储目录 - Nginx 侧配置
proxy_pass指向127.0.0.1:11000,SSL 证书由 Certbot 自动管理
二、理解 AIO 的管理模式
AIO(All-in-One)的 nextcloud-aio-mastercontainer 是一个“管理器”,真正的 Nextcloud 服务运行在它自动创建的兄弟容器中。大多数功能配置(启用 Collabora、Talk、ClamAV 等)都是在 AIO 管理界面中通过勾选完成的。
但有两类配置必须在 Compose 文件中完成:
- 反向代理相关参数(
APACHE_PORT、SKIP_DOMAIN_VALIDATION) - 数据存储路径(
NEXTCLOUD_DATADIR),且只在首次安装时生效
整体架构如下:
外部请求 → Nginx (443, SSL终止) → AIO Apache容器 (11000) → Nextcloud
↑
SSL证书由Certbot统一管理
三、前置条件
| 项目 | 要求 |
|---|---|
| 操作系统 | Ubuntu 22.04 LTS 或更高 |
| 硬件 | 至少 4GB RAM,2 核 CPU |
| 软件 | Docker 已安装,Nginx 已通过 apt 安装并运行 |
| 域名 | 已解析到服务器公网 IP |
| 网络 | 服务器可正常访问 GitHub(AIO 需要下载组件) |
四、AIO 侧配置
4.1 创建项目目录
mkdir -p ~/docker/nextcloud-aio && cd ~/docker/nextcloud-aio
4.2 关于数据存储目录的配置
AIO 默认将用户数据存储在 Docker 卷 nextcloud_aio_nextcloud_data 中(位于 /var/lib/docker/volumes/ 下)。如果需要指定到其他磁盘或目录,必须在首次安装前通过 NEXTCLOUD_DATADIR 环境变量设置。
重要限制:该变量只支持内部磁盘(SATA/NVMe),不支持 USB 外置硬盘或网络共享(CIFS/SMB)。
4.3 编写 Compose 文件
创建 compose.yaml:
name: nextcloud-aio
services:
nextcloud-aio-mastercontainer:
image: ghcr.io/nextcloud-releases/all-in-one:latest
init: true
restart: always
container_name: nextcloud-aio-mastercontainer
ports:
- "8080:8080" # AIO 管理界面
volumes:
- nextcloud_aio_mastercontainer:/mnt/docker-aio-config
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- APACHE_PORT=11000 # Apache 监听内部端口
- APACHE_IP_BINDING=0.0.0.0 # 允许从容器外部访问
- SKIP_DOMAIN_VALIDATION=true # 跳过 AIO 内置域名验证
- NEXTCLOUD_DATADIR=/mnt/your-drive/ncdata # 用户数据存储目录(可选,仅首次生效)
volumes:
nextcloud_aio_mastercontainer:
name: nextcloud_aio_mastercontainer # 官方要求此名称不可更改
4.4 环境变量说明
| 变量 | 作用 |
|---|---|
APACHE_PORT=11000 | 让 AIO 的 Apache 监听 11000,释放 80/443 给 Nginx |
APACHE_IP_BINDING=0.0.0.0 | 允许 Nginx 从容器外部访问此端口 |
SKIP_DOMAIN_VALIDATION=true | 跳过域名验证。该验证依赖 AIO 占用 80/443,反向代理场景下无法通过 |
NEXTCLOUD_DATADIR | 指定用户数据的宿主机目录,仅在首次安装时生效 |
4.5 设置数据目录权限(如使用 NEXTCLOUD_DATADIR)
Nextcloud 容器内的用户 UID 是 33,需要设置正确权限:
sudo mkdir -p /mnt/your-drive/ncdata
sudo chown -R 33:0 /mnt/your-drive/ncdata
sudo chmod -R 750 /mnt/your-drive/ncdata
4.6 启动 AIO
docker compose up -d
4.7 完成初始化
- 浏览器访问
https://你的服务器IP:8080(务必用 IP,避免 HSTS 问题) - 输入密码(查看:
docker logs nextcloud-aio-mastercontainer) - 在界面中填写你的域名
- 在可选容器区域选择需要的组件(Office、Talk 等),然后点击安装
五、Nginx 反向代理配置
5.1 Ubuntu 的 Nginx 配置目录
通过 apt install nginx 安装的 Nginx,站点配置采用 sites-available / sites-enabled 模式:
/etc/nginx/sites-available/:存放站点配置文件/etc/nginx/sites-enabled/:存放指向sites-available/的符号链接
5.2 创建站点配置
sudo nano /etc/nginx/sites-available/nextcloud
先只写 80 端口的配置,443 的 SSL 部分交给 Certbot:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name cloud.你的域名.com;
# 大文件上传必需
client_max_body_size 0;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
location / {
proxy_pass http://127.0.0.1:11000$request_uri;
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 $scheme;
proxy_set_header X-Forwarded-Port $server_port;
# WebSocket 支持(Talk 实时通信需要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# 关闭缓冲,对媒体流播放很重要
proxy_buffering off;
}
}
5.3 关键配置说明
| 配置项 | 作用 |
|---|---|
client_max_body_size 0 | 移除上传大小限制 |
proxy_read_timeout 86400s | 延长超时,避免大文件上传中断 |
X-Forwarded-Proto $scheme | 告诉 Nextcloud 外部连接协议 |
| WebSocket 头部 | Nextcloud Talk 依赖 WebSocket |
proxy_buffering off | 对视频等媒体文件的 Range 请求至关重要 |
5.4 启用配置并申请证书
# 创建软链接
sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重载 Nginx
sudo systemctl reload nginx
# 安装 Certbot 并自动申请证书
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d cloud.你的域名.com
Certbot 会自动申请证书、插入 443 的 SSL 配置、设置 HTTP 到 HTTPS 的重定向,并配置自动续期。
六、验证部署
访问 https://你的域名,应看到 Nextcloud 登录页面。初始管理员账号和密码显示在 AIO 管理界面中(点击 “Click here to reveal the initial Nextcloud credentials” 查看)。
七、常见问题排查
| 现象 | 可能原因 | 处理方向 |
|---|---|---|
| 502 Bad Gateway | Nginx 无法连接到 11000 | 检查 APACHE_IP_BINDING=0.0.0.0;确认 Apache 容器已 Running |
| AIO 域名验证失败 | 未设置跳过验证 | 确认 SKIP_DOMAIN_VALIDATION=true |
| 数据存储位置不对 | NEXTCLOUD_DATADIR 未生效 | 该变量仅在首次安装时生效,需重置实例才能更改 |
| 上传大文件失败 | client_max_body_size 太小 | 设为 0 或足够大的值 |
| Talk 通话异常 | 缺少 WebSocket 头部 | 添加 Upgrade 和 Connection 头部 |
八、AIO 管理的核心原则
AIO 的设计哲学是“管理器集中控制”。以下操作必须在 AIO 管理界面中完成:
| 操作 | 位置 |
|---|---|
| 启用/禁用可选容器(Office、Talk、ClamAV 等) | AIO 界面 → Optional containers |
| 备份与恢复 | AIO 界面 → Backup and restore |
| 容器更新 | AIO 界面 → Stop containers → Start and update |
| 查看容器日志 | AIO 界面 → 点击容器旁的 “Starting/Running” 链接 |
而以下配置必须在 Compose 文件中预先设定(且多数仅首次安装时生效):
- 反向代理参数(
APACHE_PORT、SKIP_DOMAIN_VALIDATION) - 数据存储路径(
NEXTCLOUD_DATADIR)
九、重要提醒
关于备份:AIO 内置 BorgBackup,首次备份后可在界面启用每日自动备份。备份加密密码务必妥善保存。如果数据存储在自定义的 NEXTCLOUD_DATADIR 中,AIO 的备份不会自动包含该目录,需要在 AIO 界面中额外指定备份路径。
关于更新:不要用 Watchtower 等工具自动更新 AIO。正确方式是在 AIO 管理界面手动执行更新。