Auto-répare le mot de passe du rôle BDD et change le port PostgreSQL
- Nouveau service one-shot db-sync : à chaque démarrage de la stack, il réaligne le mot de passe du rôle sbc_app sur APP_DB_PASSWORD (corrige « password authentication failed » quand le volume a été initialisé avec une ancienne valeur) ; l'app démarre après sa réussite - Port hôte PostgreSQL : 56432 → 58412 (conflit avec un service existant), toujours en loopback uniquement - Note de dépannage dans le README Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fkg15RCxNgUys4ru73He2o
This commit is contained in:
4 files changed
+58
-4
No files matched your search
+1
-1
@@ -32,4 +32,4 @@ TRUST_PROXY=false
|
||||
# Application (public web port)
|
||||
APP_PORT=8321
|
||||
# PostgreSQL, bound to 127.0.0.1 only (local admin access)
|
||||
DB_PORT=56432
|
||||
DB_PORT=58412
|
||||
@@ -12,10 +12,10 @@ Deux conteneurs orchestrés par Docker Compose, sur des ports peu utilisés
|
||||
| Service | Rôle | Port hôte |
|
||||
|---------|------|-----------|
|
||||
| `app` | Node.js 22 / Express : API REST **et** frontend React compilé **et** images `/uploads` | `8321` (`APP_PORT`) |
|
||||
| `db` | PostgreSQL 16 (schéma + données de démo au premier démarrage) | `127.0.0.1:56432` (`DB_PORT`) — loopback uniquement, pour l'administration locale |
|
||||
| `db` | PostgreSQL 16 (schéma + données de démo au premier démarrage) | `127.0.0.1:58412` (`DB_PORT`) — loopback uniquement, pour l'administration locale |
|
||||
|
||||
```
|
||||
Navigateur ──> app (Express :8321) ──> db (PostgreSQL, 127.0.0.1:56432)
|
||||
Navigateur ──> app (Express :8321) ──> db (PostgreSQL, 127.0.0.1:58412)
|
||||
├─ /api/… API REST
|
||||
├─ /uploads/… images (volume persistant)
|
||||
└─ /… frontend React (fallback SPA)
|
||||
@@ -119,6 +119,17 @@ formulaire « Mot de passe », endpoint `POST /api/auth/change-password`).
|
||||
- **Erreurs** : les détails restent dans les logs serveur, les clients reçoivent un
|
||||
message générique.
|
||||
|
||||
## Dépannage
|
||||
|
||||
- **`password authentication failed for user "sbc_app"`** : le volume de la base
|
||||
a été initialisé avec un autre `APP_DB_PASSWORD`. Le service one-shot `db-sync`
|
||||
resynchronise automatiquement le mot de passe du rôle à chaque démarrage de la
|
||||
stack — redéployez simplement. Si le mot de passe **superuser** a lui aussi
|
||||
changé (`POSTGRES_PASSWORD`), remettez l'ancienne valeur ou supprimez le volume
|
||||
`db_data` pour repartir de zéro (les données de démo seront recréées).
|
||||
- **Port déjà utilisé** : changez `APP_PORT` ou `DB_PORT` dans les variables
|
||||
d'environnement.
|
||||
|
||||
### Pour la production
|
||||
|
||||
- Placez l'application derrière HTTPS (reverse-proxy TLS) et passez `COOKIE_SECURE=true`
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
#!/bin/sh
|
||||
# Runs at every stack start (db-sync service): keeps the sbc_app role's
|
||||
# password in sync with APP_DB_PASSWORD, even when the database volume was
|
||||
# initialized with a different value. Idempotent.
|
||||
set -eu
|
||||
|
||||
ESCAPED=$(printf %s "$APP_DB_PASSWORD" | sed "s/'/''/g")
|
||||
|
||||
psql -v ON_ERROR_STOP=1 <<EOSQL
|
||||
DO \$\$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'sbc_app') THEN
|
||||
CREATE ROLE sbc_app LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE;
|
||||
GRANT USAGE ON SCHEMA public TO sbc_app;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO sbc_app;
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO sbc_app;
|
||||
END IF;
|
||||
END
|
||||
\$\$;
|
||||
ALTER ROLE sbc_app WITH LOGIN PASSWORD '${ESCAPED}' NOSUPERUSER NOCREATEDB NOCREATEROLE;
|
||||
EOSQL
|
||||
|
||||
echo "sbc_app role synchronized."
|
||||
+21
-1
@@ -17,13 +17,31 @@ services:
|
||||
ports:
|
||||
# Loopback only: reachable from the host machine (psql, backups),
|
||||
# never from the network. Remove this mapping to close it entirely.
|
||||
- "127.0.0.1:${DB_PORT:-56432}:5432"
|
||||
- "127.0.0.1:${DB_PORT:-58412}:5432"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres -d sbc"]
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 12
|
||||
|
||||
# One-shot at every stack start: realigns the sbc_app role password with
|
||||
# APP_DB_PASSWORD, healing volumes initialized with an older value.
|
||||
db-sync:
|
||||
image: postgres:16-alpine
|
||||
restart: "no"
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
PGHOST: db
|
||||
PGUSER: postgres
|
||||
PGDATABASE: sbc
|
||||
PGPASSWORD: ${POSTGRES_PASSWORD:-sbc-pg-c7f3a91d284e6b05}
|
||||
APP_DB_PASSWORD: ${APP_DB_PASSWORD:-sbc-app-9e12d47ab8c3f605}
|
||||
volumes:
|
||||
- ./db/sync-app-role.sh:/sync-app-role.sh:ro
|
||||
entrypoint: ["/bin/sh", "/sync-app-role.sh"]
|
||||
|
||||
app:
|
||||
build: .
|
||||
restart: unless-stopped
|
||||
@@ -46,6 +64,8 @@ services:
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
db-sync:
|
||||
condition: service_completed_successfully
|
||||
read_only: true
|
||||
tmpfs:
|
||||
- /tmp
|
||||
|
||||
Reference in new issue
Block a user