不是很严重,但是也有点严重的问题 —— 附件无法显示

在对网站进行升级和域名切换后,图片附件丢失了。

我们已经在官方的网站上提出了问题:Change domain and rebake post all image not show - installation - Discourse Meta

因为我们修改了存储的 bucket 名称。我们感觉是短 URL 没有办法重新被解析成正确的字符串了。

这样导致在重新构建 HTML 的时候,没有办法获得附件的 URL 地址。

升级后,所有类似下面老的附件没有办法正确显示了。

我们已经 dump 了数据库出来,保留了老的已经构建好的 HTML 供我们参考和修复,但是我们内容很多,已经没有办法修复了。

所以我们必须要找到一个合适的解决方案才可以。

Discourse 使用附件文件的摘要算法为 base62,但是比较讨厌的是他们还加了 sha1 哈希。

如果,我们查看代码:https://github.com/discourse/discourse/blob/main/app/models/upload.rb

上面有个 sha1 哈希。


应该是这个位置设置哈希代码的地方。

我现在对 bas62 也不太熟悉,估计需要恶补下 base62 了。

以前我们都用的是 base64。

这个帖子就作为学习贴吧。

首先需要解决的问题

根据上面出现的映射错误,我们觉得就是在 base62 解码的时候出现的问题。

首先我们需要解决的问题是:<img src="https://cdn.ossez.com/discourse-uploads/optimized/2X/d/d419faba3ea5937a8cb32f0370205b62db85b32e_2_690x345.png" alt="" data-base62-sha1="ugkSPrVxNFgnVwIsfwgnGPbzWJE"

中 2 个字符串的映射问题。

Discourse 是怎么把 ugkSPrVxNFgnVwIsfwgnGPbzWJE 字符串解码成 d419faba3ea5937a8cb32f0370205b62db85b32e 的。

为了便于我们对数据进行查找,我们还需要把服务器上已有的数据 SQL dump 到本地并且导入到数据库中。

创建数据库容器

Discourse 使用的是 PostgreSQL 数据库。

所以第一步的第一步我打算在我本地的磁盘整列中创建一个 PostgreSQL 数据库实例。

我想,我们找到原因了。

主要原因是表 uploads 丢数据了。

我们把数据导出来后,本地运行 select count(*) from uploads; 我们发现我们的数据库表中一共有 7302 条记录。

当我们在服务器上运行我们的表的时候,我们发现服务器上的这个表记录中只有:3217 条记录。

整个我们服务器上丢了差不多 4 千多条记录。

也不知道这个数据是怎么丢掉的。

应该是在数据合并或者 remap 的时候丢掉的吧。

2023-09-06_00-02-37

知道问题在那里就有方向了,我们应该可以比较容易的这些记录先恢复进去。

经过 10 多个小时的努力,终于是把数据恢复了。

这一路恢复的过程全是坑,如果没特别重要的必要的需求,建议是可以换路径,但是不要换 S3 的存储桶了。

同时,不知道什么原因,在备份恢复的时候,uploads 这个表的数据恢复有问题,没有办法恢复全部数据。

所以在备份的时候,不要完全相信备份的数据库,可能会有问题导致无法恢复。