Срочно: сборка с обновлениями не удалась из-за UniqueViolation

Я попытался обновить Discourse и получил следующее сообщение:

I, [2021-01-21T18:39:25.045454 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
2021-01-21 18:39:32.724 UTC [4051] discourse@discourse LOG:  duration: 336.116 ms  statement: UPDATE users
	SET locale = 'en_GB'
	WHERE locale = 'en'
	
2021-01-21 18:39:33.373 UTC [4051] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_users_on_username_lower"
2021-01-21 18:39:33.373 UTC [4051] discourse@discourse DETAIL:  Key (username_lower)=(xyz123) already exists.
2021-01-21 18:39:33.373 UTC [4051] discourse@discourse STATEMENT:  UPDATE users
	SET locale = 'en'
	WHERE locale = 'en_US'
	
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

Я попытался выполнить ./launcher enter app и su postgres -c 'psql discourse', но получил следующую ошибку:

psql: error: could not connect to server: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket “/var/run/postgresql/.s.PGSQL.5432”?

У вас есть какие-то идеи, @merefield? Спасибо!

Привет.

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

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

Запустите его с помощью команды ./launcher start app, затем войдите в контейнер и попробуйте перейти в интерфейс командной строки базы данных.

Спасибо, я перезапустил контейнер, есть какие-то идеи? Я попробовал ./launcher enter app, что еще можно попробовать?

ubuntu@:/var/discourse$ ./launcher start app
WARNING: Docker version 17.05.0-ce deprecated …
Ничего не нужно делать, ваш контейнер уже запущен!

Получили ли вы ошибку при входе в контейнер?

Ошибки нет, но при выполнении ./launcher logs app я получил следующее -

ok: run: redis: (pid 47) 918s
timeout: down: postgres: 1s, normally up, want up
ok: run: redis: (pid 47) 925s
timeout: down: postgres: 0s, normally up, want up
ok: run: redis: (pid 47) 933s
ok: run: postgres: (pid 1855) 0s
supervisor pid: 1847 unicorn pid: 1857
config/unicorn_launcher: line 71: kill: (1857) - Нет такого процесса
config/unicorn_launcher: line 15: kill: (1857) - Нет такого процесса
(1847) exiting
ok: run: redis: (pid 47) 938s
timeout: down: postgres: 0s, normally up, want up
ok: run: redis: (pid 47) 945s

Какой результат у команды ps -ef | grep postgres?

root 38 35 0 19:09 ? 00:00:00 runsv postgres
root 46 38 0 19:09 ? 00:00:00 svlogd /var/log/postgres
root 2573 2571 0 19:31 ? 00:00:00 sv start postgres
root 2575 2497 0 19:31 ? 00:00:00 grep postgres

Запускать это внутри контейнера или просто на Linux-машине?

Внутри. Похоже, что он не запущен.

Скорее всего, вам нужно будет перезапустить его вручную от имени пользователя postgres.

Вы знаете быструю команду для его перезапуска?

Вы можете попробовать:

su - postgres /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main — замените 13 на вашу текущую версию.

Это команда, которая используется в процессе корректной установки.

Однако я не даю гарантий, так как не проверял это!

Нет, не стоит этого делать, см. ниже.

Спасибо. У меня версия 12, но я получил следующую ошибку -

su: недопустимый параметр – ‘D’
Введите ‘su --help’ для получения дополнительной информации.

-D — это допустимый переключатель.

Убедитесь, что вы не включили дефис вне фрагмента кода?

Кстати, я wondering, не потерпел ли неудачу процесс обновления до версии 13 у вас.

Если да, возможно, стоит заглянуть в эту тему и, возможно, опубликовать там сообщение: PostgreSQL 13 update

Да, я всё ещё на версии 12…

Извините, похоже, это обернуто и управляется процессом более высокого уровня.

Если я завершу свой, он автоматически перезапустится.

Попробуйте: sv start postgres

от имени root

Вы имеете в виду запуск внутри контейнера Docker? Спасибо.

Да, именно там запущен сервис.

Ещё лучше сделать так: sv restart postgres

Затем проверьте:

tail /var/log/postgres/current

Нормальное состояние должно выглядеть примерно так:

2021-01-21 20:21:10.284 UTC [575368] LOG: database system is ready to accept connections где-то в логе.

Вот журнал ошибок -

root@ip–app:/var/www/discourse# cat /var/log/postgresql/postgresql-12-main.log
2021-01-21 18:12:04.965 UTC [623] FATAL: файлы базы данных несовместимы с сервером
2021-01-21 18:12:04.965 UTC [623] DETAIL: Каталог данных был инициализирован с помощью PostgreSQL версии 13, которая несовместима с этой версией 12.3 (Debian 12.3-1.pgdg100+1).
pg_ctl: не удалось запустить сервер
Изучите вывод журнала.