
Caddy est un serveur web moderne avec HTTPS automatique par défaut. Contrairement à Nginx ou Apache, Caddy obtient et renouvelle vos certificats TLS sans configuration. En 5 minutes, vous pouvez servir un site statique sécurisé ou proxyfier une API.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »Niveau : Débutant → Intermédiaire · Durée : 25-35 min
À la fin de ce guide, vous saurez :
- Servir un site statique avec HTTPS automatique
- Configurer un reverse proxy vers une application
- Comprendre le modèle mental du Caddyfile
- Déboguer les erreurs courantes (ACME, 502)
- Utiliser
tls internalpour les environnements LAN
Choisissez votre parcours
Section intitulée « Choisissez votre parcours »Pourquoi Caddy plutôt que Nginx ?
Section intitulée « Pourquoi Caddy plutôt que Nginx ? »| Critère | Caddy | Nginx |
|---|---|---|
| HTTPS | Automatique (Let’s Encrypt intégré) | Manuel (certbot séparé) |
| Configuration | Lisible (Caddyfile) | Verbeux (nginx.conf) |
| Rechargement | caddy reload sans perte | nginx -s reload |
| HTTP/3 | Natif | Module externe |
| Courbe d’apprentissage | 30 min | 2-3 heures |
En résumé : Caddy pour la simplicité, Nginx pour le contrôle fin et l’écosystème mature.
📜 Pour la culture : historique de Caddy
Caddy a été créé par Matt Holt en 2015 avec une vision claire : simplifier la configuration des serveurs web et rendre HTTPS accessible à tous. À l’époque, obtenir un certificat SSL était complexe et coûteux. L’intégration native de Let’s Encrypt dans Caddy a démocratisé HTTPS.
Aujourd’hui, Caddy est utilisé en production par de nombreuses entreprises pour sa simplicité et sa robustesse. Il est écrit en Go, ce qui lui confère d’excellentes performances et une facilité de déploiement (un seul binaire).
Le modèle mental du Caddyfile
Section intitulée « Le modèle mental du Caddyfile »Avant de plonger dans la configuration, prenons 2 minutes pour comprendre comment Caddy pense. Cette compréhension vous évitera 90% des erreurs.
L’analogie du routeur réseau
Section intitulée « L’analogie du routeur réseau »Imaginez un routeur entreprise avec des règles de routage :
- Le site block (
example.com { }) = une interface réseau (eth0, wan0) - Les handlers (
root,file_server) = les règles de traitement du trafic - Le matcher (
/api/*) = les ACL/filtres qui dirigent vers le bon backend - HTTPS automatique = le tunnel VPN configuré en auto-provisioning
Quand un paquet (requête HTTP) arrive, le routeur (matcher) l’oriente vers le bon backend (handler), et le tunnel TLS s’occupe du chiffrement automatiquement.
Visualisation
Section intitulée « Visualisation »Les 4 couches du Caddyfile
Section intitulée « Les 4 couches du Caddyfile »Pourquoi 4 couches ? Chaque requête traverse ces étapes dans l’ordre. Si vous comprenez ce flux, vous comprenez 90% de Caddy.
| Couche | Rôle | Analogie | Exemples |
|---|---|---|---|
| Site block | Définit le domaine ou l’adresse | Interface réseau (quelle interface écoute ?) | example.com { }, :8080 { }, localhost { } |
| Matchers | Filtrent les requêtes (chemin, méthode, headers) | ACL/règles de filtrage (quel trafic router ?) | /api/*, @websocket, path /static/* |
| Handlers | Traitent la requête | Règles de routage (où envoyer le paquet) | file_server, reverse_proxy, respond, redir |
| Réponse | HTTPS activé par défaut si domaine public | Auto-provisioning TLS (tunnel sécurisé auto) | TLS auto via Let’s Encrypt |
Installation
Section intitulée « Installation »# Ajouter le dépôt officielsudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curlcurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \ | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpgcurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \ | sudo tee /etc/apt/sources.list.d/caddy-stable.list
# Installersudo apt update && sudo apt install caddy
# Le service systemd est configuré automatiquementsudo systemctl status caddy# Ajouter le dépôt officielsudo dnf install 'dnf-command(copr)'sudo dnf copr enable @caddy/caddysudo dnf install caddy
# Démarrer le servicesudo systemctl enable --now caddybrew install caddydocker run -d -p 80:80 -p 443:443 \ -v /path/to/Caddyfile:/etc/caddy/Caddyfile \ -v caddy_data:/data \ -v caddy_config:/config \ caddy:latestVérification :
caddy version# v2.8.x
# Le Caddyfile par défaut est dans /etc/caddy/Caddyfilecat /etc/caddy/CaddyfileServir un site statique
Section intitulée « Servir un site statique »-
Créer le répertoire et le fichier
Fenêtre de terminal sudo mkdir -p /var/www/monsiteecho '<h1>Hello Caddy!</h1>' | sudo tee /var/www/monsite/index.htmlsudo chown -R caddy:caddy /var/www/monsite -
Configurer le Caddyfile
Fenêtre de terminal sudo tee /etc/caddy/Caddyfile << 'EOF'# Pour un test local (pas de TLS):8080 {root * /var/www/monsitefile_server}EOF -
Recharger Caddy
Fenêtre de terminal sudo systemctl reload caddy -
Tester
Fenêtre de terminal curl http://localhost:8080# <h1>Hello Caddy!</h1>
Avec un domaine public (HTTPS automatique)
Section intitulée « Avec un domaine public (HTTPS automatique) »Si votre domaine pointe vers votre serveur :
monsite.com { root * /var/www/monsite file_server}C’est tout. Caddy :
- Obtient automatiquement un certificat Let’s Encrypt
- Redirige HTTP → HTTPS
- Renouvelle le certificat avant expiration
SPA (Single Page Application)
Section intitulée « SPA (Single Page Application) »Pour React, Vue, Angular, etc. — fallback vers index.html :
monsite.com { root * /var/www/spa try_files {path} /index.html file_server}Configurer un reverse proxy
Section intitulée « Configurer un reverse proxy »Qu’est-ce qu’un reverse proxy ?
Section intitulée « Qu’est-ce qu’un reverse proxy ? »Un reverse proxy est un intermédiaire entre vos utilisateurs et votre application. C’est comme un réceptionniste d’hôtel :
- Le client ne parle jamais directement aux employés (backend)
- Le réceptionniste (Caddy) reçoit la demande et la transmet au bon service
- Le réceptionniste ajoute des informations utiles (“ce client vient de la chambre 42”)
Pourquoi utiliser un reverse proxy ?
| Sans reverse proxy | Avec reverse proxy (Caddy) |
|---|---|
| Votre app Node/Python écoute sur le port 80 | Caddy écoute sur 80/443, votre app sur 3000 |
| Pas de HTTPS (ou config manuelle) | HTTPS automatique |
| Une seule app par serveur | Plusieurs apps sur le même serveur |
| Votre app gère les logs HTTP | Caddy centralise les logs |
Configuration de base
Section intitulée « Configuration de base »api.example.com { reverse_proxy localhost:3000}C’est tout. En une ligne, Caddy :
- Écoute sur
api.example.comports 80 et 443 - Obtient un certificat HTTPS
- Transmet les requêtes à votre app sur
localhost:3000 - Ajoute automatiquement les headers
Host,X-Forwarded-For,X-Forwarded-Proto
Avec un chemin spécifique
Section intitulée « Avec un chemin spécifique »example.com { # L'API sur /api/* reverse_proxy /api/* localhost:3000
# Le reste en statique root * /var/www/frontend file_server}WebSocket
Section intitulée « WebSocket »example.com { reverse_proxy /ws/* localhost:3000}Caddy gère automatiquement l’upgrade WebSocket. Pas de configuration spéciale.
Load balancing
Section intitulée « Load balancing »example.com { reverse_proxy { to backend1:3000 to backend2:3000 to backend3:3000
lb_policy round_robin health_uri /health health_interval 10s }}HTTPS automatique : ce qu’il faut savoir
Section intitulée « HTTPS automatique : ce qu’il faut savoir »Comment ça marche (en 30 secondes)
Section intitulée « Comment ça marche (en 30 secondes) »Quand vous écrivez example.com { } dans votre Caddyfile, Caddy :
- Détecte que c’est un domaine public (pas localhost, pas une IP)
- Contacte Let’s Encrypt pour prouver que vous contrôlez le domaine
- Obtient un certificat valide 90 jours
- Configure TLS avec les bonnes options de sécurité
- Crée une redirection HTTP → HTTPS automatique
- Renouvelle le certificat avant expiration (environ 30 jours avant)
Tout cela sans une seule ligne de configuration TLS.
Les 3 modes TLS de Caddy
Section intitulée « Les 3 modes TLS de Caddy »| Mode | Quand l’utiliser | Configuration |
|---|---|---|
| Auto (défaut) | Domaine public accessible | example.com { ... } |
| Internal | Réseau local / développement | tls internal |
| Manuel | Certificats existants | tls /path/cert.pem /path/key.pem |
tls internal pour le LAN
Section intitulée « tls internal pour le LAN »Pour un serveur interne sans accès Internet :
intranet.local { tls internal reverse_proxy localhost:3000}Caddy génère un certificat auto-signé. Important : vous devez installer la CA Caddy dans les navigateurs/clients pour éviter les avertissements de sécurité.
# Afficher le chemin de la CAcaddy trust# Installe la CA dans le trust store système (Linux/macOS)DNS Challenge (wildcard, serveur privé)
Section intitulée « DNS Challenge (wildcard, serveur privé) »Si les ports 80/443 ne sont pas accessibles (firewall, NAT), utilisez le DNS Challenge :
# Compiler Caddy avec le plugin DNS (ex: Cloudflare)xcaddy build --with github.com/caddy-dns/cloudflare*.example.com { tls { dns cloudflare {env.CLOUDFLARE_API_TOKEN} } reverse_proxy localhost:3000}Pages d’erreur personnalisées
Section intitulée « Pages d’erreur personnalisées »example.com { root * /var/www/html file_server
handle_errors { @404 expression {err.status_code} == 404 handle @404 { root * /var/www/errors rewrite * /404.html file_server }
@5xx expression {err.status_code} >= 500 handle @5xx { respond "Service temporairement indisponible" 503 } }}Recettes courantes
Section intitulée « Recettes courantes »Site statique
Section intitulée « Site statique »example.com { root * /var/www/html file_server}SPA (React/Vue/Angular)
Section intitulée « SPA (React/Vue/Angular) »example.com { root * /var/www/app try_files {path} /index.html file_server}Reverse proxy simple
Section intitulée « Reverse proxy simple »api.example.com { reverse_proxy localhost:3000}Proxy + statique (API sur /api)
Section intitulée « Proxy + statique (API sur /api) »example.com { handle /api/* { reverse_proxy localhost:3000 } handle { root * /var/www/frontend file_server }}Strip path prefix (/api/users → /users)
Section intitulée « Strip path prefix (/api/users → /users) »example.com { handle_path /api/* { reverse_proxy localhost:3000 }}TLS interne (LAN)
Section intitulée « TLS interne (LAN) »intranet.local { tls internal reverse_proxy localhost:3000}Certificats manuels
Section intitulée « Certificats manuels »example.com { tls /etc/ssl/cert.pem /etc/ssl/key.pem file_server}Redirection permanente
Section intitulée « Redirection permanente »old.example.com { redir https://new.example.com{uri} permanent}Headers de sécurité
Section intitulée « Headers de sécurité »example.com { header { Strict-Transport-Security "max-age=31536000" X-Content-Type-Options "nosniff" X-Frame-Options "DENY" } file_server}Basic Auth
Section intitulée « Basic Auth »example.com { basicauth /admin/* { admin $2a$14$hash... } file_server}Pour générer un hash de mot de passe :
caddy hash-password# Entrez le mot de passe, Caddy retourne le hash bcryptMétriques Prometheus
Section intitulée « Métriques Prometheus »{ servers { metrics }}
example.com { file_server}Pièges à éviter
Section intitulée « Pièges à éviter »| Erreur | Conséquence | Solution |
|---|---|---|
| DNS ne pointe pas vers le serveur | HTTPS auto échoue (erreur ACME) | dig example.com pour vérifier |
| Ports 80/443 fermés | Let’s Encrypt ne peut pas valider | Ouvrir les ports ou utiliser DNS Challenge |
Domaine local sans tls internal | Caddy tente d’obtenir un certificat | Ajouter tls internal pour .local, .lan |
Oublier handle_path pour strip | Backend reçoit /api/users au lieu de /users | Utiliser handle_path /api/* { ... } |
| Ordre des handlers incorrect | Un handler large capture tout | Placer /api/* avant file_server catch-all |
| Backend down | Caddy renvoie 502 | curl localhost:3000 pour confirmer |
| https:// dans reverse_proxy | Erreurs de connexion | Ne pas mettre https:// sauf si backend l’exige |
Dépannage
Section intitulée « Dépannage »Commandes essentielles
Section intitulée « Commandes essentielles »# Valider la configurationcaddy validate --config /etc/caddy/Caddyfile
# Recharger sans downtimesudo systemctl reload caddy
# Voir les logssudo journalctl -u caddy -f
# Formater le Caddyfile (indentation)caddy fmt --overwrite /etc/caddy/CaddyfileErreurs courantes
Section intitulée « Erreurs courantes »| Erreur | Cause probable | Solution |
|---|---|---|
| ACME challenge failed | DNS incorrect ou ports fermés | Vérifier DNS + ouvrir 80/443 |
| 502 Bad Gateway | Backend ne répond pas | curl localhost:3000 pour tester |
| too many redirects | Boucle HTTP ↔ HTTPS | Vérifier la config proxy/CDN |
| permission denied | Caddy ne peut pas lire les fichiers | chown -R caddy:caddy /var/www |
| address already in use | Autre service sur le port | ss -tlnp | grep :80 |
Déboguer une erreur ACME
Section intitulée « Déboguer une erreur ACME »# Voir les détails de l'erreursudo journalctl -u caddy | grep -i acme
# Erreurs typiques :# - "no valid IP addresses" → DNS pas configuré# - "connection refused" → port 80 fermé# - "rate limit" → trop de tentatives (attendre 1h)Déboguer un 502
Section intitulée « Déboguer un 502 »# 1. Le backend tourne-t-il ?curl -I http://localhost:3000
# 2. Caddy peut-il joindre le backend ?sudo -u caddy curl http://localhost:3000
# 3. Regarder les logssudo journalctl -u caddy -fObservabilité
Section intitulée « Observabilité »Logs structurés
Section intitulée « Logs structurés »example.com { log { output file /var/log/caddy/access.log { roll_size 100mb roll_keep 5 } format json } file_server}Métriques Prometheus
Section intitulée « Métriques Prometheus »Ajoutez dans le bloc global :
{ servers { metrics }}
example.com { file_server}Les métriques sont exposées sur :2019/metrics par défaut.
curl localhost:2019/metricsAide-mémoire
Section intitulée « Aide-mémoire »Fichiers
Section intitulée « Fichiers »| Directive | Description |
|---|---|
root * /path | Définir la racine des fichiers |
file_server | Servir les fichiers statiques |
file_server browse | Avec listing des répertoires |
try_files {path} /index.html | Fallback SPA |
| Directive | Description |
|---|---|
reverse_proxy localhost:3000 | Proxy simple |
reverse_proxy /api/* localhost:3000 | Proxy sur un chemin |
handle_path /api/* { reverse_proxy ... } | Strip le préfixe |
| Directive | Description |
|---|---|
tls email@example.com | HTTPS auto avec email |
tls internal | Certificat auto-signé (LAN) |
tls /cert.pem /key.pem | Certificats manuels |
Headers & Sécurité
Section intitulée « Headers & Sécurité »| Directive | Description |
|---|---|
header X-Custom "value" | Ajouter un header |
header -Server | Supprimer un header |
basicauth /admin/* { user hash } | Auth basique |
encode gzip zstd | Compression |
| Directive | Description |
|---|---|
redir /old /new permanent | Redirection 301 |
rewrite /old /new | Réécriture interne |
respond "OK" 200 | Réponse directe |
handle_errors { ... } | Pages d’erreur custom |
| Commande | Description |
|---|---|
caddy validate --config /etc/caddy/Caddyfile | Valider la config |
caddy fmt --overwrite Caddyfile | Formater |
caddy reload | Recharger la config |
caddy hash-password | Générer un hash bcrypt |
caddy trust | Installer la CA interne |
À retenir
Section intitulée « À retenir »- HTTPS automatique : fonctionne si DNS + ports 80/443 accessibles
tls internal: pour les environnements LAN sans accès Internetcaddy validate: toujours valider avant de rechargerhandle_path: pour strip le préfixe URL avant le backend- Ordre des handlers : spécifique → générique
- Logs :
journalctl -u caddy -fpour déboguer
Prochaines étapes
Section intitulée « Prochaines étapes »Ressources
Section intitulée « Ressources »- Documentation officielle : caddyserver.com/docs
- Directives Caddyfile : caddyserver.com/docs/caddyfile/directives
- HTTPS automatique : caddyserver.com/docs/automatic-https
- GitHub : github.com/caddyserver/caddy
- Plugins DNS : github.com/caddy-dns
FAQ - Questions Fréquemment Posées
Section intitulée « FAQ - Questions Fréquemment Posées »Définition
Caddy est un serveur web moderne créé en 2015 avec une philosophie : HTTPS automatique par défaut.Comparaison avec Nginx
| Critère | Caddy | Nginx |
|---|---|---|
| HTTPS | Automatique (Let's Encrypt intégré) | Manuel (certbot séparé) |
| Configuration | Lisible (Caddyfile) | Verbeux (nginx.conf) |
| HTTP/3 | Natif | Module externe |
| Courbe d'apprentissage | 30 min | 2-3 heures |
Quand choisir Caddy ?
- Simplicité : HTTPS sans configuration
- Petits projets : déploiement rapide
- Développement : certificats locaux faciles
Quand choisir Nginx ?
- Contrôle fin : configuration avancée
- Écosystème : plugins, documentation massive
- Performance extrême : optimisations poussées
Debian/Ubuntu
# Ajouter le dépôt officiel
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
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
# Installer
sudo apt update && sudo apt install caddy
RHEL/Rocky/Fedora
sudo dnf install 'dnf-command(copr)'
sudo dnf copr enable @caddy/caddy
sudo dnf install caddy
sudo systemctl enable --now caddy
Vérification
caddy version
# v2.8.x
cat /etc/caddy/Caddyfile
Fonctionnement
Quand vous écrivezexample.com { } dans le Caddyfile :- Caddy détecte un domaine public
- Contacte Let's Encrypt (challenge HTTP)
- Prouve que vous contrôlez le domaine
- Obtient un certificat valide 90 jours
- Configure TLS avec les bonnes options
- Redirige HTTP → HTTPS automatiquement
- Renouvelle 30 jours avant expiration
Prérequis
| Condition | Pourquoi |
|---|---|
| DNS pointe vers le serveur | Let's Encrypt vérifie |
| Ports 80/443 accessibles | Challenge HTTP |
| Domaine public | Pas localhost, pas IP |
Exemple minimal
example.com {
root * /var/www/site
file_server
}
C'est tout. HTTPS activé sans configuration TLS.Structure de base
site_block {
directive1
directive2
}
Les 4 couches
| Couche | Rôle | Exemple |
|---|---|---|
| Site block | Définit le domaine | example.com { } |
| Matchers | Filtrent les requêtes | /api/*, @websocket |
| Handlers | Traitent la requête | file_server, reverse_proxy |
| TLS | HTTPS automatique | Activé par défaut |
Exemples
# Site statique
example.com {
root * /var/www/site
file_server
}
# Reverse proxy
api.example.com {
reverse_proxy localhost:3000
}
# SPA (React/Vue)
app.example.com {
root * /var/www/app
try_files {path} /index.html
file_server
}
Configuration de base
api.example.com {
reverse_proxy localhost:3000
}
En une ligne, Caddy :- Écoute sur ports 80 et 443
- Obtient un certificat HTTPS
- Transmet les requêtes à votre app
- Ajoute les headers
X-Forwarded-*
Avec un chemin spécifique
example.com {
handle /api/* {
reverse_proxy localhost:3000
}
root * /var/www/frontend
file_server
}
Strip le préfixe
# /api/users → backend reçoit /users
handle_path /api/* {
reverse_proxy localhost:3000
}
Load balancing
example.com {
reverse_proxy localhost:3001 localhost:3002 localhost:3003 {
lb_policy round_robin
}
}
Cas d'usage
tls internal est pour :- Serveurs intranet sans accès Internet
- Développement local
- Domaines .local, .lan
Configuration
intranet.local {
tls internal
root * /var/www/intranet
file_server
}
Éviter les avertissements navigateur
# Installer la CA Caddy dans le système
caddy trust
Les 3 modes TLS
| Mode | Usage | Config |
|---|---|---|
| Auto | Domaine public | Rien à faire |
| Internal | LAN/dev | tls internal |
| Manuel | Certificats existants | tls /cert.pem /key.pem |
Diagnostic
# Voir les logs détaillés
sudo journalctl -u caddy | grep -i acme
# Vérifier le DNS
dig example.com
# Tester les ports
nc -zv example.com 80
nc -zv example.com 443
Erreurs courantes
| Message | Cause | Solution |
|---|---|---|
| no valid IP addresses | DNS pas configuré | Configurer l'enregistrement A/AAAA |
| connection refused | Port 80 fermé | Ouvrir le pare-feu |
| rate limit | Trop de tentatives | Attendre 1h |
| unauthorized | Mauvaise IP | Vérifier que le DNS pointe vers ce serveur |
Pour le développement
Utiliseztls internal au lieu de Let's Encrypt :localhost {
tls internal
}
Causes et diagnostic
# 1. Le backend tourne-t-il ?
curl -I http://localhost:3000
# 2. Caddy peut-il le joindre ?
sudo -u caddy curl http://localhost:3000
# 3. Logs Caddy
sudo journalctl -u caddy -f
Erreurs courantes
| Problème | Solution |
|---|---|
| Backend arrêté | Démarrer l'application |
| Mauvais port | Vérifier le port dans le Caddyfile |
https:// dans reverse_proxy |
Enlever, garder http:// |
| Firewall local | Autoriser la connexion |
Configuration correcte
# Correct
reverse_proxy localhost:3000
# Incorrect (sauf si backend en HTTPS)
reverse_proxy https://localhost:3000
Commandes essentielles
| Commande | Action |
|---|---|
caddy validate --config /etc/caddy/Caddyfile |
Valider la config |
sudo systemctl reload caddy |
Recharger sans downtime |
caddy fmt --overwrite /etc/caddy/Caddyfile |
Formater le fichier |
Workflow sécurisé
# 1. Modifier le Caddyfile
sudo nano /etc/caddy/Caddyfile
# 2. Formater (optionnel mais recommandé)
caddy fmt --overwrite /etc/caddy/Caddyfile
# 3. Valider
caddy validate --config /etc/caddy/Caddyfile
# 4. Recharger
sudo systemctl reload caddy
Autres commandes utiles
# Générer un hash bcrypt pour basicauth
caddy hash-password
# Installer la CA interne
caddy trust
Configuration SPA
app.example.com {
root * /var/www/app
try_files {path} /index.html
file_server
}
Explication
| Directive | Rôle |
|---|---|
root * /var/www/app |
Dossier racine |
try_files {path} /index.html |
Si fichier absent → index.html |
file_server |
Servir les fichiers statiques |
Pourquoi try_files ?
Dans une SPA :/aboutn'existe pas comme fichier- Le routeur frontend (React Router, Vue Router) gère l'URL
- Il faut donc renvoyer
index.htmlpour toutes les routes
Avec cache
app.example.com {
root * /var/www/app
try_files {path} /index.html
file_server
header /assets/* Cache-Control "public, max-age=31536000"
}
Générer le hash
caddy hash-password
# Entrez le mot de passe
# Caddy retourne : $2a$14$...
Configuration
example.com {
basicauth /admin/* {
admin $2a$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT/5qqR7hx4IjWJPDhjvG
}
root * /var/www/site
file_server
}
Plusieurs utilisateurs
basicauth /admin/* {
alice $2a$14$hash1...
bob $2a$14$hash2...
}
Points importants
- Le hash doit être bcrypt (pas MD5, pas SHA)
- Le chemin
/admin/*inclut le slash final - Combinez avec HTTPS (déjà activé par défaut)
Configuration
{
servers {
metrics
}
}
example.com {
root * /var/www/site
file_server
}
Accès aux métriques
curl localhost:2019/metrics
Métriques disponibles
| Métrique | Description |
|---|---|
caddy_http_requests_total |
Total requêtes |
caddy_http_request_duration_seconds |
Latence |
caddy_http_response_size_bytes |
Taille réponses |
Intégration Prometheus
# prometheus.yml
scrape_configs:
- job_name: 'caddy'
static_configs:
- targets: ['caddy-server:2019']