Problemas de atualização: Falha na atualização devido a chave duplicada, falha na restauração do snapshot

Parece que encontrei um problema ao executar a última atualização, que falha devido ao seguinte:

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(scottie) already exists.

Tentei recuperar tentando excluir esse usuário acessando o console do Rails ou o banco de dados Postgres diretamente, mas continuo recebendo um erro informando que o servidor não está em execução.

Abaixo está minha tentativa de executar o rails após iniciar o aplicativo:

FAILED

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

Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 3743 exit 1>

Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'

exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}

c744729efb7a5813699e2fe8fa46ab551352d45ada8dcb9204121508364f8438

** FAILED TO BOOTSTRAP ** por favor, role para cima e procure mensagens de erro anteriores, pode haver mais de uma.

./discourse-doctor pode ajudar a diagnosticar o problema.

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

starting up existing container

+ /usr/bin/docker start app

app

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

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

bundler: failed to load command: pry (/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/pry)

PG::ConnectionBad: could not connect to server: No such file or directory

Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Abaixo está minha tentativa de executar o 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: error: could not connect to server: No such file or directory

Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

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

Estou restaurando um snapshot anterior no DigitalOcean para voltar a um estado funcional, mas a parte estranha (assustadora?) é que, mesmo restaurando o snapshot, o site não parece ter voltado a funcionar. Esse snapshot foi feito há mais de 24 horas, quando sei que os fóruns estavam funcionando perfeitamente, então isso não deve ter relação com a atualização que tentei.

No meu snapshot restaurado, este é o erro que vejo ao tentar parar/iniciar/reiniciar o aplicativo:

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

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

app

starting up existing container

+ /usr/bin/docker start app

Error response from daemon: container "a1023d05a7b4de25ded1aa69ad49caed9fa59d15fa8e8130d32db82934139e6b": already exists

Error: failed to start containers: app

root@kForum:/var/discourse#

Por fim, executei o discourse-doctor, e esta parece ser uma parte relevante da falha?

Checking cluster versions                                   ok

The source cluster was not shut down cleanly.
Failure, exiting
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Please visit https://meta.discourse.org/t/postgresql-13-update/172563 for support.

You can run ./launcher start app to restart your app in the meanwhile



FAILED
--------------------
Pups::ExecError: /root/upgrade_postgres failed with return #<Process::Status: pid 46 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params "/root/upgrade_postgres"
c98d1b076faed9b0c728cd944b3f2436afc9e266910b82a644c71fd80b42f073
** FAILED TO BOOTSTRAP ** por favor, role para cima e procure mensagens de erro anteriores, pode haver mais de uma.
./discourse-doctor pode ajudar a diagnosticar o problema.
==================== END REBUILD LOG ====================
Failed to rebuild app.

Checking your domain name . . .

Connection to forum.kirupa.com succeeded.
You should probably remove any non-standard plugins and rebuild.
Attempting to restart existing container. . . 

starting up existing container
+ /usr/bin/docker start app
Error response from daemon: driver failed programming external connectivity on endpoint app (78a35e0f12e5af560bd1f991ead900fefd0c81570cc4582fe99aaa5e56b238e8): Error starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
Error: failed to start containers: app
Failed to restart the container.


==================== PLUGINS ====================
          - 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

No non-official plugins detected.

See https://github.com/discourse/discourse/blob/master/lib/plugin/metadata.rb for the official list.

========================================
Discourse version at forum.kirupa.com: NOT FOUND
Discourse version at localhost: NOT FOUND

O que você acha que está acontecendo aqui? Meu principal objetivo é recuperar os fóruns. Corrigir as falhas de atualização é meu objetivo secundário.

Obrigado,
Kirupa

Você deve olhar aqui - isso parece ser o mesmo problema: Help! Upgrade led to complete fail

Eu tive o que acredito ser um caso semelhante ontem (veja Help! Upgrade led to complete fail - #8 by Judith). De forma geral, acho que você precisa fazer algo como:

  • renomear o postgres_data _old de volta para postgres_data
  • reiniciar o container antigo
  • corrigir o problema de índice corrompido renomeando os usuários duplicados (ou talvez usuários que são duplicados porque têm capitalização diferente)
  • reconstruir os índices na tabela de usuários para garantir que todos estejam corrigidos
  • mudar para o template do PostgreSQL 12 conforme descrito em Atualização do PostgreSQL 13
  • reconstruir para atualizar
  • quando isso funcionar, você pode mudar o template de volta e finalizar a atualização.
  • observe que você precisa atualizar não apenas o nome de usuário, mas também o username_lower

O caso que corrigi ontem tinha um nome de usuário duplicado datado de fevereiro de 2020, então provavelmente você não vai querer tentar corrigir isso restaurando um banco de dados mais antigo.

Para corrigir, você precisa saber como modificar registros pela linha de comando do postgres, reconstruir bancos de dados e lidar com problemas complexos, mas bem documentados, na atualização para o PostgreSQL 13.

Se você tiver um orçamento de US$ 500, pode entrar em contato comigo. Meus dados de contato estão no meu perfil.

@pfaffman - te acabei de chamar pelo seu formulário de contato :slight_smile:

Eu respondi. Se você não recebeu, talvez tenha colocado o endereço errado?

Para fechar o ciclo disso, @pfaffman é um gênio. Ele resolveu o problema com a atualização do fórum (e uma série de questões relacionadas) muito rapidamente :slight_smile:

Estou tendo o mesmo problema, mas não vou pagar R$ 500 por uma solução. Tenho acesso SFTP ao servidor, então não seria possível apenas abrir o banco de dados em um editor de texto e renomear o nome de usuário em conflito?

Ou se alguém puder consertar por cerca de R$ 50, por favor, entre em contato comigo.

Você pode conferir PG::UniqueViolation Problem during 3.1.0.beta4 upgrade - #3 by ahmedeldeep onde alguém descreveu muito bem o que fez.

Você precisará de um cliente SSH, não SFTP. Se você estiver usando Digital Ocean, pode usar o console no site deles.