Problemas de actualización: actualización fallida debido a clave duplicada, restauración de instantánea fallida

Parece que he encontrado un problema al ejecutar la última actualización, ya que falla debido a lo siguiente:

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

Intenté recuperarme intentando eliminar este usuario accediendo ya sea a la consola de Rails o directamente a la base de datos Postgres, pero sigo obteniendo un error que indica que el servidor no se está ejecutando.

A continuación, se muestra mi intento de ejecutar rails después de iniciar la aplicación:

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, desplácese hacia arriba y busque mensajes de error anteriores; puede haber más de uno.

./discourse-doctor puede ayudar a diagnosticar el 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

¿Está el servidor ejecutándose localmente y aceptando
conexiones en el socket de dominio Unix "/var/run/postgresql/.s.PGSQL.5432"?

A continuación, se muestra mi intento de ejecutar 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

¿Está el servidor ejecutándose localmente y aceptando
conexiones en el socket de dominio Unix "/var/run/postgresql/.s.PGSQL.5432"?

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

Estoy restaurando una instantánea anterior en DigitalOcean para volver a un estado funcional, pero la parte extraña (¿aterradora?) es que incluso restaurar la instantánea no pareció recuperar el sitio y ponerlo en funcionamiento. Esta instantánea se tomó hace más de 24 horas, cuando sé que los foros funcionaban correctamente, por lo que debería no estar relacionado con la actualización que intenté.

En mi instantánea restaurada, este es el error que veo cuando intento detener/iniciar/reiniciar la aplicación:

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 último, ejecuté discourse-doctor, y ¿esto parece ser una parte relevante del fallo?

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, desplácese hacia arriba y busque mensajes de error anteriores; puede haber más de uno.
./discourse-doctor puede ayudar a diagnosticar el 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

¿Qué piensas sobre lo que está ocurriendo aquí? Mi objetivo principal es recuperar los foros. Corregir los fallos de la actualización es mi objetivo secundario.

Gracias,
Kirupa

Deberías echar un vistazo aquí: parece ser el mismo problema: Help! Upgrade led to complete fail

Tuve lo que creo que fue un caso similar ayer (ver Help! Upgrade led to complete fail - #8 by Judith). En líneas generales, creo que necesitas hacer algo como:

  • renombrar postgres_data _old de nuevo a postgres_data
  • reiniciar el contenedor antiguo
  • solucionar el problema del índice corrupto renombrando los usuarios duplicados (o quizás los usuarios que son duplicados porque tienen diferente capitalización)
  • reconstruir los índices en la tabla de usuarios para asegurarte de que todos estén corregidos
  • cambiar a la plantilla de PostgreSQL 12 como se describe en Actualización a PostgreSQL 13
  • reconstruir para actualizar
  • cuando eso funcione, puedes volver a cambiar la plantilla y terminar la actualización.
  • ten en cuenta que debes actualizar no solo el nombre de usuario, sino también username_lower

El que arreglé ayer tenía un nombre de usuario duplicado desde febrero de 2020, así que probablemente no quieras intentar solucionarlo restaurando una base de datos más antigua.

Para solucionarlo, necesitas saber cómo modificar registros desde la línea de comandos de postgres, reconstruir bases de datos y abordar problemas complejos, pero bien documentados, en la actualización a PostgreSQL 13.

Si tienes un presupuesto de 500 USD, puedes contactarme. Mi información de contacto está en mi perfil.

@pfaffman - Te he enviado un mensaje a través de tu formulario de contacto :slight_smile:

Respondí. Si no lo recibiste, quizás escribiste la dirección incorrecta.

1 me gusta

Para cerrar este asunto, @pfaffman es un mago. Resolvió el problema con la actualización del foro (y una serie de problemas relacionados) muy rápidamente :slight_smile:

3 Me gusta

Tengo el mismo problema, pero no voy a pagar $500 por una solución. Tengo acceso SFTP al servidor, así que ¿no sería posible simplemente abrir la base de datos en un bloc de notas y renombrar el nombre de usuario en conflicto?

O si alguien puede solucionarlo por unos $50, por favor contácteme.

Puedes consultar PG::UniqueViolation Problem during 3.1.0.beta4 upgrade - #3 by ahmedeldeep donde alguien describió bastante bien lo que hizo.

Necesitarás un cliente SSH, no SFTP. Si estás usando Digital Ocean, puedes usar la consola en su sitio web.