Ошибки 500 и сбой обновления

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

К сожалению, недавно она неожиданно вышла из строя и, похоже, полностью перестала работать.

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

Мы подтвердили наличие ошибок 500 и сначала попробовали перезагрузить сервер и контейнер, но это не дало результата. Также был выполнен “apt-get update” для обновления всех пакетов. Мы также попытались обновить Discourse через бэкенд, но при входе по ссылке администратора письма с ссылками для входа не отправлялись, а после перезапуска контейнера страница входа администратора возвращала только ошибку 500.

Я также проверил окружение сервера на наличие аномалий в аппаратном обеспечении, ОС или в чём-либо ещё, и ничего подозрительного не обнаружил.

Далее мы попытались выполнить полную пересборку и обновление через “git pull” из командной строки. Это завершилось неудачей во время миграций базы данных обновления со следующей ошибкой:

I, [2022-08-09T23:15:21.229857 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'LOAD_PLUGINS=0 bundle exec rake plugin:pull_compatible_all'
I, [2022-08-09T23:15:23.938876 #1]  INFO -- : docker_manager is already at latest compatible version

I, [2022-08-09T23:15:23.939220 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
2022-08-09 23:15:28.956 UTC [835] discourse@discourse ERROR:  duplicate key value violates unique constraint "idx_bookmarks_user_polymorphic_unique"
2022-08-09 23:15:28.956 UTC [835] discourse@discourse DETAIL:  Key (user_id, bookmarkable_type, bookmarkable_id)=(4115, Post, 103355) already exists.
2022-08-09 23:15:28.956 UTC [835] discourse@discourse STATEMENT:  UPDATE bookmarks
        SET bookmarkable_id = post_id, bookmarkable_type = 'Post'
        WHERE NOT bookmarks.for_topic AND bookmarkable_id IS NULL

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

ERROR:  duplicate key value violates unique constraint "idx_bookmarks_user_polymorphic_unique"
DETAIL:  Key (user_id, bookmarkable_type, bookmarkable_id)=(4115, Post, 103355) already exists.

Если в базе данных есть несоответствия, я не понимаю, как они могли возникнуть… При необходимости могу предоставить остальную часть истории консоли.

Запуск “./discourse-doctor” завершился без видимых проблем, за исключением предупреждения о конфигурации почтового сервера — “certificate verify failed (self signed certificate)”, что, возможно, объясняет, почему письма не отправлялись. Ранее они отправлялись с текущей конфигурацией, и почтовый сервер, похоже, в остальном функционирует без проблем, так что я не уверен насчёт этого.

В данный момент сайт полностью недоступен (после неудачного обновления возвращаются только ошибки 500). У нас пока нет представления, как действовать дальше, кроме как искать внешнюю поддержку. Любые рекомендации будут очень ценны!

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

Если вы знакомы с SQL, возможно, вам удастся разобраться в этом, возможно, с небольшой помощью здесь. Если вы действительно зашли в тупик и у вас есть бюджет, вы можете связаться со мной или задать вопрос в канале Marketplace.