迁移到 S3 Pro
如果你已经使用了本地存储、Amazon S3、阿里云 OSS 或 腾讯云 COS,需要把文件改为私有访问,可以把历史文件迁移到 S3 Pro。
迁移需要同时处理三件事:把物理文件或对象复制到新的存储桶、更新文件表里的存储记录、切换以后上传使用的新存储。
迁移前务必在测试环境演练一遍,并准备可回滚的数据库备份和文件备份。迁移期间如果继续上传或删除附件,容易出现漏迁、覆盖或记录不一致。
适用范围
这篇文档适用于从以下存储引擎迁移到 S3 Pro:
其中,record.path 和 record.filename 来自文件记录本身,包括内置的 attachments 表和其他文件表。
本地存储的 documentRoot 以 storages 表中该存储的 options.documentRoot 为准。默认配置值是 storage/uploads,实际绝对路径取决于 NocoBase 运行时的 storage 目录。
操作步骤
第一步:停写或进入维护窗口
迁移期间先暂停用户上传、更新和删除附件。可以通过维护窗口、临时下线入口、冻结相关业务流程等方式实现。
这一步的目标是让文件记录和物理文件保持静止。如果迁移过程中仍有用户上传或删除文件,那么迁移脚本统计到的记录可能已经不是最新状态。
第二步:备份数据库和文件
至少准备两类备份:
- 数据库备份
- 原存储中的文件备份或对象快照
对于本地存储,需要备份 documentRoot 对应的目录。历史文件的物理路径通常是:
对于 Amazon S3、阿里云 OSS、腾讯云 COS,需要确认原 bucket 的对象仍可读取,并记录原存储引擎的 id、name、type、path、baseUrl 和 options。
另外建议导出一份迁移清单,用于回滚和人工核对:
第三步:创建并验证 S3 Pro 存储
按 S3 Pro 文档创建新的 s3-pro 存储。至少确认这些配置可用:
- bucket
- endpoint
- region
- accessKey
- secret
- public / private
- access endpoint
- forcePathStyle
- 文件大小和 MIME 类型规则
创建后先用新存储上传一个测试文件,确认上传、预览、下载、删 除都正常。如果目标是私有访问,还要确认访问 URL 是临时签名 URL,并且过期时间符合预期。
S3 Pro 使用客户端直传。目标 bucket 需要配置允许 NocoBase 站点上传的 CORS 规则,否则新文件上传会失败。
第四步:确定对象 key 映射
历史文件迁移到 S3 Pro 后,建议继续使用原来的相对路径作为 S3 object key:
比如:
S3 Pro 针对已经落库的文件记录,访问文件时会直接把 file.filename 当作完整 object key,不会再拼接 file.path。所以迁移后文件记录应更新为:
不要迁移成下面这种形式:
否则 S3 Pro 可能只把 a-123.png 当作 object key,导致历史文件访问失败。
生成 object key 时要使用 / 作为分隔符,不要使用操作系统的路径分隔符。对于以 / 开头的旧路径,也要去掉开头的 /。
第五步:迁移物理文件或确认对象位置
遍历所有文件表记录,包括内置的 attachments 和其他文件表。只处理 storageId = <old-storage-id> 的记录。
如果原存储是本地存储,需要把本地文件上传到 S3 Pro 使用的 bucket。如果原存储本来就是 Amazon S3、阿里云 OSS 或腾讯云 COS,并且新的 S3 Pro 配置仍指向同一个 bucket、同一个 endpoint,且访问凭证有权限读取同一批对象,通常不需要复制对象。此时只要确认第四步生成的 oldKey 能被 S3 Pro 正确访问即可。
不同原存储的处理方式如下:
以下情况仍然需要复制文件或对象:
- 从本地存储迁移到 S3 Pro
- 换 bucket、换账号、换 region 或换云厂商
- 需要把历史对象从公开 bucket 搬到新的私有 bucket
- 原对象 key 需要重命名或重新组织目录
- 原 bucket 权限策略不适合 S3 Pro 的签名访问或客户端直传
- S3 Pro 无法通过当前 endpoint 和凭证直接访问原对象
正式迁移前先做 dry-run。至少输出:
- 待迁移记录数
- 待迁移总大小
- 本地缺失文件数或源对象缺失数
- 重复 object key 数
- 不能识别
storageId的记录数 - 待人工处理列表
如果出现重复 object key,不要直接覆盖。先比较文件大小、ETag 或 hash,确认它们是否指向同一个文件。不是同一个文件时,需要为其中一条记录生成新的 key,并在后续记录更新时使用这个新 key。
第六步:校验目标对象可访问
文件复制完成后,或确认可以复用原云存储 bucket 后,对每条迁移记录执行 S3 HEAD Object 或等价检查,确认 S3 Pro 能通过目标 object key 访问对象。
建议输出这些结果:
- 成功数
- 源文件缺失数
- 上传或复制失败数
- 目标对象缺失数
- 重复 key 数
- 待人工处理列表
不要只看脚本退出码。对象存储可能出现部分失败、重试后成功、同名覆盖、权限可写但不可读等情况,迁移清单和 HEAD Object 校验更可靠。
第七步:更新文件记录
确认目标对象全部存在后,再更新文件表记录。只更新文件集合里的文件记录,保留原记录 id 不变,不需要更新附件字段产生的多对多关系表。
核心字段如下:
如果 S3 Pro 是私有存储,url 必须为空。S3 Pro 对非公开存储保存记录时也会清空 url,访问文件时会动态生成临时签名 URL。
建议在事务中批量更新记录,并把第二步导出的迁移清单保存到迁移完成之后。回滚时需要用这份清单把 storageId、path、filename 和 url 改回旧值。

