停止使用 Amazon S3 进行上传

经过一些实验,我发现我的部分帖子甚至在进行任何“重映射”操作之前,图片就无法正常显示。

它们只显示一个小的图片图标,将鼠标悬停在该图标上会显示图片路径,只有点击后才会显示图片。

而且,如果我从三点菜单中选择“重建 HTML",或者在容器内执行任何“重新烘焙”操作,这个图标也会消失(取而代之的是出现空白区域或图片占位符)。

恳请给予指导,谢谢。

1 个赞

如果您尚未进行重映射,且您的 S3 存储桶仍正常运行,那么一切应如从前。在您开始这一操作之前,这些图片是否正常工作?

理论上,只有当您关闭 S3 存储桶或重映射操作不正确时,才会导致与这些图片文件的连接丢失。

2 个赞

谢谢。
我发现图片图标显示的路径是 /bucket/uploads/optimized/folder/…(由于该路径下不存在对应的图片,因此图片无法显示,仅显示图标)。

但当我点击该图片图标时,图片却能从 ‘Orig’ 文件夹中显示/提供,即路径为 /bucket/uploads/original/…。

我不明白同一张图片怎么会存储了两个不同的路径?!

无论如何,现在的问题变成了:如何找到那些图片被错误映射到 ‘optimized’ 路径下的帖子?以便我能将它们的地 址更正/重映射到 ‘Original’ 路径下的正确位置。

1 个赞

感谢 @nathank@Pravi@itsbhanusharma。由于我之前混淆了不同的问题/场景,目前我的情况如下:

  1. 我的一些帖子无法显示上传的图片。要么只显示一个小图标,鼠标悬停时显示错误的存储桶 URL/地址;要么只有点击这些小图标时,才会显示正确的图片和正确的存储桶路径;还有一些帖子的图片则完全无法显示,只留下一片空白。
    如果我执行了重映射操作(remap wrongbucketurl correctbucketurl),在抽样检查的一篇帖子中发现,虽然小图标一度被正确的图片替换(我当时很高兴),但到了第二天,该图片完全消失,连图标都不见了,取而代之的是一片空白。因此,我不得不将网站恢复到前一天的状态。

  2. 当我运行该命令时,结果如下:

# rake posts:missing_uploads
正在 default 上查找缺失的上传文件。

缺失 19 个帖子上传文件。

缺失 19 个上传文件。
7792 篇帖子中有 6 篇受到影响。
1 个赞

您尚未迁移到本地存储。我已检查您的站点,S3 链接仍然存在。

命令大致如下:

./launcher enter app
  discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
  discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
  rake posts:rebake
3 个赞

我已经将这个过程的各种变体运行了几十次,但问题仍然存在。

由于管理层决定不再使用具有公共访问权限的 S3 存储桶,我们的图片无法通过 S3 正常显示,因此我们需要将图片移回本地存储。

起初,我检查了那些损坏的链接,并据此(我本以为)确定了在重映射步骤中需要使用的值,现在确实有一部分图片可以正常显示了。但大多数(我估计超过 90%)仍然无法显示。与之前出现损坏的 S3 链接时不同,那时至少可以检查链接以开始排查问题,而现在我只能看到如下提示:

link

有人知道是什么导致这些图片无法显示吗?这个问题已经困扰我好几天了。我觉得难以置信的是:a) 竟然没有方法可以迁移回来;b) 有人(不是我)在我们无法迁移回来的情况下执行了迁移操作。

需要说明的是,我已经按照 @nathank 上面描述的流程操作了多次。我尝试了许多次,通常在重映射步骤中对路径进行了一些细微调整,因为我不确定这些说明是通用的,还是取决于目录结构(我们的目录包含多个子目录,这些子目录已通过 S3 同步步骤成功从 S3 复制过来)。

我非常希望能得到一些帮助,因为我真的快要抓狂了。

我认为您要做的是启用隐藏的 include_s3_uploads_in_backups 选项,然后创建备份并恢复(建议先在新的测试服务器上操作)。当 CDCK 客户取消订阅时就会发生这种情况,这些备份可以毫无问题地恢复到新的自托管站点。

6 个赞

嗨,Jay - 谢谢你的回复。请原谅我的无知,但我该如何开启它呢?

1 个赞

抱歉。类似这样:

./launcher enter app
rails c
SiteSettings.include_s3_uploads_in_backups=true
exit
exit
2 个赞

我尝试了这样做,但得到了以下错误:

NoMethodError: undefined method include_s3_uploads_in_backups=' for SiteSettings:Module from (pry):1:in pry

随后我意识到,也许需要重新启用 S3 上传,因为之前我将其关闭了,但错误仍然相同。

哦,我们使用两个容器,而我是在 web_only 容器中运行此操作。Rails 命令在 data 容器中找不到,所以我假设这是正确的做法。

1 个赞

看起来命令应该是:

SiteSetting.include_s3_uploads_in_backups=true

我执行了该命令,然后创建了一个新备份。从该备份恢复后,没有任何变化——大部分图片仍然显示上述损坏的图标。我还尝试重建了两个容器,但这也没有带来任何改变。

当我下载并检查备份压缩包时,所有这些文件确实都在其中,并且在恢复后在文件系统中也可见。但 Discourse 就是拒绝识别和显示它们。

1 个赞

为记录在案,我最终成功解决了这个问题。我从头开始(即从实例的快照恢复),并且相当确定最终有效的流程如下:

  • 使用 rails console 运行 SiteSetting.include_s3_uploads_in_backups=true
  • 创建新的备份
  • 从此备份恢复
  • 使用 discourse remap 更新对我各个 S3 文件位置的引用,将其指向本地位置
  • 重新烘焙帖子,并重建我的两个 Docker 容器

感谢 @pfaffman 在此为我指明了正确的方向。

编辑

我也顺便提一下。在我上一则帖子之后,我意识到我们仍有六个主题的图片无法显示(尽管绝大多数现在已正常)。

这六个是我们最古老的帖子,且所有原始图片的 S3 URL 都与其他图片不同。显然这并非巧合。因此我检查了 uploads/default/original/1X 目录下是否包含所有这些文件,结果确认它们都在。随后,我使用这个唯一的 S3 URL 运行了 remap 命令,看起来它确实编辑了正确数量的帖子。然后我重新烘焙并重建了容器,但这些主题仍然无法显示。有人知道为什么会有少量帖子出现这种情况吗?

7 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.