Problèmes de mise à niveau : Échec de la mise à niveau en raison d'une clé dupliquée, Échec de la restauration d'instantané

Il semble que j’ai rencontré un problème lors de l’exécution de la dernière mise à niveau, qui échoue en raison de ceci :

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

J’ai essayé de récupérer en tentant de supprimer cet utilisateur via la console Rails ou directement dans la base de données Postgres, mais je reçois systématiquement une erreur indiquant que le serveur n’est pas en cours d’exécution.

Voici ce qui se passe lorsque j’essaie d’exécuter Rails après avoir démarré l’application :

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 ** veuillez faire défiler vers le haut et rechercher les messages d'erreur antérieurs, il peut y en avoir plus d'un.

./discourse-doctor peut aider à diagnostiquer le problème.

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"?

Voici ce qui se passe lorsque j’essaie d’exécuter 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$

Je restaure une capture d’écran précédente sur DigitalOcean pour revenir à un état fonctionnel, mais la partie étrange (effrayante ?) est que même la restauration de cette capture d’écran ne semble pas avoir remis le site en ligne. Cette capture d’écran a été prise il y a plus de 24 heures, alors que je savais que les forums fonctionnaient parfaitement, donc cela ne devrait pas être lié à la mise à niveau que j’ai tentée.

Dans ma capture d’écran restaurée, voici l’erreur que je vois lorsque j’essaie d’arrêter/démarrer/redémarrer l’application :

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#

Enfin, j’ai exécuté discourse-doctor, et cela semble être une partie pertinente de l’échec ?

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 ** veuillez faire défiler vers le haut et rechercher les messages d'erreur antérieurs, il peut y en avoir plus d'un.
./discourse-doctor peut aider à diagnostiquer le problème.
==================== 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

Qu’en pensez-vous ? Quel est le problème ici ? Mon premier objectif est de remettre les forums en ligne. Corriger les échecs de mise à niveau est mon deuxième objectif.

Merci,
Kirupa

Vous devriez regarder ici - cela semble être le même problème : Help! Upgrade led to complete fail

J’ai eu ce que je pense être un cas similaire hier (voir Help! Upgrade led to complete fail - #8 by Judith). En gros, je pense que vous devez faire quelque chose comme :

  • renommer postgres_data _old en postgres_data
  • redémarrer l’ancien conteneur
  • corriger le problème d’index corrompu en renommant les utilisateurs en double (ou peut-être les utilisateurs en double parce qu’ils ont une capitalisation différente)
  • reconstruire les index sur la table users pour s’assurer qu’ils sont tous corrigés
  • passer au modèle PostgreSQL 12 tel que décrit dans Mise à jour PostgreSQL 13
  • reconstruire pour effectuer la mise à niveau
  • une fois que cela fonctionne, vous pouvez revenir au modèle précédent et terminer la mise à niveau.
  • notez que vous devez mettre à jour non seulement le nom d’utilisateur, mais aussi username_lower

Celui que j’ai corrigé hier avait un nom d’utilisateur en double remontant à février 2020, il est donc probable que vous ne souhaitiez pas essayer de résoudre ce problème en restaurant une base de données plus ancienne.

Pour le corriger, vous devez savoir comment modifier des enregistrements avec la ligne de commande postgres, reconstruire des bases de données et gérer des problèmes complexes, mais bien documentés, liés à la mise à niveau vers PostgreSQL 13.

Si vous avez un budget de 500 $, vous pouvez me contacter. Mes coordonnées se trouvent dans mon profil.

@pfaffman - je viens de t’envoyer un message via ton formulaire de contact :slight_smile:

J’ai répondu. Si vous ne l’avez pas reçu, c’est peut-être que vous avez saisi la mauvaise adresse ?

1 « J'aime »

Pour boucler la boucle, @pfaffman est un véritable magicien. Il a résolu très rapidement le problème lié à la mise à niveau du forum (ainsi qu’un grand nombre de problèmes connexes) :slight_smile:

3 « J'aime »

J’ai le même problème, mais je ne vais pas payer 500 $ pour une solution. J’ai un accès SFTP au serveur, donc ne serait-il pas possible d’ouvrir la base de données dans un bloc-notes et de renommer le nom d’utilisateur en conflit ?

Ou si quelqu’un peut le réparer pour environ 50 $, veuillez me contacter.

Vous pouvez consulter PG::UniqueViolation Problem during 3.1.0.beta4 upgrade - #3 by ahmedeldeep où quelqu’un a décrit assez bien ce qu’il a fait.

Vous aurez besoin d’un client SSH, pas SFTP. Si vous utilisez Digital Ocean, vous pouvez utiliser la console sur leur site Web.