本文介绍如何将使用 Linux 二进制安装包部署的 Seafile 迁移到 Docker 部署。适用于 Seafile 14.0 和 13.0 的社区版与专业版,以
两台服务器之间的迁移
为例。
建议先在新服务器完成 Docker 环境准备,再在维护窗口内停止旧服务器上的写入服务、备份数据并切换业务。迁移过程中应保留旧服务器及其备份,确认新环境可用后再下线旧环境。
适用范围: 下文以单节点部署为例。对于集群部署,除数据库迁移外,需在所有相关节点执行对应操作,并统一协调停服与启动顺序。同机迁移: 如果需要在原服务器上迁移,请提前处理 /opt/seafile 目录占用、80/443 端口冲突以及数据库服务冲突。不要直接在现有二进制安装目录中执行下文的 Docker 初始化命令。
迁移步骤概览
-
核实版本、数据库、存储路径和扩展组件,准备备份及回退方案。
-
停止旧环境中的 Seafile 及相关写入服务。
-
备份 Seafile 数据目录及数据库。
-
在新服务器准备 Docker Compose 文件与 .env 。
-
恢复 Seafile 数据目录;如改用新的数据库容器,再恢复数据库。
-
启动新环境,验证后完成业务切换。
一、迁移前准备
检查现有部署
迁移前请确认以下信息:
-
Seafile 的版本及版本类型(社区版或专业版)。
-
MySQL/MariaDB 的地址、端口、数据库名称和连接账户。
-
Seafile 数据目录、配置文件目录,以及是否使用外部存储(如 S3)。
-
域名、HTTPS、反向代理、邮件、LDAP/SSO 等配置。
-
SeaDoc、搜索引擎及其他扩展组件的部署情况。
迁移部署方式不等同于升级 Seafile 版本。
如果旧服务器版本与目标 Docker 版本不同,请先确认升级路径,按
Seafile 升级说明
完成所需的版本升级与兼容性检查,不要将较旧版本数据库直接交给未经验证的高版本容器初始化。
建议预留维护窗口,并确认有一份可以实际恢复的完整备份。使用外部对象存储时,还应确保新服务器能够访问原有存储桶,并妥善保存访问密钥。
二、停止旧服务器上的服务
1. 停止 Seafile 和 Seahub
在旧服务器上,以运行 Seafile 的用户执行以下命令(路径请根据实际安装位置调整):
su - seafile
cd /opt/seafile/seafile-server-latest
./seahub.sh stop
./seafile.sh stop
如果旧环境使用 Python 虚拟环境,请先按该环境的实际路径激活虚拟环境,再执行相关维护命令。
如部署了 SeaDoc 等扩展组件,请先按各组件的停止方法停止服务,避免未保存的编辑内容丢失。
2. 停止反向代理及缓存服务
如果 Nginx、Redis 或 Memcached
仅供旧 Seafile 使用
,可在旧服务器上根据实际部署情况停止相应服务:
sudo systemctl stop nginx
sudo systemctl stop redis
# 使用 Memcached 时执行:
# sudo systemctl stop memcached
如旧环境的 Elasticsearch 是独立运行的搜索服务,也应按实际部署方式停止其写入或索引任务。
不要直接删除旧搜索容器或索引数据
,以便迁移失败时回退。
若这些服务还被其他应用使用,不要直接停止共享服务。对于继续供其他应用使用的 MySQL/MariaDB,同样不要在此阶段停止数据库服务。
三、备份数据与数据库
Seafile 的完整备份通常包含资料库数据和三个数据库:
ccnet_db
、
seafile_db
、
seahub_db
(实际名称以原配置为准)。无论后续是否沿用旧数据库,迁移前都建议先备份数据库,以便回退。
下面以旧二进制安装目录为
/opt/seafile
、备份目录为
/backup
为例:
sudo mkdir -p /backup/data/seafile /backup/databases
sudo rsync -aHAX /opt/seafile/ /backup/data/seafile/
数据库应另行导出,建议分别保存为以下文件(文件名仅为示例):
/backup/databases/ccnet_db.sql
/backup/databases/seafile_db.sql
/backup/databases/seahub_db.sql
请检查备份中至少包含实际使用的
conf
、
seafile-data
、
seahub-data
等目录,并将备份安全传输到新服务器。若专业版或扩展组件使用额外的数据目录,也需要按实际部署情况一并备份。
四、在新服务器准备 Docker 部署
Docker Compose 文件默认放在
/opt/seafile
,Seafile 持久化数据默认放在
/opt/seafile-data
。
不要将旧二进制部署的
.env
文件直接作为 Docker 的
.env
使用
;应下载与目标版本相匹配的模板,再根据旧环境配置修改必要字段。
以下模板下载命令需要对
/opt/seafile
有写入权限,可先以
sudo -i
进入 root shell 执行。
Seafile 14.0(推荐)
根据版本类型选择以下
一组
命令。
社区版:
mkdir -p /opt/seafile
cd /opt/seafile
wget -O .env https://manual.seafile.com/14.0/repo/docker/ce/env
wget https://manual.seafile.com/14.0/repo/docker/ce/seafile-server.yml
wget https://manual.seafile.com/14.0/repo/docker/seadoc.yml
wget https://manual.seafile.com/14.0/repo/docker/caddy.yml
专业版:
mkdir -p /opt/seafile
cd /opt/seafile
wget -O .env https://manual.seafile.com/14.0/repo/docker/pro/env
wget https://manual.seafile.com/14.0/repo/docker/pro/seafile-server.yml
wget https://manual.seafile.com/14.0/repo/docker/pro/seasearch.yml
wget https://manual.seafile.com/14.0/repo/docker/seadoc.yml
wget https://manual.seafile.com/14.0/repo/docker/caddy.yml
编辑
.env
:
nano /opt/seafile/.env
重点检查以下配置:
配置项
说明
SEAFILE_SERVER_HOSTNAME
用户访问 Seafile 使用的域名。
SEAFILE_SERVER_PROTOCOL
对外使用的协议,
http
或
https
。
SEAFILE_MYSQL_DB_HOST
/
SEAFILE_MYSQL_DB_PORT
数据库地址和端口;使用内置数据库时通常为
db
和
3306
。
SEAFILE_MYSQL_DB_USER
/
SEAFILE_MYSQL_DB_PASSWORD
Seafile 使用的数据库账户及密码,应与恢复后的数据库匹配。
INIT_SEAFILE_MYSQL_ROOT_PASSWORD
新数据库容器首次初始化时需要的 root 密码。
JWT_PRIVATE_KEY
至少 32 个字符的 JWT 私钥。
SEAFILE_VOLUME
/
BASIC_STORAGE_PATH
持久化路径相关设置;使用自定义路径时,应与恢复目标一致。
数据库部署方式二选一:
-
使用 Docker Compose 内置的 MariaDB: 后续按本指南恢复数据库备份。
在实际资料库数据和数据库恢复完成之前,不要将新 Seafile 应用服务开放给用户使用。尤其不要让尚未恢复文件数据的新应用服务连接到仍在运行的生产数据库。
Seafile 13.0
目标版本为 13.0 时,应使用对应的 13.0 模板,不要将 13.0 和 14.0 的 YAML 文件混用。
社区版:
mkdir -p /opt/seafile
cd /opt/seafile
wget -O .env https://manual.seafile.com/13.0/repo/docker/ce/env
wget https://manual.seafile.com/13.0/repo/docker/ce/seafile-server.yml
wget https://manual.seafile.com/13.0/repo/docker/seadoc.yml
wget https://manual.seafile.com/13.0/repo/docker/caddy.yml
专业版:
mkdir -p /opt/seafile
cd /opt/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
wget https://manual.seafile.com/13.0/repo/docker/pro/elasticsearch.yml
wget https://manual.seafile.com/13.0/repo/docker/seadoc.yml
wget https://manual.seafile.com/13.0/repo/docker/caddy.yml
Seafile 13 专业版的标准 Docker 部署使用 Elasticsearch;如需改用 SeaSearch,应另外完成对应配置。其他迁移步骤与下文一致。
五、在新服务器恢复 Seafile 数据
在包含
.env
的 Docker Compose 目录下操作。若曾启动过新环境,应先停止容器:
cd /opt/seafile
docker compose down
确认新服务器已经收到备份数据后,创建持久化目录:
sudo mkdir -p /opt/seafile-data/seafile
下面假设备份中包含旧二进制部署的
conf
、
ccnet
、
seafile-data
和
seahub-data
目录。请按
实际存在的目录
恢复,不要把旧版本程序文件当作 Docker 镜像文件复制:
sudo rsync -aHAX /backup/data/seafile/conf/ /opt/seafile-data/seafile/conf/
# 如果原部署存在 ccnet 目录,还应恢复该目录:
# sudo rsync -aHAX /backup/data/seafile/ccnet/ /opt/seafile-data/seafile/ccnet/
sudo rsync -aHAX /backup/data/seafile/seafile-data/ /opt/seafile-data/seafile/seafile-data/
sudo rsync -aHAX /backup/data/seafile/seahub-data/ /opt/seafile-data/seafile/seahub-data/
如专业版或扩展组件还有
pro-data
等其他持久化数据目录,也应根据实际目录结构恢复。
专业版授权文件:
如已购买专业版授权,请将
seafile-license.txt
放到 Seafile 容器的数据卷根目录(默认
/opt/seafile-data/seafile-license.txt
)。如果自定义了数据卷路径,请使用对应路径;不要更改授权文件名。
恢复配置文件后,请检查其中的数据库连接信息、存储路径、域名、缓存和扩展组件配置是否与 Docker 环境一致。
不要用新生成的空白配置覆盖从旧环境恢复的有效配置,也不要不加检查地沿用二进制部署中的绝对路径。
上述路径适用于默认 Docker 数据卷位置。如果修改过 .env 中的持久化路径,应恢复到对应的实际目录。
六、恢复数据库
方式一:使用 Docker Compose 内置的 MariaDB
仅启动数据库服务
,避免 Seafile 应用容器在数据库恢复前进行初始化或写入:
cd /opt/seafile
docker compose up -d --no-deps db
将备份中的
ccnet_db
、
seafile_db
和
seahub_db
恢复到目标数据库,操作详见
备份与恢复
。数据库名称如有自定义,应与
.env
及恢复的 Seafile 配置保持一致。
如果备份文件不包含创建数据库的语句,请先在目标 MariaDB 中创建对应的空数据库,再导入 SQL 文件。请使用具有适当权限的数据库管理账户操作,
不需要
给 Seafile 业务账户授予
*.*
范围内的全局权限或
GRANT OPTION
。
如使用默认数据库名,可先进入 MariaDB 管理终端创建数据库及 Seafile 业务账户(把示例密码替换为
.env
中的
SEAFILE_MYSQL_DB_PASSWORD
):
docker exec -it seafile-mysql mariadb -u root -p
CREATE DATABASE IF NOT EXISTS ccnet_db;
CREATE DATABASE IF NOT EXISTS seafile_db;
CREATE DATABASE IF NOT EXISTS seahub_db;
CREATE USER IF NOT EXISTS 'seafile'@'%' IDENTIFIED BY 'your-seafile-db-password';
GRANT ALL PRIVILEGES ON ccnet_db.* TO 'seafile'@'%';
GRANT ALL PRIVILEGES ON seafile_db.* TO 'seafile'@'%';
GRANT ALL PRIVILEGES ON seahub_db.* TO 'seafile'@'%';
EXIT;
如果数据库名称、业务账户或目标数据库版本与示例不同,应根据原环境进行相应调整,并确认导出的 SQL 与目标 MySQL/MariaDB 版本兼容。
例如,使用默认容器名
seafile-mysql
时,可以先将备份复制到容器,再进入容器进行导入:
docker cp /backup/databases/ccnet_db.sql seafile-mysql:/tmp/ccnet_db.sql
docker cp /backup/databases/seafile_db.sql seafile-mysql:/tmp/seafile_db.sql
docker cp /backup/databases/seahub_db.sql seafile-mysql:/tmp/seahub_db.sql
docker exec -it seafile-mysql sh
# 在容器中,确认目标数据库已创建后,依次执行:
mariadb -u root -p ccnet_db < /tmp/ccnet_db.sql
mariadb -u root -p seafile_db < /tmp/seafile_db.sql
mariadb -u root -p seahub_db < /tmp/seahub_db.sql
exit
以上示例使用默认数据库名和容器名。对于自定义数据库名、权限或 MySQL 镜像,请按实际情况调整;如果使用 MySQL 镜像而非 MariaDB,客户端命令通常为
mysql
。
完成恢复后停止数据库容器,准备统一启动:
docker compose down
方式二:沿用现有 MySQL/MariaDB
如果继续使用旧数据库或其他外部数据库,
无需执行上一节的
db
服务启动及 SQL 导入操作
。应确认以下条件:
-
外部数据库保持可用,新 Docker 服务器可以连接其地址和端口。
-
.env 中的数据库名称、账户、密码与旧数据库一致。
-
应用切换前,旧 Seafile 已经停止写入,文件数据与数据库处于一致状态。
七、启动并验证新环境
在 Docker Compose 工作目录中检查配置并启动服务:
cd /opt/seafile
docker compose config --quiet
docker compose up -d
docker compose ps
查看 Seafile 日志:
docker logs -f seafile
启动完成后,请使用配置的域名访问 Seafile,并检查:
-
原有管理员和普通用户能否登录。
-
资料库、目录及文件能否正常列出、预览、下载和上传。
-
文件权限、共享链接及历史版本是否正常。
-
SeaDoc、搜索、WebDAV 等已启用组件是否工作正常。
-
新旧服务器的文件和数据库状态是否符合预期。
确认新服务正常且已完成 DNS、反向代理等流量切换后,再视情况停止旧 MySQL/MariaDB。
如果旧数据库仍供其他系统使用,不要停止它。
建议在确认迁移成功并经过适当观察期后,再考虑清理旧部署及备份;在此之前保留回退所需的数据和配置。