不同存储后端之间的数据迁移

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