在对网站进行升级和域名切换后,图片附件丢失了。
我们已经在官方的网站上提出了问题: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 的时候丢掉的吧。
知道问题在那里就有方向了,我们应该可以比较容易的这些记录先恢复进去。
经过 10 多个小时的努力,终于是把数据恢复了。
这一路恢复的过程全是坑,如果没特别重要的必要的需求,建议是可以换路径,但是不要换 S3 的存储桶了。
同时,不知道什么原因,在备份恢复的时候,uploads 这个表的数据恢复有问题,没有办法恢复全部数据。
所以在备份的时候,不要完全相信备份的数据库,可能会有问题导致无法恢复。