Восстановление после неудачного или частично применённого обновления

Я попытался обновить свой экземпляр Discourse, но из-за нескольких проблем, похоже, это завершилось неудачей в частично применённом состоянии. При запуске ./launcher rebuild app я получаю следующее сообщение об ошибке, которое, на мой взгляд, указывает на миграцию, которая уже была (частично) применена:

I, [2022-03-24T21:13:16.043071 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
rake aborted!
StandardError: Произошла ошибка, и эта и все последующие миграции отменены:

PG::DuplicateColumn: ERROR:  столбец "bookmarkable_id" отношения "bookmarks" уже существует

Буду признателен за любые рекомендации: есть ли способ восстановиться после этого (или мне нужно решиться и выполнить чистую установку)? Спасибо!

Вы можете выполнить команду

 ./launcher start app

чтобы запустить старый контейнер. Это вернет вас в рабочее состояние.

Да, я в курсе этого (и уже сделал это), однако меня интересует, какой следующий шаг мне стоит предпринять в плане обновления.

Ох. Значит, это не помогло :person_shrugging:

У меня была похожая проблема, но, похоже, моё решение вам не поможет.

Вы не установили SKIP_POST_DEPLOYMENT_MIGRATIONS в вашем app.yml? Если да, то вам нужно выполнить миграцию базы данных с этим параметром, установленным в ноль, а затем пересобрать приложение, но, думаю, дело не в этом.

Нет, не похоже.

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

Посмотрите это:

Я очистил все таблицы, которые вызывали ошибки (по одной; в итоге их оказалось 7), пока не смог пересобрать приложение без ошибок.

В вашем случае, похоже, проблема в столбце:

PG::DuplicateColumn: ERROR: column "bookmarkable_id" of relation "bookmarks" already exists

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

Думаю, проблема в том, что при частичном переносе данные эти таблицы уже созданы, поэтому попытка создать их снова вызывает ошибку. Может быть, стоит добавить условие в этот процесс, чтобы избежать ошибок? (Я не эксперт) @pfaffman

Звучит правильно, @undasein.

Похоже, вы хотите удалить столбец bookmarkable_id из таблицы bookmarks. После того как вы зайдёте в контейнер и в postgres следующим образом:

cd /var/discourse
./launcher enter app
su - postgres
psql

вы выполните:

ALTER TABLE bookmarks 
DROP COLUMN bookmarkable_id;
DROP COLUMN bookmarkable_type;

Однако, если форум работает, не помешает сделать резервную копию только базы данных. Если форум не работает, вы можете создать резервную копию с помощью команды discourse backup после строки enter app выше.

Та же проблема! Это правильное решение?

Так я и думал. Попробуй и дай нам знать.

Я не очень разбираюсь в Discourse.

@sam, есть какие-то идеи, как двигаться дальше? Стандартная установка и обновление превратились в кошмар.

Правильно ли я понимаю, что вышеописанный способ решает эту проблему?

Заранее спасибо.

К сожалению, не сработало, всё ещё получаю:

PG::DuplicateColumn: ERROR:  column "bookmarkable_id" of relation "bookmarks" already exists

Нужно ли было выполнить какие-то дополнительные действия после этих команд?

ALTER TABLE bookmarks 
DROP COLUMN bookmarkable_id
DROP COLUMN bookmarkable_type;

Спасибо за помощь.

Привет, Ник,
Я пытаюсь воспроизвести это. Какой коммит в твоей версии?
Попробуй использовать

version: cd7ce52138bed391d5efc56366e7a6517a6079e7

в своём app.yml. Это версия 10-дневной давности, сразу перед отменой коммита, который был отменён и, похоже, имел схожие проблемы.

Доброе утро, Бен,

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

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

Не могли бы вы выполнить ./launcher start app и проверить установленную версию на https://your.domain/admin, чтобы я мог повторить ваши действия. Есть ли какие-то плагины?

Привет, Бен,

Установленная версия: 2.9.0.beta2
(5374e587a3)

Установленные плагины:
discourse-reactions
docker_manager
styleguide

Спасибо,
Ник

./launcher start app
-bash: ./launcher: файл или каталог не найден
 cd /var/discourse

До

./launcher start app

Итак, я заметил, что у меня было несколько обновлений Ubuntu, поэтому всё на сервере актуально.

Попробовал снова, и всё ещё:

PG::DuplicateColumn: ERROR:  столбец "bookmarkable_id" отношения "bookmarks" уже существует

Это кажется вероятным решением. Вы должны иметь возможность обновиться до этой версии, и, возможно, тогда сможете перейти на текущую? Что-то в этом роде имеет для меня смысл.