Seafile 可以通过内置的迁移脚本,在文件系统、S3、Ceph、OpenStack Swift 和阿里云 OSS 等存储后端之间迁移数据。本文适用于 Seafile 14.0 和 13.0,主要介绍 Docker 部署方式,并提供二进制部署的对应命令。
迁移的基本过程是:准备目标存储和临时配置 → 停止写入 → 运行迁移脚本 → 验证目标数据 → 切换配置并启动服务。
迁移前的准备
- 确认源存储和目标存储均可访问,目标存储容量、权限和网络连通性满足要求。如果迁移涉及 S3,请确认 S3 服务端点可以正常访问;涉及两个 S3 服务端点时,两个端点均需可用。
- 准备目标存储所需的存储桶、访问密钥或本地目录,并确认运行 Seafile 的容器或系统能够访问目标存储。
- 如果迁移涉及 S3(从 S3 迁出或迁入 S3),应使用 V4 签名认证。使用 V2 签名时,迁移脚本可能无法正确列出 S3 对象。
- 规划维护时间。推荐在停止用户写入后完成迁移和配置切换。数据量较大时,可使用文末介绍的“两轮迁移”方式缩短停机时间。
- 确认安装目录及持久化目录。下文使用 Docker 默认路径;如已自定义路径,请对应调整。
用途
Docker 宿主机路径
Docker 容器内路径
当前 Seafile 配置
/opt/seafile-data/seafile/conf/seafile.conf
/shared/seafile/conf/seafile.conf
临时的目标存储配置
/opt/seafile-data/seafile.conf
/shared/seafile.conf
Seafile 程序目录
—
/opt/seafile/seafile-server-latest
这里的路径仅适用于默认 Docker 数据挂载方式。运行迁移脚本时,应传入容器内的临时配置文件所在目录,而不是宿主机目录。
1. 创建临时配置文件
Docker 部署
在宿主机上复制现有配置文件,保留原有其他配置,仅将复制文件中指向存储后端的部分修改为目标存储配置:
cp -a /opt/seafile-data/seafile/conf/seafile.conf \ /opt/seafile-data/seafile.confnano /opt/seafile-data/seafile.conf请确保容器中的 Seafile 进程能够读取 /shared/seafile.conf。不要将临时配置文件放在未挂载到容器的宿主机目录。
二进制包部署
在服务器上执行:
cp -a /opt/seafile/conf/seafile.conf /opt/seafile.confnano /opt/seafile.conf下文中的配置示例均用于修改这个临时seafile.conf 文件。请勿直接覆盖正在使用的配置文件,也不要删除原文件中的其他必要配置项。
迁移到 S3
如果目标存储是 Amazon S3 或兼容 S3 的对象存储,可在临时文件中配置以下三个后端。将存储桶、密钥及区域替换为实际值:
[commit_object_backend]name = s3bucket = my-commit-objectskey_id = your-key-idkey = your-secret-keyuse_v4_signature = trueuse_https = trueaws_region = eu-central-1[fs_object_backend]name = s3bucket = my-fs-objectskey_id = your-key-idkey = your-secret-keyuse_v4_signature = trueuse_https = trueaws_region = eu-central-1[block_backend]name = s3bucket = my-block-objectskey_id = your-key-idkey = your-secret-keyuse_v4_signature = trueuse_https = trueaws_region = eu-central-1迁移到本地文件系统
如果目标存储是本地文件系统,可以在临时文件中使用以下配置:
[commit_object_backend]name = fsdir = /var/data_backup[fs_object_backend]name = fsdir = /var/data_backup[block_backend]name = fsdir = /var/data_backupdir 是 Seafile 进程所看到的目录。如果使用 Docker,必须提前将宿主机的目标目录挂载到容器中的 /var/data_backup(或相应的自定义路径),并确保目录可读写。不要直接把未挂载的宿主机路径填入配置。
迁移到阿里云 OSS
如果目标存储使用阿里云 OSS,可将临时配置中的三个存储后端修改为相应的 OSS 配置。下面的密钥和存储桶名称仅用于示例:
[commit_object_backend]name = osskey_id = your-access-key-idkey = your-access-key-secretbucket = seafcommendpoint = oss-cn-shanghai.aliyuncs.com[fs_object_backend]name = osskey_id = your-access-key-idkey = your-access-key-secretbucket = seaffsendpoint = oss-cn-shanghai.aliyuncs.com[block_backend]name = osskey_id = your-access-key-idkey = your-access-key-secretbucket = seafblkendpoint = oss-cn-shanghai.aliyuncs.com实际使用时请根据 OSS 服务端点和授权信息调整。迁移到 Ceph 或 Swift 等其他后端时,应在临时 seafile.conf 中使用对应后端的配置。
2. 停止 Seafile 服务
为了避免迁移期间有文件继续写入源存储,建议先停止 Seafile 服务,再运行迁移脚本。这样不需要在最终切换时再追赶新增对象,但停机时间可能较长。
Docker 部署
在宿主机上进入 Seafile 容器:
docker exec -it seafile bash随后在容器内停止 Seahub 和 Seafile:
cd /opt/seafile/seafile-server-latest./seahub.sh stop./seafile.sh stop此时先不要执行 docker compose down,因为下一步需要在容器内运行迁移脚本。
二进制包部署
cd /opt/seafile/seafile-server-latest./seahub.sh stop./seafile.sh stop请同时确认没有其他应用或定时任务持续向源存储写入数据。
3. 运行迁移脚本
Docker 部署
继续在Seafile 容器内、/opt/seafile/seafile-server-latest 目录下执行:
./migrate.sh /shared/shared 是容器内存放临时 seafile.conf 的目录,对应宿主机的 /opt/seafile-data。不要在 Docker 部署中使用 /opt 来代替 /shared。
二进制包部署
在 /opt/seafile/seafile-server-latest 目录下执行:
./migrate.sh /opt迁移脚本会将源存储中的 commits、fs 和 blocks 对象迁移到目标存储。迁移成功时,日志中通常会出现如下提示:
Complete migrate [commits] objectComplete migrate [blocks] objectComplete migrate [fs] objectDone.只有看到脚本正常结束且实际检查目标数据无误后,才能继续切换配置。若出现错误,应先排查网络、存储桶权限、挂载目录或密钥设置,不要直接修改线上配置。
可选:迁移旧式加密存储数据
对于使用旧式加密存储后端的特殊场景,迁移脚本提供 --decrypt 参数,可在迁移时解密对象,并将解密后的数据写入目标后端。不过,该能力在官方文档中标注为 deprecated(已弃用),仅建议在确认现有数据格式及迁移目标的情况下使用。
Docker 示例:
./migrate.sh /shared --decrypt执行前应先在测试环境验证结果,并保留完整备份。一般存储后端迁移无需添加此参数。
4. 验证数据并切换配置
迁移脚本完成后,检查目标存储中的对象数量、数据大小和可读取情况。若使用 S3,可在对象存储控制台核对相应存储桶;如果使用本地目录,确认 commits、fs 和 blocks 对象已正确写入。验证通过后再进行配置切换。
Docker 部署
如果当前仍在容器内,先退出:
exit切换前,在宿主机上进入 Docker Compose 工作目录,停止容器,然后备份并替换配置:
cd /opt/seafiledocker compose downcp -a /opt/seafile-data/seafile/conf/seafile.conf \ /opt/seafile-data/seafile/conf/seafile.conf.bak-before-migrationcp /opt/seafile-data/seafile.conf \ /opt/seafile-data/seafile/conf/seafile.conf如果 Docker 部署还使用 .env 管理存储后端,切换时也要检查 .env 中的相关设置是否与新后端一致。例如,使用 .env 配置单个 S3 存储后端时,需要将 SEAF_SERVER_STORAGE_TYPE 设为 s3,并填写对应的 S3 参数。通过 seafile.conf 配置其他存储后端或多存储后端时,请按部署方式确认相关环境变量,以免启动时使用旧的存储设置。详细说明参阅使用 S3 存储后端及多存储后端。
检查配置无误后启动:
docker compose up -d注意:这里使用的是 docker compose down,不要添加 -v 参数,以免误删 Docker 卷。自定义了 Compose 目录或 .env 路径的用户应按实际部署方式执行。
二进制包部署
在服务器上备份原配置并替换:
cp -a /opt/seafile/conf/seafile.conf \ /opt/seafile/conf/seafile.conf.bak-before-migrationcp /opt/seafile.conf /opt/seafile/conf/seafile.conf随后启动服务:
cd /opt/seafile/seafile-server-latest./seafile.sh start./seahub.sh start5. 检查迁移结果
服务启动后,使用客户端或网页端检查资料库列表,并随机选择不同资料库中的文件进行浏览、下载和上传测试。还应检查 Seafile 日志,确认没有新后端连接、权限或对象读取错误。
Docker 部署可通过以下命令查看日志:
cd /opt/seafiledocker compose logs -f seafile确认业务正常运行、目标存储数据完整并完成必要的观察期后,再按既定的数据保留策略处理源存储。不要仅凭脚本输出 Done. 就立即清理原有数据。
大数据量迁移
如果数据量很大,完全停服迁移可能需要较长时间。可考虑分两轮完成:
- 首次迁移:服务仍在运行时,使用临时配置执行一次 migrate.sh,将大部分现有对象写入目标存储。此阶段用户仍可能产生新对象。
- 最终迁移:安排维护窗口,停止 Seahub 和 Seafile,并阻止其他写入;使用同一份临时配置再次执行迁移脚本,将遗漏的对象同步到目标存储。
- 最终迁移结束后,检查对象完整性,再按上一节执行配置替换和启动。
两轮迁移的关键是:在切换到目标后端之前,必须确保源存储已停止写入,并完成最后一次迁移和验证。 对关键业务数据,建议先在测试环境完整演练此流程。
如果迁移包含数百万个对象,可酌情调整迁移脚本 migrate.py 中的 nworker(工作线程数)和 maxsize(任务队列大小)。这些参数并非越大越快,过高的并发可能受磁盘 I/O 或对象存储限流影响。修改脚本前请备份原文件并进行性能测试。