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]
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)
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


