📚 Cet article s’intègre dans notre parcours self-hosting Afrique de l’Ouest. Pour la stratégie complète (Coolify, Hetzner, Docker, sauvegarde, sécurité), voir le guide pilier self-hosting 2026.
Docker Compose en production demande quelques précautions au-delà du dev. Voici les patterns clés en 2026.
Voir notre guide Docker complet.
Structure recommandée
# compose.yml (production)
services:
web:
image: registry.exemple.sn/myapp:latest
restart: unless-stopped
deploy:
resources:
limits:
memory: 512M
cpus: "0.5"
environment:
DATABASE_URL: ${DATABASE_URL}
networks:
- internal
- traefik-public
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
labels:
- traefik.enable=true
- traefik.http.routers.web.rule=Host(`exemple.sn`)
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- internal
volumes:
db-data:
networks:
internal:
traefik-public:
external: true
secrets:
db_password:
file: ./secrets/db_password.txt
Override par environnement
compose.yml # base
compose.dev.yml # overrides pour dev (ports exposés, volumes bind)
compose.prod.yml # overrides pour prod (replicas, limits)
# Lancer
docker compose -f compose.yml -f compose.prod.yml up -d
Secrets en production
- JAMAIS de credentials dans le YAML committé
- Utiliser
secretsDocker (fichiers montés en /run/secrets) - Ou variables d’env via
.envfile (gitignored) - Ou Docker Swarm secrets pour multi-host
Updates zero-downtime
# Pull la nouvelle image
docker compose pull web
# Recréer le service avec rolling update (Swarm)
docker service update --image registry/myapp:v2 web
# Sur compose simple : restart
docker compose up -d --no-deps web
Backup base de données
# Cron quotidien
docker exec compose-db-1 pg_dump -U app app | gzip > /backups/db-$(date +%F).sql.gz
Logs centralisés
services:
web:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Pour observabilité avancée, brancher Loki ou Promtail (voir guide Grafana Loki).