Guide Caddy Reverse Proxy 2026 : HTTPS Automatique Simplifié
Configurez Caddy comme reverse proxy avec HTTPS automatique, SSL sans configuration et une syntaxe Caddyfile simple. Guide complet de déploiement VPS.
Guide Caddy Reverse Proxy : HTTPS Automatique Simplifié
Caddy est le serveur web qui active HTTPS par défaut. Pas de certbot, pas de tâches cron, pas de scripts de renouvellement. Pointez un domaine vers Caddy et il obtient un certificat automatiquement.
Qu’est-ce que Caddy ?
Caddy se place entre Internet et vos services :
Internet → Caddy → Service A (app.domain.com)
→ Service B (api.domain.com)
→ Service C (admin.domain.com)
Pourquoi les développeurs adorent Caddy :
- HTTPS automatique — Certificats SSL sans aucune configuration
- Configuration simple — Le Caddyfile est lisible par un humain
- HTTP/2 et HTTP/3 — Activés par défaut
- Binaire unique — Aucune dépendance
- Piloté par API — Modifiez la configuration sans redémarrage
Caddy vs Nginx vs Traefik
| Fonctionnalité | Caddy | Nginx | Traefik |
|---|---|---|---|
| HTTPS auto | Par défaut | Certbot nécessaire | Intégré |
| Syntaxe de config | Simple | Modérée | Complexe |
| Intégration Docker | Bonne | Manuelle | Native |
| Performance | Excellente | Excellente | Excellente |
| Plugins | Modules Go | Modules C | Middleware |
| Rechargement config | Zéro interruption | Nécessite un signal | Rechargement à chaud |
| Courbe d’apprentissage | Faible | Modérée | Plus élevée |
Caddy l’emporte sur la simplicité. Si vous voulez la configuration de reverse proxy la plus facile, c’est celle-ci. Consultez notre guide Traefik Docker pour le routage natif des conteneurs.
Prérequis VPS
Caddy est extrêmement léger :
- 1 vCPU
- 256 Mo de RAM (pour Caddy lui-même)
- Ports 80, 443
- Un nom de domaine pointant vers votre VPS
Le dimensionnement de votre VPS dépend de vos services backend, pas de Caddy. Consultez notre guide meilleur VPS pour Docker pour des recommandations de dimensionnement.
Installer Caddy
Option 1 : Gestionnaire de paquets (Debian/Ubuntu)
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
Option 2 : Docker
# docker-compose.yml
services:
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- 80:80
- 443:443
- 443:443/udp # HTTP/3
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
Option 3 : Binaire unique
curl -sS https://webi.sh/caddy | sh
Reverse Proxy Basique
Le Caddyfile le plus simple
app.domain.com {
reverse_proxy localhost:3000
}
C’est tout. Caddy va :
- Écouter sur les ports 80 et 443
- Obtenir un certificat SSL auprès de Let’s Encrypt
- Rediriger HTTP vers HTTPS
- Proxifier le trafic vers votre application sur le port 3000
Plusieurs services
app.domain.com {
reverse_proxy localhost:3000
}
api.domain.com {
reverse_proxy localhost:8080
}
admin.domain.com {
reverse_proxy localhost:9000
}
Chaque domaine obtient automatiquement son propre certificat.
Configuration du Reverse Proxy Docker
Étape 1 : Créer le répertoire du projet
mkdir -p /opt/caddy
cd /opt/caddy
Étape 2 : Docker Compose
# docker-compose.yml
services:
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- 80:80
- 443:443
- 443:443/udp
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
networks:
- caddy
whoami:
image: traefik/whoami
container_name: whoami
networks:
- caddy
networks:
caddy:
name: caddy
volumes:
caddy_data:
caddy_config:
Étape 3 : Caddyfile
test.domain.com {
reverse_proxy whoami:80
}
Étape 4 : Lancement
docker compose up -d
Visitez https://test.domain.com — ça fonctionne avec HTTPS complet.
Ajouter d’autres services Docker
Tout service sur le réseau caddy peut être proxifié :
# separate docker-compose.yml
services:
myapp:
image: myapp:latest
container_name: myapp
networks:
- caddy
networks:
caddy:
external: true
Puis ajoutez dans votre Caddyfile :
myapp.domain.com {
reverse_proxy myapp:8080
}
Rechargez Caddy :
docker exec caddy caddy reload --config /etc/caddy/Caddyfile
Routage par chemin
Router par chemin
domain.com {
handle /api/* {
reverse_proxy localhost:8080
}
handle /admin/* {
reverse_proxy localhost:9000
}
handle {
reverse_proxy localhost:3000
}
}
Supprimer le préfixe de chemin
domain.com {
handle_path /api/* {
reverse_proxy localhost:8080
}
}
handle_path supprime le préfixe correspondant. /api/users devient /users pour le backend.
Répartition de charge
Round Robin (par défaut)
app.domain.com {
reverse_proxy app1:3000 app2:3000 app3:3000
}
Avec vérifications de santé
app.domain.com {
reverse_proxy app1:3000 app2:3000 {
health_uri /health
health_interval 10s
health_timeout 5s
}
}
Sessions persistantes
app.domain.com {
reverse_proxy app1:3000 app2:3000 {
lb_policy cookie
}
}
Moins de connexions
app.domain.com {
reverse_proxy app1:3000 app2:3000 {
lb_policy least_conn
}
}
Sécurité
Authentification basique
# Générer le hash du mot de passe
caddy hash-password --plaintext 'your-secure-password'
admin.domain.com {
basicauth {
admin $2a$14$Zkx19...hashed...password
}
reverse_proxy localhost:9000
}
Liste blanche d’IP
admin.domain.com {
@blocked not remote_ip 192.168.1.0/24 10.0.0.0/8
respond @blocked 403
reverse_proxy localhost:9000
}
Limitation de débit
api.domain.com {
rate_limit {
zone dynamic {
key {remote_host}
events 100
window 1m
}
}
reverse_proxy localhost:8080
}
En-têtes de sécurité
domain.com {
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "strict-origin-when-cross-origin"
-Server
}
reverse_proxy localhost:3000
}
La directive -Server supprime l’en-tête Server des réponses.
Certificats wildcard
Pour *.domain.com, utilisez le challenge DNS :
*.domain.com {
tls {
dns cloudflare {env.CF_API_TOKEN}
}
@app host app.domain.com
handle @app {
reverse_proxy localhost:3000
}
@api host api.domain.com
handle @api {
reverse_proxy localhost:8080
}
}
Compilez Caddy avec le module DNS Cloudflare :
xcaddy build --with github.com/caddy-dns/cloudflare
Ou utilisez l’image Docker avec les modules :
services:
caddy:
image: caddy:2-builder AS builder
# Use multi-stage or pre-built custom image
Fichiers statiques + API
SPA avec backend API
domain.com {
handle /api/* {
reverse_proxy localhost:8080
}
handle {
root * /srv/frontend
try_files {path} /index.html
file_server
}
}
Servir du statique + Proxy
domain.com {
root * /var/www/html
file_server
handle /app/* {
reverse_proxy localhost:3000
}
}
Support WebSocket
Caddy proxifie automatiquement les connexions WebSocket :
ws.domain.com {
reverse_proxy localhost:8080
}
Aucune configuration supplémentaire nécessaire. Caddy détecte l’en-tête Upgrade et le gère automatiquement.
Journalisation
Journaux d’accès
domain.com {
log {
output file /var/log/caddy/access.log {
roll_size 100mb
roll_keep 5
}
format json
}
reverse_proxy localhost:3000
}
Journalisation par site
app.domain.com {
log {
output file /var/log/caddy/app.log
}
reverse_proxy localhost:3000
}
api.domain.com {
log {
output file /var/log/caddy/api.log
}
reverse_proxy localhost:8080
}
Compression
domain.com {
encode gzip zstd
reverse_proxy localhost:3000
}
Caddy supporte nativement la compression gzip et Zstandard.
En-têtes CORS
api.domain.com {
header Access-Control-Allow-Origin "https://app.domain.com"
header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
header Access-Control-Allow-Headers "Content-Type, Authorization"
@options method OPTIONS
respond @options 204
reverse_proxy localhost:8080
}
Redirections
WWW vers domaine racine
www.domain.com {
redir https://domain.com{uri} permanent
}
domain.com {
reverse_proxy localhost:3000
}
HTTP vers HTTPS
Caddy le fait automatiquement. Aucune configuration nécessaire.
Redirections personnalisées
domain.com {
redir /old-page /new-page permanent
redir /blog/* /articles/{re.1} permanent
reverse_proxy localhost:3000
}
Mise en cache
domain.com {
header /static/* Cache-Control "public, max-age=31536000, immutable"
header /api/* Cache-Control "no-cache"
reverse_proxy localhost:3000
}
Configuration via API
Caddy dispose d’une API REST complète pour les modifications de configuration :
# Get current config
curl localhost:2019/config/
# Update a route
curl localhost:2019/config/apps/http/servers/srv0/routes/0 \
-X PUT \
-H "Content-Type: application/json" \
-d '{"handle": [{"handler": "reverse_proxy", "upstreams": [{"dial": "localhost:3001"}]}]}'
# Reload from Caddyfile
caddy reload --config /etc/caddy/Caddyfile
Dépannage
Certificat non émis
- Vérifiez que le DNS pointe vers votre VPS :
dig +short domain.com
- Assurez-vous que les ports 80 et 443 sont ouverts :
sudo ufw allow 80,443/tcp
- Consultez les journaux de Caddy :
journalctl -u caddy --no-pager -n 50
# Or for Docker:
docker logs caddy
502 Bad Gateway
- Vérifiez que le backend fonctionne :
curl localhost:3000
-
Vérifiez l’adresse upstream dans le Caddyfile
-
Pour Docker : assurez-vous que les deux conteneurs sont sur le même réseau
Erreur de syntaxe de configuration
caddy validate --config /etc/caddy/Caddyfile
Performances lentes
- Activez la compression :
encode gzip zstd
-
Vérifiez les temps de réponse du backend
-
Ajoutez des délais d’expiration de connexion :
reverse_proxy localhost:3000 {
transport http {
dial_timeout 5s
response_header_timeout 10s
}
}
Checklist de production
- Enregistrements DNS pointant vers le VPS
- Pare-feu autorisant les ports 80, 443
- Caddyfile validé (
caddy validate) - Journaux d’accès activés
- En-têtes de sécurité configurés
- Vérifications de santé du backend mises en place
- Compression activée
- Sauvegarde du répertoire
/data(certificats)
Meilleur VPS pour Caddy
Caddy fonctionne partout. Choisissez votre VPS en fonction de vos besoins backend :
| Fournisseur | Offre | Prix | Idéal pour |
|---|---|---|---|
| Hostinger | KVM1 | 4,99 $ | Meilleur rapport qualité-prix pour débuter |
| Hetzner | CX22 | 5,49 € | Projets basés en Europe |
| DigitalOcean | Basic | 6 $ | Convivial pour les développeurs |
| Vultr | VC2 | 6 $ | Emplacements edge mondiaux |
Hostinger offre le meilleur rapport qualité-prix si vous débutez. Leur offre KVM1 gère confortablement Caddy ainsi que plusieurs services backend.
FAQ
Caddy est-il prêt pour la production ?
Absolument. Caddy v2 fait tourner des milliers de sites en production. Il est utilisé par des entreprises de toutes tailles.
Caddy vs Nginx pour le reverse proxy ?
Caddy pour la simplicité et le HTTPS automatique. Nginx pour un contrôle maximal et les configurations historiques. Pour la plupart des nouveaux déploiements, Caddy vous fait gagner des heures de configuration.
Comment fonctionne le HTTPS automatique ?
Caddy utilise le protocole ACME pour obtenir des certificats auprès de Let’s Encrypt (ou ZeroSSL). Il gère automatiquement l’émission, le renouvellement et l’agrafage OCSP.
Caddy peut-il remplacer Apache ?
Oui. Caddy gère tout ce qu’Apache fait pour les déploiements web modernes, avec une fraction de la configuration.
Caddy supporte-t-il HTTP/3 ?
Oui, HTTP/3 (QUIC) est activé par défaut sur le port HTTPS.
Comment mettre à jour Caddy ?
Gestionnaire de paquets : apt upgrade caddy. Docker : récupérez la nouvelle image. Binaire : téléchargez et remplacez.
Résumé
Caddy simplifie le reverse proxy :
| Tâche | Nginx | Caddy |
|---|---|---|
| Obtenir SSL | Installer certbot, configurer | Automatique |
| Ajouter un service | Modifier la config, tester, recharger | Ajouter 3 lignes, recharger |
| Rediriger HTTP→HTTPS | Ajouter un bloc serveur | Automatique |
| Activer HTTP/2 | Configurer | Automatique |
| Syntaxe de config | Complexe | Lisible par un humain |
Trois lignes dans un Caddyfile remplacent des dizaines dans une configuration Nginx. Pour les nouveaux projets, Caddy est le chemin le plus rapide vers un reverse proxy sécurisé et prêt pour la production. Associez-le à Docker Compose pour un workflow de déploiement complet, ou consultez notre guide de sécurisation VPS pour verrouiller le reste de votre serveur.
Ready to get started?
Get the best VPS hosting deal today. Hostinger offers 4GB RAM VPS starting at just $4.99/mo.
Get Hostinger VPS — $4.99/mo// up to 75% off + free domain included
// related topics
// related guides
$1 VPS Hosting 2026: Cheapest VPS Servers Starting at $1/Month
Looking for $1 VPS hosting? Compare the cheapest VPS providers starting from $1-3/month. Real specs, no hidden fees, honest reviews of budget VPS options.
tutorialCloudflare Tunnel VPS Guide 2026: Expose Services Without Opening Ports
Set up Cloudflare Tunnel on your VPS to expose web apps securely without opening ports or revealing your server IP. Complete guide with Docker and DNS config.
tutorialCoolify VPS Setup Guide 2026: Self-Hosted Vercel Alternative
Deploy Coolify on your VPS for a self-hosted Vercel/Netlify experience. Complete setup guide with Docker, SSL, and app deployments.
tutorialVPS with Crypto & No KYC — 7 Providers That Accept Bitcoin
Pay for VPS hosting with Bitcoin, Monero, or ETH — no ID required. We list 7 privacy-first providers with anonymous signup. Updated March 2026.
Andrius Putna
I am Andrius Putna. Geek. Since early 2000 in love tinkering with web technologies. Now AI. Bridging business and technology to drive meaningful impact. Combining expertise in customer experience, technology, and business strategy to deliver valuable insights. Father, open-source contributor, investor, 2xIronman, MBA graduate.
// last updated: March 11, 2026. Disclosure: This article may contain affiliate links.