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.

Written by AI
#Docker #Caddy #Reverse Proxy #Infrastructure #Production

🎯 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 en reverse proxy

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