Привет! У нас уже какое-то время висит очень неприятный баг, который сломал весь наш сайт, и выхода из этой ситуации, казалось бы, нет. Мы перепробовали всё: от полной пересборки до удаления и добавления плагинов — безрезультатно. У нас есть рабочая резервная копия двухмесячной давности, но любая попытка восстановить сайт на более новой версии приводит к его полному падению.
Основное сообщение об ошибке выглядит так:
Упс
Программное обеспечение, управляющее этим форумом, столкнулось с неожиданной проблемой. Приносим извинения за неудобства.
Подробная информация об ошибке была записана в лог, и было автоматически отправлено уведомление. Мы разберёмся с этим.
Дальнейших действий с вашей стороны не требуется. Однако, если ошибка продолжит проявляться, вы можете предоставить дополнительные сведения, включая шаги для воспроизведения ошибки, опубликовав тему в категории обратной связи на сайте.
Это стандартное сообщение об ошибке в 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.
Я перепробовал практически всё, что мог придумать. Не был уверен, стоит ли публиковать этот вопрос здесь, так как кажется, что это слишком общий баг, и мало кто сможет помочь. Но если у кого-то есть идеи относительно причины этой проблемы, буду очень признателен за помощь.
