Guide Caddy Reverse Proxy 2026 : HTTPS Automatique Simplifié
TUTORIAL 8 min read fordnox

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 :

Caddy vs Nginx vs Traefik

FonctionnalitéCaddyNginxTraefik
HTTPS autoPar défautCertbot nécessaireIntégré
Syntaxe de configSimpleModéréeComplexe
Intégration DockerBonneManuelleNative
PerformanceExcellenteExcellenteExcellente
PluginsModules GoModules CMiddleware
Rechargement configZéro interruptionNécessite un signalRechargement à chaud
Courbe d’apprentissageFaibleModéréePlus é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 :

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 :

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

  1. Vérifiez que le DNS pointe vers votre VPS :
dig +short domain.com
  1. Assurez-vous que les ports 80 et 443 sont ouverts :
sudo ufw allow 80,443/tcp
  1. Consultez les journaux de Caddy :
journalctl -u caddy --no-pager -n 50
# Or for Docker:
docker logs caddy

502 Bad Gateway

  1. Vérifiez que le backend fonctionne :
curl localhost:3000
  1. Vérifiez l’adresse upstream dans le Caddyfile

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

  1. Activez la compression :
encode gzip zstd
  1. Vérifiez les temps de réponse du backend

  2. Ajoutez des délais d’expiration de connexion :

reverse_proxy localhost:3000 {
    transport http {
        dial_timeout 5s
        response_header_timeout 10s
    }
}

Checklist de production

Meilleur VPS pour Caddy

Caddy fonctionne partout. Choisissez votre VPS en fonction de vos besoins backend :

FournisseurOffrePrixIdéal pour
HostingerKVM14,99 $Meilleur rapport qualité-prix pour débuter
HetznerCX225,49 €Projets basés en Europe
DigitalOceanBasic6 $Convivial pour les développeurs
VultrVC26 $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âcheNginxCaddy
Obtenir SSLInstaller certbot, configurerAutomatique
Ajouter un serviceModifier la config, tester, rechargerAjouter 3 lignes, recharger
Rediriger HTTP→HTTPSAjouter un bloc serveurAutomatique
Activer HTTP/2ConfigurerAutomatique
Syntaxe de configComplexeLisible 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.

~/caddy-reverse-proxy-guide/get-started

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

caddy reverse proxy configuration caddy serveur caddy ssl caddy docker caddy vs nginx

// related guides

Andrius Putna

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.