Ошибка обновления Discourse «FAILED TO BOOTSTRAP»

Всем привет,

Первый пост здесь, заранее спасибо за то, что приняли меня. Выполняю плановое, хотя и запоздалое, обновление нашего форума на базе Discourse (https://forum.troygrady.com), и мы дошли до точки, где обновление завершается ошибкой после выполнения командной строки “git pull” и “rebuild”, как рекомендовано в инструкциях на экране.

Ниже приведён вывод команды “./launcher rebuild app”. Я также запустил скрипт “discourse doctor” и могу опубликовать или отправить ссылку на его вывод, если вы считаете, что это не создаст серьёзных проблем с безопасностью.

Хочу отметить, что, хотя я достаточно компетентный разработчик PHP/SQL с периодическим опытом администрирования Linux-приложений, я совершенно не разбираюсь в Discourse, и именно я не занимался первоначальной установкой. Ваш любимый, знаю!

Я просто следую инструкциям на экране, которые начались с нажатия синих кнопок “upgrade” в интерфейсе для Docker. После завершения этого шага я увидел инструкцию на экране войти через командную строку и выполнить git pull и launcher rebuild. Именно так я и оказался в этой ситуации.

Также добавлю, что наш форум работал абсолютно безупречно до этого, без каких-либо проблем, если это поможет в диагностике. Единственная причина, по которой мы выполняем это обновление, — просто оставаться в курсе того, что вы выпускаете, чтобы не отставать слишком сильно. Это центральный конфликт моего мышления “если не сломалось, не чини”, опасаясь, что обновление вызовет ошибку, которую я не смогу исправить. И вот, мы здесь.

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

Любые советы будут крайне полезны!

FAILED

Pups::ExecError: cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’ failed with return #<Process::Status: pid 3972 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn’
exec failed with the params {“cd”=>“$home”, “hook”=>“db_migrate”, “cmd”=>[“su discourse -c ‘bundle exec rake db:migrate’”]}
f89318158c2c276c69a60d600def8a838ae4ad4bc7bafbe665fb1cd77c130ad1
** FAILED TO BOOTSTRAP ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках; их может быть несколько.
./discourse-doctor может помочь в диагностике проблемы.

Привет, добро пожаловать в сообщество Discourse.

Где вы устанавливаете, какая операционная система? Вы следуете нашему официальному руководству?

Кажется, у вас действительно есть более ранние сообщения об ошибках; похоже, что ваша база данных (сервер) может быть недоступна.

Возможно, вам стоит рассмотреть вариант управляемого хостинга, когда ваш форум снова заработает…

Привет, Гэвин! Спасибо за быстрый ответ. Мы используем Droplet от Digital Ocean, и при входе в систему я вижу следующее:

Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-210-generic x86_64)

Что касается использования вашего официального руководства, я не могу сказать точно. Это установка, которую мы используем уже около 3–4 лет без проблем, хотя изначально её настраивал не я. Обычно требовались только обновления через браузер и периодическая пересборка через командную строку, которые всегда проходили без нашего участия, до сих пор.

У меня сохранён полный вывод терминала при пересборке в файле, и я могу его проанализировать. Но мы находимся в виртуальной среде Droplet и ничего не меняли с момента настройки. Фактически, мы редко заходим в систему, так как Discourse работает стабильно с обновлениями через браузер. Поэтому я не понимаю, что могло измениться и внезапно сделать базу данных недоступной.

Конечно. Это ситуация, когда всё работало отлично годами, так что нас не так-то просто переубедить что-то менять. Но мы были бы рады нанять кого-то, кто периодически проверял бы нашу установку и следил за актуальностью, вместо того чтобы делать это мне самому. Есть ли какой-то ресурс или каталог для поиска специалистов по Discourse, которые могли бы быть заинтересованы в подобной работе?

Спасибо!

Вам нужно будет подумать об обновлении. Эта версия устарела. Очень устарела.

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

Хорошо, выполнил поиск предупреждений и ошибок в выводе пересборки, вот что я нашел (ниже).

227:initdb: предупреждение: включена аутентификация «trust» для локальных подключений
294:update-alternatives: предупреждение: принудительная повторная установка альтернативы /usr/share/postgresql/13/man/man1/psql.1.gz, так как группа ссылок psql.1.gz повреждена
324:update-alternatives: предупреждение: принудительная повторная установка альтернативы /usr/share/postgresql/13/man/man1/postmaster.1.gz, так как группа ссылок postmaster.1.gz повреждена

1684:createdb: ошибка: создание базы данных не удалось: ОШИБКА: база данных «discourse» уже существует
1811:I, [2021-08-29T20:18:40.246150 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
1813:I, [2021-08-29T20:18:40.253584 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
2563:StandardError: Произошла ошибка, эта и все последующие миграции отменены:
2698:-- add_column(:groups, :imap_last_error, :text)
2961:** НЕ УДАЛОСЬ ЗАПУСТИТЬ ** прокрутите вверх и найдите более ранние сообщения об ошибках, их может быть несколько.
3118:createdb: ошибка: создание базы данных не удалось: ОШИБКА: база данных «discourse» уже существует
3245:I, [2021-08-29T20:22:40.262592 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
3247:I, [2021-08-29T20:22:40.274767 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
3960:StandardError: Произошла ошибка, эта и все последующие миграции отменены:
4087:** НЕ УДАЛОСЬ ЗАПУСТИТЬ ** прокрутите вверх и найдите более ранние сообщения об ошибках, их может быть несколько.
4224:/error – поиск слова «error»
4358:createdb: ошибка: создание базы данных не удалось: ОШИБКА: база данных «discourse» уже существует
4485:I, [2021-08-29T20:26:59.373901 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
4487:I, [2021-08-29T20:26:59.381142 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
5200:StandardError: Произошла ошибка, эта и все последующие миграции отменены:
5327:** НЕ УДАЛОСЬ ЗАПУСТИТЬ ** прокрутите вверх и найдите более ранние сообщения об ошибках, их может быть несколько.

Ещё раз спасибо, Гэвин, что уделили время этому, и извините за запущенные обновления ОС.

Выше приведён только тот вывод скрипта, который содержит слова «error» и «warning». Полный вывод я сохранил здесь. Если нужно искать что-то ещё в этом выводе, просто дайте знать — с радостью опубликую.

Ах, извините, я понимаю, что вывод был недостаточно пояснительным. Вот подробности сообщения об ошибке “StandardError”. Похоже, что запрос INSERT не удался из-за дублирования ключа. Внутренности запроса удалены для удобства чтения; при необходимости я могу их предоставить.

I, [2021-08-29T20:23:37.257772 #1] INFO – : > cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse ERROR: значение дублирующегося ключа нарушает уникальное ограничение “data_explorer_queries_pkey”
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse DETAIL: Ключ (id)=(-2) уже существует.
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse STATEMENT: INSERT INTO
[…]
FROM plugin_store_rows
WHERE plugin_name = ‘discourse-data-explorer’ AND type_name = ‘JSON’

rake aborted!
StandardError: Произошла ошибка, поэтому эта и все последующие миграции отменены:

ERROR: значение дублирующегося ключа нарушает уникальное ограничение “data_explorer_queries_pkey”
DETAIL: Ключ (id)=(-2) уже существует.

попробуйте это

Да, это работает (как вы уже видели).

Во время самого обновления что-то пошло не так.

Просто опубликуйте свой запрос в канале #marketplace или просмотрите его, чтобы увидеть, кто там регулярно отвечает.

Всё, что вам нужно сделать, это, когда Discourse снова заработает:

  • сделать резервную копию Discourse.
  • скачать резервную копию.
  • обновить дроплет.
  • пересобрать приложение.

После этого вы сможете работать ещё несколько лет без проблем.

Отлично, спасибо.

Если я правильно понимаю, похоже, что таблица базы данных, используемая плагином «Data Explorer», содержит дублирующуюся строку, и удаление этой дублирующей строки позволяет скрипту восстановления продолжить работу. Из той же темы также следует, что эта ошибка — или подобные ей — уже возникали ранее, и, возможно, были выпущены обновления Discourse для предотвращения её появления в будущем. То есть, при будущих обновлениях мы, вероятно, с ней не столкнёмся.

Дайте знать, если я правильно понял!

Вы имеете в виду обновление Ubuntu? Если да, то всё ясно.

Верно.

Опять верно :slight_smile:

Да :smiley:

Отлично! У меня есть четкие указания. Большое спасибо за оперативный ответ.

Напоследок, чтобы закрыть этот вопрос: у тех, кто столкнулся с этой ошибкой, вероятно, произошло несколько сбоев.

Что касается самого обновления, то дублирующаяся строка в плагине «data_explorer» вызывала проблему, и её пришлось удалить.

Однако в рамках этого процесса мы также выполнили обновление операционной системы с Ubuntu 16 до 20, что привело к сетевой ошибке, из-за которой Droplet на Digital Ocean стал недоступен после перезагрузки. В частности, похоже, что при переходе ОС на новую конфигурацию «Netplan» что-то в настройках препятствовало завершению скрипта инициализации сетевого интерфейса в момент его запуска. В результате Droplet запустился, но сеть осталась неработоспособной. После этого, зайдя через консоль восстановления в браузере и повторно запустив скрипт сетевого интерфейса, мы смогли активировать интерфейс и снова получить доступ к Droplet извне. Пока нам не придётся перезагружать Droplet, всё будет в порядке, пока мы не найдём время, чтобы выключить его и протестировать исправление конфигурации Netplan.

Я понимаю, что это, вероятно, редкий случай, но я где-то читал, что обновления ОС обычно не вызывают проблем. И хотя это, скорее всего, верно в большинстве случаев, здесь ситуация была иной, и мы оставались без связи около половины дня, пока часовые пояса не совпали так, чтобы наш технический специалист мог восстановить работу.

Итак, на данный момент всё исправлено. Спасибо всем за быструю реакцию.