Skip to main content

Introdução | Traefik

  • Introdução | Traefik

1. O que é o Traefik

O Traefik é um reverse proxy e load balancer moderno, orientado a cloud-native, que se configura dinamicamente a partir do ambiente (Docker, Kubernetes, Swarm, etc).

Principais diferenciais

  • Configuração automática via labels
  • HTTPS automático com Let’s Encrypt
  • Hot reload (sem restart)
  • Middlewares (auth, redirect, headers, rate limit)
  • Observabilidade nativa (dashboard + métricas)

2. Arquitetura (conceito essencial)

O Traefik funciona com 3 camadas principais:

2.1 EntryPoints

São as portas de entrada

http  → :80
https → :443

2.2 Routers

Definem como o tráfego entra

  • Domínio (Host)
  • Path (PathPrefix)
  • EntryPoint
  • TLS

2.3 Services

Definem para onde o tráfego vai

  • Container
  • Porta interna
  • Load balancing

2.4 Middlewares

Camada intermediária:

  • Redirect HTTP → HTTPS
  • Basic Auth
  • Headers
  • Rate limit

3. Tipos de Configuração

Traefik usa dois tipos de configuração:

3.1 Static Configuration (inicialização)

Define como o Traefik funciona

  • EntryPoints
  • Providers
  • Certificados
  • Dashboard

👉 Não muda em runtime

3.2 Dynamic Configuration

Define rotas e regras

  • Routers
  • Services
  • Middlewares

👉 Muda dinamicamente (labels, arquivos, CRDs)


4. Traefik com Docker (Base sólida)

4.1 docker-compose.yml (Traefik)

version: "3.9"

services:
traefik:
image: traefik:v3.0
command:
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"

# EntryPoints
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"

# HTTPS / Let's Encrypt
- "--certificatesresolvers.le.acme.email=admin@seudominio.com"
- "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"

ports:
- "80:80"
- "443:443"

volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt

4.2 Permissões importantes

chmod 600 letsencrypt/acme.json

5. Expondo um serviço com Labels (ESSENCIAL)

5.1 Exemplo simples (HTTP)

services:
app:
image: nginx
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`app.localhost`)"
- "traefik.http.routers.app.entrypoints=web"

6. HTTPS com Let’s Encrypt (PRODUÇÃO)

6.1 Router HTTPS

labels:
- "traefik.enable=true"

# Router
- "traefik.http.routers.app.rule=Host(`app.seudominio.com`)"
- "traefik.http.routers.app.entrypoints=websecure"
- "traefik.http.routers.app.tls=true"
- "traefik.http.routers.app.tls.certresolver=le"

# Service
- "traefik.http.services.app.loadbalancer.server.port=80"

7. Redirecionar HTTP → HTTPS (OBRIGATÓRIO)

7.1 Middleware de redirect

labels:
- "traefik.http.middlewares.redirect-https.redirectscheme.scheme=https"

7.2 Router HTTP

labels:
- "traefik.http.routers.app-http.rule=Host(`app.seudominio.com`)"
- "traefik.http.routers.app-http.entrypoints=web"
- "traefik.http.routers.app-http.middlewares=redirect-https"

8. Middlewares Importantes

8.1 Basic Auth

htpasswd -nb user senha
labels:
- "traefik.http.middlewares.auth.basicauth.users=user:HASH"

Aplicando:

- "traefik.http.routers.app.middlewares=auth"

8.2 Headers de Segurança

labels:
- "traefik.http.middlewares.secure.headers.sslredirect=true"
- "traefik.http.middlewares.secure.headers.stsseconds=31536000"
- "traefik.http.middlewares.secure.headers.contenttypenosniff=true"

8.3 Rate Limit

labels:
- "traefik.http.middlewares.ratelimit.ratelimit.average=100"
- "traefik.http.middlewares.ratelimit.ratelimit.burst=50"

9. Dashboard do Traefik

9.1 Expor com segurança

labels:
- "traefik.http.routers.traefik.rule=Host(`traefik.seudominio.com`)"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.tls.certresolver=le"
- "traefik.http.routers.traefik.middlewares=auth"

10. Providers

Traefik pode consumir config de:

  • Docker ✅
  • File
  • Kubernetes
  • Consul
  • Nomad

Provider File (exemplo)

http:
routers:
app:
rule: "Host(`app.seudominio.com`)"
service: app
tls: {}

services:
app:
loadBalancer:
servers:
- url: "http://127.0.0.1:8080"