Merge pull request #33 from R0m1k3/claude/combohr-app-recreation-plan-yu7wre

Nommer le vrai obstacle : le mot de passe gravé dans le volume
This commit is contained in:
LogiFlow authored and GitHub committed 2026-08-10 08:26:12 +02:00
commit b1be8a575c
2 files changed
+73 -3

No files matched your search

+28
View File
@@ -74,6 +74,34 @@ Les autres ont une valeur par défaut utilisable : `POSTGRES_PASSWORD`, `POSTGRE
**Après le premier déploiement, relevez la clé dans les journaux du conteneur `app` et conservez-la hors du serveur.**
### Si l’application ne démarre pas : `P1000`
Le journal du conteneur `app` dit toujours quoi faire. Trois cas, dans l’ordre de fréquence.
**`[bootstrap] Le compte d’amorçage « planflow » est lui-même refusé.`**
C’est le piège classique de PostgreSQL en conteneur, et il n’a rien à voir avec le rôle applicatif. **`POSTGRES_PASSWORD` n’est lu qu’à l’initialisation du volume.** Un volume créé lors d’un déploiement antérieur — y compris un déploiement qui avait échoué pour une autre raison — garde le mot de passe d’alors. Le changer dans la pile n’y touche pas : le volume ne se réinitialise jamais.
La base est encore vide ? Repartez d’un volume neuf, c’est le plus sûr :
```bash
docker compose down
docker volume rm planflow_db-data
docker compose up -d
```
La base contient déjà quelque chose ? Réalignez le mot de passe. L’image PostgreSQL fait confiance aux connexions par socket locale, donc l’ancien mot de passe n’est pas nécessaire :
```bash
docker compose exec db psql -U planflow \
-c "ALTER USER planflow PASSWORD 'planflow-interne';"
docker compose restart app
```
**`[bootstrap] Aucun identifiant d’amorçage fourni`** — le service `app` n’a pas `POSTGRES_PASSWORD`. Il l’a par défaut dans le compose fourni ; son absence signale une variable vidée à la main.
**Aucune ligne `[bootstrap]` du tout** — l’image tourne sur une version antérieure à ce mécanisme. Reconstruisez-la (`docker compose up -d --build`, ou dans Portainer *Update the stack* avec *Re-pull image and redeploy*). Un simple redémarrage réutilise l’image existante.
### Première installation
Les migrations posent le schéma, rien de plus : une instance neuve n'a **aucun compte et aucun utilisateur**. Le jeu de données de démonstration (`pnpm db:seed`) n'y remédie pas et refuse de tourner en production, à raison — personne ne veut de « Maison Rivage » et de salariés fictifs dans son registre du personnel.
+45 -3
View File
@@ -106,9 +106,51 @@ try {
} catch (error) {
// Non bloquant : le rôle est peut-être déjà correct et posé par `db-init`.
// Faire échouer le démarrage ici priverait d'une installation qui marche.
console.error(
`[bootstrap] Provisionnement impossible (${error instanceof Error ? error.message : String(error)}).`,
);
const message = error instanceof Error ? error.message : String(error);
console.error(`[bootstrap] Provisionnement impossible (${message}).`);
// Le cas de très loin le plus fréquent, et le moins évident : le compte
// d'amorçage lui-même est refusé.
//
// `POSTGRES_PASSWORD` n'est lu qu'à **l'initialisation du volume**. Un volume
// créé lors d'un déploiement antérieur garde le mot de passe d'alors, et le
// changer dans la pile n'y touche pas — le volume ne se réinitialise jamais.
// Sans cette explication, on cherche indéfiniment du côté du rôle applicatif,
// qui n'y est pour rien.
if (/password authentication failed/i.test(message)) {
console.error('');
console.error(
`[bootstrap] Le compte d’amorçage « ${superUser} » est lui-même refusé.`,
);
console.error(
'[bootstrap] POSTGRES_PASSWORD n’est lu qu’à la création du volume de la',
);
console.error(
'[bootstrap] base. Si ce volume vient d’un déploiement antérieur, il porte',
);
console.error(
'[bootstrap] encore l’ancien mot de passe, et le changer dans la pile n’y',
);
console.error('[bootstrap] change rien.');
console.error('');
console.error('[bootstrap] • Base encore vide — repartir d’un volume neuf :');
console.error('[bootstrap] docker compose down');
console.error('[bootstrap] docker volume rm planflow_db-data');
console.error('[bootstrap] docker compose up -d');
console.error('');
console.error('[bootstrap] • Base à conserver — réaligner le mot de passe.');
console.error(
'[bootstrap] Par la socket locale, qui ne demande pas l’ancien :',
);
console.error(
`[bootstrap] docker compose exec db psql -U ${superUser} \\`,
);
console.error(
`[bootstrap] -c "ALTER USER ${superUser} PASSWORD '<celui de la pile>';"`,
);
console.error('');
}
console.error(
'[bootstrap] La suite dira si le rôle applicatif est utilisable en l’état.',
);