Caddy in Docker: Reverse Proxy con SSL Automatico e Zero Manutenzione
Come rimpiazzare configurazioni Nginx chilometriche e script Certbot fragili con Caddy: certificati HTTPS out-of-the-box, supporto nativo WebSocket e sintassi Caddyfile pulita in 3 righe.
1. Il Caddyfile: Semplicità Estrema
Crea un file chiamato Caddyfile nella cartella del tuo progetto. Per instradare il traffico pubblico verso due container interni (es. un'app Node.js e un pannello Portainer):
# Configurazione globale: la tua email per avvisi Let's Encrypt
{
email [email protected]
}
# Proxy verso l'app principale
app.tuodominio.it {
reverse_proxy nodejs_app:3000
}
# Proxy verso dashboard interna
panel.tuodominio.it {
reverse_proxy portainer:9000
}
Nessun parametro extra per i WebSocket o per gli header X-Forwarded-For: Caddy li gestisce nativamente.
2. Il file Docker Compose
Ecco il docker-compose.yml per avviare Caddy garantendo la persistenza dei certificati SSL:
version: '3.8'
services:
caddy:
image: caddy:2-alpine
container_name: caddy_proxy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # Necessario per HTTP/3 (QUIC)
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data # CRUCIALE: custodisce i certificati SSL
- caddy_config:/config
networks:
- web_network
nodejs_app:
image: node:20-alpine
container_name: nodejs_app
restart: unless-stopped
command: node index.js
networks:
- web_network
volumes:
caddy_data:
caddy_config:
networks:
web_network:
name: internal_web_proxy
3. Reload a Zero Downtime
Quando aggiungi un nuovo dominio al Caddyfile, non riavviare il container (evita di interrompere le connessioni attive degli utenti!). Esegui il reload a caldo:
docker exec -w /etc/caddy caddy_proxy caddy reload
Caddy valida la sintassi del file in memoria; se c'è un errore di battitura, rifiuta il cambio e mantiene attiva la configurazione precedente senza alcun disservizio.
❓ Domande Frequenti (FAQ Tecniche)
Caddy rinnova automaticamente i certificati Let's Encrypt?
Sì, Caddy esegue il rinnovo automatico prima della scadenza tramite protocollo ACME standard. Non serve alcun cron job o pacchetto Certbot esterno.
Perché il volume caddy_data è fondamentale?
Il volume /data salva i certificati e le chiavi crittografiche emesse. Se non lo persisti, a ogni riavvio del container Caddy richiederà nuovi certificati, rischiando il blocco per 7 giorni per superamento dei rate-limits di Let's Encrypt.
Come funziona il supporto WebSocket in Caddy?
È abilitato di default. A differenza di Nginx che richiede le direttive Upgrade e Connection, la direttiva reverse_proxy di Caddy rileva e instrada automaticamente gli stream WebSocket.