Discourse升级错误“启动失败”

大家好,

这是我的第一篇帖子,提前感谢大家接纳我。我们正对基于 Discourse 的论坛(https://forum.troygrady.com)进行一套常规但已延迟的升级操作,但在按照屏幕提示执行命令行中的 git pullrebuild 步骤后,升级失败了。

以下是 ./launcher rebuild app 命令的输出结果。我还运行了 discourse doctor 脚本,如果您认为这不会带来太大的安全风险,我可以发布或转发该脚本的输出结果。

需要说明的是,虽然我是一名还算熟练的 PHP/SQL 开发者,偶尔也有 Linux 应用管理方面的经验,但对 Discourse 本身完全不了解,而且我们最初的安装也不是我负责的。我知道你们最喜欢我这种人了!

我只是在遵循屏幕上的操作指引:首先点击 Docker UI 中的蓝色“升级”按钮。完成后,系统提示我通过命令行登录并执行 git pulllauncher rebuild。我就是因此才到了这一步。

另外想补充一点,我们的论坛在此之前运行得非常完美,没有任何问题,如果这有助于诊断的话。我们进行这次升级的唯一原因,就是希望跟上各位发布的更新,避免版本过于陈旧。这也正是我“没坏就别修”心态与必须升级之间的冲突:我担心升级会引发一些超出我修复能力的错误。而果然,我们现在就遇到了这个问题。

截至我写下这段文字时,论坛已经完全无法访问。由于这是业务的核心组件,我希望能尽快恢复其正常运行。

非常感激任何建议!

FAILED

Pups::ExecError: cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’ 执行失败,返回状态为 #<Process::Status: pid 3972 exit 1>
失败位置:/pups/lib/pups/exec_command.rb:112:in `spawn’
执行失败,参数如下:{“cd”=>“$home”, “hook”=>“db_migrate”, “cmd”=>[“su discourse -c ‘bundle exec rake db:migrate’”]}
f89318158c2c276c69a60d600def8a838ae4ad4bc7bafbe665fb1cd77c130ad1
** 启动失败 ** 请向上滚动查看更早的错误信息,可能不止一条。
./discourse-doctor 可能有助于诊断问题。

嘿,欢迎来到 Discourse 社区。

你在哪里安装?使用什么操作系统?你是在遵循我们的官方指南吗?

我想你确实可能有更早的错误消息,看起来你的数据库(服务器)可能无法访问。

也许你应该在论坛重新正常运行后考虑使用托管服务……

1 个赞

你好,Gavin!感谢你的迅速回复。我们使用的是 Digital Ocean 的 Droplet,登录时显示如下:

Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-210-generic x86_64)

至于是否遵循了官方指南,我无法确定。这是一个我们已经运行了大约 3 到 4 年且一直正常的安装,不过最初并不是由我来设置的。通常只需要在浏览器中进行升级,偶尔也需要命令行重建,这些操作一直以来都无需我们额外干预就能顺利完成,直到这次出了问题。

我保存了整个重建过程的终端输出到文件中,可以从中查找。但我们的环境是虚拟 Droplet,自搭建以来没有任何改动。事实上,由于 Discourse 一直通过浏览器升级正常运行,我们很少登录系统。因此,我不确定是什么突然导致数据库无法访问了。

当然可以。这种情况是系统多年来一直运行良好,所以并没有太多动力去改变现状。不过,我们很乐意偶尔聘请专业人士来检查我们的安装情况,并确保一切保持最新,而不是由我来操作。请问是否有资源或目录可以查找愿意承接此类工作的 Discourse 专家?

谢谢!

你需要考虑更新它。它已经过时了,非常过时。

不过,让我们先帮你把系统跑起来。你能把错误日志发出来吗?我们需要看看具体是什么错误。

好的,我在重建输出中搜索了警告和错误,结果如下(见下方)。

227:initdb: 警告:为本地连接启用“trust”身份验证
294:update-alternatives: 警告:强制重新安装替代文件 /usr/share/postgresql/13/man/man1/psql.1.gz,因为链接组 psql.1.gz 已损坏
324:update-alternatives: 警告:强制重新安装替代文件 /usr/share/postgresql/13/man/man1/postmaster.1.gz,因为链接组 postmaster.1.gz 已损坏

1684:createdb: 错误:数据库创建失败:错误:数据库 “discourse” 已存在
1811:I, [2021-08-29T20:18:40.246150 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
1813:I, [2021-08-29T20:18:40.253584 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
2563:StandardError: 发生错误,本次及后续所有迁移已取消:
2698:-- add_column(:groups, :imap_last_error, :text)
2961:** 启动失败 ** 请向上滚动并查找更早的错误信息,可能不止一条。
3118:createdb: 错误:数据库创建失败:错误:数据库 “discourse” 已存在
3245:I, [2021-08-29T20:22:40.262592 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
3247:I, [2021-08-29T20:22:40.274767 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
3960:StandardError: 发生错误,本次及后续所有迁移已取消:
4087:** 启动失败 ** 请向上滚动并查找更早的错误信息,可能不止一条。
4224:/error – 搜索单词 ‘error’
4358:createdb: 错误:数据库创建失败:错误:数据库 “discourse” 已存在
4485:I, [2021-08-29T20:26:59.373901 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
4487:I, [2021-08-29T20:26:59.381142 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
5200:StandardError: 发生错误,本次及后续所有迁移已取消:
5327:** 启动失败 ** 请向上滚动并查找更早的错误信息,可能不止一条。

再次感谢 Gavin 查看此事,并为被搁置的操作系统升级致歉。

上面是我在脚本输出中搜索“error”和“warning”这两个词时得到的结果,该脚本的完整输出已保存于此。如果还需要我在该输出中查找其他内容,请随时告知,我很乐意发布。

啊,抱歉,我意识到之前的输出解释得不够清楚。以下是关于“StandardError”错误的详细信息。看起来是一条 INSERT 查询因主键冲突而失败。为了便于阅读,查询的具体内容已做脱敏处理,如有需要我可以提供完整内容。

I, [2021-08-29T20:23:37.257772 #1] INFO – : > cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse ERROR: 重复键值违反了唯一约束 “data_explorer_queries_pkey”
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse DETAIL: 键 (id)=(-2) 已存在。
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse STATEMENT: INSERT INTO
[…]
FROM plugin_store_rows
WHERE plugin_name = ‘discourse-data-explorer’ AND type_name = ‘JSON’

rake aborted!
StandardError: 发生错误,本次及后续所有迁移已取消:

ERROR: 重复键值违反了唯一约束 “data_explorer_queries_pkey”
DETAIL: 键 (id)=(-2) 已存在。

试试这个

1 个赞

是的,这样可以(正如你所见)。

升级过程中出现了问题。

只需在 #marketplace 发布你的需求,或浏览该板块查看哪些人经常在那里回应。

你只需要在 Discourse 重新上线并正常运行后,执行以下步骤:

  • 备份 Discourse。
  • 下载备份文件。
  • 更新 Droplet。
  • 重建应用。

完成后,你就可以安心使用好几年了。

太棒了,谢谢。

如果我没理解错的话,似乎有一个名为“数据探索器”(data explorer)的插件使用的数据库表中存在重复行,删除该重复行后,重建脚本就能继续执行。从该讨论串来看,类似这样的错误以前也曾发生过,Discourse 可能已经发布了更新以防止未来再次出现这种情况。也就是说,我们未来进行的升级可能就不会再遇到这个问题了。

请告诉我您是否认为我的理解是正确的!

您指的是 Ubuntu 升级吗?如果是的话,明白了。

正确

再次正确 :slight_smile:

是的 :smiley:

好的!我已经接到指令了。非常感谢你如此迅速的反馈。

1 个赞

为了彻底解决此问题,向所有遇到该错误的用户说明:我们确实遇到了几个问题。

关于升级本身,“data_explorer” 插件中存在重复行导致了故障,必须将其移除。

此外,作为升级的一部分,我们还执行了从 Ubuntu 16 到 20 的操作系统升级,这引发了网络错误,导致 Digital Ocean 实例在重启后无法访问。具体来说,当操作系统迁移到新的 “Netplan” 配置时,某些配置项阻止了网络接口启动脚本在运行时完成。因此,实例虽然启动了,但网络并未连通。随后,我们通过浏览器内的恢复控制台进入系统,再次运行网络接口脚本,成功启用了网络接口,使我们能够重新从外部访问。只要不再次重启该实例,我们就能维持正常运行,直到我们有时间关机并测试修复 Netplan 配置的方案。

我知道这可能属于极端情况,但我记得曾看到过“操作系统升级通常不会引发问题”的说法。虽然这在大多数情况下可能属实,但这次并非如此,导致我们离线了整整半天,直到时区协调到我们的技术支援人员能够协助恢复服务。

目前所有问题均已解决。感谢大家迅速的反馈。

5 个赞