Activestorage - 将所有资产从一个桶转移到另一个桶

Activestorage - transfer all assets from one bucket to another bucket

我正在将我的应用程序从 Vultr 切换到 DigitalOcean。现在我在 Vultr 上配置了一个存储桶以及以前的服务器。当我尝试从 DigitalOcean 访问 Vultr 上的 activestorage 图像时,图像仅加载了 10% 的时间,大多数请求导致 502 错误。

由于我已将此应用完全从 Vultr 移走,我觉得将我应用的图像资产转移到 DigitalOcean 存储桶是个好主意。

我发现了很多带有迁移脚本的帖子和博客,但它们都专注于从本地迁移到存储桶。从一个桶移到另一个桶时,我还没有找到任何东西。

我不知道该怎么做,有没有人从一个桶移到另一个桶?如果有,你是怎么做到的?

我们还想进行从一个 ActiveStorage 后端到另一个的在线增量迁移,这是为我们处理它的一些提取代码。

它遍历每个 blob,复制文件并更新 blob 以引用新服务。它会完整保留原件,以防您在出现问题时需要切换回来。

我们没有复制任何变体,而是选择让它们根据需要重新生成,但复制它们的代码可能相似。

source_service = ActiveStorage::Blob.services.fetch(:service_a)
destination_service = ActiveStorage::Blob.services.fetch(:service_b)
# :service_a/b above should be top-level keys from `config/storage.yml`

ActiveStorage::Blob.where(service_name: source_service.name).find_each do |blob|
  key = blob.key

  raise "I can't find blob #{blob.id} (#{key})" unless source_service.exist?(key)

  unless destination_service.exist?(key)
    source_service.open(blob.key, checksum: blob.checksum) do |file|
      destination_service.upload(blob.key, file, checksum: blob.checksum)
    end
  end
  blob.update_columns(service_name: destination_service.name)
end