Ce guide suit la documentation de la directive reverse_proxy et l'image Docker officielle de Caddy, relues le 14 octobre 2026 ; dernière version publiée à cette date : 2.11.7. La mise en place du certificat et les échecs de validation sont traités dans Un certificat SSL sur son VPS ; cet article s'attache au rôle de proxy devant plusieurs services.
Installer Caddy dans Docker
- Créez un réseau Docker partagé, que rejoindront Caddy et vos applications :
docker network create proxy - Créez un dossier
~/caddyet, dedans, un dossierconfqui contiendra leCaddyfile. - Créez
~/caddy/compose.yaml:
services:
caddy:
image: caddy:2.11
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./conf:/etc/caddy
- caddy_data:/data
- caddy_config:/config
networks:
- proxy
volumes:
caddy_data:
caddy_config:
networks:
proxy:
external: true
- Lancez-le :
docker compose up -d
Ce fichier reprend celui de Un certificat SSL sur son VPS, avec une différence : Caddy rejoint le réseau proxy au lieu de partager le fichier compose de l'application. Le volume caddy_data, qui garde les certificats, y est expliqué.
Servir plusieurs applications
Dans le fichier compose de chaque application, rattachez son service au réseau proxy et ne publiez pas de port :
services:
app:
image: votre-application:1.0
networks:
- proxy
networks:
proxy:
external: true
Puis décrivez chaque site dans ~/caddy/conf/Caddyfile, un bloc par nom de domaine :
app.votre-domaine.fr {
reverse_proxy app:3000
}
stats.votre-domaine.fr {
reverse_proxy plausible:8000
}
Caddy joint chaque application par le nom de son service sur le réseau partagé ; WordPress avec Docker en donne un exemple complet. Chaque nom doit pointer vers le serveur avant le premier lancement, faute de quoi Let's Encrypt refuse le certificat ; voir Pointer un nom de domaine vers son VPS.
Recharger sans couper
Après une modification du Caddyfile, vérifiez d'abord la syntaxe avec docker compose exec -w /etc/caddy caddy caddy validate, puis rechargez comme l'indique Un certificat SSL sur son VPS. Si la configuration est fausse, Caddy garde l'ancienne et affiche l'erreur. La documentation précise qu'un rechargement ferme les connexions WebSocket ouvertes ; l'option stream_close_delay les laisse vivre un moment, par exemple stream_close_delay 5m dans le bloc reverse_proxy.
Ce que Caddy fait sans réglage
- En-têtes du visiteur. Caddy pose
X-Forwarded-For,X-Forwarded-ProtoetX-Forwarded-Host, et ignore les valeurs envoyées par le visiteur pour empêcher l'usurpation. Votre application voit ainsi la vraie adresse et sait que la page a été demandée en HTTPS. - WebSocket. La connexion est montée en tunnel sans configuration, ce qu'attendent des outils comme Uptime Kuma.
- Redirection vers HTTPS. Le port 80 renvoie vers le 443.
Quelques réglages courants
Répartir la charge entre deux instances d'une application : reverse_proxy app1:3000 app2:3000. Le choix par défaut est aléatoire, lb_policy round_robin le rend tournant.
Ajouter ou retirer un en-tête envoyé à l'application : header_up X-Exemple "valeur" pour l'ajouter, header_up -X-Exemple pour le retirer, à l'intérieur du bloc reverse_proxy.
Garder un journal des accès d'un site : ajoutez une ligne log dans son bloc, puis lisez-le avec docker compose logs -f caddy.
Sur un VPS Hubspace
Le pare-feu réseau placé devant le serveur ouvre déjà 80 et 443 en TCP, ce qui suffit à Caddy et à Let's Encrypt. Le port UDP 443, utile au HTTP/3, est fermé à la livraison ; sans lui, les sites restent servis en HTTPS ordinaire. Les ports de vos applications, eux, restent fermés depuis Internet même s'ils étaient publiés : le reverse proxy est la voie prévue. Ce pare-feu en amont explique aussi l'absence d'UFW, détaillée dans UFW : le pare-feu d'Ubuntu. Docker et Compose sont installés, utilisables par le compte admin sans sudo.
Un seul programme peut écouter sur 80 et 443 : choisissez Caddy, Traefik ou Nginx Proxy Manager, pas deux à la fois. Le principe du reverse proxy est expliqué dans Qu'est-ce qu'un reverse proxy.
Questions fréquentes
Caddy ou Traefik ?
Caddy se règle dans un fichier lisible, un bloc par site. Traefik se règle par des étiquettes posées sur chaque conteneur et découvre seul les nouveaux services. Les deux obtiennent les certificats automatiquement ; le choix est affaire de goût et d'habitude.
Où sont stockés les certificats ?
Dans le volume caddy_data. Le supprimer oblige Caddy à redemander tous les certificats, et des demandes répétées peuvent buter sur les limites de Let's Encrypt.
Mon application affiche l'adresse de Caddy au lieu de celle du visiteur ?
L'application doit lire l'en-tête X-Forwarded-For et faire confiance au proxy. Cherchez dans sa documentation le réglage des proxys de confiance (« trusted proxies ») et indiquez-y le réseau Docker.
Articles liés
- Installer Docker sur Ubuntu ou Debian, pas à pasInstaller Docker Engine et Docker Compose sur Ubuntu 24.04, 26.04 ou Debian 13 depuis le dépôt officiel, l'utiliser sans sudo et vérifier que tout fonctionne.
- Docker Compose : décrire et lancer vos conteneursDocker Compose expliqué : écrire un fichier compose.yaml, lancer et arrêter vos services, lire les journaux et mettre à jour une application sur un serveur.
- Commandes Docker : les essentielles à connaîtreLes commandes Docker essentielles : lister les conteneurs, lire leurs journaux, entrer dans un conteneur, gérer les images et libérer de la place sans risque.