无法将上传迁移到 S3

您好,我们已经设置了上传托管(使用 S3 设置)在 Backblaze。
新的上传工作正常(在 x-amz-checksum-crc32 标头修复后),但是尝试使用 uploads:migrate_to_s3 迁移现有上传会立即失败。

这发生在最新的 Discourse 版本(3.5.0.beta5-dev)上。
这是完整的输出:

root@goactuary-app:/var/www/discourse# rake uploads:migrate_to_s3 --trace
** Invoke uploads:migrate_to_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:migrate_to_s3
请注意,迁移到 S3 目前是不可逆的!
[CTRL+c] 取消,[ENTER] 继续

正在将上传迁移到 S3 以用于“default”...
一些上传未迁移到新方案。运行迁移,这可能需要一段时间...
rake aborted!
FileStore::ToS3MigrationError: Some uploads could not be migrated to the new scheme. You need to fix this manually. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:156:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:126:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:106:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:104:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:100:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

您需要按照为上传配置 S3 兼容对象存储提供商中的说明将其放入您的 app.yml。

您的意思是您在 app.yml 中添加了代码,将 aws 库回滚到与 backblaze 兼容的版本吗?

2 个赞

是的,它们在 app.yml 中,我已经重建了应用程序。
我已确认新上传的文件已在那里。

不完全是。我正在使用以下环境变量:

  AWS_REQUEST_CHECKSUM_CALCULATION: WHEN_REQUIRED
  AWS_RESPONSE_CHECKSUM_VALIDATION: WHEN_REQUIRED

这些修复了更改设置后无法上传新文件的问题。

您可能需要自己查找这些。

在 Rails 中,您可以执行

 Upload.pluck(:url)

然后查找哪些上传存在问题。

依我看,这还不够,但您说它对您有效。

2 个赞

在容器中手动降级 aws gems 确实让 uploads:migrate_to_s3 作业成功上传了图片,所以正如你指出的,环境变量是不够的。

然而,该过程后来在另一个点失败了:

FileStore::ToS3MigrationError: 2 篇帖子未映射到新的 S3 上传 URL。数据库 'default' 的 S3 迁移失败。(FileStore::ToS3MigrationError)

这将是一次单独的故障排除冒险。

1 个赞

这可能是因为您有一个指向本地帖子的框。我对此发表过一个主题,但不太记得细节了。

如果只有 2 个,您可能可以忽略它,但在 Rails 中,您可以找到所有不包含您新存储桶的上传。我认为它应该是空的?

我认为问题在于您有两个帖子在已处理的帖子中具有意外路径。

我找到了!
如果备份包含指向 Discourse onebox 的链接,则无法恢复

编辑:所以我认为您有两个带有本地 onebox 的帖子。我认为您只需要找到并重新处理这些帖子。

1 个赞

@stanski 这个问题解决了吗?

1 个赞

抱歉,我被其他事情耽误了,忘记更新这个了。
在重新烘焙所有帖子后,再次尝试迁移时,我收到了不同的错误消息。
很遗憾,我再也找不到回溯了。

我意识到,尽管出现了错误,但上传的文件似乎已迁移到 Backblaze,并且帖子已更新。
我已将本地上传的文件存档并转移到其他地方,此后未收到任何投诉。

因此,总而言之,是的,我的问题已得到解决。
感谢 @pfaffman 的持续建议。

现在我有一个投诉,各种防火墙都在阻止 Backblaze 托管的上传,但那是另一回事了。

我认为您确实应该使用 CDN。

1 个赞