恢复后修复或清理损坏的链接和资源

我们遇到了一次服务器崩溃,不得不创建新服务器并从备份中恢复。这是一个艰苦的过程,有关发生的情况以及我们如何恢复的详细信息请参见此处

现在恢复之后(关键是禁用 S3 上传),帖子中所有附件的链接都已损坏(404 错误)。我已搜索论坛但找不到解决方案,希望有人能指引我正确的方向。

我有两个选择:

  1. 我能否修复这些指向帖子中嵌入的附件的损坏的 short-url 链接(所有损坏的链接都是帖子中的附件;嵌入的图片可以正常渲染,其他内部链接也可以正常工作)?

例如,论坛帖子中附件的 URL 显示为 https://XYZ.com/uploads/short-url/phu1HOLvkE8LWpkKYfnMPSWsvHh.zip。当我在帖子中点击附件链接时(导致 404),我在日志中看到的是这个:

Message (5 copies reported)

Failed to process hijacked response correctly : Errno::ENOENT : No such file or directory @ rb_sysopen - /XXXXX.s3.dualstack.us-east-1.amazonaws.com/optimized/1X/46728e07f9819907d1b18387bf02ea7fc25c7981_2_32x32.ico

Backtrace

/var/www/discourse/app/controllers/static_controller.rb:160:in read' /var/www/discourse/app/controllers/static_controller.rb:160:in block (2 levels) in favicon’
/var/www/discourse/lib/distributed_memoizer.rb:16:in block in memoize' /var/www/discourse/lib/distributed_mutex.rb:33:in block in synchronize’
/var/www/discourse/lib/distributed_mutex.rb:29:in synchronize' /var/www/discourse/lib/distributed_mutex.rb:29:in synchronize’
/var/www/discourse/lib/distributed_mutex.rb:14:in synchronize' /var/www/discourse/lib/distributed_memoizer.rb:12:in memoize’
/var/www/discourse/app/controllers/static_controller.rb:138:in block in favicon' /var/www/discourse/lib/hijack.rb:56:in instance_eval’

我非常希望在禁用 S3 上传选项并从备份恢复服务器后,有一种方法可以修复这些 short-url 链接。重新烘焙帖子并没有解决问题。

  1. 如果出于某种原因,这是一个死胡同,无法大规模修复,现在我在 S3 云端有数千个孤立的附件,是否有办法清理它们并释放空间?是否有办法让 Discourse 扫描其 S3 上传存储桶并清除所有孤立的资产?

也许有可能,或者曾经有可能找出如何修复那些链接,但找出如何修复的方法超出了论坛上可行范围。\n\nUpload.sha1_from_short_url('phu1HOLvkE8LWpkKYfnMPSWsvHh.zip')\n=\u003e \"b13050bdcd2d58924ba6ab3e7608b16bfc3cd1b7\"\n\n\n看看你的上传文件和/或 s3 存储桶中是否有名为 b13050bdcd2d58924ba6ab3e7608b16bfc3cd1b7.zip 的文件。如果有,那么修复这些问题应该是可能的,尽管不容易。\n\n由于你没有包含实际的论坛或存储桶名称,我们无法在此处得知。

1 个赞

是的,我在以下位置找到了它:

original/2X/b/b13050bdcd2d58924ba6ab3e7608b16bfc3cd1b7.zip

我很乐意通过私信向您发送链接/详细信息。

非常有趣的是,只有附件(如文件)损坏了。任何嵌入的图片都能正常显示。

那么东西都在那里了,你只需要重写帖子。不确定为什么它不起作用,但文件都在那里。

有没有办法从控制台或 UI 批量运行此操作,或者将这些文件从 S3 “下载”到本地?

是的,但我认为熟悉 discourse 和 rails 的人需要来写。我不知道有现成的解决方案来解决你的问题。有一些关于在 S3 存储桶之间移动的帖子可能会提供一些线索,但我认为你的特定问题以前没有得到解决。

恢复后,您应该重新启用了 S3 上传选项。听起来您没有这样做?

2 个赞

而且这很难做到,因为它是在 app.yml 上设置的,这可能会做到。

这能解决问题吗?只是想知道是否可以安全地尝试。

嗯,是的,这正是我一开始就建议你做的……
如果你不重新启用 S3 上传,那么 short-url 函数将会在本地查找这些上传,但它们在 S3 上。

2 个赞

我将尝试一下,但另一方面,当我启用它时,它破坏了恢复功能(请参阅我的另一个主题)。在 Jay 的帮助下,我不得不弄清楚如何禁用上传才能最终恢复它。您是否能够成功恢复已启用该选项的服务器?

您需要\n\n* 禁用该设置\n* 恢复\n* 启用该设置\n\n正如我在上周的私信交流中所描述的那样

2 个赞