Cosa fa#
Edge router e reverse proxy che legge i label dei container Docker e configura automaticamente il routing HTTP/HTTPS. Quando un container viene avviato con i label corretti, Traefik lo rende immediatamente raggiungibile senza toccare nessun file di configurazione.
Come funziona — architettura#
graph TD
Internet -->|porta 80/443| T[Traefik]
T -->|legge label| D[Docker API]
D -->|restituisce metadati container| T
T -->|Host chat.dominio.it| C1[Chatwoot :3000]
T -->|Host n8n.dominio.it| C2[n8n :5678]
T -->|Host portainer.dominio.it| C3[Portainer :9000]
Lettura diagramma: Traefik come reverse proxy. Il traffico da internet entra su porte 80/443 verso Traefik. Traefik legge le label dei container tramite Docker API e le usa per creare le regole di routing. In base all'header Host della richiesta, smista verso il container giusto: chat.dominio.it → Chatwoot:3000, n8n.dominio.it → n8n:5678, portainer.dominio.it → Portainer:9000.
Traefik interroga continuamente Docker per sapere quali container sono attivi e quali label hanno. Ogni volta che avvii o spegni un container, il routing si aggiorna automaticamente.
Configurazione via Docker labels#
Tutti i parametri di routing si definiscono come label nel
docker-compose.yml del servizio:
| Label | Significato | Cosa fa |
|---|---|---|
traefik.enable=true | enable — abilita gestione | Dice a Traefik di gestire questo container |
traefik.http.routers.X.rule | router rule — regola di routing | Definisce il dominio (Host(\chat.dominio.it`)`) |
traefik.http.services.X.loadbalancer.server.port | loadbalancer port — porta interna | Indica la porta su cui ascolta il container |
traefik.http.routers.X.tls=true | tls — Transport Layer Security | Abilita HTTPS su questo router |
traefik.http.routers.X.tls.certresolver | certresolver — risolutore certificati | Usa Let's Encrypt per il certificato SSL |
exposedByDefault e il label traefik.enable#
Traefik nel compose del progetto AntonellAI e' configurato con:
- "--providers.docker.exposedbydefault=false"
# exposedbydefault = esponi automaticamente tutti i container
# false = non farlo — ogni container deve dichiararsi esplicitamenteCon questa opzione attiva, Traefik ignora tutti i container sulla rete web a meno che non abbiano il label:
labels:
- "traefik.enable=true"Senza exposedbydefault=false, qualsiasi container aggiunto alla rete web verrebbe esposto automaticamente — un rischio di sicurezza in produzione.
Un container puo' essere sulla rete web e non essere raggiungibile da Traefik se non ha il label traefik.enable=true. Questo e' il comportamento corretto: la rete web e' il canale di comunicazione, il label e' il permesso esplicito.
Esempio docker-compose.yml#
services:
chatwoot:
image: chatwoot/chatwoot
labels:
- "traefik.enable=true"
- "traefik.http.routers.chat.rule=Host(`chat.example.it`)"
- "traefik.http.routers.chat.tls=true"
- "traefik.http.routers.chat.tls.certresolver=letsencrypt"
- "traefik.http.services.chat.loadbalancer.server.port=3000"Flusso di una richiesta HTTPS#
sequenceDiagram
participant U as Utente
participant T as Traefik :443
participant C as Chatwoot :3000
U->>T: GET https://chat.example.it
T->>T: legge Host header
T->>T: cerca router con rule Host(chat.example.it)
T->>T: trova → service chat → porta 3000
T->>C: GET http://chatwoot:3000 (rete interna Docker)
C->>T: 200 OK + HTML
T->>U: 200 OK + HTML (cifrato TLS)
Lettura diagramma: Sequenza di una richiesta HTTPS attraverso Traefik. L'utente chiede chat.example.it in HTTPS. Traefik riceve su porta 443, legge l'header Host, cerca il router con la regola corrispondente, trova il service che punta alla porta 3000. Invia la richiesta a Chatwoot sulla rete interna Docker (HTTP, non HTTPS — il TLS termina su Traefik). Chatwoot risponde, Traefik cifra la risposta e la manda all'utente.
Scenario Reale — Blue Team#
Traefik centralizza i log di accesso di tutti i servizi in un unico punto. Un analista SOC puo' cercare pattern di attacco su tutti i servizi con un solo comando invece di controllare i log di ogni container separatamente:
# Log di tutti i servizi in tempo reale
docker logs traefik -f
# Cerca tentativi di accesso a path sospetti
docker logs traefik 2>&1 | grep -E "wp-admin|\.env|etc/passwd"
# Conta richieste per IP (potenziale brute force)
docker logs traefik 2>&1 | awk '{print $1}' | sort | uniq -c | sort -rn | headTraefik e' il punto ideale dove installare CrowdSec o Fail2Ban — tutti gli accessi passano da li', quindi un singolo blocco protegge tutti i servizi dietro il proxy.
Certificati Let's Encrypt — acme.json#
Traefik salva i certificati SSL in un file acme.json dentro il volume mappato:
volumes:
- traefik_letsencrypt:/letsencrypt # volume named
# dentro /letsencrypt ci sara' acme.json con tutti i certificatiIl file acme.json contiene i certificati per tutti i domini gestiti da Traefik. Se il volume viene perso o ricreato, Traefik genera nuovi certificati — ma Let's Encrypt ha un rate limit:
Rate limit Let's Encrypt: 5 certificati per dominio ogni 7 giorniSe si supera il limite, il dominio rimane senza certificato valido e il browser mostra "tls: unknown certificate" per diversi giorni.
# Verifica il contenuto del volume certificati
sudo ls /var/lib/docker/volumes/traefik_traefik_letsencrypt/_data/
# acme.json
# Verifica che acme.json non sia vuoto
sudo cat /var/lib/docker/volumes/traefik_traefik_letsencrypt/_data/acme.json | python3 -m json.tool | grep -c "certificate"Il volume traefik_letsencrypt deve essere incluso nel backup. Se si perde acme.json e si e' gia vicini al rate limit di Let's Encrypt, i domini restano irraggiungibili via HTTPS per giorni. Includilo nello script backup.sh.
Collegato a#
- system — categoria
- docker — Traefik legge i metadati Docker
- reverse-proxy — Traefik e' un'implementazione di reverse proxy


