|
@@ -25,6 +25,7 @@ rules:
|
|
|
| BDR-001 | 2026-05-15 | Static single-file site, no framework | accepted |
|
|
| BDR-001 | 2026-05-15 | Static single-file site, no framework | accepted |
|
|
|
| BDR-002 | 2026-05-15 | weasyprint pour PDF CV depuis HTML | accepted |
|
|
| BDR-002 | 2026-05-15 | weasyprint pour PDF CV depuis HTML | accepted |
|
|
|
| BDR-003 | 2026-05-15 | Position pro: CDI prioritaire, freelance parallèle | accepted |
|
|
| BDR-003 | 2026-05-15 | Position pro: CDI prioritaire, freelance parallèle | accepted |
|
|
|
|
|
+| BDR-004 | 2026-05-15 | Containerize site with nginx:alpine behind reverse proxy | accepted |
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
@@ -64,3 +65,17 @@ rules:
|
|
|
- **Décision**: Site annonce **CDI systèmes/embarqué prioritaire**, ZenQuality (freelance) en parallèle. Géo: full remote idéal, hybride 1-2 j/mois si Paris, mobilité Pays de la Loire.
|
|
- **Décision**: Site annonce **CDI systèmes/embarqué prioritaire**, ZenQuality (freelance) en parallèle. Géo: full remote idéal, hybride 1-2 j/mois si Paris, mobilité Pays de la Loire.
|
|
|
- **Pourquoi**: Recadrage user. Première version annonçait "Missions long terme & expertise" — pas représentatif. Hiérarchie CDI > freelance maintenant explicite (hero eyebrow + about para + callout + CV header).
|
|
- **Pourquoi**: Recadrage user. Première version annonçait "Missions long terme & expertise" — pas représentatif. Hiérarchie CDI > freelance maintenant explicite (hero eyebrow + about para + callout + CV header).
|
|
|
- **Référence**: `index.html` (hero-eyebrow, about-text para 3, about-callout) + `CV_Bastien_Chanot.html` (header).
|
|
- **Référence**: `index.html` (hero-eyebrow, about-text para 3, about-callout) + `CV_Bastien_Chanot.html` (header).
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## BDR-004 — Containerize site with nginx:alpine behind reverse proxy
|
|
|
|
|
+
|
|
|
|
|
+- **Date**: 2026-05-15
|
|
|
|
|
+- **Status**: accepted
|
|
|
|
|
+- **Decision**: Ship site as `bchanot-web` Docker container (`nginx:1.27-alpine`). Container listens on port 80 internally; host port configurable via `PORT` env (default 8080), bound to `127.0.0.1`. Host nginx terminates TLS + `proxy_pass` to container.
|
|
|
|
|
+- **Why**: VPS hosts multiple sites (`zenquality.fr`, `nuit-folle.zenquality.fr`, `bchanot.fr`). Container isolates static assets + nginx config, easier rollback, reproducible build. Loopback bind blocks direct external hits, forces traffic through host nginx (TLS, rate limit, logs).
|
|
|
|
|
+- **Hardening**: `read_only: true`, `cap_drop: ALL` + minimal `cap_add`, `no-new-privileges`, tmpfs for `/var/cache/nginx` + `/var/run` + `/tmp`. CSP allows inline CSS/JS (project convention) + Google Fonts. HSTS deliberately omitted at container level — set by outer proxy after TLS termination.
|
|
|
|
|
+- **Alternatives rejected**:
|
|
|
|
|
+ - Bare static files served by host nginx — no isolation, config drift between sites, harder rollback.
|
|
|
|
|
+ - Caddy / Traefik container — overkill for 1 static site, host nginx already handles TLS for other domains.
|
|
|
|
|
+- **Reference**: `Dockerfile`, `nginx.conf`, `docker-compose.yml`, `.env.example`.
|