跳到主要内容

主机资讯与使用指南

Nextcloud Docker 部署:个人文件、域名与后台任务

使用 Nextcloud Apache 镜像与 MariaDB 部署个人文件服务,配置持久化、HTTPS、可信代理和定时任务。

文件库与数据库分别保存

本文采用 Nextcloud 社区维护的 Apache 镜像,程序与 MariaDB 分开运行。已经安装 Docker Compose,并准备 files.example.com 域名;域名改成自己的实际地址。

文件容量按现有资料和增长量选择,内存按用户、应用和并发决定。数据库、配置与上传目录都需要持久化;容器存在不等于文件已经备份。

建立配置与密码

sudo mkdir -p /opt/nextcloud
sudo chown "$(id -u):$(id -g)" /opt/nextcloud
cd /opt/nextcloud
umask 077
printf "DB_PASSWORD=%s\nDB_ROOT_PASSWORD=%s\n" "$(openssl rand -hex 24)" "$(openssl rand -hex 24)" > .env

创建 compose.yml。示例使用 33 系列镜像,并按该系列文档配置;后续大版本升级按官方顺序逐版进行,不直接跳过多个大版本。

services:
  db:
    image: mariadb:10.11
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    environment:
      MARIADB_DATABASE: nextcloud
      MARIADB_USER: nextcloud
      MARIADB_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD}
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:?set DB_ROOT_PASSWORD}
    volumes:
      - ./database:/var/lib/mysql
  app:
    image: nextcloud:33-apache
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD}
      NEXTCLOUD_TRUSTED_DOMAINS: files.example.com
      OVERWRITEPROTOCOL: https
      OVERWRITECLIURL: https://files.example.com
    volumes:
      - ./nextcloud:/var/www/html
    depends_on:
      - db

启动并建立 HTTPS 入口

docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=100 app

数据库首次初始化需要时间。应用出现数据库连接错误时,先看 db 日志,初始化完成后再查看 app 状态。示例端口只对本机开放,由宿主机 Caddy 接收域名请求。

files.example.com {
    redir /.well-known/carddav /remote.php/dav/ 301
    redir /.well-known/caldav /remote.php/dav/ 301
    reverse_proxy 127.0.0.1:8080
}

域名指向 VPS,开放 80、443,并按 Caddy 教程检查与重载配置。Caddy 在容器中运行时,应另建共享网络并连接 app:80,不能照用宿主机 localhost。

建立管理员与可信代理

通过 HTTPS 域名完成初始化,创建管理员。打开管理概览,检查域名、后台任务和代理提示。

Nextcloud 需要明确可信代理地址。宿主机经 Docker 端口映射访问时,可先查看 app 所在网络的网关,并结合访问日志确认来源,再将实际代理地址写入 trusted_proxies;不要信任整个公网。

docker inspect "$(docker compose ps -q app)" --format '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}'

确认后执行下列命令,把示例地址换成刚确认的代理来源。

docker compose exec -u www-data app php occ config:system:set trusted_proxies 0 --value='172.18.0.1'

安排后台任务与备份

先将后台任务模式改为 Cron:

docker compose exec -u www-data app php occ background:cron

Nextcloud 需要定期运行 cron.php。在可以执行 Docker 的系统用户 crontab 中添加下面任务;确认 docker 的实际路径,示例为 /usr/bin/docker。

*/5 * * * * cd /opt/nextcloud && /usr/bin/docker compose exec -T -u www-data app php -f /var/www/html/cron.php

任务运行后,在管理页检查最近执行时间。上传一个文件,通过另一台设备下载,再测试分享链接。

备份保存 nextcloud 目录、数据库逻辑导出、compose.yml 和 .env。数据库不能只复制运行中的 ./database;恢复时先建立对应版本环境,再导入数据库和文件。

相关阅读