Discourse v3.0.6에서 v3.1.1로 업그레이드 시 오류 - Bookmark:Class에 정의되지 않은 메서드 `register_bookmarkable`

안녕하세요,

Discourse 설치 환경을 이미지 태그 3.0.6에서 3.1.1로 업그레이드하려고 시도하고 있는데, 아래 문제에 직면했습니다. Kubernetes 클러스터에서 Bitnami Helm Chart를 사용하여 공식적으로 지원되지 않는 설치 방식을 사용하고 있다는 점은 알고 있지만, 이 문제를 해결하는 방법에 대해 완전히 막막한 상태입니다.

아래에 표시된 오류는 표준 Discourse 설치 환경(추가 플러그인이 없는 상태)에서 최신 버전으로 업그레이드를 시도할 때 발생합니다. 포럼을 살펴보니 이 게시글(Upgrade failed (NoMethodError: undefined method `register_bookmarkable' for Bookmark:Class))을 확인할 수 있었으나, 해당 글에서는 discourse-data-explorer 플러그인에 대해 언급하고 있습니다. 앞서 언급했듯이, 기본 Bitnami Discourse 설치 환경에는 이 플러그인이 설치되어 있지 않습니다.

도움 주실 분 계신가요?

감사합니다,

Steve

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>'

웹 기반 업데이트였다면, 첫 번째 해결책은 명령줄 업그레이드일 것입니다. 호스트에 ssh로 접속한 다음 다음을 실행하세요.

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

(설정이 app.yml이라고 가정합니다)

수정: /opt/bitnami/discourse가 설치 위치일 가능성이 더 높아 보입니다. 이러한 차이 때문에 “unsupported-install” 태그가 붙고 공급업체에 문의하라는 조언이 나오는 것입니다.

@Ed_S님, 감사합니다. 수동 업그레이드를 시도해 보겠습니다.

Bitnami에 지원 요청을 접수했으며, 이들은 해당 문제가 애셋, 즉 이 경우 Discourse 이미지와 관련되어 있다고 답변했습니다. Bitnami의 Helm Chart 버전 간 업그레이드는 Bitnami 측에서 테스트되었어야 하므로, 발견된 문제들은 Bitnami와 Discourse 팀 간의 협력을 통해 해결되었을 것으로 기대했습니다. 이에 대해 다시 한번 확인해 줄 수 있는지 요청했습니다.

Bitnami가 discourse 팀과 협력하지 않는다고 생각합니다.

그들이 도움을 줄 수 없고 예산이 있다면 저에게 연락해 주세요. 작동하는 이미지를 만들어 드릴 수 있을 것 같습니다.

@pfaffman 감사합니다

질문이 있습니다 - 제가 보고 있는 오류는 공식적으로 지원되는 플러그인인 Chat 플러그인에서 발생한 것 같습니다. Discourse 팀이 이 오류를 살펴보는 데 이것이 어떤 차이를 만듭니까?

플러그인을 비활성화한 후 업그레이드를 수행해 보고 어떻게 되는지 확인해 보겠습니다.

Bitnami 설치판의 경우, 해당 버전과 업데이트된 플러그인 간에 호환성 문제가 발생할 수 있습니다.

표준 설치 방식으로 전환하시면 더 쉽게 해결하실 수 있을 뿐만 아니라, 이곳에서 더 많은 분들의 지원을 받을 수도 있습니다.

채팅 플러그인이 이미 포함되어 있습니다. 만약 채팅 플러그인을 별도로 설치하고 있다면(일段时间 동안은 별도였나 봐요?), 그것이 문제일 수 있습니다.

맞아요. 처음에는 별도의 플러그인이었지만, 이후 코어에 포함되도록 변경되어 더 이상 따로 설치할 필요가 없습니다.

감사합니다 @JammyDodger

시작 시 코어 플러그인을 비활성화하는 방법이 있을까요? Chat 플러그인이 문제인지 테스트해 보고 싶습니다.

Bitnami 차트에서는 플러그인 목록을 전달할 수 있으며, 제공한 각 플러그인에 대해 RAILS_ENV=production bundle exec rake plugin:install repo={{ $plugin }} 명령을 실행합니다. 하지만 이는 코어 플러그인 위에 추가 설치되는 것 같네요.

표준 설치 방식을 다시 검토해 보겠습니다. 저희는 쿠버네티스 클러스터에서 Helm 차트를 사용하여 모든 서드파티 앱을 배포하고 있지만, 쿠버네티스와 Helm 지원이 아직 멀었다면 Discourse의 경우 예외를 두는 것이 합리적일 수도 있겠습니다.

간단한 업데이트입니다. 3.0.0 이전 버전에서 업그레이드를 수행하면 업그레이드가 정상적으로 작동하는 것 같습니다. 예: 2.8.11 → 3.0.6 → 3.1.1

이것이 우연인지 확신은 없으나, 3.0.6에서 3.1.1로 바로 업그레이드하려고 하면 작동하지 않습니다.

흥미롭게도 이 업그레이드 경로를 따르더라도 채팅(Chat) 플러그인이 Discourse 배포 환경에 전혀 표시되지 않습니다. 이는 여전히 코어 제품의 일부가 아닌 외부 플러그인으로 취급되고 있기 때문으로 추정됩니다.

채팅 플러그인이 이 업그레이드 경로에서 정상적인지, 아니면 존재하지 않는 것이 매우 이상한 상황인지 아시는 분 계신가요?

활성화하셨나요?

관리자 → 설정:

image

여전히 플러그인이지만 코어에 포함되어 배포되므로, 활성화 방식이 약간 다릅니다.

설치를 다시 확인해 보겠지만, 해당 플래그를 아예 찾을 수 없습니다.

이 업그레이드를 적용한 서버에서도 플러그인 코드가 보이지 않는데, v3.0.6으로 시작하면 확실히 보이는 것 같습니다. 그래도 모든 것을 다시 확인해 보겠습니다.

공식 저장소를 클론하는 경우 이미 포함되어 있으며, 현재 stable 브랜치의 내용은 다음과 같습니다: discourse/plugins/chat at stable · discourse/discourse · GitHub

@merefield - 방금 확인해 보니, 2.8.11에서 3.0.6으로 업그레이드하면 Chat 플러그인이 사용 불가능합니다.

위에서 언급했듯이 저는 Bitnami Helm 차트를 사용해 Discourse를 배포하고 있으며, 이것이 지원되지 않는다는 점을 알고 있습니다. 다만 흥미로운 점은 3.0.6으로 처음 시작하면 Chat 플러그인이 존재한다는 것입니다.

업데이트 전에 app.yml에서 채팅 플러그인을 제거하셨나요? 제거하셔야 합니다.

저는 Chat 플러그인에 대해 아무것도 하지 않았지만, Bitnami가 Discourse 이미지 버전을 빌드하는 데 사용하는 스크립트가 이를 영향받고 있지 않다고 단정할 수는 없습니다.

Bitnami Discourse 저장소는 containers/bitnami/discourse at main · bitnami/containers · GitHub 이고, Docker 이미지를 빌드하는 방식은 https://github.com/bitnami/containers/blob/main/bitnami/discourse/3/debian-11/Dockerfile 입니다.

제 제안은? 백업을 덤프한 후 표준 설치로 전환하는 것입니다.

@stevejr 저도 같은 문제에 막혀 있습니다. 결국 업그레이드를 완료할 수 있었나요? 제안해 주신 대로 2.8 버전에서 업그레이드 프로세스를 시작해 보려 했지만, 시도조차 하지 못하고 있습니다.

불행히도 아닙니다. 저는 업그레이드를 수행한 적이 없으며, Bitnami의 답변은 백업 후 완전히 새로운 설치를 하고 복원하라는 것이었습니다.

저희 프로덕션 환경에 영향을 미치고 싶지 않으므로 이 과정을 완전히 테스트해야 합니다!

새로 설치한 후 백업에서 복원하는 방식의 다양한 변형을 시도해 보았지만, 데이터베이스 마이그레이션에 버그가 있는 것으로 보이는 문제로 인해 실패했습니다. 이러한 시도는 초기화가 쉬운 독립적인 개발 배포 환경에서 수행됩니다. 복원 로그에는 예를 들어 다음과 같은 내용이 표시됩니다:

...
[2024-02-21 12:43:12] ALTER TABLE
[2024-02-21 12:43:12] Migrating the database...
[2024-02-21 12:43:16] EXCEPTION: /opt/bitnami/discourse/lib/discourse.rb:138:in `exec': Failed to migrate database.
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

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'
...