Tengo el siguiente problema. Llevo más de 10 años administrando un foro de Discourse y, como no he podido instalar actualizaciones desde hace algún tiempo, quería configurar un nuevo servidor:
El servidor antiguo está ejecutando: 3.4.0.beta4-dev
El nuevo servidor: Última versión
La copia de seguridad ya tiene un tamaño de 673,2 MB como archivo .gz, sin incluir las subidas.
Desafortunadamente, la restauración sigue fallando. El archivo de registro contiene este error:
[2026-06-16 07:54:52] ERROR: no se pudo crear el índice único "index_incoming_referers_on_path_and_incoming_domain_id"
[2026-06-16 07:54:52] DETALLE: La clave (path, incoming_domain_id)=(//, 5) está duplicada.
[2026-06-16 07:54:52] EXCEPCIÓN: psql falló: DETALLE: La clave (path, incoming_domain_id)=(//, 5) está duplicada.
[2026-06-16 07:54:52] /var/www/discourse/lib/backup_restore/database_restorer.rb:93:in 'BackupRestore::DatabaseRestorer#restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in 'BackupRestore::DatabaseRestorer#restore'
/var/www/discourse/lib/backup_restore/restorer.rb:61:in 'BackupRestore::Restorer#run'
/var/www/discourse/script/spawn_backup_restore.rb:20:in 'Object#restore'
/var/www/discourse/script/spawn_backup_restore.rb:33:in 'bloque en '
/var/www/discourse/script/spawn_backup_restore.rb:4:in 'Kernel#fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in ''
[2026-06-16 07:54:52] Intentando revertir...
¿Qué puedo hacer para solucionar este problema y no perder los últimos 10 años de datos?
La tabla incoming_referers rastrea las rutas de URL que derivaron a los visitantes en tu foro. Tiene un índice único, lo que significa que no pueden haber dos filas con la misma combinación de ruta + dominio.
Tu base de datos tiene dos filas con path='//' e incoming_domain_id=5. Cuando intenta reconstruir este índice único durante la restauración, encuentra el duplicado y cancela toda la transacción de restauración.
Así que necesitarás encontrar y limpiar ese incoming_referers duplicado y luego hacer una nueva copia de seguridad para restaurar en el nuevo servidor.
Lo siento por molestarte, pero creo que estoy haciendo algo mal. Después de ejecutar el comando “discourse=# select * from incoming_referers where path LIKE ‘%/search/’ ORDER BY incoming_domain_id;”, obtengo un error de sintaxis.
Vale, ahora también he instalado “apt install postgresql-client-common”. Sin embargo, sigo obteniendo el error “Error: Debe instalar al menos un paquete postgresql-client-.”
Lo siento muchísimo por haber actuado de forma tan tonta.
Ya he instalado Rails y parece que ha funcionado. También lo ejecuté con «rails c». Eso también parece funcionar, pero cuando introduzco el comando, aparece así:
“root@community:/var/discourse# ActiveRecord::Base.connection.execute(<<~SQL)
-bash: error de sintaxis cerca del token inesperado «<<’
root@community:/var/discourse# SELECT id, path, incoming_domain_id
SELECT: comando no encontrado
root@community:/var/discourse# FROM incoming_referers
FROM: comando no encontrado
root@community:/var/discourse# WHERE path = ‘//’
WHERE: comando no encontrado
root@community:/var/discourse# AND incoming_domain_id = 5
AND: comando no encontrado
root@community:/var/discourse# SQL”
No te preocupes, quizás mis instrucciones no sean tan buenas
Digo que me confundo cuando dices que acabas de instalar Rails y no puedes acceder a tu base de datos. Quizás sea todo diferente porque es una versión más antigua, pero creo que yo también me he quedado sin ideas.
En cualquier caso, una vez que estés en Rails, el indicador debería ser diferente, así que por tu salida, parece que aún no estás en la consola de Rails.
Ni siquiera creo que estés dentro del contenedor real. ¿Has ejecutado ./launcher enter app?
Entonces, ntuples=1 significa que solo se encontró una fila, pero según el registro de errores debería haber un duplicado… :mujer_encogiéndose_de_hombros:
Lo siento, no sé qué probar a continuación. Recomiendo navegar por el foro; parece que hay muchos casos similares (ver más abajo en la sección relacionada), quizás encuentres ahí la siguiente pista.
Parece que tu servidor antiguo no es una instalación estándar. De todos modos,… en resumen: un índice en tu servidor antiguo se dañó con los años (esto puede ocurrir tras actualizaciones del sistema operativo), por lo que dos filas idénticas se colaron en la tabla incoming_referers. La copia de seguridad las copia tal cual, y el nuevo servidor las rechaza. Así que primero lo arreglamos en el servidor antiguo, y luego hacemos una nueva copia de seguridad.
En el servidor ANTIGUO, abre la consola de Rails:
./launcher enter app
rails c
Luego pega estas líneas, una tras otra:
db = ActiveRecord::Base.connection.current_database
DB.exec("DELETE FROM incoming_referers a USING incoming_referers b WHERE a.id > b.id AND a.path = b.path AND a.incoming_domain_id = b.incoming_domain_id")
DB.exec("REINDEX DATABASE #{ActiveRecord::Base.connection.quote_table_name(db)}")
Esto elimina los duplicados y reconstruye todos los índices (por si otras tablas también se ven afectadas).
Si REINDEX finaliza sin errores, escribe exit, haz una nueva copia de seguridad en el servidor antiguo y restaura ese nuevo archivo. Si muestra un error relacionado con otra tabla, simplemente pégalo aquí.
Sal de la consola de Rails (escribe exit) y, mientras sigues dentro del contenedor (./launcher enter app), ejecuta:
su postgres -c "reindexdb discourse"
Cuando termine sin errores, haz una copia de seguridad nueva en el servidor antiguo y restaura ese nuevo archivo. Si aparece un error sobre una tabla específica, pégalo aquí.
¡Muchísimas gracias! Todo salió maravillosamente bien y, sin tu ayuda, no habría tenido ninguna oportunidad y seguro que habría tenido que empezar el foro de nuevo desde cero, con mucho dolor de cabeza. ¡GRACIAS!