---
name: project-docker-deployment
description: "Architecture de déploiement Docker (Traefik, nginx, volumes, icônes seed, DATA_DIR) — pièges et corrections appliquées"
metadata: 
  node_type: memory
  type: project
  originSessionId: 8f54f673-57ca-4a21-b205-0857456e2ed0
---

Déploiement Docker sur `crowdlending.croguennec.net` — corrections appliquées en session 2026-06-13.

**Stack :** Traefik (reverse proxy) → crowdlending-frontend (nginx) → crowdlending-backend (Node/Express). Volumes montés sur `~/volumes/crowdlending/data` et `~/volumes/crowdlending/uploads`.

**Pièges résolus :**

1. **Nom du container nginx** : dans `frontend/nginx.conf`, l'upstream doit être `crowdlending-backend` (nom du container Docker), pas `backend`.

2. **Traefik middleware provider** : les middlewares de fichier doivent s'écrire `ipwhitelist-all@file`, pas `ipwhitelist-all@docker`.

3. **`express.static` + `fallthrough`** : sans `{ fallthrough: false }`, un logo manquant appelle `next()` qui tombe sur `app.use('/api', requireAuth)` → 401. Toujours ajouter `fallthrough: false` sur les middlewares statiques publics (logos, icons-files).

4. **Chemin `DATA_DIR`** : les chemins relatifs depuis `__dirname` diffèrent entre dev Windows (`backend/src/routes` → 3 niveaux → projet root/data) et Docker (`/app/src/routes` → 3 niveaux → `/data`). Solution : variable d'env `DATA_DIR=/app/data` dans `docker-compose.yml` ; fallback `../../../data` pour dev. Utilisé dans `referentiel.js` et `server.js`.

5. **Volume masque les fichiers seed** : monter un volume sur `/app/data` masque les fichiers copiés dans l'image. Solution : dossier `backend/icons_seed/` + `docker-entrypoint.sh` qui copie les fichiers manquants dans `/app/data/icons/` au démarrage (copie idempotente, ne remplace pas l'existant).

6. **Sauvegarde DB** : `sqlite3` n'est pas installé dans le container. Utiliser `docker cp $CONTAINER:/app/data/crowdlending.db $BACKUP_PATH` dans `deploy.sh`.

7. **deploy.sh** : `git pull --ff-only` échoue si les branches ont divergé. Utiliser `git pull origin main`.

**How to apply :** Avant tout déploiement depuis zéro, vérifier que `DATA_DIR` est dans `docker-compose.yml`, que `icons_seed/` est peuplé avec les 16 icônes, et que `docker-entrypoint.sh` est exécutable dans le Dockerfile.
