Recuperación de actualización fallida/parcialmente aplicada

Intenté actualizar mi instancia de Discourse, sin embargo, debido a varios problemas, parece que falló en un estado parcialmente aplicado. Al ejecutar ./launcher rebuild app, recibo el siguiente mensaje de error, que me indica una migración que ya se aplicó (parcialmente):

I, [2022-03-24T21:13:16.043071 #1]  INFO -- : 	> cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DuplicateColumn: ERROR:  column "bookmarkable_id" of relation "bookmarks" already exists

Cualquier orientación sobre si hay una forma de recuperarse de esto (o si necesito asumir las consecuencias y hacer una instalación nueva) sería apreciada. ¡Gracias!

1 me gusta

Puedes ejecutar

./launcher start app

para iniciar el contenedor antiguo. Eso te permitirá volver a funcionar.

2 Me gusta

Sí, soy consciente de eso (y lo he hecho), sin embargo, me pregunto cuál debería ser mi próximo paso en cuanto a la actualización.

2 Me gusta

Vaya. Eso no fue útil entonces :person_shrugging:

Tuve un problema similar, pero parece poco probable que mi solución te ayude.

No tienes SKIP_POST_DEPLOYMENT_MIGRATIONS configurado en tu app.yml, ¿verdad? Si es así, necesitas migrar la base de datos con él configurado a cero y luego reconstruir, pero no creo que ese sea tu problema.

No, no parece.

Eso es lo que pensaba. Así que podría haber un problema real que tenga que ver con la capacidad de migrar de un punto en particular al actual. Pero eso no debería suceder.

Mira esto:

Vacía todas las tablas que me daban errores (una por una, al final fueron 7), hasta que pude reconstruir la aplicación sin ningún error.

En tu caso parece que el problema es una columna:

PG::DuplicateColumn: ERROR: column "bookmarkable_id" of relation "bookmarks" already exists

Quizás deberías buscar a qué tabla pertenece, para poder vaciarla, o puedes simplemente eliminar esa columna.

Creo que el problema está en que al migrar parcialmente, esas tablas ya están creadas, por eso no puede crearlas de nuevo y da un error. ¿Quizás se podría añadir una condición a este proceso, para que no dé errores? (No soy un experto) @pfaffman

Suena bien, @undasein.

Creo que quieres eliminar la columna bookmarkable_id de la tabla bookmarks. Así que después de entrar en el contenedor y en postgres así:

cd /var/discourse
./launcher enter app
su - postgres
psql

Entonces harías

ALTER TABLE bookmarks 
DROP COLUMN bookmarkable_id
DROP COLUMN bookmarkable_type;

Pero hacer una copia de seguridad solo de la base de datos no sería una mala idea si el foro está en funcionamiento. Si no, puedes hacer una copia de seguridad con discourse backup después de la línea enter app de arriba.

1 me gusta

¡Mismo problema aquí! ¿Es esta la solución correcta a seguir?

Esa fue mi suposición. Puedes intentarlo y hacérnoslo saber.

No soy experto en discourse.

@sam ¿alguna idea de cómo proceder? La instalación y actualización estándar resulta ser una pesadilla.

¿Es la forma correcta de solucionar este problema?

Gracias de antemano.

Desafortunadamente, no funcionó, todavía obtengo

PG::DuplicateColumn: ERROR:  column "bookmarkable_id" of relation "bookmarks" already exists

¿Hubo alguna otra acción que tomar después de estos comandos?

ALTER TABLE bookmarks
DROP COLUMN bookmarkable_id
DROP COLUMN bookmarkable_type;

Gracias por tu ayuda.

Hola Nick:
Estoy intentando reproducir esto, ¿cuál es el commit de tu instancia?
Podrías intentar con

version: cd7ce52138bed391d5efc56366e7a6517a6079e7

en tu app.yml, eso es de hace 10 días, justo antes de rehacer un commit revertido que parece haber tenido problemas similares.

2 Me gusta

Buenos días Ben,

¿Sería posible que me dieras un resumen de los comandos para hacer esto, por favor?

Puedo actualizar y todo eso fácilmente, pero es la primera vez que algo sale mal y, para ser honesto, estoy totalmente fuera de mi zona de confort, jajaja.

¿Podrías ejecutar ./launcher start app y comprobar la versión instalada en https://your.domain/admin para que pueda intentar seguir tus pasos? ¿Algún plugin?

2 Me gusta

Hola Ben,

Versión instalada: 2.9.0.beta2
(5374e587a3)

Plugins instalados:
discourse-reactions
docker_manager
styleguide

Gracias,
Nick

./launcher start app
-bash: ./launcher: No such file or directory
 cd /var/discourse

Antes

./launcher start app
2 Me gusta

Así que noté que tenía algunas actualizaciones de Ubuntu, así que todo en el servidor está actualizado

lo intenté de nuevo y todavía

PG::DuplicateColumn: ERROR:  la columna «bookmarkable_id» de la relación «bookmarks» ya existe

Esta parece ser una solución probable. Deberías poder actualizar a esta y quizás entonces podrás llegar a la versión actual? Algo así tiene sentido para mí.

1 me gusta