意外升级后,一些设置丢失/损坏

坦白说,我很久很久没有对我们自托管的 Discourse 安装进行任何手动维护了,而且最初是由别人搭建的。

我需要更改我的 SMTP 凭据,因为 SendGrid 要求从基本认证迁移到 API 密钥。

我找到了这份文档:Discourse 推荐邮件服务商

其中提到:

若要更改当前的邮件服务,请同时运行 ./discourse-setup(这将在论坛重建期间使其离线几分钟)。

我运行了该命令,按预期回答了问题,随后在标准输出中产生了约 2,000 行输出,最后以以下内容结束:

升级完成
----------------
pg_upgrade 不会传输优化器统计信息,因此,
一旦启动新服务器,请考虑运行:
    ./analyze_new_cluster.sh

运行此脚本将删除旧集群的数据文件:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
Postgres 升级完成

旧版 10 数据库存储在 /shared/postgres_data_old

要完成升级,请再次使用以下命令重建:

./launcher rebuild app
-------------------------------------------------------------------------------------

cfd4df26701b4b4cd4a4202f30a9c8165a1ba609c921bffc25f250f52fee6cbe

当时我并没有预料到这会“升级”任何东西。我只是想更改 SMTP 凭据。但网站并没有自动恢复运行,于是我按照提示“完成升级”,运行了:

./launcher rebuild app

这又触发了约 8,000 行标准输出。网站最终恢复了,但看起来不一样了:

  • 我的标志消失了,被替换为“Discourse”标志。
  • 用户头像图片损坏。不过后来这些头像又自动恢复正常了。
  • 帖子中的图片和分类标志损坏。这些目前仍未恢复。我在 ./discourse/share 目录以及我们的 S3 存储桶(URL 期望找到它们的位置)中查找了匹配文件名的图片,但并未找到。
  • 我之前已从“最新”页面隐藏的支持类别帖子,现在又出现在该页面上了。
  • 我的“支持”类别在“分类”页面上已不可见。
  • “分类”页面现在变为两列布局,左侧是分类,右侧是“最新”。我印象中之前只是分类列表。
  • + 新主题 按钮中 + 的颜色从白色变成了灰色。

此时我怀疑某些配置丢失了,但所有帖子都完好无损。我推测 Discourse 可能自动进行了升级(我不清楚之前是哪个版本,可能跨越了多个版本),导致一些底层默认设置、CSS、模板等发生了变化,从而引发了上述问题。

查看源代码后,我发现当前版本是 2.6.0.beta6,该版本似乎仅在 7 天前发布。

因此,我的问题如下:

  • 为了应用像更改 SMTP 凭据这样简单的设置更改,是否必须像这样完全升级软件?
  • 如何在不升级整个软件的情况下更改设置或应用安全更新?
  • 我的图片在哪里?或者为什么它们的 URL 发生了某种变化,导致无法访问?
  • 有没有办法回滚,同时不丢失自事件发生以来的新帖子?我甚至不知道我们之前运行的是哪个版本。我在 S3 上有 Discourse 备份(只是一个 gzip 压缩的 SQL 转储文件)。
  • 我是否只需手动检查所有设置和自定义项,以修复诸如 + 新主题 按钮颜色、隐藏/显示的“支持”类别等问题?

我原以为我们一直在对托管 Discourse 的 EC2 卷进行 EBS 快照,但后来发现并非如此。我现在已启用快照,以便未来必要时可以这样回滚。

谢谢。

是的。理论上可以通过销毁并重新启动容器来应用新的 SMTP 设置,但你需要仔细研究具体操作方法。

不行。安全更新是整个软件的一部分。你可以运行稳定版分支,但听起来你之前落后了好几个版本,所以即使如此,大部分问题可能仍然会出现。

这不太清楚。通常升级不会导致图片丢失。

没有。[quote=“mrmachine, post:1, topic:171465”]
我是否只需手动检查所有设置和自定义项,以修复诸如“+ 新建主题”按钮的颜色以及隐藏/可见的“支持”分类等问题?
[/quote]

是的。听起来你之前运行的版本已经落后了好几年。自那以后,数十名程序员投入了数千小时的工作,他们所做的更改破坏了你的一些自定义设置。

但你仍然无法在不丢失自上次备份以来的帖子的情况下进行回滚。

你应该在每个测试版发布时进行升级,或者在下一个稳定版发布时切换到稳定版分支。

跟进一下此事。我们一直将上传的图片存储在 S3 上,并且没有选择下载远程图片,以避免链接失效。我不确定这是否相关,但关键在于图片本应存储在 S3 上,并在 Discourse 中使用 S3 URL 进行引用。

升级后,大量图片无法显示,包括分类徽标和用户在帖子中上传的图片。检查 S3 后发现,所引用的文件名并不存在。

幸运的是,我们启用了 S3 版本控制,我通过 S3 控制台看到,许多被引用的图片在升级期间或之后被删除了。

我修改了一个找到的 Python 脚本(https://stackoverflow.com/a/54613767/2829685),用于遍历 S3 存储桶中的所有对象版本,并移除那些 last_modified 时间戳等于或晚于升级日期的文件的当前版本中的“删除标记”。

该脚本运行了大半天,恢复了约 4.5 万张图片。看来 Discourse 为每张图片生成了许多缩略图。

现在,我们的分类徽标和帖子中用户上传的图片都已恢复。但我完全不明白这些图片为何会在升级过程中被从 S3 中删除。

这看起来像是 Discourse 升级流程中存在一个非常危险的漏洞?不过也许该问题已经被修复,因为我当时是从非常旧的版本进行升级的。