嘿 @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