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:
1 file changed
+35
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user