Exemple : déploiement Docker Compose
Cette page illustre, à titre d'exemple, un déploiement on-premise de FoxPlan sur un serveur unique avec Docker Compose et Traefik comme reverse proxy (terminaison TLS et certificats Let's Encrypt automatiques).
Les fichiers exacts (docker-compose.yml, scripts, configuration Traefik) sont fournis avec le package de déploiement on-premise. Les extraits ci-dessous sont donnés pour comprendre le fonctionnement d'ensemble.
Architecture
Internet (DNS : DOMAIN → ce serveur)
│ 80 / 443
▼
┌────────┐ TLS Let's Encrypt (ACME)
│ Traefik│ redirection 80 → 443
└───┬────┘
┌─────────────────┼───────────────────────────┐
▼ ▼ ▼ ▼
/ (app:5000) /docs (docs:8080) /_maintenance (bascule)
product-server docs maintenance-toggle maintenance
│
├──► mongo (réseau interne)
└──► redis (réseau interne)
Deux variantes sont fournies :
docker-compose.yml— une instance de l'application ;docker-compose-scale.yml— plusieurs instances, dont Traefik répartit automatiquement la charge.
Prérequis
- Un serveur Linux avec Docker et Docker Compose v2 ;
- Un nom de domaine dont l'enregistrement DNS pointe vers le serveur ;
- Les ports 80 et 443 ouverts depuis Internet (obligatoire pour le challenge ACME) ;
- L'accès au registre d'images FoxPlan et votre licence.
Configuration
1. Préparation initiale
Un script prépare l'environnement (fichier .env, stockage des certificats, identifiants du panneau de maintenance) :
MAINT_USER=foxops MAINT_PASS='un_mot_de_passe_fort' ./setup-compose.sh
2. Variables d'infrastructure (.env)
| Variable | Description |
|---|---|
DOMAIN | Domaine public servi (ex. app.mon-entreprise.com) |
ACME_EMAIL | Email de contact Let's Encrypt |
APP_IMAGE | Image applicative à déployer (registre/tag) |
3. Secrets applicatifs
Trois fichiers de secrets sont créés depuis leurs modèles .example, puis renseignés :
cp .env_application.example .env_application # variables de l'app (BD, OAuth, S3, JWT…)
cp .env_mongo.example .env_mongo # identifiants MongoDB
cp .env_redis.example .env_redis # mot de passe Redis
Cohérences à respecter :
URL_MONGOutilise l'utilisateur/mot de passe de.env_mongo, avec l'hôtemongo;SPRING_REDIS_PASSWORDest identique àREDIS_PASSWORD;BASE_URLcorrespond àhttps://+DOMAIN.
Lancement
# Variante simple (1 instance)
docker compose up -d --build
# Variante scalée (plusieurs instances)
docker compose -f docker-compose-scale.yml up -d --build
docker compose -f docker-compose-scale.yml up -d --scale product-server=4
Au premier démarrage, Traefik obtient automatiquement le certificat auprès de Let's Encrypt. Vérification :
docker compose logs -f traefik # suivre l'obtention du certificat
curl -I https://VOTRE_DOMAINE/ # doit répondre 200 avec un certificat valide
curl -I https://VOTRE_DOMAINE/docs/
Mode maintenance
Le site peut basculer vers une page de maintenance (la documentation /docs reste accessible).
- Via le navigateur : se rendre sur
https://VOTRE_DOMAINE/_maintenance(protégé par mot de passe), puis Activer / Rétablir. - Via la ligne de commande :
./compose-maintenance.sh on # active la maintenance
./compose-maintenance.sh off # rétablit l'application
./compose-maintenance.sh status # état courant
La bascule est instantanée et ne redémarre aucun conteneur (rechargement à chaud de Traefik).
Certificats TLS (Let's Encrypt)
- Obtenus et renouvelés automatiquement par Traefik (challenge HTTP-01) ;
- Aucune action manuelle requise pour le renouvellement.
En cas de certificat non émis, vérifier dans l'ordre :
- Le domaine résout bien vers le serveur (
dig +short VOTRE_DOMAINE) ; - Les ports 80 et 443 sont ouverts depuis Internet ;
- Les logs :
docker compose logs traefik | grep -i acme.
Exploitation courante
docker compose ps # état des services
docker compose logs -f product-server # logs de l'application
docker compose pull product-server && docker compose up -d # mise à jour
docker compose down # arrêt (conserve les données)
Les données MongoDB et Redis sont conservées dans des volumes nommés, qui survivent aux arrêts/redémarrages.
Dépannage
| Symptôme | Piste |
|---|---|
404 sur / | DOMAIN incorrect, ou application non démarrée (voir logs) |
| 502 / 503 | L'application n'écoute pas encore, ou erreur au démarrage |
| Certificat invalide | DNS, ports 80/443, logs ACME (voir ci-dessus) |
/_maintenance en boucle d'authentification | Identifiants à régénérer via setup-compose.sh |
| Erreur d'authentification Redis | SPRING_REDIS_PASSWORD ≠ REDIS_PASSWORD |
| Échec d'authentification Mongo | URL_MONGO incohérent avec .env_mongo |
Pour la cible de production avec montée en charge et haute disponibilité, voir le format Kubernetes.