Aller au contenu principal

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).

remarque

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)

VariableDescription
DOMAINDomaine public servi (ex. app.mon-entreprise.com)
ACME_EMAILEmail de contact Let's Encrypt
APP_IMAGEImage 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_MONGO utilise l'utilisateur/mot de passe de .env_mongo, avec l'hôte mongo ;
  • SPRING_REDIS_PASSWORD est identique à REDIS_PASSWORD ;
  • BASE_URL correspond à 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 :

  1. Le domaine résout bien vers le serveur (dig +short VOTRE_DOMAINE) ;
  2. Les ports 80 et 443 sont ouverts depuis Internet ;
  3. 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ômePiste
404 sur /DOMAIN incorrect, ou application non démarrée (voir logs)
502 / 503L'application n'écoute pas encore, ou erreur au démarrage
Certificat invalideDNS, ports 80/443, logs ACME (voir ci-dessus)
/_maintenance en boucle d'authentificationIdentifiants à régénérer via setup-compose.sh
Erreur d'authentification RedisSPRING_REDIS_PASSWORDREDIS_PASSWORD
Échec d'authentification MongoURL_MONGO incohérent avec .env_mongo

Pour la cible de production avec montée en charge et haute disponibilité, voir le format Kubernetes.