Architecture de déploiement — Monorepo DDD_Module¶
Projet : gestionFichePaie — Session 20260515
Structure du monorepo¶
DDD_Module/
├── shared-kernel/ ← lib TypeScript partagée (CJS, dist/ committé dans git)
├── BackEnd/ ← Express 5 + Prisma + BullMQ
│ └── Dockerfile ← contexte racine (inclut shared-kernel)
├── FrontEnd/ ← React + Vite
│ └── Dockerfile ← contexte racine
├── scripts/
│ └── deploy.sh ← script de déploiement VPS (versionné dans git)
└── .github/workflows/
└── deploy.yml ← GitHub Actions → SSH → deploy.sh
Principe du build Docker (contexte racine)¶
Les deux Dockerfiles sont buildés depuis la racine du monorepo pour accéder à shared-kernel/.
# Depuis deploy.sh
docker build -t gestionfichepaie-backend:latest -f "$PROJECT_DIR/BackEnd/Dockerfile" "$PROJECT_DIR"
# ^^^^^^^^^^^^
# contexte = racine du monorepo
shared-kernel : dist/ committé, pas reconstruit dans Docker¶
Le shared-kernel/dist/ est committé dans git (.gitignore contient !dist/ dans shared-kernel/).
Pourquoi : éviter de rebuilder shared-kernel dans chaque Dockerfile (complexité, dépendances croisées). Le dist/ est source de vérité pour BackEnd et FrontEnd.
Conséquence : après toute modification de shared-kernel, rebuilder localement (npm run build dans shared-kernel/) et committer le dist/.
Réseaux Docker¶
| Réseau | Rôle |
|---|---|
shared_infra |
Postgres + Redis partagés entre tous les projets du VPS |
gestionfichepaie_default |
Communication interne backend ↔ frontend |
Le backend est connecté aux deux réseaux.
Ports¶
| Service | Port externe | Port interne |
|---|---|---|
| Backend | 3902 | 3000 |
| Frontend | 8902 | 80 |
deploy.sh — dans le repo, pas dans /opt/¶
scripts/deploy.sh est versionné dans git.
Le workflow GitHub Actions l'appelle après git pull :
su - kanmaber -c "git -C ~/projets/gestionFichePaie pull origin main"
bash /home/kanmaber/projets/gestionFichePaie/scripts/deploy.sh $TARGET
Avantage : toute modification de deploy.sh est déployée en même temps que le code, sans intervention manuelle sur le VPS.
Auto-discovery des routes en production¶
ConfigurationModulaire.ts adapte la découverte selon l'environnement :
modulesBasePath: process.env.NODE_ENV === 'production' ? 'dist' : 'src',
filePattern: process.env.NODE_ENV === 'production' ? '*.module.routes.js' : '*.module.routes.ts',
excludePatterns: [
'node_modules',
...(process.env.NODE_ENV !== 'production' ? ['dist'] : []), // exclure dist en dev
// ...
]
En production : cherche *.module.routes.js dans dist/.
En développement : cherche *.module.routes.ts dans src/.
Variables d'environnement backend requises¶
| Variable | Valeur type | Remarque |
|---|---|---|
NODE_ENV |
production |
active le mode prod |
CORS_ORIGIN |
* ou domaine |
obligatoire — bloque tout si absent |
DATABASE_URL |
postgresql://fichepaie_user:... |
user en minuscules (PostgreSQL normalize) |
REDIS_HOST |
shared-redis |
nom du container dans shared_infra |
REDIS_PORT |
6379 |
|
REDIS_URL |
redis://shared-redis:6379 |