Éviter les collisions DNS sur le réseau partagé + ne plus crasher sur erreur DB

- Renomme les services (db/backend/frontend -> presencia-db/
  presencia-backend/presencia-frontend) : sur le réseau externe partagé
  nginx_default, un nom générique comme "db" peut entrer en collision
  avec un service du même nom dans une autre stack, et Docker résout
  alors le nom en round-robin vers le mauvais container. Confirmé en
  prod : le bootstrap réussissait puis une requête suivante échouait
  avec une erreur d'authentification alors que le mot de passe était
  correct.
- nginx résout maintenant le backend dynamiquement (resolver + variable)
  au lieu de résoudre une seule fois au démarrage, pour survivre à une
  recréation du container backend.
- Ajoute express-async-errors : une erreur dans une route async (ex. la
  requête pg qui échoue) était une rejection non gérée et faisait
  planter tout le process Node au lieu de renvoyer une 500 propre.
  Testé en local : avant le fix, une erreur d'auth pg tuait le process ;
  après le fix, il répond 500 et reste opérationnel.
This commit is contained in:
Claude committed 2026-07-06 09:26:28 +00:00
1 parent 2170489424
commit 0c438275b5
5 files changed
+25 -7

No files matched your search

+10
View File
@@ -14,6 +14,7 @@
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"exceljs": "^4.4.0", "exceljs": "^4.4.0",
"express": "^4.19.2", "express": "^4.19.2",
"express-async-errors": "^3.1.1",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"pdfkit": "^0.15.0", "pdfkit": "^0.15.0",
"pg": "^8.12.0" "pg": "^8.12.0"
@@ -915,6 +916,15 @@
"url": "https://opencollective.com/express" "url": "https://opencollective.com/express"
} }
}, },
"node_modules/express-async-errors": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/express-async-errors/-/express-async-errors-3.1.1.tgz",
"integrity": "sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng==",
"license": "ISC",
"peerDependencies": {
"express": "^4.16.2"
}
},
"node_modules/fast-csv": { "node_modules/fast-csv": {
"version": "4.3.6", "version": "4.3.6",
"resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz",
+1
View File
@@ -14,6 +14,7 @@
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"exceljs": "^4.4.0", "exceljs": "^4.4.0",
"express": "^4.19.2", "express": "^4.19.2",
"express-async-errors": "^3.1.1",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"pdfkit": "^0.15.0", "pdfkit": "^0.15.0",
"pg": "^8.12.0" "pg": "^8.12.0"
+1
View File
@@ -1,5 +1,6 @@
require('dotenv').config(); require('dotenv').config();
const express = require('express'); const express = require('express');
require('express-async-errors');
const cookieParser = require('cookie-parser'); const cookieParser = require('cookie-parser');
const cors = require('cors'); const cors = require('cors');
+6 -6
View File
@@ -1,5 +1,5 @@
services: services:
db: presencia-db:
image: postgres:16-alpine image: postgres:16-alpine
restart: unless-stopped restart: unless-stopped
environment: environment:
@@ -16,15 +16,15 @@ services:
timeout: 5s timeout: 5s
retries: 10 retries: 10
backend: presencia-backend:
build: ./backend build: ./backend
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
db: presencia-db:
condition: service_healthy condition: service_healthy
environment: environment:
PORT: 4790 PORT: 4790
PGHOST: db PGHOST: presencia-db
PGPORT: 5432 PGPORT: 5432
PGUSER: presencia PGUSER: presencia
PGPASSWORD: R4dsITu0vuigNQQwNlvj0agVyHupSyX PGPASSWORD: R4dsITu0vuigNQQwNlvj0agVyHupSyX
@@ -37,11 +37,11 @@ services:
ports: ports:
- "4790:4790" - "4790:4790"
frontend: presencia-frontend:
build: ./frontend build: ./frontend
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- backend - presencia-backend
ports: ports:
- "8781:80" - "8781:80"
+7 -1
View File
@@ -5,8 +5,14 @@ server {
root /usr/share/nginx/html; root /usr/share/nginx/html;
index index.html; index index.html;
# Resolve the backend hostname at request time (via Docker's embedded DNS)
# instead of once at startup, so a recreated backend container is picked
# up without needing to restart/reload this nginx.
resolver 127.0.0.11 valid=30s;
location /api/ { location /api/ {
proxy_pass http://backend:4790/api/; set $backend_upstream http://presencia-backend:4790;
proxy_pass $backend_upstream/api/;
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;