Восстановление не удалось: ключ (plugin_name, key)=(discourse-data-explorer, q:-1) дублируется

При обновлении моего Discourse я обнаружил, что он перестал работать. Я вижу страницу категорий, но не могу открыть главную или страницу «Последние», например, страницу «Последние»:

Я уже удалил все плагины, включая официальные и неофициальные. Но проблема осталась.

Поэтому я попытался восстановить резервную копию, но увидел следующее сообщение:

[2020-07-12 01:16:20] ERROR:  could not create unique index "index_plugin_store_rows_on_plugin_name_and_key"
[2020-07-12 01:16:20] DETAIL:  Key (plugin_name, key)=(discourse-data-explorer, q:-1) is duplicated.
[2020-07-12 01:16:20] EXCEPTION: psql failed: DETAIL:  Key (plugin_name, key)=(discourse-data-explorer, q:-1) is duplicated.

[2020-07-12 01:16:20] /var/www/discourse/lib/backup_restore/database_restorer.rb:95:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:49:in `run'
/var/www/discourse/lib/backup_restore.rb:188:in `block in start!'

В хранилище плагинов повреждены данные.

Если вас не волнует сохранённые вами пользовательские данные в Data Explorer, попробуйте следующее:

./launcher enter app
rails c
PluginStore.where(plugin_name: 'discourse-data-explorer').delete_all
root@HFT-app:/var/www/discourse# rails c
[1] pry(main)> PluginStore.where(plugin_name: 'discourse-data-explorer').delete_all
NoMethodError: undefined method `where' for PluginStore:Class
Did you mean?  when
from (pry):1:in `__pry__'
[2] pry(main)>


Кажется, что-то не так.

Можете предоставить дополнительную информацию?

Должно быть PluginStoreRow, а не PluginStore. Попробуйте это:

./launcher enter app
rails c
PluginStoreRow.where(plugin_name: 'discourse-data-explorer').delete_all

:warning: Это безвозвратно удалит все данные из data-explorer с вашего сайта

Тогда что мне делать?
Форум сейчас не читается, похоже, файл latest.json утерян.

Я бы попробовал переустановить приложение. Если это не поможет, проверьте /logs на наличие ошибок.

Как посмотреть логи?

Если вы имеете в виду логи процесса пересборки, то вот сообщение об ошибке при пересборке (все красные слова здесь).


2020/07/14 11:33:39 socat[26] E connect(6, AF=1 "/shared/postgres_run/.s.PGSQL.5432", 36): Нет такого файла или каталога


#------




2020-07-14 11:33:42.023 UTC [49] LOG: система баз данных готова принимать подключения
I, [2020-07-14T11:33:46.972466 #1]  INFO -- :
I, [2020-07-14T11:33:46.972792 #1]  INFO -- : > su postgres -c 'createdb discourse' || true
2020-07-14 11:33:47.025 UTC [62] postgres@postgres ERROR: база данных "discourse" уже существует
2020-07-14 11:33:47.025 UTC [62] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: ошибка: создание базы данных не удалось: ERROR: база данных "discourse" уже существует
I, [2020-07-14T11:33:47.026573 #1]  INFO -- :
I, [2020-07-14T11:33:47.026936 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2020-07-14 11:33:47.083 UTC [73] postgres@discourse ERROR: роль "discourse" уже существует
2020-07-14 11:33:47.083 UTC [73] postgres@discourse STATEMENT:  create user discourse;
ERROR: роль "discourse" уже существует


Привет! Подскажите, пожалуйста, как запустить этот код?

@xiasummer

Только при наличии ПОДТВЕРЖДЁННОЙ полной резервной копии вашей текущей базы данных и папки uploads вы можете переместить или скопировать эти резервные копии из общей директории, например (но адаптируйте под вашу конфигурацию):

mv  /var/discourse/shared  /tmp

Конечно, убедитесь, что у вас есть полные резервные копии базы данных.

Затем вы можете выполнить полную пересборку:

./launcher rebuild app

а затем восстановить данные из командной строки:

cp -rf /tmp/shared/backups/default /var/discourse/shared/standalone/backups

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

Это восстановит резервную копию вашего приложения до состояния на момент последней ХОРОШЕЙ и ПОЛНОЙ резервной копии.

Это рекомендуется ТОЛЬКО если у вас есть полная, актуальная резервная копия всей базы данных и файла uploads.

Если вы выполнили резервное копирование без uploads, вы, конечно, можете найти их в /tmp/shared/standalone/uploads и скопировать следующим образом:

cp -rf /tmp/shared/standalone/uploads/* /var/discourse/shared/standalone/uploads

Затем, когда всё снова заработает и вы будете уверены, что восстановление прошло успешно, вы, конечно, можете удалить свою промежуточную директорию:

rm -rf /tmp/shared

Это один из способов действий.

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