好的,在深入数据库进行排查后,我找到了原因。看起来是原始的、早已废弃的 S3 环境(或者更准确地说,是由于成本效益不高而未被主要使用的 S3 环境)遗留了 71 个上传文件。
我最终采取了以下步骤:
从源服务器:
./launcher enter app
sudo -u postgres psql discourse
SELECT url FROM uploads WHERE url NOT LIKE '%ExpectedS3DomainGoesHere%
(将 ExpectedS3DomainGoesHere 替换为您 S3 配置的实际 URL)
这将获取您需要处理的 URL,因为我们需要执行一些操作。对于来自不同 URL 的旧存储桶的 URL,请使用 Amazon S3 客户端(或您的 S3 存储后端客户端),并执行以下操作:
a. 将意外 URL 的存储桶(如果可用)同步到本地存储。
b. 将本地文件同步到新的存储桶。
discourse remap OLD-URL-FROM-DB NEW-URL-FROM-DB
尽管有人建议 在此 使用 DbHelper.remap,但 discourse 的 remap 函数运行良好。确保数据已迁移。
rails uploads:migrate_to_s3重建时间!
rails posts:rebake再次在“源”机器/服务器上备份站点。下载最新的更新。
从新目标服务器:
按预期设置 Discourse,将源服务器上的 app.yml 等文件复制到新服务器上的
/var/discourse/containers/,以确保重建能够命中所需的正确插件等。
请确保在 app.yml 中注释掉任何DISCOURSE_BACKUP_LOCATION: s3条目,如果您正在处理本地备份文件。由于 S3 在处理备份文件时出现截断问题,我采取了本地方法进行恢复。按照 https://meta.discourse.org/t/restore-a-backup-from-command-line/108034 中的步骤将备份导入到您的服务器并进行恢复。包括重建步骤。
我花了很长时间才解决这个问题,但在深入研究数据库中的 uploads 表后,问题得到了解决。但这似乎奏效了,所以……