Web Server Docker HTTPS & SSL ⏱️ 8 min lettura

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.

💡 Perché Caddy sta conquistando gli sviluppatori: In Nginx, ottenere HTTPS richiede script Certbot esterni, cron job per i rinnovi, e decine di direttive per gli header di proxy. Con Caddy 2, basta scrivere il nome del dominio: il server contatta Let's Encrypt o ZeroSSL, risolve la challenge ACME, rinnova le chiavi in memoria e applica HTTP/3 e TLS 1.3 in automatico.

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.