Deploiement

Docker Compose, Traefik, certificats SSL, backups et procedures de mise en production.

Docker Compose

Toute l'infrastructure est definie dans un seul docker-compose.yml. Chaque service a son propre Dockerfile quand necessaire.

# Demarrer tous les services
docker compose up -d

# Stopper tous les services
docker compose down

# Rebuild un service specifique
docker compose build <service>
docker compose up -d <service>

# Voir les logs
docker compose logs -f <service>

# Status des services
docker compose ps

Traefik & SSL

Traefik v2.11 sert de reverse proxy pour tous les services. Les certificats SSL sont generes automatiquement via Let's Encrypt (ACME TLS Challenge).

Routage

Chaque service declare ses routes via des labels Docker :

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.myapp.rule=Host(`myapp.d1dev.fr`)"
  - "traefik.http.routers.myapp.entrypoints=websecure"
  - "traefik.http.routers.myapp.tls.certresolver=myresolver"
  - "traefik.http.services.myapp.loadbalancer.server.port=80"
  - "traefik.docker.network=d1dev_web"

Middlewares disponibles

MiddlewareRole
authBasic Auth (Traefik dashboard, Solr, Metabase)
*-force-httpsRedirection HTTP → HTTPS
*-stripprefixStrip prefix pour sous-chemins (Dozzle, Glances, Git)
docuseal-headersHeaders securite (HSTS, CSP, XSS filter)
docuseal-ratelimitRate limiting (100 req/s, burst 200)

Health Checks

Les services critiques ont des health checks Docker integres :

# Verifier tous les health checks
docker compose ps

# Tester manuellement
curl -s https://drupal.d1dev.fr/healthz
curl -s https://api.d1dev.fr/healthz
curl -s https://kanban.d1dev.fr/healthz
curl -s https://prestadmin.d1dev.fr/healthz
curl -s https://api-gpa.d1dev.fr/healthz
ServiceEndpointMethode
Drupal/healthzcurl HTTP
Symfony API/healthzcurl HTTP
Kanban/healthzcurl HTTP
PrestaAdmin/healthzcurl HTTP
API GPA/healthzcurl HTTP
DocuSeal/wget (port 3000)
Tika/versionTCP check

Magic Links (Auto-login)

# Symfony API
docker compose exec symfony-api bin/console app:login-token email@test.fr --ttl=600 --redirect=/admin

# API GPA
docker compose exec api-gpa php bin/console app:login-token email@test.fr --ttl=600 --redirect=/admin
Les magic links expirent apres 10 minutes et sont a usage unique. La reponse est un HTML 200 avec redirect JS (pas de 302 qui perd le cookie session).

Backups

Dump local (scripts/dump.sh)

./scripts/dump.sh all          # Dump complet (MariaDB + PostgreSQL + Solr + Redis)
./scripts/dump.sh mariadb      # MariaDB (drupal_db, symfony_api, kanban_db, prestadmin_db, api_gpa_db)
./scripts/dump.sh postgres     # PostgreSQL (n8n_db, metabase_db, docuseal_db)
./scripts/dump.sh solr         # Export JSON Solr
./scripts/dump.sh redis        # Snapshot Redis RDB
./scripts/dump.sh list         # Lister les backups
./scripts/dump.sh rotate       # Garder les 5 derniers

Backup distant FTP (scripts/backup-remote.sh)

Rotation GFS (Grandfather-Father-Son) sur FTP dedie (100 Go) :

./scripts/backup-remote.sh backup    # Dump + upload FTP
./scripts/backup-remote.sh list      # Lister backups distants
./scripts/backup-remote.sh status    # Statut global
./scripts/backup-remote.sh test      # Tester connexion FTP

Cron

PlanningCommandeDescription
0 3 * * 0scripts/nutch-crawl.sh 3Crawl hebdo Nutch (dimanche 3h)
0 4 * * *scripts/backup-remote.sh backupBackup FTP quotidien (GFS)
0 * * * *scripts/generate-git-dashboard.shRegeneration git dashboard

Checklist : ajouter un nouveau service

  1. Creer le Dockerfile.<service>
  2. Creer le fichier nginx-<service>.conf si nginx
  3. Ajouter le service dans docker-compose.yml avec labels Traefik + Flame
  4. Ajouter la variable <SERVICE>_HOST dans .env
  5. Configurer les reseaux (web pour Traefik, default si BDD)
  6. Ajouter un health check si service critique
  7. Si nouvelle BDD : creer le script init dans init-mariadb/ ou init-db/
  8. Si cookie session Symfony : configurer framework.session.name unique
  9. Mettre a jour CLAUDE.md et la documentation
  10. docker compose build <service> && docker compose up -d <service>
  11. Verifier dans Flame dashboard (all.d1dev.fr)

Conventions cookies de session

Toutes les apps Symfony partagent *.d1dev.fr. Chaque app DOIT avoir un nom de cookie unique pour eviter les conflits.
AppCookie
KanbanKANBAN_SESSID
Symfony APISYMAPI_SESSID
PrestaAdminPRESTADMIN_SESSID
API GPAAPIGPA_SESSID