¡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
DEBES HACER UNA COPIA DE SEGURIDAD DE POSTGRES_DATA ANTES DE INTENTAR ESTO
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.