跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

在 Ubuntu 上用 Docker Compose 部署 Seafile 专业版,并通过 Nginx 反向代理

一、结论先行

Seafile 专业版对 3 个用户以内免费,无需 license 文件。本文部署方案的核心要点:

  1. 数据目录必须放在 ext4 文件系统上,NTFS、exFAT、fuseblk 会导致启动失败
  2. 不安装 Elasticsearch(省内存),不使用内置 Caddy(用已有 Nginx)
  3. 数据卷路径全部通过 .env 中的绝对路径指定,不依赖 BASIC_STORAGE_PATH
  4. Nginx 需要分别代理 Seahub(8000)和 fileserver(8082)

项目部署在 ~/docker/seafile 目录下,数据存储在 ext4 分区(如 /data/seafile)。

二、关键前提:文件系统必须是 ext4

这是部署前必须确认的一点。Seafile 依赖以下文件系统特性:

  • Linux 标准的 UID/GID 所有权模型
  • chown / chmod 权限修改
  • POSIX 文件锁
  • 目录和文件的原子重命名

NTFS、exFAT、fuseblk 均不满足这些要求,会导致:

  • 数据库初始化失败(MariaDB 拒绝启动)
  • Seafile 启动脚本报 the user running the script is not the owner 错误
  • 进程被 OOM 杀掉(内存不足时表现)
  • block 存储路径配置不生效

结论:数据目录所在的磁盘分区必须是 ext4。如果现有磁盘是 NTFS 且不能格式化,需要分一个新的 ext4 分区,或使用系统盘上的 ext4 目录。

三、环境准备

3.1 系统要求

项目要求
操作系统Ubuntu 22.04 LTS 或更高
CPU / 内存建议 2核4G(Seafile Pro 13 的 seafile-monitor 较占内存)
文件系统ext4(数据目录所在分区)
域名已解析到服务器公网 IP
软件Docker、Docker Compose、Nginx(已通过 apt 安装并占用 80/443)

3.2 创建项目目录

mkdir -p ~/docker/seafile
cd ~/docker/seafile

3.3 准备 ext4 数据目录

假设你有一个 ext4 分区挂载在 /data:

sudo mkdir -p /data/seafile/seafile-data
sudo mkdir -p /data/seafile/seafile-mysql/db

如果使用系统盘上的目录,直接用 ~/docker/seafile/ 下的子目录即可,无需额外操作。

四、下载并配置专业版文件

4.1 下载官方配置文件

cd ~/docker/seafile

wget -O .env https://manual.seafile.com/13.0/repo/docker/pro/env
wget https://manual.seafile.com/13.0/repo/docker/pro/seafile-server.yml

不下载 caddy.yml 和 elasticsearch.yml。

4.2 生成 JWT 私钥

sudo apt install pwgen -y
pwgen -s 40 1

4.3 修改 .env 文件

nano .env

关键配置:

COMPOSE_FILE='seafile-server.yml'
IS_PRO_VERSION=true

SEAFILE_IMAGE=seafileltd/seafile-pro-mc:13.0-latest

# 数据卷路径,全部使用绝对路径指向 ext4 分区
SEAFILE_VOLUME=/data/seafile/seafile-data
SEAFILE_MYSQL_VOLUME=/data/seafile/seafile-mysql/db

SEAFILE_SERVER_HOSTNAME=cloud.example.com
SEAFILE_SERVER_PROTOCOL=https

JWT_PRIVATE_KEY=你生成的40字符密钥

SEAFILE_MYSQL_DB_PASSWORD=Kf9mQ2xP8wN4jF7t
INIT_SEAFILE_MYSQL_ROOT_PASSWORD=wN4jF8tL6bV3yH2s
REDIS_PASSWORD=zC9pK5nG2mT7wR4q

INIT_SEAFILE_ADMIN_EMAIL=admin@example.com
INIT_SEAFILE_ADMIN_PASSWORD=mT2wR7qX5fJ8dN3v

TIME_ZONE=Asia/Shanghai
ENABLE_SEADOC=false

关键点:

  • SEAFILE_VOLUME 和 SEAFILE_MYSQL_VOLUME 使用绝对路径,指向 ext4 分区上的目录
  • 不依赖 BASIC_STORAGE_PATH,每个卷可以独立指定
  • ENABLE_SEADOC=false 关闭 SeaDoc,省内存
  • 密码只使用字母数字,避免特殊字符

4.4 修改 seafile-server.yml

需要做两处修改:

nano seafile-server.yml

第一,暴露两个端口(Seahub 和 fileserver):

    ports:
      - "127.0.0.1:8000:80"
      - "127.0.0.1:8082:8082"

第二,确认 volumes 引用变量:

    volumes:
      - "${SEAFILE_VOLUME:-./seafile-data}:/shared"

五、启动 Seafile

cd ~/docker/seafile
docker compose up -d
docker logs -f seafile

看到以下信息表示成功:

Your seafile server configuration has been finished successfully.
Seafile server started
Seahub is started

如果看到 Failed to start seafile server 和 Killed,说明内存不足,需要给服务器增加内存或关闭其他占用内存的服务。

六、配置 Nginx 反向代理

6.1 Nginx 配置

在 /etc/nginx/sites-available/seafile 中创建:

server {
    listen 80;
    server_name cloud.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name cloud.example.com;

    ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;

    client_max_body_size 0;

    # Seahub(网页界面)
    location / {
        proxy_pass http://127.0.0.1:8000;
        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_read_timeout 36000s;
    }

    # fileserver(文件上传下载)
    location /seafhttp {
        rewrite ^/seafhttp(.*)$ $1 break;
        proxy_pass http://127.0.0.1:8082;
        proxy_set_header Host $host;
        client_max_body_size 0;
        proxy_read_timeout 36000s;
        proxy_request_buffering off;
        proxy_buffering off;
    }
}

关键说明:

  • /seafhttp 必须代理到 8082,不是 8000。这是文件上传下载的专用端点
  • proxy_request_buffering off 和 proxy_buffering off 关闭缓冲,避免上传卡顿
  • client_max_body_size 0 移除上传大小限制

6.2 启用配置并申请证书

sudo ln -s /etc/nginx/sites-available/seafile /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d cloud.example.com

七、验证部署

# 确认容器状态
docker compose ps

# 确认两个端口都在监听
curl -I http://127.0.0.1:8000
curl -I http://127.0.0.1:8082

浏览器访问 https://cloud.example.com,用 .env 中设置的管理员邮箱和密码登录。

检查 FILE_SERVER_ROOT

登录后进入系统管理 → 设置,确认:

SERVICE_URL = https://cloud.example.com
FILE_SERVER_ROOT = https://cloud.example.com/seafhttp

FILE_SERVER_ROOT 必须包含 /seafhttp,否则上传会返回 404。

八、客户端使用

客户端用途
桌面同步客户端本地文件夹自动双向同步
SeaDrive挂载为网络驱动器
移动 App照片自动备份

客户端从 Seafile 官网下载。

九、备份策略

数据库备份:

docker exec seafile-mysql mysqldump -u root -p${INIT_SEAFILE_MYSQL_ROOT_PASSWORD} --all-databases > seafile-db-backup.sql

数据目录备份:

rsync -Aax --delete /data/seafile/seafile-data/ /mnt/backup/seafile-data/

数据库和数据目录必须来自同一时间点,恢复时先恢复数据库,再恢复数据目录。

十、常见问题排查

现象可能原因处理方向
502 Bad GatewayNginx 无法连接到 8000确认容器 running,端口映射正确
上传返回 404/seafhttp 代理到了 8000 而非 8082检查 Nginx 中 /seafhttp 的 proxy_pass
Failed to start seafile server + Killed内存不足,进程被 OOM 杀掉free -h 确认内存,关闭其他服务或增加内存
the user running the script is not the owner数据目录在 NTFS 上改用 ext4 分区
MariaDB 初始化失败数据库目录在 NTFS 上改用 ext4 分区

十一、重要提醒

关于文件系统:数据目录必须放在 ext4 分区上。NTFS、exFAT、fuseblk 均不支持 Seafile 和 MariaDB 所需的 Linux 文件权限模型,会导致启动失败或运行异常。

关于 license:3 用户以内无需 license 文件,Seafile 会以试用模式运行。超过 3 个用户需购买许可证,将 seafile-license.txt 放入 ~/docker/seafile/seafile-data/seafile/。

关于备份:Seafile 的用户文件是分块加密存储,不能直接拷贝服务器文件夹来备份。必须数据库 dump + 数据目录 rsync,两者来自同一时间点。

关于 Nginx 与 Caddy:必须使用 seafile-server.yml 而不是 caddy.yml,否则两个服务会争抢 80/443 导致启动失败。

作者

老丹

关注我
其他文章
上一个

Performance Co-Pilot (PCP) 深度详解

下一个

四种硬件加速接口详解:QSV、VA-API、VideoToolbox 与 RKMPP

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • 在 Windows 里养一只 Linux:WSL 完整指南 2026年10月24日
  • Paho MQTT C 与 C++ 客户端库完全指南:从概念到 Ubuntu 26.04 下的编译、安装与使用 2026年10月23日
  • Mosquitto $SYS 主题详解:Broker 自监控指南 2026年10月23日
  • 应用级 MQTT 服务搭建完全指南:Mosquitto + 宿主机 Nginx 2026年10月22日
  • OpenWrt 固件签名三剑客:usign、ucert 与 fwtool 深度解析 2026年10月21日

文章分类

  • C/C++开发 (22)
  • Docker容器 (5)
  • Linux工具包 (21)
  • Linux服务配置 (53)
  • Linux系统 (16)
  • MQTT技术 (6)
  • OpenWrt路由 (5)
  • Shell脚本 (3)
  • 代码管理 (1)
  • 安防技术 (4)
  • 数据安全 (36)
  • 网络协议 (25)
  • 计算机理论 (23)
  • 问题解决 (3)
  • 防火墙 (6)
  • 音视频技术 (6)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号