Помогите отладить неудачные миграции PushFixTopicEmbedAuthorsJob

Хорошо, это имеет смысл :+1:.

Пока эти добавленные плагины не включены по умолчанию, по крайней мере для существующих экземпляров, всё в порядке. Но что касается изменений в зависимостях gem и сбоев миграции нескольких баз данных, с которыми мы столкнулись, я немного обеспокоен тем, что что-то может быть незаметно сломано или утеряно. К сожалению, пересборка в этих случаях не пишет никаких логов, просто сообщая, что команда cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' завершилась с кодом ошибки, но без деталей, и тоже не в логах :thinking:.

Это звучит странно. Вы запускаете PostgreSQL в отдельном контейнере? Установлен ли там pgvector?

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

Только автономный контейнер Discourse Docker. Также я был не совсем прав: действительно, есть ещё некоторый вывод по этой теме, но я не смог в нём достаточно разобраться:

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-8.0.2/lib/active_record/migration.rb:1454:in `migrate'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-8.0.2/lib/active_record/migration.rb:1261:in `up'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-8.0.2/lib/active_record/migration.rb:1236:in `migrate'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-8.0.2/lib/active_record/tasks/database_tasks.rb:270:in `migrate'
/var/www/discourse/lib/tasks/db.rake:267:in `block (2 levels) in <main>'
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize'
/var/www/discourse/lib/tasks/db.rake:242:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.3.0/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => db:migrate
(Полный трассировочный вывод можно получить, запустив задачу с флагом --trace)
I, [2025-07-29T20:36:15.074727 #1]  INFO -- : == 20180828095129 PushFixTopicEmbedAuthorsJob: миграция ======================
== 20180828095129 PushFixTopicEmbedAuthorsJob: мигрировано (0.0021 с) =============


I, [2025-07-29T20:36:15.075331 #1]  INFO -- : Завершение асинхронных процессов
I, [2025-07-29T20:36:15.075355 #1]  INFO -- : Отправка INT для HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main pid: 45
I, [2025-07-29T20:36:15.075376 #1]  INFO -- : Отправка TERM для exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 112
2025-07-29 20:36:15.075 UTC [45] LOG:  получен запрос быстрого завершения
112:signal-handler (1753821375) Получен SIGTERM, планирование завершения...
2025-07-29 20:36:15.091 UTC [45] LOG:  прерывание любых активных транзакций
2025-07-29 20:36:15.092 UTC [45] LOG:  фоновый рабочий "logical replication launcher" (PID 59) завершил работу с кодом выхода 1
2025-07-29 20:36:15.092 UTC [54] LOG:  завершение работы
2025-07-29 20:36:15.105 UTC [54] LOG:  начало контрольной точки: завершение работы, немедленное
112:M 29 Jul 2025 20:36:15.125 # Пользователь запросил завершение...
112:M 29 Jul 2025 20:36:15.125 * Сохранение финального снимка RDB перед выходом.
112:M 29 Jul 2025 20:36:15.247 * БД сохранена на диск
112:M 29 Jul 2025 20:36:15.247 # Redis готов к выходу, пока...
2025-07-29 20:36:15.273 UTC [54] LOG:  контрольная точка завершена: записано 10 буферов (0.0%); добавлено 0 WAL-файлов, удалено 0, переработано 0; write=0.066 с, sync=0.046 с, total=0.181 с; sync files=9, longest=0.026 с, average=0.006 с; distance=36 КБ, estimate=36 КБ
2025-07-29 20:36:15.276 UTC [45] LOG:  система баз данных завершена


НЕ УДАЛОСЬ
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' завершился с ошибкой, код возврата #<Process::Status: pid 635 exit 1>
Место ошибки: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
выполнение не удалось с параметрами {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
загрузка не удалась с кодом выхода 1
** НЕ УДАЛОСЬ ЗАПУСТИТЬ ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках; их может быть несколько.
./discourse-doctor может помочь диагностировать проблему.

Интересно, что это миграция

Она следует паттерну, которому мы действительно не должны следовать.

Дам задание кому-нибудь разобраться с этим!

Значит, была попытка миграции для плагина, которого раньше не было и который не включен? Есть какие-то идеи, почему это удалось после нескольких попыток пересборки?

Подождите, всё уже работает?

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

Да, как уже говорилось, после нескольких попыток пересборки процесс наконец завершился успешно. В последнем успешном логе я больше не вижу упоминания об этой конкретной миграции. Вероятно, она была помечена как «выполненная» несмотря на сбой, поэтому при следующей пересборке она больше не предпринималась?

Миграция просто установила ключ в Redis. Возможная причина сбоя заключается в том, что код плагина RSS по какой-то причине не был загружен в этот момент. Мы разберёмся в этом, чтобы другие пользователи не столкнулись с такой проблемой.

Исправит основную проблему здесь.