Migrate_to_s3 失败

我正在尝试将上传内容迁移到 S3,网站的流量相对较大。
一切都按计划进行,直到我运行 rake uploads:migrate_to_s3 时,出现以下错误:

Updating the URLs in the database...
Removing old optimized images...
Flagging all posts containing lightboxes for rebake...
2023 posts were flagged for a rebake
rake aborted!
FileStore::ToS3MigrationError: 1 of 9629 uploads are not migrated to S3. S3 migration failed for db 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:79:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_to_s3
(See full trace by running task with --trace)

这句“FileStore::ToS3MigrationError: 1 of 9629 uploads are not migrated to S3. S3 migration failed for db ‘default’.”尤其引起了我的注意。
我猜想是有一个有问题的文件导致整个 rake 任务失败?有没有办法找出是哪个文件导致了问题,然后也许移除它,让其余的任务顺利完成?

1 个赞

一些更新:
网站似乎正在正常加载,据我所知,上传的图片正在从 CDN 提供。
所有上传的本地副本仍然存在于服务器上。我假设这是因为迁移被标记为失败。
如果 rake uploads:s3_migration_status 的输出有任何帮助,请提供?

# rake uploads:s3_migration_status
1 个上传未迁移到 S3。数据库 'default' 的 S3 迁移失败。
19 篇帖子未重新映射到新的 S3 上传 URL。数据库 'default' 的 S3 迁移失败。
没有帖子需要重新烘焙
网站尚未准备好进行迁移

您可以通过“管理” > “日志” > “错误日志”找到有关哪个文件失败的参考信息。

如果这没有帮助,我认为可以通过搜索数据库中 cooked 字段包含 yourdomain/uploads/ 的帖子来获取迁移状态中提到的 19 个帖子列表。最坏的情况下,您可以手动查看这些帖子,并将任何上传与 S3 中的内容进行比较。

类似这样:

rails c
Post.where("cooked like '%discourse.example.com/uploads/%'")
1 个赞

您好 @Simon_Manning

我尝试了您的建议,但遗憾的是,在错误日志中没有找到任何相关信息。我确实看到一条条目,如
Failed to optimize image: unknown reason,但它没有提供比字面意思更多的信息。

我也尝试了您建议的查询,确实得到了一堆帖子作为结果,但实际访问这些帖子时,它们包含了很多来自 onebox 预览的缩略图。当我尝试在这些缩略图上在新标签页中打开图片时,它们似乎是从 CDN 加载的。

我认为对于这19个帖子中的18个,我可能会看到类似的结果,甚至可能全部19个,如果那个失败的上传恰好发生在有多个上传的帖子中。

也许更容易的做法是从查询结果中提取所有文件名(例如 f8a2d9381889b8693db2777acac566bd7b134fa5.png),然后在S3中搜索它们。理论上,应该只有一个文件丢失。忽略派生文件,只查找路径中包含“/originals/”的文件。

虽然有点繁琐,但如果那个查询只选择了这19个帖子,应该不会花费太长时间。

2 个赞

所以我找到了罪魁祸首,我该如何处理?

对我来说似乎合乎逻辑的方法可能不是最好的出路。

以下是我看到的选项:

  1. 从有问题的帖子中删除文件的引用
  2. 从服务器上删除文件
  3. 将文件链接重新映射到某个通用链接

或者也许我完全想错了?

如果无法找到明显的解决方案来成功上传,那么选项 1 或 3 似乎都是不错的选择。选项 2 我可能会留给 Discourse,特别是清理孤立上传文件的任务,其间隔由 clean orphan uploads grace period hours(清理孤立文件宽限期小时数)设置控制。

不过,在文件被删除之前将其获取可能是一个好主意。如果文件不包含任何敏感数据,它可能有助于测试在迁移过程中文件为何无法上传。

在删除文件并完成迁移(以及下载失败的文件)后,您可以尝试的另一件事是再次编辑帖子以将文件放回原处。了解它是完全无法上传到 S3 还是仅在迁移任务期间失败会很有趣。

我遇到了同样的错误,在 64 个帖子上。在 80K 文件中找不到它们……

如果我删除本地文件(其中大部分已迁移),会发生什么?

我确认文件已迁移,但我遇到了同样的错误。

有什么建议吗?上传到 s3 可以正常工作,但迁移到 s3 的任务失败了。

如果你不介意丢失那 64 个文件,当同一个 rake 任务一直失败时,我所做的就是编辑它,让它在有 100 个错误而不是 1 个错误时才报错。

对我来说没问题。
我应该怎么做来编辑这个任务?

您可以先尝试运行:SKIP_FAILED=1 rake uploads:migrate_to_s3

如果这不起作用,请在此处编辑此行并重试

Tried with SKIP_FAILED=100 rake uploads:migrate_to_s3

=> 0 files

  • Listing S3 files
    … .. => 81070 files
  • Syncing files to S3

Updating the URLs in the database…
Removing old optimized images…
Flagging all posts containing lightboxes for rebake…
54453 posts were flagged for a rebake
53 posts are not remapped to new S3 upload URL. S3 migration failed for db ‘default’.

我不明白如何将修改后的文件放到我的 discourse 脚本中

我可能理解错了,但我觉得你需要运行 SKIP_FAILED=1 来开启 SKIP_FAILED,而不是为其赋值。

1 个赞

尝试使用此命令。……结果相同

啊,那真遗憾。还有 @Falco 提出的编辑 rake 任务的建议——但不幸的是,我不知道该怎么做,而且搜索时也找不到任何说明。:slightly_smiling_face:

希望其他人能帮忙?:crossed_fingers:

1 个赞

我在我的 /shared 文件夹中创建了 myscript.rb,但无法运行它。

还有其他建议吗?@vulkanino 我注意到您遇到了类似的问题