Skip to main content
  1. Comandi/

traefik

·4 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

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:

LabelSignificatoCosa fa
traefik.enable=trueenable — abilita gestioneDice a Traefik di gestire questo container
traefik.http.routers.X.rulerouter rule — regola di routingDefinisce il dominio (Host(\chat.dominio.it`)`)
traefik.http.services.X.loadbalancer.server.portloadbalancer port — porta internaIndica la porta su cui ascolta il container
traefik.http.routers.X.tls=truetls — Transport Layer SecurityAbilita HTTPS su questo router
traefik.http.routers.X.tls.certresolvercertresolver — risolutore certificatiUsa 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 esplicitamente

Con 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.

Note

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 | head
Tip

Traefik 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 certificati

Il 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 giorni

Se 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"
Warning

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

Related