Проблемы с обновлением: сбой обновления из-за дубликата ключа, сбой восстановления снимка

Похоже, я столкнулся с проблемой при запуске последнего обновления, которое завершается неудачей по следующей причине:

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(scottie) уже существует.

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

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

FAILED

--------------------

Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' завершился с кодом возврата #<Process::Status: pid 3743 exit 1>

Место возникновения ошибки: /pups/lib/pups/exec_command.rb:112:in `spawn'

exec failed с параметрами {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}

c744729efb7a5813699e2fe8fa46ab551352d45ada8dcb9204121508364f8438

** FAILED TO BOOTSTRAP ** пожалуйста, прокрутите вверх и поищите сообщения об ошибках, их может быть несколько.

./discourse-doctor может помочь в диагностике проблемы.

root@kForum:/var/discourse# ./launcher start app

запуск существующего контейнера

+ /usr/bin/docker start app

app

root@kForum:/var/discourse# ./launcher enter app

root@kForum-app:/var/www/discourse# rails c

bundler: не удалось загрузить команду: pry (/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/pry)

PG::ConnectionBad: не удалось подключиться к серверу: такой файл или каталог не существует

Запущен ли сервер локально и принимает ли он

подключения через Unix-сокет "/var/run/postgresql/.s.PGSQL.5432"?

Ниже приведены мои попытки запустить postgres:

root@kForum:/var/discourse# ./launcher enter app

root@kForum-app:/var/www/discourse# su discourse

discourse@kForum-app:/var/www/discourse$ psql discourse

psql: ошибка: не удалось подключиться к серверу: такой файл или каталог не существует

Запущен ли сервер локально и принимает ли он

подключения через Unix-сокет "/var/run/postgresql/.s.PGSQL.5432"?

discourse@kForum-app:/var/www/discourse$

Я восстанавливаю предыдущую снимок в DigitalOcean, чтобы вернуться в рабочее состояние, но странная (пугающая?) часть заключается в том, что даже восстановление снимка не вернуло сайт в работу. Этот снимок был сделан более 24 часов назад, когда я точно знаю, что форумы работали нормально, так что это должно быть не связано с попыткой обновления.

В восстановленном снимке вот ошибка, которую я вижу при попытке остановить/запустить/перезапустить приложение:

root@kForum:/var/discourse# ./launcher restart app

+ /usr/bin/docker stop -t 10 app

app

запуск существующего контейнера

+ /usr/bin/docker start app

Ошибка ответа от демона: контейнер "a1023d05a7b4de25ded1aa69ad49caed9fa59d15fa8e8130d32db82934139e6b" уже существует

Ошибка: не удалось запустить контейнеры: app

root@kForum:/var/discourse#

Наконец, я запустил discourse-doctor, и вот часть, которая, похоже, относится к ошибке?

Проверка версий кластера                                   ok

Исходный кластер был завершён некорректно.
Ошибка, выход
-------------------------------------------------------------------------------------
ОБНОВЛЕНИЕ POSTGRES НЕ УДАЛОСЬ

Пожалуйста, посетите https://meta.discourse.org/t/postgresql-13-update/172563 для получения поддержки.

Вы можете запустить ./launcher start app для перезапуска приложения в это время




FAILED
--------------------
Pups::ExecError: /root/upgrade_postgres завершился с кодом возврата #<Process::Status: pid 46 exit 1>
Место возникновения ошибки: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed с параметрами "/root/upgrade_postgres"
c98d1b076faed9b0c728cd944b3f2436afc9e266910b82a644c71fd80b42f073
** FAILED TO BOOTSTRAP ** пожалуйста, прокрутите вверх и поищите сообщения об ошибках, их может быть несколько.
./discourse-doctor может помочь в диагностике проблемы.
==================== КОНЕЦ ЛОГА ПЕРЕСОЗДАНИЯ ====================
Не удалось пересоздать приложение.

Проверка вашего доменного имени . . .

Подключение к forum.kirupa.com успешно.
Возможно, вам стоит удалить любые нестандартные плагины и пересоздать приложение.
Попытка перезапуска существующего контейнера . . . 

запуск существующего контейнера
+ /usr/bin/docker start app
Ошибка ответа от демона: драйвер не смог запрограммировать внешнюю связность для конечной точки app (78a35e0f12e5af560bd1f991ead900fefd0c81570cc4582fe99aaa5e56b238e8): Ошибка при запуске userland proxy: listen tcp 0.0.0.0:443: bind: адрес уже используется
Ошибка: не удалось запустить контейнеры: app
Не удалось перезапустить контейнер.


==================== ПЛАГИНЫ ====================
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-sitemap.git

Не обнаружено неофициальных плагинов.

См. официальный список на https://github.com/discourse/discourse/blob/master/lib/plugin/metadata.rb.

========================================
Версия Discourse на forum.kirupa.com: НЕ НАЙДЕНА
Версия Discourse на localhost: НЕ НАЙДЕНА

Что, по вашему мнению, происходит здесь? Моя первая цель — вернуть форумы в работу. Исправление ошибок обновления — вторая цель.

Спасибо,
Кирупа

Вам стоит посмотреть здесь — похоже, это та же проблема: Help! Upgrade led to complete fail

У меня вчера был похожий случай (см. Help! Upgrade led to complete fail - #8 by Judith). Если говорить в общих чертах, вам, вероятно, нужно сделать следующее:

  • переименовать postgres_data _old обратно в postgres_data
  • перезапустить старый контейнер
  • исправить проблему с повреждённым индексом, переименовав дублирующихся пользователей (возможно, тех, у кого дубликаты возникли из-за разного регистра)
  • перестроить индексы в таблице пользователей, чтобы убедиться, что все исправлено
  • переключиться на шаблон PostgreSQL 12, как описано в обновлении PostgreSQL 13
  • выполнить пересборку для обновления
  • когда это заработает, можно вернуть шаблон обратно и завершить обновление.
  • обратите внимание, что нужно обновить не только username, но и username_lower

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

Чтобы исправить проблему, нужно понимать, как изменять записи через командную строку PostgreSQL, перестраивать базы данных и справляться со сложными, но хорошо документированными проблемами при обновлении до PostgreSQL 13.

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

@pfaffman - только что отправил тебе сообщение через форму обратной связи :slight_smile:

Я ответил. Если вы не получили его, возможно, вы указали неверный адрес?

Чтобы закрыть этот вопрос, @pfaffman — настоящий волшебник. Он очень быстро решил проблему с обновлением форума (и множество сопутствующих вопросов) :slight_smile:

У меня та же проблема, но я не собираюсь платить $500 за решение. У меня есть доступ SFTP к серверу, так что разве нельзя просто открыть базу данных в блокноте и переименовать конфликтующее имя пользователя?

Или, если кто-то может исправить это примерно за $50, пожалуйста, свяжитесь со мной.

Вы можете ознакомиться с тем, что подробно описал один из пользователей, по ссылке: PG::UniqueViolation Problem during 3.1.0.beta4 upgrade - #3 by ahmedeldeep.

Вам понадобится SSH-клиент, а не SFTP. Если вы используете Digital Ocean, вы можете воспользоваться консолью на их веб-сайте.