Restauração falhou devido à chave duplicada (plugin_name, key)=(discourse-data-explorer, q:-1)

Ao atualizar meu Discourse, percebi que ele parou de funcionar. Consigo acessar a página de categorias, mas não consigo visualizar a página inicial ou a página de mais recentes, como a página de mais recentes:

Já excluí todos os plugins, incluindo os oficiais e os não oficiais. No entanto, o problema persiste.

Então, tentei restaurar o backup, mas apareceu a seguinte mensagem:

[2020-07-12 01:16:20] ERROR:  não foi possível criar o índice único "index_plugin_store_rows_on_plugin_name_and_key"
[2020-07-12 01:16:20] DETAIL:  A chave (plugin_name, key)=(discourse-data-explorer, q:-1) está duplicada.
[2020-07-12 01:16:20] EXCEPTION: psql falhou: DETAIL:  A chave (plugin_name, key)=(discourse-data-explorer, q:-1) está duplicada.

[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!'

Há dados corrompidos na loja de plugins.

Se você não se importa com nenhum dos dados personalizados salvos no Data Explorer, tente:

./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: método `where' não definido para PluginStore:Class
Did you mean?  when
from (pry):1:in `__pry__'
[2] pry(main)>


Parece que algo está errado.

Você pode me dar mais informações?

Deveria ser PluginStoreRow, não PluginStore. Tente o seguinte:

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

:warning: Isso excluirá irreversivelmente todos os dados do data-explorer do seu site

Então, o que devo fazer?
O fórum agora não está legível; parece que o latest.json foi perdido.

Eu tentaria reconstruir o aplicativo. Se isso não funcionar, verifique /logs em busca de erros.

como ver os logs?

Se você se refere aos logs do processo de reconstrução, aqui está a mensagem de erro durante a reconstrução (todas as palavras em vermelho estão aqui).


2020/07/14 11:33:39 socat[26] E connect(6, AF=1 "/shared/postgres_run/.s.PGSQL.5432", 36): No such file or directory


#------




2020-07-14 11:33:42.023 UTC [49] LOG:  database system is ready to accept connections
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:  database "discourse" already exists
2020-07-14 11:33:47.025 UTC [62] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
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:  role "discourse" already exists
2020-07-14 11:33:47.083 UTC [73] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists


Oi, como executar o código, por favor?

@xiasummer

Se e somente se (SSE) você tiver um backup completo CONFIRMADO do seu banco de dados atual e da pasta de uploads, você pode mover ou copiar esses backups para fora do diretório compartilhado, por exemplo (mas adapte para sua configuração):

mv  /var/discourse/shared  /tmp

Certifique-se de ter backups completos do banco de dados primeiro, é claro.

Em seguida, você pode reconstruir do zero:

./launcher rebuild app

E então você pode restaurar pela linha de comando:

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

Depois, você pode realizar uma restauração pela linha de comando usando seu backup mais recente da maneira normal.

Isso restaurará o backup do seu aplicativo para o estado em que estava no momento do seu último backup BOM e COMPLETO.

Isso só é recomendado SE você tiver um backup completo e recente de todo o seu banco de dados e do arquivo de uploads.

Se você realizou um backup sem os uploads, é claro, pode encontrá-los em /tmp/shared/standalone/uploads e copiá-los da seguinte forma:

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

Depois que tudo estiver funcionando novamente e você tiver certeza de que a restauração ocorreu conforme esperado, é claro, você poderá excluir seu diretório de staging:

rm -rf /tmp/shared

Esta é uma forma de proceder.

Pode haver outras maneiras, mas é assim que eu procederia se tivesse um backup completo, atual e bom.