Обновление или переустановка Discourse до последней версии необратимо ломает сайт

Привет! У нас уже какое-то время висит очень неприятный баг, который сломал весь наш сайт, и выхода из этой ситуации, казалось бы, нет. Мы перепробовали всё: от полной пересборки до удаления и добавления плагинов — безрезультатно. У нас есть рабочая резервная копия двухмесячной давности, но любая попытка восстановить сайт на более новой версии приводит к его полному падению.

Основное сообщение об ошибке выглядит так:

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

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

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

Это стандартное сообщение об ошибке в Discourse, которое не даёт никаких конкретных подсказок при поиске проблемы. Проверив логи нашего Docker-контейнера, я нашёл следующее:

Completed 500 Internal Server Error in 152ms (ActiveRecord: 0.0ms | Allocations: 17980)
ActionView::Template::Error (undefined method `[]' for nil:NilClass)
lib/svg_sprite/svg_sprite.rb:502:in `block in custom_icons'
lib/svg_sprite/svg_sprite.rb:500:in `each'
lib/svg_sprite/svg_sprite.rb:500:in `custom_icons'
lib/svg_sprite/svg_sprite.rb:275:in `block in all_icons'
lib/distributed_cache.rb:25:in `defer_get_set'
lib/svg_sprite/svg_sprite.rb:517:in `get_set_cache'
lib/svg_sprite/svg_sprite.rb:268:in `all_icons'
lib/svg_sprite/svg_sprite.rb:337:in `bundle'
lib/svg_sprite/svg_sprite.rb:285:in `block in version'
lib/distributed_cache.rb:25:in `defer_get_set'
lib/svg_sprite/svg_sprite.rb:517:in `get_set_cache'
lib/svg_sprite/svg_sprite.rb:284:in `version'
lib/svg_sprite/svg_sprite.rb:290:in `path'
app/helpers/application_helper.rb:586:in `client_side_setup_data'
app/views/layouts/application.html.erb:61
lib/topic_list_responder.rb:13:in `block (2 levels) in respond_with_list'
lib/topic_list_responder.rb:9:in `respond_with_list'
app/controllers/list_controller.rb:103:in `block (2 levels) in <class:ListController>'
app/controllers/application_controller.rb:387:in `block in with_resolved_locale'
app/controllers/application_controller.rb:387:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:356:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
lib/middleware/request_tracker.rb:198:in `call'

Естественно, я подумал, что могу исправить проблему, просто добавив блок try/catch на строке 501, где возникает ошибка. Вот этот метод:

  def self.custom_icons(theme_id)
    # Автоматически регистрируем иконки в спрайтах, добавленных через темы или плагины
    icons = []
    custom_svg_sprites(theme_id).each do |item|
      begin
        svg_file = Nokogiri::XML(item[:sprite])
        svg_file.css('symbol').each do |sym|
          icons << sym.attributes['id'].value if sym.attributes['id'].present?
        end
      rescue Exception:
        puts Exception
      end
    end
    icons
  end

Хотя это действительно восстанавливает работоспособность сайта, к сожалению, это происходит за счёт того, что на всём сайте не загружаются никакие иконки или изображения, так что в итоге это ничего не исправляет.

Мы используем следующие плагины:

          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-bbcode.git
          - git clone https://github.com/discourse/discourse-follow.git
          - git clone https://github.com/discourse/discourse-user-notes.git

Насколько я помню, мы использовали некоторые плагины, такие как discourse-follow, ещё до того, как они получили официальную поддержку, поэтому, возможно, их сторонняя установка что-то сломала в процессе.

Исходная версия перед обновлением была 2.8.0.beta2, сейчас мы на 2.9.0.beta1.

Я перепробовал практически всё, что мог придумать. Не был уверен, стоит ли публиковать этот вопрос здесь, так как кажется, что это слишком общий баг, и мало кто сможет помочь. Но если у кого-то есть идеи относительно причины этой проблемы, буду очень признателен за помощь.

Это может быть проблема с Postgres, когда PostgreSQL пытается обновиться с версии 10 до версии 13.

Проверьте логи, чтобы убедиться, нет ли там сообщений, связанных с PostgreSQL.

Вы имеете в виду логи, находящиеся в /shared/standalone/log/rails? Потому что в них ничего не упоминается, связанного с Postgres. Что касается логов в /shared/standalone/log/var-log/postgres, то примерно в момент ошибки, 19:51:08, запрос кажется вполне обычным. Нет ошибок или чего-либо, что указывало бы на сбой. И в момент обновления, думаю, это здесь не логируется.

Есть ли что-то конкретное, на что мне стоит обратить внимание?

Убедитесь, что команды apt-get update и apt-get upgrade выполнены успешно и система обновлена, а затем запустите ./launcher rebuild app.

Проверьте наличие ошибок или просмотрите логи в /var/discourse/shared/standalone/log/rails.

Я выполнил обновление через apt-get update и apt-get upgrade, сделал полную пересборку, но, к сожалению, столкнулся с теми же ошибками. Насколько я могу судить, ничего не изменилось.

Несколько вопросов:

  1. Завершается ли пересборка без ошибок?
  2. Пробовали ли вы загрузить сайт в безопасном режиме?
  3. Можете ли вы предоставить URL сайта, чтобы мы могли его проверить?
  1. Да, перестроение завершается без ошибок.
  2. Да, и это очень похоже на ситуацию, когда я исправлял ошибку, упомянутую выше: сайт запускается в своеобразном режиме «без иконок/изображений», где ничего не загружается.
  3. И да, и нет: на сайте есть откровенный контент, и мне нужно будет уточнить у людей, готовы ли они к тому, что я поделюсь этим.

Тем временем я выяснил ещё кое-что: при просмотре сайта в безопасном режиме я заметил, что плагин DiscoTOC выдаёт ошибку. После его отключения сайт снова работает нормально, и безопасный режим больше не требуется, однако иконки и изображения всё ещё не загружаются корректно.

Все изображения вызывают в консоли ошибки 404, большинство иконок, включая favicon, — ошибки 500.
Раньше всё работало исправно.

В дополнение к этому, не могло ли случиться так, что пересборка каким-то образом очистила базу данных от всех ссылок на изображения?

Чтобы держать всех в курсе, я попробовал несколько предложений из разных тем, но вот лишь два из них:

К сожалению, ни одно из предложений не помогло: rake posts:rebake, rake posts:missing_uploads и rake uploads:recover_from_tombstone не сработали. Я также проверил панель управления sidekiq, но она тоже ничего не восстанавливает.

Если у кого-то есть идеи, как восстановить теперь отсутствующие изображения, буду признателен за любую информацию.

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

Было ли что-то, что вы хотели бы знать в самом начале?

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

Никому бы и в голову не пришло! Рад, что вы нашли решение.