Guide de déploiement

Caddy en reverse proxy sur VPS : guide complet

Déployer sur un VPS Cloud →

Tutoriel

Caddy en reverse proxy sur VPS : guide complet

Déploiement8 min de lecture7 étapes

Caddy est un serveur web écrit en Go qui gère l'intégralité du cycle TLS — négociation ACME, renouvellement, redirection HTTP → HTTPS — sans la moindre ligne de configuration dédiée. Là où Nginx demande Certbot, un cron et un vhost par domaine, un seul `Caddyfile` de dix lignes suffit pour exposer plusieurs applications sur le même VPS en HTTPS. Ce guide couvre l'installation, la configuration multi-applications, le durcissement et les erreurs les plus courantes.

Sommaire· Pourquoi choisir Caddy comme frontal sur votre VPS ?1/9
  1. 01Pourquoi choisir Caddy comme frontal sur votre VPS ?
  2. 02Les atouts de Caddy en production
  3. 03Prérequis
  4. 04Déployer Caddy en reverse proxy
  5. 05Comment fonctionne le HTTPS automatique de Caddy
  6. 06Caddy vs Nginx : quand choisir l'un ou l'autre
  7. 07Dépannage : les erreurs courantes
  8. 08Pour héberger plusieurs applications sur le même VPS
  9. 09La documentation officielle

Pourquoi choisir Caddy comme frontal sur votre VPS ?

La plupart des reverse proxys délèguent la gestion TLS à un outil externe — Certbot, acme.sh ou un script cron maison. Caddy intègre ce mécanisme de bout en bout : dès qu'un nom de domaine est déclaré dans le Caddyfile, il contacte Let's Encrypt, obtient le certificat et le renouvelle avant expiration, sans intervention manuelle. Le résultat est une configuration qui se lit en quelques lignes et qui se déploie identiquement sur tous vos VPS, sans état externe à synchroniser.

Les atouts de Caddy en production

  • HTTPS automatique : Let's Encrypt ACME HTTP-01 activé dès qu'un nom de domaine est déclaré — aucun cron, aucun plugin à installer
  • Syntaxe concise : un bloc de cinq lignes remplace un vhost Nginx de quarante lignes avec son fichier de configuration Certbot
  • Zéro rechargement à froid : caddy reload applique le nouveau Caddyfile sans couper les connexions en cours
  • HTTP/2 et HTTP/3 (QUIC) par défaut : activés sans configuration supplémentaire sur toutes les versions 2.x
  • API JSON : la configuration est modifiable à chaud via une API REST, utile pour les environnements dynamiques ou conteneurisés
  • Image Docker officielle légère : caddy:2-alpine pèse moins de 20 Mo et suffit pour la majorité des cas de production

Prérequis

Avant de démarrer, vérifiez que votre VPS répond aux conditions suivantes.

Ressources minimales : 512 Mo de RAM et 1 vCPU suffisent pour Caddy seul. Comptez 1 Go de RAM et 2 vCPU si vous hébergez plusieurs applications derrière.

Ports 80 et 443 libres : Caddy les occupe pour ACME HTTP-01 (port 80) et pour le trafic HTTPS (port 443). Vérifiez qu'aucun autre processus ne les utilise :

ss -tlnp | grep -E ':80|:443'

Nom de domaine pointant sur le VPS : Let's Encrypt valide la propriété du domaine en interrogeant le port 80 de votre IP. Votre enregistrement DNS A doit être actif et propagé avant de lancer Caddy.

Système d'exploitation : Debian 11/12 ou Ubuntu 22.04/24.04. Les commandes de ce guide sont testées sur ces distributions.

Docker (optionnel) : si vous déployez Caddy en conteneur, Docker Engine 24+ et Docker Compose v2 sont nécessaires.

Déployer Caddy en reverse proxy

  1. Méthode 1 — Installation via le dépôt APT officiel

    Caddy propose un dépôt APT signé. Ajoutez-le, puis installez le paquet :

    apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
      | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
      | tee /etc/apt/sources.list.d/caddy-stable.list
    apt update && apt install caddy

    Vérifiez la version installée : caddy version doit afficher v2.9.x ou supérieur.

  2. Méthode 2 — Déploiement avec Docker Compose

    Si vos applications tournent déjà sous Docker, un service Caddy dans le même compose.yml est l'approche la plus simple. Créez un fichier compose.yml à la racine de votre projet :

    services:
      caddy:
        image: caddy:2-alpine
        restart: unless-stopped
        ports:
          - "80:80"
          - "443:443"
          - "443:443/udp"
        volumes:
          - ./Caddyfile:/etc/caddy/Caddyfile
          - caddy_data:/data
          - caddy_config:/config
        networks:
          - proxy
    
    volumes:
      caddy_data:
      caddy_config:
    
    networks:
      proxy:
        external: true

    Créez le réseau partagé une seule fois : docker network create proxy. Vos autres services rejoignent ce réseau pour être accessibles par Caddy.

  3. Créer le Caddyfile de base

    Le Caddyfile est le fichier de configuration central. Pour une installation APT, il se trouve dans /etc/caddy/Caddyfile. Pour Docker, placez-le à côté de votre compose.yml.

    Voici un exemple minimal qui expose une application sur le port 3000 :

    monapp.com {
        reverse_proxy localhost:3000
    }

    C'est tout. Caddy détecte que monapp.com est un nom de domaine, contacte Let's Encrypt via ACME HTTP-01, obtient un certificat et redirige automatiquement tout le trafic HTTP vers HTTPS. Les certificats sont stockés dans ~/.local/share/caddy/ (APT) ou dans le volume caddy_data (Docker).

  4. Configuration multi-applications (multi-vhost)

    Héberger plusieurs applications sur le même VPS ne demande que des blocs supplémentaires dans le même fichier :

    app1.votredomaine.com {
        reverse_proxy localhost:3000
    }
    
    app2.votredomaine.com {
        reverse_proxy localhost:4000
    }
    
    blog.votredomaine.com {
        reverse_proxy localhost:8080
    }

    Chaque bloc obtient son propre certificat Let's Encrypt. Caddy gère les renouvellements de manière indépendante pour chaque domaine, en parallèle, sans interruption de service.

  5. Appliquer le Caddyfile sans interruption

    Pour APT, rechargez la configuration sans couper les connexions :

    systemctl reload caddy
    # ou, si vous avez modifié le fichier en dehors de /etc/caddy/ :
    caddy reload --config /chemin/vers/Caddyfile

    Pour Docker :

    docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile

    Vérifiez que la syntaxe est correcte avant de recharger : caddy validate --config /etc/caddy/Caddyfile.

  6. Ajouter les en-têtes de sécurité et le rate limiting

    Caddy supporte les en-têtes de sécurité natifs via la directive header. Voici un bloc renforcé pour une application en production :

    monapp.com {
        reverse_proxy localhost:3000
    
        header {
            Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
            X-Content-Type-Options "nosniff"
            X-Frame-Options "SAMEORIGIN"
            Referrer-Policy "strict-origin-when-cross-origin"
            -Server
        }
    
        log {
            output file /var/log/caddy/monapp.log {
                roll_size 10mb
                roll_keep 5
            }
        }
    }

    Pour le rate limiting, le module caddy-ratelimit s'installe via xcaddy build et s'utilise avec la directive rate_limit. La version Docker officielle ne l'inclut pas — construisez votre propre image ou utilisez un pare-feu applicatif en amont si le besoin est critique.

  7. Activer et vérifier le service systemd (APT)

    Après installation via APT, le service est activé automatiquement. Contrôlez son état et les journaux :

    systemctl status caddy
    journalctl -u caddy -f

    Pour que Caddy démarre au reboot : systemctl enable caddy (déjà fait par le paquet). Testez que le certificat Let's Encrypt a bien été émis :

    curl -sv https://monapp.com 2>&1 | grep -E 'subject|issuer|expire'

Comment fonctionne le HTTPS automatique de Caddy

Caddy implémente le protocole ACME (Automated Certificate Management Environment) de manière intégrée. Dès qu'un bloc de Caddyfile contient un nom de domaine qualifié, Caddy enclenche automatiquement le défi ACME HTTP-01 : Let's Encrypt place un jeton de vérification sur http://votredomaine.com/.well-known/acme-challenge/, Caddy répond à cette requête et prouve ainsi qu'il contrôle le serveur. Let's Encrypt émet alors un certificat valable 90 jours.

Caddy renouvelle ce certificat en avance (à partir de 30 jours avant expiration) et recharge la configuration à chaud, sans interruption de service. Les certificats et les données ACME sont conservés localement — dans ~/.local/share/caddy/ pour une installation APT, dans le volume caddy_data pour Docker. Ne supprimez pas ce volume : Caddy y stocke aussi l'état ACME, et des demandes trop fréquentes vers Let's Encrypt déclenchent des limites de taux (rate limits) qui peuvent bloquer l'émission de nouveaux certificats pendant plusieurs heures.

Pour les certificats wildcard (*.votredomaine.com), ACME HTTP-01 ne fonctionne pas : il faut le défi DNS-01, qui exige l'accès à l'API de votre fournisseur DNS. Caddy supporte nativement plusieurs fournisseurs via des modules (caddy-dns/cloudflare, caddy-dns/ovh…) compilés avec xcaddy.

Caddy vs Nginx : quand choisir l'un ou l'autre

Faites défiler le tableau

CritèreCaddyNginx
Configuration TLSAutomatique, zéro configuration manuelleManuel (Certbot ou acme.sh requis)
Courbe d'apprentissageFaible — syntaxe lisible, peu de directivesModérée — syntaxe verbeuse, nombreux contextes
Performance brute (requêtes/s)Excellente pour la majorité des chargesLégèrement supérieure sous très haute charge
Modules et écosystèmeCroissant, xcaddy pour compiler des modulesTrès large, modules tiers nombreux et matures
Reload sans interruptionNatif (`caddy reload`)Natif (`nginx -s reload`), similaire
Cas d'usage idéalVPS personnel, projets d'équipe, microservices DockerGrandes plateformes, CDN frontal, cas avancés (GeoIP, Lua…)
Support HTTP/3 (QUIC)Activé par défaut depuis Caddy 2.6Expérimental, requiert compilation avec quiche ou ngx_http_v3

Dépannage : les erreurs courantes

Port 80 déjà occupé. Caddy a besoin du port 80 pour ACME HTTP-01. Si Apache ou Nginx tourne déjà, l'arrêter avant de démarrer Caddy : systemctl stop apache2 ou systemctl stop nginx. Vérifiez ensuite avec ss -tlnp | grep :80.

Échec ACME / certificat non émis. Let's Encrypt ne peut pas contacter votre serveur. Vérifiez : (1) votre enregistrement DNS A pointe bien sur l'IP du VPS — dig +short votre-domaine.com doit retourner votre IP ; (2) le port 80 est accessible depuis l'extérieur — les pare-feux VPS (iptables, ufw) bloquent parfois ce port même si Caddy l'écoute. Consultez les journaux Caddy avec journalctl -u caddy pour lire le message d'erreur ACME précis.

permission denied sur les ports 80/443. Les ports inférieurs à 1024 sont réservés sous Linux. Pour une installation APT, le paquet configure automatiquement la capacité CAP_NET_BIND_SERVICE sur le binaire Caddy. Si vous avez compilé Caddy manuellement, appliquez-la : setcap cap_net_bind_service=+ep $(which caddy).

DNS non résolu / no such host. Caddy résout les noms des backends déclarés dans reverse_proxy. Si votre application s'appelle app dans Docker Compose, assurez-vous que Caddy et l'application partagent le même réseau Docker. Vérifiez avec : docker compose exec caddy nslookup app.

Volume caddy_data supprimé par erreur. Caddy doit renégocier tous les certificats depuis zéro. Let's Encrypt impose une limite de 5 certificats par domaine sur 7 jours. Si vous atteignez cette limite, utilisez l'environnement de staging ACME (acme_ca https://acme-staging-v02.api.letsencrypt.org/directory dans le Caddyfile) pour tester, puis repassez en production une fois la fenêtre expirée.

Pour héberger plusieurs applications sur le même VPS

Créez un réseau Docker partagé (docker network create proxy) et connectez chaque service à ce réseau. Le Caddyfile référence alors les services par leur nom de conteneur plutôt que par localhost:PORT — la configuration ne change pas lorsque vous ajoutez ou retirez des applications. Exemple : reverse_proxy mon-service:3000 au lieu de reverse_proxy localhost:3000.

La documentation officielle

La référence complète des directives, des modules et de l'API JSON est disponible sur <a href="https://caddyserver.com/docs/">caddyserver.com/docs</a>. Le forum communautaire (<a href="https://caddy.community">caddy.community</a>) est la référence communautaire pour les questions avancées — les mainteneurs y répondent directement.

Votre VPS, prêt à accueillir Caddy

Déployez Caddy sur un VPS ServOrbit et bénéficiez d'un environnement Debian 12, ports 80 et 443 ouverts, accès SSH immédiat.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet