Faire réparer le mot de passe d'amorçage par le conteneur de la base

`POSTGRES_PASSWORD` n'est lu qu'à la création du volume. Un volume né d'un
déploiement antérieur garde le mot de passe d'alors, et plus rien dans la
pile ne peut le corriger : ni l'application, ni `db-init`, tous deux refusés
à l'entrée. Le symptôme visible — un P1000 sur `planflow_app` — désigne le
mauvais coupable, et la seule issue était du SQL à la main.

La seule position d'où la réparation est possible est l'intérieur du
conteneur de la base, où PostgreSQL accepte la socket locale sans mot de
passe. Le service y réaligne donc le compte d'amorçage sur la valeur de la
pile à chaque démarrage, avant de céder la main au point d'entrée officiel.

Le SQL passe par l'entrée standard et non par `-c` : `psql -c` n'interpole
pas les variables, si bien que `:'pw'` y partait littéralement — mesuré,
« syntax error at or near ":" ». Par l'entrée standard, c'est psql qui met
le mot de passe entre guillemets, et une apostrophe dans le mot de passe ne
casse rien. Vérifié avec un mot de passe en contenant une.

Éprouvé en exécutant le corps de la commande contre un vrai serveur, avec un
point d'entrée factice : la reprise attend le serveur, le réalignement
aboutit, et le mot de passe est bien posé.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cr9dkEHwbDgkWPnyGj1Rjv
This commit is contained in:
Claude committed 2026-08-10 07:30:47 +00:00
1 parent 1dddb948c7
commit 859e51ea20
1 file changed
+35
+35
View File
@@ -19,6 +19,41 @@ services:
# Deterministic collation: ordering of employee names must not depend on
# the host locale, or exports differ between machines.
LANG: C.UTF-8
# Réaligne le mot de passe du compte d'amorçage à **chaque** démarrage.
#
# `POSTGRES_PASSWORD` n'est lu qu'à la création du volume. Un volume né d'un
# déploiement antérieur garde donc le mot de passe d'alors, et plus rien
# dans la pile ne peut le corriger : ni l'application, ni `db-init`, tous
# deux refusés à l'entrée. La seule position d'où la réparation est possible
# est l'intérieur de ce conteneur, où PostgreSQL accepte la socket locale
# sans mot de passe.
#
# Sans cela, une installation ayant connu deux valeurs de mot de passe ne
# redémarre plus jamais sans SQL à la main — et le symptôme, un `P1000` sur
# le rôle applicatif, désigne le mauvais coupable.
#
# Le SQL passe par l'entrée standard et non par `-c` : `psql -c` n'interpole
# pas les variables, si bien que `:'pw'` y serait envoyé littéralement. Par
# l'entrée standard, c'est psql qui met le mot de passe entre guillemets —
# une apostrophe dans le mot de passe ne casse donc rien.
command:
- sh
- -c
- |
(
tentative=0
while [ $$tentative -lt 60 ]; do
if echo "ALTER USER \"$$POSTGRES_USER\" WITH PASSWORD :'pw';" \
| psql -q -v ON_ERROR_STOP=1 -v pw="$$POSTGRES_PASSWORD" \
-U "$$POSTGRES_USER" -d postgres >/dev/null 2>&1; then
echo "[db] Mot de passe du compte d'amorçage réaligné sur la pile."
break
fi
tentative=$$((tentative + 1))
sleep 1
done
) &
exec docker-entrypoint.sh postgres
volumes:
- db-data:/var/lib/postgresql/data
# Crée le rôle applicatif à la première initialisation du volume.