Actualización de PostgreSQL 15

:warning: ¡ADVERTENCIA! Si tu base de datos es muy grande, necesitarás mucho espacio adicional en disco (2 veces el tamaño de la base de datos) ¡y deberías tener mucho cuidado con esta actualización!

Hemos implementado cambios para actualizar nuestra imagen de Docker a PostgreSQL 15. Cualquier administrador de sitio que reconstruya Discourse desde la línea de comandos se actualizará a PostgreSQL 15 desde la versión anterior de PostgreSQL 13. Ten en cuenta que si te abstuviste de actualizar cuando ocurrió la actualización de PostgreSQL 13 en 2020, puedes omitir esa actualización y pasar directamente a PostgreSQL 15.

Si te abstuviste de la actualización anteriormente, cambia la plantilla de PostgreSQL en app.yml de templates/postgres.12.template.yml a templates/postgres.template.yml.

Como con cualquier actualización, se recomienda encarecidamente hacer una copia de seguridad antes de hacer nada.

Actualización

Guía de Instalación Oficial (contenedor único)

En tu próxima reconstrucción, verás este mensaje al final:

-------------------------------------------------------------------------------------
ACTUALIZACIÓN DE POSTGRES COMPLETADA

La base de datos antigua 13 se almacena en /shared/postgres_data_old

Para completar la actualización, reconstruye de nuevo usando:

./launcher rebuild app
-------------------------------------------------------------------------------------

¡Eso significa que todo salió bien en la actualización! Solo necesitas emitir una nueva reconstrucción para que tu sitio vuelva a funcionar.

Instalación con Contenedor de Datos

Si estás ejecutando una configuración con un contenedor de datos dedicado basado en la muestra proporcionada en nuestro repositorio discourse_docker, querrás asegurarte de que PostgreSQL se apaga de manera segura y limpia.

Hoy en día, tenemos trabajos en segundo plano ejecutando consultas que abarcan varios minutos, por lo que detener el contenedor web ayudará a que el contenedor de datos se apague de forma segura.

./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only

Antes de emitir la primera reconstrucción al contenedor de datos, puedes seguir el registro de PostgreSQL para ver si se apagó correctamente.

Ejecutar tail -f shared/standalone/log/var-log/postgres/current debería darte el siguiente registro si fue limpio:

2025-01-24 09:19:06.437 UTC [37] LOG:  received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG:  background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG:  shutting down
2025-01-24 09:19:06.468 UTC [37] LOG:  database system is shut down

Realización de una actualización manual / entornos con espacio limitado

:warning::warning::warning:
DEBES HACER UNA COPIA DE SEGURIDAD DE POSTGRES_DATA ANTES DE INTENTAR ESTO
:warning::warning::warning:

Si te encuentras en un entorno con espacio limitado y sin forma de obtener más espacio, puedes intentar lo siguiente:

./launcher stop app #(o ambos web_only y data si es tu caso)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
	--entrypoint=/bin/bash \
	-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
	-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
	tianon/postgres-upgrade:13-to-15 \
	-c "apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
	docker-upgrade"
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
docker run --rm -v /var/discourse/shared/standalone:/shared local_discourse/app \
	chown -R postgres:postgres /shared/postgres_data #(o local_discourse/data)
./launcher rebuild app #(o primero data y luego web_only si es tu caso)

En mis pruebas, este procedimiento requiere menos de 1 vez tu tamaño de base de datos actual en espacio libre.

Si estás utilizando una configuración regional no predeterminada, puedes intentar reemplazar el primer comando docker con este:

# cambia 'en_US.UTF-8' a tu configuración regional
docker run --rm \
	--entrypoint=/bin/bash \
	-e LANG='en_US.UTF-8' \
	-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
	-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
	tianon/postgres-upgrade:13-to-15 \
	-c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
	apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
	docker-upgrade'

Posponer la actualización

Si necesitas posponer la actualización durante tu próxima reconstrucción, puedes intercambiar la plantilla de PostgreSQL en tu archivo app.yml cambiando "templates/postgres.template.yml" por "templates/postgres.13.template.yml".

Esto no se recomienda, ya que algunos administradores de sitios olvidarán revertir el cambio después.

Tareas opcionales posteriores a la actualización

Optimización de las estadísticas de PostgreSQL

Después de la actualización, la nueva PostgreSQL no tendrá estadísticas de tabla a mano. Puedes generarlas usando:

docker exec -u postgres app \
	/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages

Limpieza de datos antiguos

Para una instalación estándar, puedes eliminar los datos antiguos en formato PG13 con el siguiente comando:

cd /var/discourse
./launcher cleanup

Si tienes un contenedor de datos separado, deberás eliminar la copia de seguridad de esta manera:

rm -fr /var/discourse/shared/data/postgres_data_old/

Preguntas frecuentes

El clúster de origen no se apagó limpiamente

Si obtienes un error de actualización con el mensaje anterior, puedes intentar un enfoque más simple para devolverlo a un mejor estado.

Reinicia el contenedor antiguo con ./launcher start app. Espera unos minutos hasta que se inicie.

Ahora apágalo de nuevo con ./launcher stop app. Después de eso, sigue los registros para ver si fue limpio:

tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG:  received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG:  background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG:  shutting down
2025-01-24 09:19:06.468 UTC [37] LOG:  database system is shut down

Si los registros no indican que la base de datos se ha apagado, puedes iniciar el contenedor antiguo de nuevo, entrar con ./launcher enter app, ejecutar estos comandos y seguir los registros de nuevo una vez hecho.

export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit

Si los registros se parecen a los anteriores, ahora puedes intentar actualizar de nuevo usando ./launcher rebuild app.

Los valores de lc_collate para la base de datos “postgres” no coinciden

Este error ocurre si estás utilizando configuraciones regionales no predeterminadas para tu base de datos. Se informó que necesitas 3 variables para que tenga éxito. Asegúrate de que la sección env: de tu archivo app.yml tenga las 3 líneas:

  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

Cambiando en_US.UTF-8 a tu configuración regional.

Cada reconstrucción vuelve a realizar la actualización, es decir, bucle de actualización

Cuando esto sucede, tus registros de actualización contendrán

mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty

Esto significa que todavía hay archivos del último intento de actualización. Muévelos a otro lugar antes de continuar.

Scripts de sugerencia de finalización de actualización - ¿necesito hacer algo?

Una vez que la actualización se complete, verás la salida del mensaje de pg_upgrade diciendo:

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.

Once you start the new server, consider running:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh

Puedes ignorar este mensaje de forma segura.

Me salté la actualización de PostgreSQL 13, ¿qué hago ahora?

Puedes seguir las instrucciones estándar en la parte superior de esta guía y se actualizarán de tu versión a la 15 sin problemas.

Si sigues las instrucciones para espacio limitado, adapta los números de versión en consecuencia.

La reconstrucción de índices puede proporcionarte ahorros significativos de espacio en disco. Sigue los pasos de nuestra actualización de PostgreSQL 13 después de la actualización.

28 Me gusta
Cannot rebuild app because UPGRADE OF POSTGRES FAILED
Site offline after rebuild (4th Feb 2025)
Launcher upgrade failing
Update “3.4.0.beta4” failed
Admin dashboard not working after docker update
Specifically for 3.4.0.beta4 -- what are the system requirements?
Discourse rebuild fails due to unclean shutdown
Move from standalone container to separate web and data containers
Not receiving notifications for some replies
Hundreds of megabytes of apparently duplicate locale .js files
Upgrade failed spectacularily
Quote Callouts
502 Bad Gateway after updating to latest version
Discourse rebuild fails due to unclean shutdown
Rebuild fails: Data directory /shared/postgres_data must not be owned by root
Site Offline Since Update - pg15 upgrade failed
Failing update
Backup Failed error
Failing update
Let's Encrypt SSL certificates not renewing
Failing update
Long runtime moving posts / timeout errors
Upgrade failed. Database stopped. (multisite install)
Make (temporary) use of Network Storage for Restores, PSQL Update,
Error updating from 3.3 to 3.5
Unable to rebuild app / upgrade to 3.4.0.beta4
Upgrade fail unsupported Docker Version
Endlessly running Postgres processes & bad performance after Reinstall/restore
Unable to upgrade to PostgreSQL 15/
PostgreSQL update fails from China
Postgres doesn't seem to be running when running Discourse locally using Docker
Postgres doesn't seem to be running when running Discourse locally using Docker
Unable to upgrade to PostgreSQL 15/
My install is 16,359 commits behind! Advice?
Admin functions
Discourse rebuild process hangs at PostgreSQL initialization with "trust" authentication warning
Discourse update error with Terser
Getting white screen on admin page after update
Upgrade fails (again :) )
Update failure
I broke my site while updating it
Major upgrade -- best practices?
An upgrade knocked my site offline; how long until it's restored?
Upgrade failed. Database stopped. (multisite install)
Can't log into Digital Ocean--And they aren't replying. Advice?
Trouble updating discourse after some time - UPGRADE OF POSTGRES FAILED
Site Offline Since Update - pg15 upgrade failed
Site offline after rebuild (4th Feb 2025)
Can publishing "from" the `#staff` category prevent emails being sent?
Cannot rebuild app,
Upgrade from postgres 13 to 15 failing - currently means forum is unavailable
Unable to upgrade Kore Community Instance
Site upgrade insisting on database upgrade after manual db upgrade
Update v3.4.0.beta3 +21 to v3.4.0.beta4 +37 fails, unable to create a directory
Discourse Randomly Does Not run or Rebuild
PostgreSQL update fails from China
Hundreds of megabytes of apparently duplicate locale .js files
Site not working after upgrade

Cuando visito https://community.ankihub.net/admin/update, veo el siguiente mensaje:

Estás ejecutando una versión antigua de la imagen de Discourse
Las actualizaciones a través de la interfaz web están deshabilitadas hasta que ejecutes la última imagen. Para hacerlo, inicia sesión en tu servidor usando SSH y ejecuta:

cd /var/discourse
git pull
./launcher rebuild app

Después de seguir esas instrucciones, obtengo UPGRADE OF POSTGRES FAILED (Fallo en la actualización de PostgreSQL):

invoke-rc.d: no se pudo determinar el nivel de ejecución actual
invoke-rc.d: policy-rc.d denegó la ejecución de start.
Procesando desencadenantes para postgresql-common (267.pgdg120+1) ...
Construyendo diccionarios de PostgreSQL desde los paquetes myspell/hunspell instalados...
Eliminando archivos de diccionario obsoletos:
Deteniendo el servidor de base de datos PostgreSQL 13: main.
Deteniendo el servidor de base de datos PostgreSQL 15: main.
Realizando comprobaciones de consistencia
-----------------------------
Verificando versiones del clúster                                   ok
Verificando que el usuario de la base de datos sea el usuario de instalación                  ok
Verificando la configuración de conexión a la base de datos                       ok
Verificando transacciones preparadas                          ok
Verificando tipos compuestos definidos por el sistema en tablas de usuario  ok
Verificando tipos de datos reg* en tablas de usuario                 ok
Verificando contrib/isn con discrepancia en paso de bigint       ok
Verificando conversiones de codificación definidas por el usuario              ok
Verificando operadores postfijos definidos por el usuario                 ok
Verificando funciones polimórficas incompatibles             ok
Creando volcado de objetos globales                             ok
Creando volcado de esquemas de bases de datos
*falla*

Consulta las últimas líneas de "/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log" para
conocer la probable causa del fallo.
Fallo, saliendo
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Por favor, visita https://meta.discourse.org/t/postgresql-15-update/349515 para obtener soporte.

Mientras tanto, puedes ejecutar ./launcher start app para reiniciar tu aplicación
-------------------------------------------------------------------------------------



FAILED
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres ya se está ejecutando, detén el contenedor ; exit 1
fi
 falló con el código de retorno #<Process::Status: pid 18 exit 1>
Ubicación del fallo: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falló con los parámetros {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres ya se está ejecutando, detén el contenedor ; exit 1\nfi\n"}
bootstrap falló con código de salida 1

Nada aquí ni en este tema algo relacionado aborda mi problema, por lo que puedo ver.

Aquí están los registros de /shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log:

comando: "/usr/lib/postgresql/15/bin/pg_dump" --host /var/lib/postgresql --port 50432 --username postgres --schema-only --quote-all-identifiers --binary-upgrade --format=custom  --file="/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/dump/pg_upgrade_dump_16384.custom" 'dbname=discourse' >> "/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log" 2>&1
pg_dump: error: la consulta falló: ERROR: no se pudo acceder al archivo "$libdir/vector": No existe el archivo o el directorio
pg_dump: detalle: La consulta fue: SELECT t.tableoid, t.oid, i.indrelid, t.relname AS indexname, pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, i.indkey, i.indisclustered, c.contype, c.conname, c.condeferrable, c.condeferred, c.tableoid AS contableoid, c.oid AS conoid, pg_catalog.pg_get_constraintdef(c.oid, false) AS condef, (SELECT spcname FROM pg_catalog.pg_tablespace s WHERE s.oid = t.reltablespace) AS tablespace, t.reloptions AS indreloptions, i.indisreplident, inh.inhparent AS parentidx, i.indnkeyatts AS indnkeyatts, i.indnatts AS indnatts, (SELECT pg_catalog.array_agg(attnum ORDER BY attnum)   FROM pg_catalog.pg_attribute   WHERE attrelid = i.indexrelid AND     attstattarget >= 0) AS indstatcols, (SELECT pg_catalog.array_agg(attstattarget ORDER BY attnum)   FROM pg_catalog.pg_attribute   WHERE attrelid = i.indexrelid AND     attstattarget >= 0) AS indstatvals, false AS indnullsnotdistinct FROM unnest('{16805,16813,16823,16835,16846,16858,16940,16948,16963,16973,16996,17006,17029,17061,17071,17085,17095,17101,17112,17136,17151,17159,17168,17266,17280,17321,17334,17345,17354,17368,17382,17398,17412,17420,17428,17519,17532,17543,17562,17570,17620,17687,17710,17724,17738,17754,17775,17788,17803,17824,17851,17864,17898,17917,17932,17944,17958,17980,17993,18006,18019,18030,18041,18055,18069,18092,18101,18134,18145,18166,18177,18214,18241,18263,18276,18298,18324,18338,18358,18368,18403,18426,18449,18458,18470,18496,18510,18525,18534,18543,18569,18596,18607,18625,18643,18655,18663,18676,18686,18698,18710,18719,18734,18742,18757,18768,18786,18798,18802,18806,18846,18864,18879,18891,18910,18920,18932,18946,18988,19003,19014,19039,19059,19073,19085,19097,19103,19116,19140,19192,19206,19227,19250,19266,19300,19309,19328,19343,19354,19367,19389,19402,19417,19430,19497,19521,19544,19559,19569,19597,19605,19637,19687,19703,19721,19742,19771,19807,19821,19830,19839,19862,19874,19890,19904,19917,19932,19942,19951,19960,19981,20005,20021,20044,20052,20061,20073,20082,20133,20146,20157,20178,20191,20203,20217,20231,20263,20276,20297,20309,20320,28805,28951,28964,28976,28986,28997,32824,32833,32843,32852,32862,32875,32887,32899,32910,32930,32967,35131,35141,38401,38413,38437,38445,38461,38482,38495,42870,46125,46138,130133,191445,191457,191471,191486,191497,191603,191637,243875,606663,606675,606693,606707,779182,779197,779213,779225,779237,779252,779265,968985,968993,969004,969017,969027,1004239,1004251,1004263,1004276,1004295,1091838,1091849,1091860,1336877,1336884,1336891,1566392,2169846,2169852,2169858,2169864,2169870,2169876,2169882,2169888,2169894,2169900,2169906,2169912,2169918,2169924,2169930,2169936,2169942,2169948,2169954,2169960,2169966,2169972,2169978,2169984}'::pg_catalog.oid[]) AS src(tbloid)
JOIN pg_catalog.pg_index i ON (src.tbloid = i.indrelid) JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) JOIN pg_catalog.pg_class t2 ON (t2.oid = i.indrelid) LEFT JOIN pg_catalog.pg_constraint c ON (i.indrelid = c.conrelid AND i.indexrelid = c.conindid AND c.contype IN ('p','u','x')) LEFT JOIN pg_catalog.pg_inherits inh ON (inh.inhrelid = indexrelid) WHERE (i.indisvalid OR t2.relkind = 'p') AND i.indisready ORDER BY i.indrelid, indexname
/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log

Aquí está la salida de ./discourse-doctor:

Salida de ./discourse-doctor
DISCOURSE DOCTOR Mié 29 Ene 2025 10:39:42 AM UTC
SO: Linux forum 5.4.0-48-generic #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux


Encontrado containers/app.yml

==================== CONFIGURACIONES YML ====================
DISCOURSE_HOSTNAME=community.ankihub.net
SMTP_ADDRESS=smtp.mailgun.org
DEVELOPER_EMAILS=REDACTED 
SMTP_PASSWORD=REDACTED 
SMTP_PORT=587
SMTP_USER_NAME=postmaster@mg.ankihub.net
LETSENCRYPT_ACCOUNT_EMAIL=REDACTED 

==================== INFORMACIÓN DE DOCKER ====================
VERSIÓN DE DOCKER: Docker versión 27.2.1, compilación 9e34c9b

PROCESOS DE DOCKER (docker ps -a)

ID DEL CONTENEDOR   IMAGEN                           COMANDO        CREADO         ESTADO          PUERTOS                                                                      NOMBRES
37e2430e1014   local_discourse/app             "/sbin/boot"   hace 4 meses    Up 33 segundos   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app
260f4c0ed417   local_discourse/mail-receiver   "/sbin/boot"   hace 20 meses   Up 4 meses     0.0.0.0:25->25/tcp, :::25->25/tcp                                          mail-receiver


El contenedor de Discourse app está en ejecución


==================== PLUGINS ====================
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-reactions.git
          - git clone https://github.com/discourse/discourse-chat-integration.git
          - git clone https://github.com/discourse/discourse-code-review.git
          - git clone https://github.com/discourse/discourse-topic-voting.git
          - git clone https://github.com/discourse/discourse-automation.git
          - git clone https://github.com/discourse/discourse-bbcode-color.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-docs.git
          - git clone https://github.com/discourse/discourse-ai.git
          - git clone https://github.com/discourse/discourse-jira.git

No se detectaron plugins no oficiales.

Consulta la lista oficial en https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb.

========================================
Versión de Discourse en community.ankihub.net: Discourse 3.4.0.beta2 
Versión de Discourse en localhost: Discourse 3.4.0.beta2 


==================== INFORMACIÓN DE MEMORIA ====================
SO: Linux
RAM (MB): 4127

              total        used        free      shared  buff/cache   available
Mem:           3936        1567         158         274        2209        1802
Swap:          2047          67        1980

==================== VERIFICACIÓN DE ESPACIO EN DISCO ====================
---------- Espacio en disco del SO ----------
Sistema de archivos      Tamaño  Usado Disp Uso% Montado en
/dev/vda1        78G   50G   28G  65% /

---------- Espacio en disco del contenedor ----------
Sistema de archivos      Tamaño  Usado Disp Uso% Montado en
overlay          78G   50G   28G  65% /
/dev/vda1        78G   50G   28G  65% /shared
/dev/vda1        78G   50G   28G  65% /var/log

==================== INFORMACIÓN DE DISCO ====================
Disco /dev/loop0: 55.68 MiB, 58363904 bytes, 113992 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop1: 91.85 MiB, 96292864 bytes, 188072 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop2: 63.71 MiB, 66789376 bytes, 130448 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop3: 63.10 MiB, 67080192 bytes, 131016 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop4: 44.45 MiB, 46596096 bytes, 91008 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop5: 91.9 MiB, 96346112 bytes, 188176 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop7: 44.3 MiB, 46448640 bytes, 90720 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/vda: 80 GiB, 85899345920 bytes, 167772160 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
Tipo de etiqueta de disco: gpt
Identificador de disco: 2ED04D82-BA1D-4A75-86B9-9553B7EA5228

Dispositivo      Inicio       Fin   Sectores  Tamaño Tipo
/dev/vda1  227328 167772126 167544799 79.9G Sistema de archivos Linux
/dev/vda14   2048     10239      8192    4M Arranque BIOS
/dev/vda15  10240    227327    217088  106M Datos básicos de Microsoft

Las entradas de la tabla de particiones no están en orden del disco.


Disco /dev/loop8: 55.37 MiB, 58052608 bytes, 113384 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes

==================== FIN DE LA INFORMACIÓN DE DISCO ====================

==================== PRUEBA DE CORREO ====================
Para una prueba robusta, obtén una dirección en http://www.mail-tester.com/
Prueba de correo omitida.

==================== ¡LISTO! ====================

Esperando que alguien pueda indicarme la dirección correcta. ¡Gracias!

1 me gusta

Tengo el mismo problema que tú y busco igualmente una solución.

1 me gusta

¿Cómo puedo comprobar el tamaño de la base de datos de mi instancia?

2 Me gusta

Gracias por los informes. Estamos investigando el problema de could not access file \"$libdir/vector\".

En una instalación estándar, creo que puedes ejecutar esto:

du -sh /var/discourse/shared/standalone/postgres_data

por ejemplo, para mi sitio de prueba, el resultado es:

# du -sh /var/discourse/shared/standalone/postgres_data
237M	/var/discourse/shared/standalone/postgres_data

(@mwaniki ¡por favor corrígeme si hay una mejor manera!)

4 Me gusta

Claro, eso devolvería el tamaño total de todos los archivos de datos de PostgreSQL en el disco (incluidos los archivos WAL).

Si solo te interesa el tamaño de la base de datos discourse, puedes usar la función pg_database_size o el metacomando \\list+.

docker exec -u postgres app psql -c "SELECT pg_size_pretty( pg_database_size('discourse') ) AS db_size;"

# o

docker exec -u postgres app psql -c "\list+ discourse"
6 Me gusta

Por cierto, ¿cuál es la ventaja de usar uno de sus formularios de análisis de vacío en lugar del comando sugerido por postgres?

¿Es solo que es innecesario generar esas estadísticas para cualquier cosa fuera de la base de datos discourse? Si es así, ¿sería analyze-in-stages una ventaja para instancias muy grandes si se usara en su lugar:
/var/discourse/launcher run app \"/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages\"

Hola @aas y @NKERIFAC_CLAUD_NBAPNON! :wave:

No pude reproducir el error al ejecutar launcher rebuild para un sitio que se ejecuta en la imagen base anterior. Mis pruebas resultaron en una actualización exitosa, incluso con el plugin discourse-ai instalado.

Dado que el error ocurre al volcar el esquema de la base de datos antigua, acabamos de lanzar una actualización que sospecho que podría solucionar el problema que encontraste.

Puedes intentar seguir los mismos pasos y contarnos cómo va.

cd /var/discourse
git pull
./launcher rebuild app

Si eso aún no soluciona el problema, ¿podrías compartir más detalles sobre tu entorno? Estos serían particularmente útiles:

  • tu versión actual de la imagen base

    docker image inspect --format '{{ .Config.Image }}' local_discourse/app
    
  • plugins de Discourse instalados

    cat containers/app.yml | \\\
    docker run --rm -i -a stdout -a stdin local_discourse/app \\\
    ruby -e \"require 'yaml'; puts YAML.load(STDIN.readlines.join)['hooks']\"
    
  • extensiones de PostgreSQL y sus versiones

    docker exec -u postgres app psql discourse -c \"SELECT
      name,
      default_version,
      installed_version
    FROM
      pg_catalog.pg_available_extensions
    WHERE
      installed_version IS NOT NULL;\"
    
3 Me gusta

Noté una línea preocupante en postgres.template.yml:

La lógica actual hace que el script salga inmediatamente si el archivo /shared/postgres_run/.s.PGSQL.5432 existe, independientemente de si PostgreSQL se está ejecutando realmente. Esto omite todo el código posterior en /root/install_postgres, incluido el script de actualización. Creo que se debería eliminar el primer exit 0.

1 me gusta

La actualización también falla para mí. El error que veo parece indicar un problema de localización (lo cual es un poco extraño, ya que la localización del sistema siempre ha sido de_DE.UTF-8).

root@Ubuntu-2204-jammy-amd64-base /var/discourse # ./launcher rebuild app
x86_64 arch detected.
...
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20250129-0720: Pulling from discourse/base
Digest: sha256:01b8516e5504c0e9bc3707773015ff4407be03a89154194ff3b5b8699291bc26
Status: Image is up to date for discourse/base:2.0.20250129-0720
docker.io/discourse/base:2.0.20250129-0720
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (de_DE.UTF-8)
I, [2025-01-29T21:35:58.711630 #1]  INFO -- : Reading from stdin
I, [2025-01-29T21:35:58.721321 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown:
I, [2025-01-29T21:35:58.726551 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown:
I, [2025-01-29T21:35:58.732322 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown:
I, [2025-01-29T21:35:58.737436 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown:
I, [2025-01-29T21:35:58.742651 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown:
I, [2025-01-29T21:35:58.742825 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.743394 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.743708 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.744003 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.744441 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.744734 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.745027 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.747582 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.748035 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.748263 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-01-29T21:35:58.748463 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-01-29T21:35:58.748657 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-01-29T21:35:58.748844 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

/bin/bash: warning: setlocale: LC_ALL: cannot change locale (de_DE.UTF-8)
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
debconf: delaying package configuration, since apt-utils is not installed
I, [2025-01-29T21:37:25.430685 #1]  INFO -- : Generating locales (this might take a while)...
  de_DE.UTF-8... done
  en_US.UTF-8... done
Generation complete.
Upgrading PostgreSQL from version 13 to 15
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "de_DE.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "german".

Data page checksums are disabled.

fixing permissions on existing directory /shared/postgres_data_new ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok


Success. You can now start the database server using:

    /usr/lib/postgresql/15/bin/pg_ctl -D /shared/postgres_data_new -l logfile start

Get:1 http://deb.debian.org/debian bookworm-backports InRelease [59,0 kB]
Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55,4 kB]
Get:4 https://dl.yarnpkg.com/debian stable InRelease [17,1 kB]
Get:5 http://deb.debian.org/debian-security bookworm-security InRelease [48,0 kB]
Get:6 https://deb.nodesource.com/node_22.x nodistro InRelease [12,1 kB]
Get:7 http://deb.debian.org/debian bookworm-backports/main amd64 Packages [280 kB]
Get:8 http://deb.debian.org/debian bookworm/main amd64 Packages [8.792 kB]
Get:9 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [13,5 kB]
Get:10 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10,9 kB]
Get:11 https://dl.yarnpkg.com/debian stable/main all Packages [10,9 kB]
Get:12 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [243 kB]
Get:13 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5.274 B]
Get:14 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
Get:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
Fetched 10,2 MB in 2s (6.159 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  postgresql-client-13
Suggested packages:
  postgresql-doc-13
The following NEW packages will be installed:
  postgresql-13 postgresql-13-pgvector postgresql-client-13
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 17,3 MB of archives.
After this operation, 56,7 MB of additional disk space will be used.
Get:1 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.18-1.pgdg120+1 [1.523 kB]
Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.18-1.pgdg120+1 [15,4 MB]
Get:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
Fetched 17,3 MB in 1s (32,1 MB/s)
Selecting previously unselected package postgresql-client-13.
(Reading database ... 33363 files and directories currently installed.)
Preparing to unpack .../postgresql-client-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-client-13 (13.18-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13.
Preparing to unpack .../postgresql-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13 (13.18-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13-pgvector.
Preparing to unpack .../postgresql-13-pgvector_0.8.0-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Setting up postgresql-client-13 (13.18-1.pgdg120+1) ...
Setting up postgresql-13 (13.18-1.pgdg120+1) ...
Creating new PostgreSQL cluster 13/main ...
/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/13/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 13 main start

invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Processing triggers for postgresql-common (267.pgdg120+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Stopping PostgreSQL 13 database server: main.
Stopping PostgreSQL 15 database server: main.
Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for user-defined encoding conversions              ok
Checking for user-defined postfix operators                 ok
Checking for incompatible polymorphic functions             ok
Creating dump of global objects                             ok
Creating dump of database schemas                           ok

lc_collate values for database "template1" do not match:  old "en_US.UTF-8", new "de_DE.UTF-8"
Failure, exiting
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Please visit https://meta.discourse.org/t/postgresql-15-update/349515 for support.

You can run ./launcher start app to restart your app in the meanwhile
-------------------------------------------------------------------------------------



FAILED
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi
 failed with return #<Process::Status: pid 18 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
80933ad1f9a6809c85383c9d512c34340988ab7791b3ff57a6a563fd42fc413f
1 me gusta

Hola @mwaniki, la actualización que enviaste funcionó bien para mí. Muchas gracias.

2 Me gusta

Dado que obtienes el error al volcar los esquemas antiguos, ¿puedes confirmar la configuración regional actual?

docker exec -it -u postgres app bash
env
psql -c 'SELECT
  datname,
  datcollate,
  datctype
FROM
  pg_database;'

De hecho. ¡Gracias por señalarlo! He actualizado el procedimiento en OP. :+1:

¡Me alegra saberlo! Gracias por confirmar.

4 Me gusta

4 publicaciones se dividieron en un nuevo tema: Problemas con la configuración de incrustaciones de Discourse AI

Oefhh, habría sido genial si el script de actualización se hubiera actualizado con un enlace a esto y una solicitud de sí/no. Ahora actualicé y no estoy seguro si necesito recuperar mi sitio debido a este cambio.

Editar: parece que terminó con éxito :tada:

Logré actualizar un foro (hay cuatro en este servidor) y al intentar actualizar el siguiente me aparece:

Caused by:
PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: Connection refused (PG::ConnectionBad)

Tuve que usar ./launcher start app para que volviera a funcionar.

Recuerdo que hubo un problema con PostgreSQL 12 update y creo que tuve que usar ./launcher stop app para las otras aplicaciones antes de intentar la actualización, sin embargo, esta vez no está funcionando. (Las publicaciones en ese hilo fueron eliminadas automáticamente, ¿podría un moderador revisar las publicaciones para ver si eso fue lo que hice?)

¿Alguna otra idea?

1 me gusta

He solicitado al equipo de discourse-ai que intervenga.

Sí, eso es exactamente lo que publicaste. Tendré que probar con una configuración similar y volveré a informarte.

3 Me gusta

Gracias Mwaniki, logré solucionarlo: solo tuve que entrar en la aplicación y sudo service postgresql stop antes de hacer la actualización rebuilds.

Gracias por toda tu ayuda :heart:

1 me gusta

El entorno parece tener la configuración regional esperada (salida de env a continuación, configuración de correo electrónico redactada):

LEFTHOOK=0
HOSTNAME=Ubuntu-2204-jammy-amd64-base-app
LANGUAGE=de_DE.UTF-8
UNICORN_WORKERS=8
DISCOURSE_HOSTNAME=[..]
RUBY_GC_HEAP_INIT_SLOTS=400000
DISCOURSE_SMTP_USER_NAME=[...]
DOCKER_HOST_IP=172.17.0.1
DISCOURSE_SMTP_ADDRESS=[...]
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5
RUBY_VERSION=3.3.6
PWD=/
DISCOURSE_DB_SOCKET=/var/run/postgresql
DISCOURSE_DEVELOPER_EMAILS=[...]
HOME=/var/lib/postgresql
LANG=de_DE.UTF-8
DISCOURSE_SMTP_PORT=587
RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000
DEBIAN_RELEASE=bookworm
DISCOURSE_SMTP_PASSWORD=[...]
DISCOURSE_NOTIFICATION_EMAIL=[...]
PG_MAJOR=13
DISCOURSE_DB_HOST=
TERM=xterm
RUBY_ALLOCATOR=/usr/lib/libjemalloc.so
SHLVL=1
DISCOURSE_DB_PORT=
DISCOURSE_SMTP_DOMAIN=[...]
UNICORN_SIDEKIQS=1
LC_ALL=de_DE.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RAILS_ENV=production
_=/usr/bin/env

Sin embargo, la salida de la declaración de Postgres indica una configuración regional de EE. UU.:

  datname  | datcollate  |  datctype
-----------+-------------+-------------
 postgres  | en_US.UTF-8 | en_US.UTF-8
 template1 | en_US.UTF-8 | en_US.UTF-8
 template0 | en_US.UTF-8 | en_US.UTF-8
 discourse | en_US.UTF-8 | en_US.UTF-8
(4 rows)
1 me gusta

¿Cuándo creaste esa instancia de Discourse?

Hasta ahora, nuestros intentos de reproducir el problema solo son posibles cuando creamos una base de datos en una configuración regional y luego intentamos migrar usando una configuración regional diferente, y nos gustaría entender cuándo se creó la instancia para ver si podría haber habido errores de configuración regional en ese momento.

2 Me gusta

Hasta donde puedo rastrear, la instalación inicial ocurrió el 7 de febrero de 2024 (creo que el servidor se encargó un par de días antes, pero el SO es Ubuntu 22.04, que, al igual que Discourse, se actualizó continuamente).

Editar:
No estoy seguro si eso ayuda, pero creo que las advertencias sobre problemas de configuración regional son algo relativamente reciente. Recuerdo haberlas visto la última vez que reconstruí el contenedor, pero no creo que estuvieran allí desde el principio.

1 me gusta