更改用于上传的 s3 存储桶

@Jite

看看这个是否可行。如果没问题,我会着手创建一个正式的 howto 指南。

旧存储桶

这假设你可以安装并配置一个工具,将数据从旧存储桶移动到本地机器,然后再从本地移动到新的存储桶。有关详细信息,请参阅 aws cli sync(可配置用于非 AWS 存储桶)和 gsutil rsync。如果你有大量数据,或者是在同一提供商的不同存储桶之间迁移,那么你可能需要研究直接在存储桶之间传输数据的方法。

在尝试以下操作之前,请进入一个适合作为临时空间的目录(例如,mkdir temp-bucket; cd temp-bucket)。以下示例包含了 -n--dry-run 参数,用于显示将要执行的操作。如果看起来符合你的预期,请再次运行该命令,但不带该参数。

将旧数据从旧存储桶移动到本地

    gsutil  rsync -r -n  gs://=OLD= .

    aws s3 sync s3://=OLD= .

将数据从本地移动到新存储桶

    gsutil rsync -r -n . gs://=NEW=

    aws s3 sync . s3://=NEW=

更新数据库以使用新存储桶

这些命令需要在 Rails 控制台中执行。要进入控制台,请执行:

cd /var/discourse
./launcher enter app
rails c

对于新存储桶,上传一张使用新配置的图片,然后执行:

Upload.last.url

你应该会看到类似以下内容:

=> "//discourse-bucket.s3.dualstack.us-east-2.amazonaws.com/`original/2X/7/12345fbea574afc4e02db80107e6682430aede2c.png"

对于新存储桶,你将获得 discourse-bucket.s3.dualstack.us-east-2.amazonaws.com。同样地,从上述输出中获取旧存储桶的主机名。

使用以下命令检查你的上传文件是否位于你预期的位置:

Upload.order(Arel.sql('RANDOM()')).limit(10).pluck(:id, :url)

现在,你将更新数据库以使用新存储桶而不是旧存储桶。DbHelper.remap 将替换所有表中的匹配项。

DbHelper.remap("//=OLDHOST=/","//=NEWHOST=/")

迁移到 AWS 可能需要清除你的 s3_endpoint

注意:如果你在数据库的 SiteSettings 中定义了 s3_endpoint 并切换到 AWS(AWS 不需要端点),那么在使用更新后的设置构建新容器后(或在恢复包含该设置的数据库后),你需要清除该站点设置。

重新烘焙引用存储桶而非 S3 CDN 的帖子

如果你的帖子直接链接到了新的 S3 存储桶(也许你之前没有定义 s3_cdn_url),以下是如何仅重新烘焙那些需要更新的帖子的方法。

获取这些帖子:

  posts=Post.where("cooked like '%=NEWHOST=%'")

查看数量:

  posts.count

重新烘焙这些帖子:

  posts.each do |p| p.rebake! end

或者,只需将存储桶替换为 CDN:

posts.each do |p|
  p.cooked.gsub!(/=NEWHOST=/,"=CDN=")
  p.save!
end

8 个赞