Discourse v3.0.6 到 v3.1.1 升级错误 - undefined method `register_bookmarkable' for Bookmark:Class

你好,

我正在尝试将我的 Discourse 安装从镜像标签 3.0.6 升级到 3.1.1,但遇到了以下问题。我知道我正在使用 Bitnami Helm Chart 在 Kubernetes 集群中进行不受支持的安装,但我完全不知道如何解决。

当我尝试从现成的 Discourse 安装(未添加任何附加插件)升级到最新版本时,会发出以下错误。查看论坛,我看到了这个帖子 - Upgrade failed (NoMethodError: undefined method `register_bookmarkable' for Bookmark:Class) - 但它讨论的是 discourse-data-explorer 插件,如上所述,该插件并未安装在默认的 Bitnami Discourse 安装中。

有人能帮忙吗?

谢谢,

史蒂夫

discourse 07:39:04.07 INFO  ==> Running database migrations
rake aborted!
NoMethodError: undefined method `register_bookmarkable' for Bookmark:Class
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.5.1/lib/active_record/dynamic_matchers.rb:22:in `method_missing'
/opt/bitnami/discourse/plugins/chat/plugin.rb:261:in `block (2 levels) in activate!'
/opt/bitnami/discourse/lib/plugin/instance.rb:1351:in `reloadable_patch'
/opt/bitnami/discourse/plugins/chat/plugin.rb:250:in `block in activate!'
/opt/bitnami/discourse/lib/plugin/instance.rb:526:in `block in notify_after_initialize'
/opt/bitnami/discourse/lib/plugin/instance.rb:524:in `each'
/opt/bitnami/discourse/lib/plugin/instance.rb:524:in `notify_after_initialize'
/opt/bitnami/discourse/config/application.rb:230:in `each'
/opt/bitnami/discourse/config/application.rb:230:in `block (2 levels) in <class:Application>'
/opt/bitnami/discourse/lib/plugin.rb:6:in `initialization_guard'
/opt/bitnami/discourse/config/application.rb:230:in `block in <class:Application>'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.5.1/lib/active_support/lazy_load_hooks.rb:92:in `block in execute_hook'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.5.1/lib/active_support/lazy_load_hooks.rb:85:in `with_execution_control'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.5.1/lib/active_support/lazy_load_hooks.rb:90:in `execute_hook'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.5.1/lib/active_support/lazy_load_hooks.rb:76:in `block in run_load_hooks'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.5.1/lib/active_support/lazy_load_hooks.rb:75:in `each'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.5.1/lib/active_support/lazy_load_hooks.rb:75:in `run_load_hooks'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/application/finisher.rb:87:in `block in <module:Finisher>'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/initializable.rb:32:in `instance_exec'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/initializable.rb:32:in `run'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/initializable.rb:60:in `run_initializers'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/application.rb:372:in `initialize!'
/opt/bitnami/discourse/config/environment.rb:7:in `<main>'
internal:/opt/bitnami/ruby/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb:38:in `require'
internal:/opt/bitnami/ruby/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb:38:in `require'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.10/lib/zeitwerk/kernel.rb:38:in `require'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/application.rb:348:in `require_environment!'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/application.rb:506:in `block in run_tasks_blocks'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/opt/bitnami/ruby/bin/bundle:25:in `load'
/opt/bitnami/ruby/bin/bundle:25:in `<main>'

如果这是一个基于 Web 的更新,第一个解决办法将是命令行升级 - ssh 到您的主机并执行

cd /var/discourse
git pull
./launcher rebuild app

(假设您的配置名为 app.yml)

编辑:但是,您的安装位置更可能是 /opt/bitnami/discourse。正是这种差异导致了“unsupported-install”标签以及联系供应商的建议。

1 个赞

感谢 @Ed_S,我将尝试手动升级。

我已经向 Bitnami 提出了支持问题,他们声称这是资产本身的问题,在这种情况下是 Discourse 镜像。我已要求他们重新检查,因为在他们的 Helm Chart 版本之间进行升级应该已经过 Bitnami 的测试,并且他们看到的任何问题都应该在 Bitnami 和 Discourse 团队之间得到解决。

2 个赞

我相当确定 Bitnami 不与 discourse 团队合作。

如果他们无法提供帮助,并且您有预算,可以联系我。我或许可以为您构建一个可用的镜像。

1 个赞

感谢 @pfaffman

问题 - 我看到的错误似乎暗示它来自 Chat 插件,这是一个官方支持的插件 - 这对 Discourse 团队查看错误是否有区别?

我将尝试禁用它,然后执行升级,看看效果如何。

我认为 Bitnami 安装有时会与其版本和更新的插件存在兼容性问题。

如果您可以迁移到标准安装,您可能会更容易(并且还能从更多人那里获得支持)。

1 个赞

聊天插件已包含在内。如果您也安装了聊天插件(我记得它曾经是分开的?),那么这可能是问题所在。

1 个赞

没错。它最初是一个独立的插件,但后来已与核心捆绑在一起,因此不再需要单独安装。

感谢 @JammyDodger

有没有办法在启动时禁用核心插件,以便我测试 Chat 插件是否是问题所在?

Bitnami chart 允许我传递一个插件列表,它将为我提供的每个插件运行命令 RAILS_ENV=production bundle exec rake plugin:install repo={{ $plugin }},但我想这将在核心插件之上运行。

我将再次查看标准安装——我们在 Kubernetes 集群中使用 Helm chart 部署所有第三方应用程序,但也许对于 Discourse 来说,如果 Kubernetes 和 Helm 支持还有很长的路要走,可以做一个例外。

只是一个快速更新,似乎从 3.0.0 之前的版本执行升级可以使升级正常工作,即 2.8.11 → 3.0.6 → 3.1.1。

我不确定这是否纯属巧合,但尝试直接从 3.0.6 升级到 3.1.1 不起作用。

有趣的是,在此升级路径之后,聊天插件甚至没有出现在我的 Discourse 部署中。它被认为仍然是一个外部插件,而不是核心产品的一部分。

有人知道聊天插件在此升级路径中是否正确,还是它没有出现是出了什么严重问题!

您启用它了吗?

管理员 → 设置:

image

它仍然是一个插件,但已随核心一起发布,因此启用它的方式略有不同。

我会仔细检查我的安装,但我甚至看不到该标志。

使用此升级时,我也看不到服务器上的插件代码,但如果我从 v3.0.6 开始,我确信我能看到,但会仔细检查所有内容。

如果您克隆的是官方仓库,它已包含在内,这是 stable 分支的当前内容:discourse/plugins/chat at stable · discourse/discourse · GitHub

@merefield - 我刚检查了一下,如果我从 2.8.11 版本升级到 3.0.6 版本,Chat 插件将不可用。

如上所述,我正在使用 Bitnami Helm chart 部署 Discourse,我知道这不受支持,但有趣的是,如果我从 3.0.6 版本开始,Chat 插件是存在的。

在更新之前,您是否已从 app.yml 中移除了聊天插件?您应该这样做。

我没有对 Chat 插件做任何操作,但这并不意味着 Bitnami 用来构建其 Discourse 镜像的脚本没有影响它。

这是 Bitnami Discourse 仓库 - https://github.com/bitnami/containers/tree/main/bitnami/discourse,以及他们如何构建 Docker 镜像 - https://github.com/bitnami/containers/blob/main/bitnami/discourse/3/debian-11/Dockerfile

我的建议?直接恢复备份,然后迁移到标准安装。

@stevejr 我也遇到了同样的困境。你最终能够完成升级吗?我无法按照你建议的从 2.8 开始尝试升级过程。

抱歉,不是。我没有进行任何升级,Bitnami 的回应是进行备份,然后进行全新的安装,之后再恢复。

我需要全面测试这一点,因为我不想影响我们的生产环境!

我一直在尝试使用全新安装然后从备份恢复的方法,但由于数据库迁移中似乎存在 bug 而失败。这些尝试是在一个易于重置的独立开发部署上进行的。例如,恢复日志显示:

...
[2024-02-21 12:43:12] ALTER TABLE
[2024-02-21 12:43:12] 正在迁移数据库...
[2024-02-21 12:43:16] EXCEPTION: /opt/bitnami/discourse/lib/discourse.rb:138:in `exec': 数据库迁移失败。
rake aborted!
StandardError: 发生了一个错误,此错误及之后的所有迁移都已取消:

PG::DuplicateTable: ERROR:  relation \"sidebar_sections\" already exists
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.0/lib/patches/db/pg.rb:110:in `exec'
/opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.0/lib/patches/db/pg.rb:110:in `async_exec'
...