500错误和更新失败

我们基于官方仓库的标准 Discourse 安装,使用 SSO 集成作为唯一的登录系统,已经运行了好几年,服务着庞大的用户群,运行在一个运行其他应用程序的基于 Ubuntu 的专用服务器上,我很乐意地说,一直没有出现重大问题。

不幸的是,它最近遭受了一点自发性故障,似乎完全无法正常工作了。

最初的报告称,该网站出现了大量看似随机的 500 错误,并且通知未能送达,但除此之外它仍然可以运行。当时的情况是,安装是在一两个月前更新的,并且没有对其或服务器环境进行任何更改,因此这是一个令人惊讶的发展。

我们确认了 500 错误的发生,并首先尝试重启服务器和容器,但无效。还运行了“apt-get update”以使所有软件包都保持最新。我们也尝试通过后端更新 Discourse,但使用管理员链接登录时,没有通过电子邮件发送任何登录链接,并且在容器重启后,管理员登录页面只生成了 500 错误。

我还检查了服务器环境是否存在硬件、操作系统或其他方面的异常,但似乎没有什么不对劲。

接下来,我们尝试通过 CLI 进行完全重建和“git pull”更新。这在升级的数据库迁移过程中失败了,并出现以下错误:

I, [2022-08-09T23:15:21.229857 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'LOAD_PLUGINS=0 bundle exec rake plugin:pull_compatible_all'
I, [2022-08-09T23:15:23.938876 #1]  INFO -- : docker_manager is already at latest compatible version

I, [2022-08-09T23:15:23.939220 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
2022-08-09 23:15:28.956 UTC [835] discourse@discourse ERROR:  duplicate key value violates unique constraint "idx_bookmarks_user_polymorphic_unique"
2022-08-09 23:15:28.956 UTC [835] discourse@discourse DETAIL:  Key (user_id, bookmarkable_type, bookmarkable_id)=(4115, Post, 103355) already exists.
2022-08-09 23:15:28.956 UTC [835] discourse@discourse STATEMENT:  UPDATE bookmarks
        SET bookmarkable_id = post_id, bookmarkable_type = 'Post'
        WHERE NOT bookmarks.for_topic AND bookmarkable_id IS NULL

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

ERROR:  duplicate key value violates unique constraint "idx_bookmarks_user_polymorphic_unique"
DETAIL:  Key (user_id, bookmarkable_type, bookmarkable_id)=(4115, Post, 103355) already exists.

如果存在数据库不一致,我不知道它是如何发生的……如果需要,我可以提供其余的控制台历史记录。

运行“./discourse-doctor”完成了,似乎没有问题,除了关于邮件服务器配置的一个警告——“证书验证失败(自签名证书)”——这可能解释了为什么电子邮件没有被发送出去。以前它们是按原样配置发送的,而且邮件服务器似乎运行正常,所以我对此不太确定。

目前该网站已完全瘫痪(在更新失败后只返回 500 错误)。除了寻求外部支持外,我们真的不知道如何进行。任何指导都将不胜感激!

1 个赞

看起来索引已损坏或出现类似问题。您需要删除或更改这些记录,以便数据库能够迁移。

如果您熟悉 SQL,或许可以在这里获得一些帮助来找出问题所在。如果您实在无法解决并且有预算,可以联系我或在 Marketplace 频道提问。

2 个赞