Frontend на продакшене не работает — ошибка Ember/Test

Мой фронтенд экземпляра Discourse полностью пуст и не загружается после нового обновления. Это серьёзная проблема, и я немного напуган, так как пользователи недовольны. Бэкенд, кажется, работает.

Это произошло после сегодняшнего обновления на Digital Ocean Droplet, запущенном в контейнере. Я использовал launcher для пересборки приложения.

Любая помощь будет крайне оценена.

Ошибка в консоли:

app.js:31 
Uncaught TypeError: Cannot read properties of undefined (reading 'registerAsyncHelper')    at s.callback (vendor-suffix.js:58:1)
    at s.exports (loader.js:106:1)
    at s._reify (loader.js:143:1)
    at s.reify (loader.js:130:1)
    at s.exports (loader.js:104:1)
    at s._reify (loader.js:143:1)
    at s.reify (loader.js:130:1)
    at s.exports (loader.js:104:1)
    at s._reify (loader.js:143:1)
    at s.reify (loader.js:130:1)
    at s.exports (loader.js:104:1)
    at requireModule (loader.js:27:1)
    at n._prepareInitializer (app.js:24:1)
    at app.js:81:1
    at Array.forEach (<anonymous>)
    at n.start (app.js:73:1)
    at HTMLDocument.<anonymous> (start-app.js:4:1)
    at discourse-boot.js:30:1
    at discourse-boot.js:31:1

Весь HTML загружается корректно, но что-то не работает с приложением Ember…

Посмотрев на код, где возникает ошибка, кажется, что Ember.Application.extend по какой-то причине выбрасывает исключение

  var Discourse = Ember.Application.extend({
    rootElement: "#main",
    customEvents: {
      paste: "paste"
    },
    Resolver: (0, _resolver.buildResolver)("discourse"),
    _prepareInitializer: function _prepareInitializer(moduleName) {
      var themeId = moduleThemeId(moduleName);
      var module = null;

      try {
        module = requirejs(moduleName, null, null, true);

        if (!module) {
          throw new Error(moduleName + " must export an initializer.");
        }
      } catch (error) {
        if (!themeId || (0, _environment.isTesting)()) {
          throw error;
        }

Виновником, похоже, является это условное выражение: !themeId || (0, _environment.isTesting)()

Эх… это был плагин. Не уверен, какой именно, но после некоторых поисков здесь я подозревал, что проблема могла быть в этом. Удалил cakeday, signatures, data explorer, discourse-video-upload и encryption. Позже буду добавлять их по одному и посмотрю, удастся ли выявить виновника. Но пока приложение снова работает, и я больше к нему не трогаю.

Ужасный опыт. Чувствую себя довольно виноватым… В будущем, наверное, стоит иметь процесс клонирования на тестовый сервер для таких обновлений. Урок усвоен. Или, по крайней мере, я всегда буду делать снимок состояния перед обновлением, чтобы в случае сбоя можно было восстановить систему.

Проблема в плагине Discourse encrypt. Вы можете исправить это, добавив его в конец вашего YAML-файла и выбрав коммит из времени до того, как он впервые сломался (проверка подписи перестала работать пару дней назад), вот так:

  - git clone https://github.com/discourse/docker-manager.git
  ... затем ваши другие плагины ...
  - git clone https://github.com/discourse/discourse-encrypt.git
  - cd discourse-encrypt && git checkout 12639de

Как видите, я поставил плагин Discourse encrypt последним, на случай если команды cd и git checkout повлияли бы на последующие команды (хотя я не думаю, что это так).

Да, это хеш коммита последней версии, которая гарантированно работает корректно.

Мой сайт теперь снова работает нормально. И у Discourse Encrypt снова зелёные галочки.

@TomSSL спасибо за этот разбор проблемы

@sam Завтра я подам заявку на позицию Full Stack Engineer. Решил, что, пока я занимаюсь исправлением сломанных плагинов, попробую присоединиться к команде и поработать над плагинами :slight_smile:

Я бы просто написал вам в личные сообщения, но этот инстанс не позволяет этого сделать.

Смотри Current Openings | Discourse - Civilized Discussion :slight_smile:

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

Мы знаем о проблеме с проверкой подписи и уже работаем над исправлением и выпустили исправление.

Однако ошибка Ember.Test была неожиданной. @Mycobee, пожалуйста, подтвердите, какую версию Discourse вы используете? Как вы выполняли обновление? Через интерфейс /admin/upgrade?

Да, это крайне важно, и я забыл об этом упомянуть (я писал это почти в 4 часа утра по моему времени, только что восстановил работу системы и решил заглянуть сюда, чтобы проверить, столкнулся ли кто-то ещё с той же проблемой). Это лишь временное решение, чтобы снова запустить систему. Спасибо за напоминание, @david.

Это исправление не сработало для меня, когда я обновил всё сегодня в 00:00 UTC (десять с половиной часов назад). Я обновил свой экземпляр именно тогда, потому что увидел, что проблема с проверкой подписи была исправлена. После этого мне пришлось применить описанное выше временное решение. Возможно ли, что моё обычное обновление по какой-то причине не подтянуло последний код?

У вас всё ещё была проблема с проверкой подписи :x:? Или вы столкнулись с проблемой Ember.Test?

Кроме того, я только что связался с командой, и, похоже, мы выявили проблему с Ember.Test, и исправление будет очень скоро. Мы обновим информацию здесь, как только оно станет доступно.

У меня отображалась пустая главная страница, и мне пришлось отключить все плагины (в безопасном режиме), чтобы сайт вообще загрузился. Я обычно делаю еженедельные обновления примерно в 9:00 UTC по понедельникам, а это было дополнительное обновление для исправления проблемы с проверкой подписи. Однако… естественно, было зафиксировано и довольно много других изменений. Кроме того, в этот период версия также была повышена до 2.9.0beta3.

Как вы уже, вероятно, видели (но, возможно, кто-то ещё нет), вот дифф для Discourse Encrypt между версией, которая у меня сейчас запущена, и последней версией на момент написания этого сообщения.

Также это заняло не почти до 4 часов утра. Всё было исправлено незадолго до 2 часов ночи, но затем мне нужно было сообщить людям, что произошло (большинство наших пользователей находятся в США).

Эта проблема должна быть исправлена этим коммитом в ядре Discourse:

Таким образом, после обновления Discourse до последней версии можно безопасно обновить discourse-encrypt до последней версии.

Действительно, всё сработало, обновление теперь проходит без проблем.

@david, я обновился до версии 2.9.0.beta3, что и вызвало проблему.

Что касается процесса обновления, я обычно делаю это через интерфейс /admin/upgrade. В данном случае всё было иначе.

Я обновил только docker-manager через интерфейс обновления. После этого мне пришлось заняться другими делами, и лишь через несколько часов я вернулся на путь /admin/upgrade, чтобы завершить процесс обновления.

Меня встретил текстовый экран с инструкцией перейти на хост, сменить директорию на /var/discourse, выполнить git pull и пересобрать приложение с помощью ./launcher… Так я и поступил, после чего началась полная неразбериха.

В состоянии сильного стресса и нервного напряжения я нашёл на этом форуме информацию о том, что не перехваченная ошибка TypeError может быть связана с плагином, поэтому я удалил из app.yml все ненужные плагины и пересобрал контейнер. После этого приложение Ember снова заработало.