AVERTISSEMENT ! Si votre base de données est très volumineuse, vous aurez besoin de beaucoup d’espace disque supplémentaire (2x la taille de la base de données) et vous devrez être très prudent avec cette mise à niveau !
Nous venons d’apporter des modifications pour mettre à niveau notre image Docker vers PostgreSQL 15. Tous les administrateurs de site reconstruisant Discourse depuis la ligne de commande seront mis à niveau vers PostgreSQL 15 à partir de la version précédente de PostgreSQL 13. Notez que si vous avez retardé la mise à niveau lorsque la mise à niveau de PostgreSQL 13 a eu lieu en 2020, vous pouvez sauter cette mise à niveau et passer directement à PostgreSQL 15.
Si vous aviez précédemment retardé la mise à niveau, remplacez le modèle PostgreSQL dans app.yml de templates/postgres.12.template.yml par templates/postgres.template.yml.
Comme pour toute mise à niveau, il est fortement recommandé de faire une sauvegarde avant de faire quoi que ce soit.
Mise à jour
Guide d’installation officiel (conteneur unique)
Lors de votre prochaine reconstruction, vous verrez ce message à la fin :
-------------------------------------------------------------------------------------
MISE À NIVEAU DE POSTGRES TERMINÉE
L'ancienne base de données 13 est stockée dans /shared/postgres_data_old
Pour terminer la mise à niveau, reconstruisez à nouveau en utilisant :
./launcher rebuild app
-------------------------------------------------------------------------------------
Cela signifie que tout s’est bien passé lors de la mise à niveau ! Il vous suffit d’émettre une nouvelle reconstruction pour que votre site soit de nouveau opérationnel.
Installation avec conteneur de données
Si vous utilisez une configuration avec un conteneur de données dédié basé sur l’exemple fourni dans notre dépôt discourse_docker, vous voudrez vous assurer d’arrêter PostgreSQL de manière sûre et propre.
Aujourd’hui, nous avons des tâches d’arrière-plan qui exécutent des requêtes s’étendant sur plusieurs minutes, donc l’arrêt du conteneur web aidera le conteneur de données à s’arrêter en toute sécurité.
./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only
Avant d’émettre la première reconstruction du conteneur de données, vous pouvez suivre le journal PostgreSQL pour voir s’il a été correctement arrêté.
L’exécution d’un tail -f shared/standalone/log/var-log/postgres/current devrait vous donner le journal suivant s’il était propre :
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
Effectuer une mise à jour manuelle / environnements à espace limité
VOUS DEVEZ SAUVEGARDER LE POSTGRES_DATA AVANT D’ESSAYER CECI
Si vous êtes dans un environnement à espace limité sans aucun moyen d’obtenir plus d’espace, vous pouvez essayer ce qui suit :
./launcher stop app #(ou à la fois web_only et data si c'est votre cas)
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 #(ou local_discourse/data)
./launcher rebuild app #(ou d'abord data puis web_only si c'est votre cas)
Lors de mes tests, cette procédure nécessite moins de 1x la taille de votre base de données actuelle en espace libre.
Si vous utilisez une locale non par défaut, vous pouvez essayer de remplacer la première commande docker par celle-ci :
# changez 'en_US.UTF-8' pour votre locale
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'
Reporter la mise à jour
Si vous avez besoin de reporter la mise à niveau lors de votre prochaine reconstruction, vous pouvez échanger le modèle PostgreSQL dans votre fichier app.yml en remplaçant "templates/postgres.template.yml" par "templates/postgres.13.template.yml".
Ce n’est pas recommandé, car certains administrateurs de site oublieront de rétablir le changement par la suite.
Tâches optionnelles après la mise à jour
Optimisation des statistiques PostgreSQL
Après la mise à niveau, la nouvelle version de PostgreSQL n’aura pas de statistiques de table à disposition. Vous pouvez les générer en utilisant :
docker exec -u postgres app \
/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages
Nettoyage des anciennes données
Pour une installation standard, vous pouvez supprimer les anciennes données au format PG13 avec la commande suivante :
cd /var/discourse
./launcher cleanup
Si vous avez un conteneur de données séparé, vous devrez supprimer la copie de sauvegarde comme ceci :
rm -fr /var/discourse/shared/data/postgres_data_old/
FAQ
Le cluster source n’a pas été arrêté proprement
Si vous obtenez un message d’échec de mise à niveau avec le message ci-dessus, vous pouvez essayer une approche plus simple pour le remettre dans un meilleur état.
Redémarrez l’ancien conteneur avec ./launcher start app. Attendez quelques minutes qu’il soit de nouveau opérationnel.
Arrêtez-le ensuite à nouveau avec ./launcher stop app. Après cela, suivez les journaux pour voir si l’arrêt a été propre :
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 les journaux n’indiquent pas que la base de données est arrêtée, vous pouvez redémarrer l’ancien conteneur, y accéder avec ./launcher enter app, exécuter ces commandes et suivre les journaux à nouveau une fois terminé.
export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit
Si les journaux ressemblent à ceux ci-dessus, vous pouvez maintenant essayer de mettre à niveau à nouveau en utilisant ./launcher rebuild app.
Les valeurs lc_collate pour la base de données “postgres” ne correspondent pas
Cette erreur se produit si vous utilisez des locales non par défaut pour votre base de données. Il a été signalé que vous avez besoin de 3 variables pour que cela réussisse. Assurez-vous que la section env: de votre fichier app.yml contient les 3 lignes :
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
En remplaçant en_US.UTF-8 par votre locale.
Chaque reconstruction relance la mise à niveau, c’est-à-dire boucle de mise à niveau
Lorsque cela se produit, vos journaux de mise à niveau contiendront :
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
Cela signifie qu’il reste encore des fichiers de la dernière mise à niveau. Déplacez-les ailleurs avant de continuer.
Scripts de suggestion de fin de mise à niveau - dois-je faire quelque chose ?
Une fois la mise à niveau terminée, vous verrez le message de pg_upgrade indiquant :
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
Vous pouvez ignorer ce message en toute sécurité.
J’ai sauté la mise à jour de PostgreSQL 13, que faire maintenant ?
Vous pouvez suivre les instructions standard en haut de ce guide et elles mettront à niveau de votre version actuelle vers la 15 sans problème.
Si vous suivez les instructions pour les contraintes d’espace, adaptez les numéros de version en conséquence.
La reconstruction des index peut vous faire économiser beaucoup d’espace disque. Suivez les étapes de notre mise à jour de PostgreSQL 13 après la mise à niveau.