Rails Active Storage:克隆PostgreSQL数据库后可跨应用复制全部存储文件吗?
答案是完全可以实现完整复制,操作逻辑和步骤如下:
核心原理
Active Storage的附件关联关系、文件元数据全部存储在PostgreSQL库的active_storage_blobs和active_storage_attachments两张系统表中,你已经完成了数据库克隆,意味着所有元数据已经同步到目标应用,只需要将实际存储的附件文件按照原路径/键完整迁移到目标应用的存储介质中即可正常使用。
前置检查
必须保证两个应用的active_storage_encryption_key(存储在credentials.yml.enc或者环境变量中)完全一致,如果你开启了Active Storage的文件加密功能,密钥不一致会导致迁移后的文件无法解密读取。
分场景操作步骤
场景1:原应用使用本地磁盘存储
直接将原应用根目录下的storage/文件夹完整复制到目标Rails应用的根目录,覆盖目标应用原有storage/文件夹即可。
如果你的应用自定义了本地存储路径,按照config/storage.yml中配置的本地服务路径替换对应目录即可。
场景2:原应用使用S3/OSS/COS等云对象存储
两种可选操作:
- 方案1:在云服务控制台将原存储桶内的所有文件全量复制到目标应用使用的存储桶中,全程保持文件的键(Key)完全不变
- 方案2:如果允许目标应用复用原有存储桶,直接将目标应用
config/storage.yml内的云存储配置(Access Key、Secret、桶名、区域)修改为和原应用完全一致即可,无需迁移文件
兼容性处理
若两个应用的Rails版本差异较大,完成数据库克隆后先执行
rails active_storage:update命令同步Active Storage的表结构,避免元数据字段不兼容导致文件无法识别。
验证方法
迁移完成后在目标应用控制台执行Rails.application.routes.url_helpers.rails_blob_url(ActiveStorage::Blob.first)生成附件访问链接,或者直接在业务页面访问原有附件,确认可以正常加载即迁移成功。
内容的提问来源于stack exchange,提问作者doer123456789

