La base de datos de nuestra instancia de Discourse no es un contenedor local; en su lugar, utilizamos un clúster de base de datos central. Recientemente, el PostgreSQL central se actualizó a la versión 18.3. He notado que ahora falla la copia de seguridad de Discourse:
[2026-05-19 03:37:37] [INICIADO]
[2026-05-19 03:37:37] ¡'system' ha iniciado la copia de seguridad!
[2026-05-19 03:37:37] Marcando la copia de seguridad como en ejecución...
[2026-05-19 03:37:37] Asegurando que '/var/www/discourse/tmp/backups/default/2026-05-19-033737' exista...
[2026-05-19 03:37:37] Asegurando que '/var/www/discourse/public/backups/default' exista...
[2026-05-19 03:37:37] Actualizando metadatos...
[2026-05-19 03:37:37] Volcando el esquema público de la base de datos...
[2026-05-19 03:37:37] pg_dump: error: abortando debido a una discrepancia en la versión del servidor
[2026-05-19 03:37:37] pg_dump: detalle: versión del servidor: 18.3 (Ubuntu 18.3-1.pgdg24.04+1); versión de pg_dump: 15.15 (Debian 15.15-1.pgdg12+1)
[2026-05-19 03:37:37] EXCEPCIÓN: pg_dump falló
[2026-05-19 03:37:37] /var/www/discourse/lib/backup_restore/creator.rb:173:in 'BackupRestore::Creator#dump_public_schema'
/var/www/discourse/lib/backup_restore/creator.rb:36:in 'BackupRestore::Creator#run'
/var/www/discourse/lib/backup_restore.rb:13:in 'BackupRestore.backup!'
/var/www/discourse/app/jobs/regular/create_backup.rb:10:in 'Jobs::CreateBackup#execute'
Esto parece ser una discrepancia entre las versiones del cliente y el servidor de PostgreSQL.
La copia de seguridad se está ejecutando desde el contenedor de Discourse, donde pg_dump es la versión 15.15, pero el servidor externo de PostgreSQL es 18.3:
server version: 18.3; pg_dump version: 15.15
Sería prudente evitar modificar el contenedor de Discourse a menos que el equipo de Discourse lo recomiende. Mi primera impresión sería mantener el clúster de bases de datos externo alineado con la versión de PostgreSQL que Discourse espera o admite actualmente.
Vale, entendido. En este caso no tuve más opción, ya que necesitábamos 18 para otro proyecto que utiliza el mismo clúster de bases de datos. Hmm, suena a que necesitaríamos un servidor de base de datos separado con 15 exclusivamente para Discourse.
Dado que parece haber demostrado la compatibilidad con PG 18, ya que lo está utilizando como base de datos de producción, esto parecería de bajo riesgo.
Hice una prueba rápida antes con un PostgreSQL 18 externo y una instalación de Discourse de prueba, y no mostró problemas. Pero, para ser honesto, esto solo fue algo “rápido y sucio”, no una prueba “profunda”. De todos modos, lleva funcionando dos semanas, así que asumo que está bien. Hasta ahora, el único problema es la copia de seguridad interna de Discourse. Por otro lado, el propio servidor de base de datos (que se ejecuta en LXC) también se respalda por separado.
La política en el pasado ha sido actualizar cada dos versiones. Sin embargo, han pasado 1,5 años desde que se lanzó PostgreSQL 17 y la imagen oficial de Docker sigue utilizando la versión 15, así que no estoy seguro de que esto siga siendo así.
Puedes agregar código a tu app.yml para actualizar PostgreSQL a la versión correspondiente. Ya lo he hecho antes, pero no encuentro mis notas. Lo más sencillo es entrar en el contenedor, ejecutar los comandos apt para instalar los clientes de PostgreSQL adecuados y luego intentar la copia de seguridad. Una vez que funcione, agrega esos comandos a los comandos exec en tu app.yml para que funcione después del siguiente reinicio.
Si necesitas que alguien te guíe, puedes enviarme un correo electrónico o publicar en Marketplace.
Esto actualiza el paquete postgres a la versión 18.
Luego, inicia la copia de seguridad desde la Interfaz de Administración, lo cual parece haber tenido éxito.
[2026-05-21 16:26:50] ¡'admin' ha iniciado la copia de seguridad!
[2026-05-21 16:26:50] Marcando la copia de seguridad como en ejecución...
[2026-05-21 16:26:50] Asegurando que '/var/www/discourse/tmp/backups/default/2026-05-21-162650' exista...
[2026-05-21 16:26:50] Asegurando que '/var/www/discourse/public/backups/default' exista...
[2026-05-21 16:26:50] Actualizando metadatos...
[2026-05-21 16:26:50] Volcando el esquema público de la base de datos...
[2026-05-21 16:26:50] pg_dump: ejecutando SELECT pg_catalog.set_config('search_path', '', false);
[2026-05-21 16:26:50] pg_dump: el último OID incorporado es 16383
[2026-05-21 16:26:50] pg_dump: leyendo extensiones
[2026-05-21 16:26:50] pg_dump: identificando miembros de la extensión
[2026-05-21 16:26:50] pg_dump: leyendo esquemas
[2026-05-21 16:26:50] pg_dump: leyendo tablas definidas por el usuario
[2026-05-21 16:26:50] pg_dump: leyendo funciones definidas por el usuario
[2026-05-21 16:26:50] pg_dump: leyendo tipos definidos por el usuario
[2026-05-21 16:26:50] pg_dump: leyendo lenguajes procedimentales
[2026-05-21 16:26:50] pg_dump: leyendo funciones agregadas definidas por el usuario
[2026-05-21 16:26:50] pg_dump: leyendo operadores definidos por el usuario
[2026-05-21 16:26:50] pg_dump: leyendo métodos de acceso definidos por el usuario
[2026-05-21 16:26:50] pg_dump: leyendo clases de operadores definidas por el usuario
[2026-05-21 16:26:50] pg_dump: leyendo familias de operadores definidas por el usuario
[... .... ...]
[2026-05-21 16:26:57] Finalizando la copia de seguridad...
[2026-05-21 16:26:57] Creando archivo comprimido: netzwissen-forum-2026-05-21-162650-v20260520064255.tar.gz
[2026-05-21 16:26:57] Asegurando que el archivo comprimido no exista previamente...
[2026-05-21 16:26:57] Creando archivo comprimido vacío...
[2026-05-21 16:26:57] Archivando el volcado de datos...
[2026-05-21 16:26:57] Archivando las cargas...
[2026-05-21 16:26:58] Eliminando el directorio temporal '/var/www/discourse/tmp/backups/default/2026-05-21-162650'...
[2026-05-21 16:26:58] Comprimiendo el archivo con gzip, esto puede tardar un momento...
¡Genial! Probablemente intentaría instalar específicamente los componentes del cliente de pg18 para que no cambie a la versión 19 en algún momento. Además, querrás agregar estos comandos a tu app.yml, a menos que prefieras hacerlo manualmente en cada actualización.