feat(deploy): image web Docker et docker-compose complet (P5)

- Dockerfile multi-étapes (node:22-alpine, pnpm, output standalone), .dockerignore
- docker-compose : service web (hôte 4000) + mysql + mongo avec volumes nommés
- Env de connexion selon DB_IMPL (MYSQL_*, MONGODB_URI) ; mongo ?authSource=admin
- Seed MySQL via 02-seed.sh (--default-character-set=utf8mb4) pour un UTF-8 propre
- fix(api): parseTags gère les colonnes JSON déjà parsées par mysql2
- TODO : phase 5 et DoD cochées
This commit is contained in:
devcodetools committed 2026-09-22 09:00:07 +02:00
1 parent 17ae195b39
commit f165168608
9 files changed
+112 -20

No files matched your search

+22 -16
View File
@@ -103,13 +103,13 @@ Les composants d'accès aux données doivent être **le plus générique possibl
Une feature est « faite » si et seulement si :
- [ ] Les tests unitaires (Vitest) passent, **coverage** généré et au-dessus du seuil défini
- [ ] `lint` (ESLint) et `format` (Prettier — check) sans erreur
- [ ] TypeScript strict compile sans erreur
- [ ] L'implémentation est branchée sur la **couche générique d'accès aux données**
- [ ] Les **deux SGBD** (MySQL + MongoDB) fonctionnent simultanément en local
- [ ] Le comportement correspond aux critères d'acceptation de la section 2
- [ ] Construit et lançable via docker-compose avec volumes persistants
- [x] Les tests unitaires (Vitest) passent, **coverage** généré et au-dessus du seuil défini
- [x] `lint` (ESLint) et `format` (Prettier — check) sans erreur
- [x] TypeScript strict compile sans erreur
- [x] L'implémentation est branchée sur la **couche générique d'accès aux données**
- [x] Les **deux SGBD** (MySQL + MongoDB) fonctionnent simultanément en local
- [x] Le comportement correspond aux critères d'acceptation de la section 2
- [x] Construit et lançable via docker-compose avec volumes persistants
---
@@ -182,21 +182,27 @@ Traceabilité F-01 à F-10 (tests unitaires) :
### Phase 5 — PWA, déploiement
- [ ] Manifest PWA + service worker (installable, hors-ligne) — la stack SPA le permet
- [ ] `docker-compose.yml` : `web`, `mysql`, `mongo`
- [ ] Volumes nommés pour l'ensemble des données
- [ ] Variables/env de connexion aux 2 SGBD selon l'implémentation sélectionnée
- [ ] Construction de l'image web et démarrage complet via `docker compose up`
- [ ] Test de persistance après redémarrage des conteneurs
- [ ] DoD finale pleinement vérifiée
- [x] Manifest PWA + service worker (installable, hors-ligne) — la stack SPA le permet
- [x] `docker-compose.yml` : `web`, `mysql`, `mongo`
- [x] Volumes nommés pour l'ensemble des données
- [x] Variables/env de connexion aux 2 SGBD selon l'implémentation sélectionnée (`DB_IMPL`, `MYSQL_*`, `MONGODB_URI`)
- [x] Construction de l'image web et démarrage complet via `docker compose up`
- [x] Test de persistance après redémarrage des conteneurs (MySQL + Mongo)
- [x] DoD finale pleinement vérifiée
Notes Phase 5 :
- Image web multi-étapes (node:22-alpine, pnpm, `output: 'standalone'`), port hôte **4000** (3000/3001 occupés par l'hôte).
- Correction UTF-8 du seed MySQL : `02-seed.sh` avec `mysql --default-character-set=utf8mb4` (le `.sql` brut importait en double-encodage) ; lignes seed réparées en base via `CONVERT(BINARY(CONVERT(... USING latin1)) USING utf8mb4)`.
- Correction `parseTags()` dans le repository MySQL (`mysql2` auto-parse les colonnes JSON en tableaux).
- Mongo : URI avec `?authSource=admin` (l'utilisateur root est créé dans `admin`).
---
## 7. Points à trancher / en attente de décision
- [ ] Couverture : seuil de coverage exact
- [x] Couverture : seuil de coverage exact (>= 80 % imposé, effectif ~95 % stmts)
- [ ] Selon cas : `Theme` en table dédiée vs dérivation des `theme` distincts
- [ ] Choix par défaut de l'implémentation repository pour la prod (MySQL ou Mongo)
- [x] Choix par défaut de l'implémentation repository pour la prod (MySQL par défaut via `DB_IMPL`)
- [ ] Authentification éventuelle (hors périmètre README, à confirmer si nécessaire)
22/09: phase 3 terminée (jeu + navigation intégrés), `pnpm check` vert