내부 오류: 정의되지 않은 메서드 `visibility_reason_id`

저는 https://lilypond.community에서 Discourse 인스턴스를 관리하고 있습니다. 몇 시간 전, 웹 인터페이스를 사용하여 Discourse를 3.3.0beta2로 업그레이드했습니다. 하지만 https://meta.discourse.org/t/3-3-0-beta2-dev-update-error/308163/8에서 발생한 것과 동일한 오류로 실패했습니다. 당시 조사할 시간이 없어서 그대로 두었지만, 포럼은 여전히 정상적으로 작동하는 것처럼 보였습니다. 그런데 이제 어떤 페이지(/, /t/topic-slug 등)를访问하든 다음과 같은 메시지가 표시됩니다.

Oops

이 토론 포럼을 구동하는 소프트웨어에서 예상치 못한 문제가 발생했습니다. 불편을 드려 죄송합니다.

오류에 대한 자세한 정보는 로그로 기록되었으며 자동 알림이 생성되었습니다. 확인해 보겠습니다.

추가 조치는 필요하지 않습니다. 다만 오류 상태가 지속된다면, 오류를 재현하는 단계를 포함한 추가 세부 정보를 사이트의 피드백 카테고리에 토론 주제를 게시하여 제공할 수 있습니다.

링크된 주제에 있는 조언을 따랐습니다:

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

하지만 도움이 되지 않았습니다. 문제가 실제로 업그레이드와 관련이 있는지 100% 확신은 없지만, 그럴 가능성이 높다고 생각합니다.

/var/discourse/shared/standalone/log/rails/production.log에서 https://lilypond.community/t/effacer-les-citations-du-conducteur/5698/8 페이지에 접근을 시도한 직후 발견한 내용은 다음과 같습니다:

Started GET "/t/effacer-les-citations-du-conducteur/5698/8" for [IP redacted] at 2024-05-16 20:49:53 +0000
Processing by TopicsController#show as HTML
  Parameters: {"slug"=>"effacer-les-citations-du-conducteur", "topic_id"=>"5698", "post_number"=>"8"}
Completed 500 Internal Server Error in 39ms (ActiveRecord: 0.0ms | Allocations: 14832)
NoMethodError (undefined method `visibility_reason_id' for #<Topic id: 5698, title: "Effacer les citations du conducteur", [...]>)
app/serializers/topic_view_serializer.rb:327:in `include_visibility_reason_id?'
(eval):37:in `_fast_attributes'
app/controllers/topics_controller.rb:1360:in `block (2 levels) in perform_show_response'
app/controllers/topics_controller.rb:1354:in `perform_show_response'
app/controllers/topics_controller.rb:187:in `show'
app/controllers/application_controller.rb:423:in `block in with_resolved_locale'
app/controllers/application_controller.rb:423:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:391:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:277:in `call'
start
done

사용자 페이지의 경우:

Started GET "/u/jeanas/" for [IP redacted] at 2024-05-16 20:47:21 +0000
Processing by UsersController#show as HTML
  Parameters: {"username"=>"jeanas"}
Completed 500 Internal Server Error in 180ms (ActiveRecord: 0.0ms | Allocations: 80166)
NoMethodError (undefined method `custom_homepage' for #<ThemeModifierHelper:0x00007f37a9f775c8 @theme_ids=[1]>)
app/serializers/user_serializer.rb:327:in `can_pick_theme_with_custom_homepage'
(eval):100:in `_fast_attributes'
app/controllers/users_controller.rb:152:in `block (2 levels) in show'
app/controllers/users_controller.rb:149:in `show'
app/controllers/application_controller.rb:423:in `block in with_resolved_locale'
app/controllers/application_controller.rb:423:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:393:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:277:in `call'

그리고 루트 페이지의 경우:

Started GET "/" for [IP redacted] at 2024-05-16 20:54:16 +0000
NoMethodError (undefined method `custom_homepage' for #<ThemeModifierHelper:0x00007f37aba0c488 @theme_ids=[]>)
lib/homepage_helper.rb:5:in `resolve'
lib/homepage_constraint.rb:12:in `matches?'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:393:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:277:in `call'

코드를 살펴보면 visibility_reason_id와 같은 필드는 이 버전에서 새로 추가된 데이터베이스 필드이며, 마이그레이션 스크립트(예: db/migrate/20240423013808_add_visibility_reason_id_to_topics.rb)를 통해 기존 데이터베이스에 추가되어야 할 것으로 보입니다. 업그레이드가 이 스크립트 실행 전에 중단되었을 것으로 추정됩니다.

3.3.0beta1로 깔끔하게 롤백한 후 마이그레이션을 다시 수행할 수 있는 방법이 있을까요? Docker 컨테이너(./launcher enter app) 안에서 git checkout v3.3.0.beta1을 실행하면 위험한가요?

두 번째로 다시 빌드해도 여전히 발생하나요? 문제가 계속된다면 리빌드 로그에는 어떤 내용이 표시되나요? :thinking:

오, 잘 작동했어요. 감사합니다!