Caddy en frontal : un reverse proxy unique pour nos apps
Comment nous avons mis en place un Caddy central dans notre projet infra pour rediriger vers les Caddy embarqués dans chaque application.
🎯 Objectif
En production, nous avons choisi d’utiliser un Caddy central, dans un projet séparé appelé infra, pour servir de reverse proxy vers les Caddy internes de chaque application.
Cela permet de :
- Centraliser la configuration réseau publique (certificats SSL, redirections, etc.)
- Déléguer à chaque app son propre Caddy interne pour la gestion statique et PHP
- Simplifier la mise en place de nouvelles apps
🏗 Architecture
L’architecture globale ressemble à ceci :

- Caddy (infra) : écoute sur le port 80/443, gère TLS et redirige vers les autres conteneurs.
- Caddy interne (app) : écoute sur un port interne (ex:
8080), sert les fichiers statiques et interprète PHP. - Application : s’appuie sur son propre environnement (Symfony, Laravel, etc.).
⚙️ Configuration du Caddy (infra)
Dans le projet infra, nous utilisons lucaslorentz/caddy-docker-proxy pour que Caddy détecte automatiquement les services exposés par Docker grâce aux labels.
Exemple de docker-compose.yml (infra)
services:
caddy:
image: lucaslorentz/caddy-docker-proxy:2.8-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
📦 Labels côté application
Chaque application définit dans son docker-compose.prod.yml les labels Caddy pour être automatiquement routée par le Caddy frontal.
Exemple pour blog :
services:
blog:
image: ghcr.io/<usr>/<blog_project>:main
labels:
caddy: blog.mondomaine.com
caddy.reverse_proxy: "{{upstreams 8080}}"
Ici :
- caddy → définit le domaine public
- caddy.reverse_proxy → envoie le trafic vers le port interne où écoute le Caddy interne de l’app (8080).
🔒 Avantages de cette approche
- Isolation : chaque app conserve son Caddy interne et ses optimisations
- Flexibilité : on peut remplacer facilement une app sans toucher au reverse proxy central
- Certificats centralisés : le Caddy frontal gère le HTTPS pour tout le monde
- Zero-config routing : grâce aux labels Docker
🚀 Conclusion
Mettre un Caddy central en frontal via infra permet de simplifier la gestion réseau en production tout en laissant aux applications leur indépendance technique. Cette approche est particulièrement efficace dans un environnement multi-app Docker avec des déploiements fréquents.