Внутренняя ошибка: не определен метод `visibility_reason_id`

Я управляю экземпляром Discourse на https://lilypond.community. Несколько часов назад я использовал веб-интерфейс для обновления Discourse до версии 3.3.0beta2. Обновление не удалось из-за той же ошибки, что и на 3.3.0.beta2-dev update error - #8 by david. В тот момент у меня не было времени расследовать проблему, поэтому я оставил всё как было, и форум казался рабочим. Теперь на любой странице (, /, /t/topic-slug и т. д.) отображается:

Ой

В программном обеспечении, управляющем этим форумом, возникла непредвиденная проблема. Приносим извинения за неудобства.

Подробная информация об ошибке была записана в журнал, и автоматически отправлено уведомление. Мы разберёмся с этим.

Никаких дополнительных действий с вашей стороны не требуется. Однако, если ошибка сохраняется, вы можете предоставить дополнительные детали, включая шаги для воспроизведения ошибки, опубликовав тему в категории обратной связи сайта.

Я последовал советам из связанной темы:

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 и повторно выполнить миграцию? Если я выполню git checkout v3.3.0.beta1 внутри контейнера Docker (./launcher enter app), это опасно?

Продолжает ли это происходить при повторной сборке? Что говорит журнал сборки, если проблема сохраняется? :thinking:

О, это сработало. Спасибо!