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:
2 files changed
+71
-1
No files matched your search
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
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] Provisionnement impossible (${error instanceof Error ? error.message : String(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.',
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user