在 Ubuntu 上用 Docker Compose 部署 Seafile 专业版,并通过 Nginx 反向代理
一、结论先行
Seafile 专业版对 3 个用户以内免费,无需 license 文件。本文部署方案的核心要点:
- 数据目录必须放在 ext4 文件系统上,NTFS、exFAT、fuseblk 会导致启动失败
- 不安装 Elasticsearch(省内存),不使用内置 Caddy(用已有 Nginx)
- 数据卷路径全部通过
.env中的绝对路径指定,不依赖BASIC_STORAGE_PATH - 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 Gateway | Nginx 无法连接到 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 导致启动失败。