Skip to main content

3 - Traefik

Compose do Traefik

Arquivo docker-compose.yml do Traefik

mkdir -p /srv/docker/core/traefik/dynamic /srv/docker/shared/certs

tee /srv/docker/core/traefik/docker-compose.yml > /dev/null <<'EOF'
version: "3.8"

services:
  traefik:
    image: traefik:v2.11
    command:
      - "--providers.docker=true"
      - "--providers.docker.swarmMode=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.file.directory=/dynamic"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--log.level=INFO"
      - "--api.dashboard=true"
      - "--api.insecure=true"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik_dynamic:/dynamic:ro
      - traefik_certs:/certs:ro
    configs:
      - source: traefik_yml
        target: /traefik.yml
        mode: 0444
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - traefik

networks:
  traefik:
    external: true

volumes:
  traefik_dynamic:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /srv/docker/core/traefik/dynamic
  traefik_certs:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /srv/docker/shared/certs

configs:
  traefik_yml:
    file: ./traefik.yml
EOF

Esse docker-compose.yml define o serviço Traefik rodando em modo Swarm. Ele se conecta ao Docker, lê configurações dinâmicas da pasta dynamic/, expõe as portas 80 e 443, e monta os volumes necessários — incluindo os certificados localizados em /srv/docker/shared/certs. A rede traefik é externa e precisa ser criada manualmente antes do deploy.

Arquivo traefik.yml – Configuração estática

tee /srv/docker/core/traefik/traefik.yml > /dev/null <<'EOF'
api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

providers:
  docker:
    swarmMode: true
    exposedByDefault: false
  file:
    directory: /dynamic
    watch: true
EOF

Este é o arquivo de configuração estática do Traefik. Define dois pontos de entrada (web e websecure), habilita o painel de controle e ativa dois providers: Docker (modo Swarm) e arquivos (/dynamic), que serão usados para a configuração TLS com certificados autoassinados.

Arquivo tls.yml – Certificado TLS estático

tee /srv/docker/core/traefik/dynamic/tls.yml > /dev/null <<'EOF'
tls:
  certificates:
    - certFile: /certs/wsl.lab.local.crt
      keyFile: /certs/wsl.lab.local.key
  stores:
    default:
      defaultCertificate:
        certFile: /certs/wsl.lab.local.crt
        keyFile: /certs/wsl.lab.local.key
EOF

Este arquivo é lido dinamicamente pelo Traefik para aplicar certificados TLS. Ele aponta para os arquivos .crt e .key armazenados em /srv/docker/shared/certs. Essa abordagem permite que você utilize certificados autoassinados em ambientes locais com HTTPS funcional.

Execute o teste para validar se o Windows pinga do nome

ping wsl.lab.local

Criar a rede overlay traefik

docker network create --driver=overlay traefik

Esse comando só precisa ser executado uma vez. Se a rede já existir, será ignorado.

Fazer o deploy do stack Traefik

docker stack deploy -c /srv/docker/core/traefik/docker-compose.yml traefik
Comandos Úteis

Atualizar (redeploy) o Traefik

docker stack deploy -c /srv/docker/core/traefik/docker-compose.yml traefik

Opcional: forçar recriação dos serviços se nada mudou no spec

docker service update --force traefik_traefik

Verificação rápida

docker stack ps traefik

Logs em tempo real (Ctrl+C para sair)

docker service logs -f traefik_traefik

Backup

sudo bash -lc 'cd /srv/docker && mkdir -p .backup \
&& TS=$(date +%F_%H-%M-%S) \
&& tar -czf ".backup/traefik-${TS}.tar.gz" \
core/traefik/docker-compose.yml core/traefik/traefik.yml core/traefik/dynamic shared/certs \
&& echo "Gerado: /srv/docker/.backup/traefik-${TS}.tar.gz"'

Restore — Traefik (último backup)

sudo bash -lc '
cd /srv/docker
BAK=$(ls -1t .backup/traefik-*.tar.gz | head -n1) || { echo "Nenhum backup traefik encontrado"; exit 1; }
echo ">> Restaurando: $BAK"
docker stack rm traefik >/dev/null 2>&1 || true
# espera o stack sumir
while docker stack ps traefik >/dev/null 2>&1; do sleep 1; done
tar -xzf "$BAK" -C /srv/docker
docker network create --driver overlay --attachable traefik 2>/dev/null || true
docker stack deploy -c core/traefik/docker-compose.yml traefik
'