Poupe até 53% em Servidores VPS, escolha agora. Oferta limitada.

Checklist: como configurar Traefik como proxy reverso para Docker

17 min de leitura  ·  Guia técnico

Traefik como proxy reverso para Docker é uma solução de roteamento dinâmico que detecta automaticamente novos containers via labels, gerencia certificados SSL com Let's Encrypt e elimina a necessidade de recarregar configurações manualmente. Para configurar o Traefik como proxy reverso no Docker, siga estes passos:

  1. Instale o Docker e o Docker Compose no servidor
  2. Crie a rede Docker externa compartilhada entre os serviços
  3. Crie o arquivo traefik.yml com entrypoints, providers e resolvers SSL
  4. Suba o container do Traefik via docker-compose.yml com o socket do Docker montado
  5. Adicione labels de roteamento nos containers das aplicações
  6. Valide o roteamento e os certificados pelo dashboard do Traefik

Pré-requisitos para configurar o Traefik como proxy reverso

  • Servidor VPS ou dedicado com Linux (Debian 12, Ubuntu 22.04 ou Ubuntu 24.04 LTS recomendados)
  • Docker Engine instalado (versão 24 ou superior) — veja o artigo Como Instalar e Configurar o Docker no VPS Linux para Hospedar Aplicações
  • Docker Compose v2 instalado (docker compose version deve retornar v2.x)
  • Acesso root ou usuário com permissão sudo e no grupo docker
  • Domínio(s) com registro DNS tipo A apontando para o IP do servidor
  • Portas 80 e 443 liberadas no firewall (UFW, nftables ou CSF)
  • Endereço de e-mail válido para registro no Let's Encrypt

Entendendo a arquitetura do Traefik com Docker

O Traefik atua como edge router: ele escuta nas portas 80 e 443 do host e encaminha requisições HTTP/HTTPS para os containers corretos com base em regras de roteamento definidas por labels. Diferente do Nginx configurado manualmente, o Traefik usa o socket do Docker para observar eventos em tempo real — quando um container sobe ou desce, o Traefik atualiza suas rotas automaticamente, sem restart.

A arquitetura básica envolve três conceitos centrais:

  • Entrypoints: pontos de entrada de tráfego (porta 80 para HTTP, porta 443 para HTTPS)
  • Routers: regras que associam um domínio ou path a um serviço (definidos por labels no container)
  • Services: o backend real — o container e a porta interna que receberá o tráfego

Além disso, o Traefik possui middlewares que permitem redirecionar HTTP para HTTPS, adicionar headers de segurança, limitar taxa de requisições e muito mais, tudo via labels no docker-compose.yml.

Para ambientes com múltiplos sites em containers, essa abordagem é mais eficiente do que manter arquivos de configuração do Nginx para cada virtual host. Se você ainda usa Nginx como proxy reverso estático, o artigo Como Configurar um Servidor Proxy Reverso com Nginx no VPS Linux oferece uma boa base comparativa.

Passo 1 — Criar a rede Docker e a estrutura de diretórios

O Traefik precisa de uma rede Docker externa para se comunicar com os containers das aplicações. Crie essa rede antes de qualquer coisa:

docker network create traefik-public

Em seguida, crie o diretório de trabalho do Traefik e o arquivo que armazenará os certificados SSL:

mkdir -p /opt/traefik
touch /opt/traefik/acme.json
chmod 600 /opt/traefik/acme.json

Atenção: o arquivo acme.json deve ter permissão 600 obrigatoriamente. O Traefik recusa iniciar se as permissões estiverem incorretas, pois esse arquivo armazena chaves privadas dos certificados TLS.

Output esperado ao verificar as permissões:

ls -la /opt/traefik/acme.json
-rw------- 1 root root 0 Jan 15 10:00 /opt/traefik/acme.json

Passo 2 — Criar o arquivo de configuração estática traefik.yml

A configuração estática do Traefik define os entrypoints, o provider Docker e o resolver de certificados. Crie o arquivo /opt/traefik/traefik.yml com o seguinte conteúdo:

api:
  dashboard: true
  insecure: false

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: traefik-public

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]
      storage: /acme.json
      httpChallenge:
        entryPoint: web

log:
  level: INFO

Pontos importantes desta configuração:

  • exposedByDefault: false — o Traefik só roteia containers que tiverem a label traefik.enable=true, evitando exposição acidental
  • O redirecionamento automático de HTTP para HTTPS está configurado no entrypoint web
  • Substitua [email protected] pelo seu e-mail real para receber alertas de renovação do Let's Encrypt
  • O httpChallenge usa a porta 80 para validação do domínio — certifique-se de que a porta 80 está acessível publicamente

Passo 3 — Criar o docker-compose.yml do Traefik

Com a configuração estática pronta, crie o arquivo /opt/traefik/docker-compose.yml para subir o container do Traefik:

version: "3.8"

services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro
      - ./acme.json:/acme.json
    networks:
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.seudominio.com`)"
      - "traefik.http.routers.dashboard.entrypoints=websecure"
      - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$hashedpassword"

networks:
  traefik-public:
    external: true

Atenção: o socket do Docker é montado como somente leitura (:ro) por segurança. O acesso ao socket concede controle total sobre o Docker — nunca exponha o dashboard sem autenticação. Para gerar o hash da senha do basicauth, use:

echo $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g

Substitua o valor em basicauth.users pelo output gerado. Suba o Traefik:

cd /opt/traefik
docker compose up -d

Output esperado:

[+] Running 2/2
 ✔ Network traefik-public  Created
 ✔ Container traefik        Started

Verifique se o container está rodando:

docker compose ps
NAME      IMAGE          COMMAND                  SERVICE   STATUS    PORTS
traefik   traefik:v3.0   "/entrypoint.sh trae…"   traefik   running   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp

Passo 4 — Adicionar uma aplicação com labels de roteamento

Com o Traefik em execução, qualquer container pode ser roteado adicionando labels no seu docker-compose.yml. Veja um exemplo com uma aplicação Node.js rodando na porta 3000:

version: "3.8"

services:
  minha-app:
    image: minha-imagem:latest
    container_name: minha-app
    restart: unless-stopped
    networks:
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.minha-app.rule=Host(`app.seudominio.com`)"
      - "traefik.http.routers.minha-app.entrypoints=websecure"
      - "traefik.http.routers.minha-app.tls.certresolver=letsencrypt"
      - "traefik.http.services.minha-app.loadbalancer.server.port=3000"

networks:
  traefik-public:
    external: true

Explicação das labels essenciais:

  • traefik.enable=true — habilita o roteamento para este container
  • traefik.http.routers.minha-app.rule=Host(...) — define o domínio que aciona esta rota
  • traefik.http.routers.minha-app.tls.certresolver=letsencrypt — solicita certificado SSL automaticamente
  • traefik.http.services.minha-app.loadbalancer.server.port=3000 — porta interna do container onde a aplicação escuta

Suba a aplicação:

docker compose up -d

Em segundos, o Traefik detecta o novo container, solicita o certificado ao Let's Encrypt e começa a rotear https://app.seudominio.com para a aplicação. Não é necessário reiniciar o Traefik.

Passo 5 — Configurar múltiplos domínios no mesmo VPS

O roteamento por múltiplos domínios com Traefik é um dos principais casos de uso em VPS com vários projetos. Cada serviço recebe suas próprias labels, e o Traefik gerencia os certificados de forma independente. Exemplo com dois serviços distintos:

version: "3.8"

services:
  blog:
    image: wordpress:6.5
    container_name: blog
    restart: unless-stopped
    networks:
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.blog.rule=Host(`blog.seudominio.com`)"
      - "traefik.http.routers.blog.entrypoints=websecure"
      - "traefik.http.routers.blog.tls.certresolver=letsencrypt"
      - "traefik.http.services.blog.loadbalancer.server.port=80"

  api:
    image: minha-api:latest
    container_name: api
    restart: unless-stopped
    networks:
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.seudominio.com`)"
      - "traefik.http.routers.api.entrypoints=websecure"
      - "traefik.http.routers.api.tls.certresolver=letsencrypt"
      - "traefik.http.services.api.loadbalancer.server.port=8080"

networks:
  traefik-public:
    external: true

Cada router tem um nome único (blog, api) e regras independentes. O Traefik emite um certificado SSL separado para cada domínio via Let's Encrypt. Você pode adicionar quantos serviços precisar sem alterar a configuração do Traefik em si.

Passo 6 — Verificar logs e validar o funcionamento

Após subir os serviços, verifique os logs do Traefik para confirmar que os certificados foram emitidos e as rotas estão ativas:

docker logs traefik --tail 50

Procure por linhas como:

time="2025-01-15T10:05:00Z" level=info msg="Configuration loaded from file" file=/traefik.yml
time="2025-01-15T10:05:02Z" level=info msg="Obtaining ACME certificate" domain=app.seudominio.com
time="2025-01-15T10:05:08Z" level=info msg="Certificate obtained successfully" domain=app.seudominio.com

Para verificar o roteamento ativo via API do Traefik:

curl -s http://localhost:8080/api/http/routers | python3 -m json.tool

Teste o redirecionamento HTTP para HTTPS:

curl -I http://app.seudominio.com
HTTP/1.1 301 Moved Permanently
Location: https://app.seudominio.com/

E valide o certificado SSL:

curl -I https://app.seudominio.com
HTTP/2 200
server: traefik

Problemas comuns e como resolver

Sintoma: container não aparece nas rotas do Traefik

Causa: o container não está na rede traefik-public ou a label traefik.enable=true está ausente. Com exposedByDefault: false no traefik.yml, apenas containers com essa label são roteados.
Solução: verifique se o container está conectado à rede correta com docker inspect nome-container | grep -A 10 Networks. Confirme que a label traefik.enable=true está presente no docker-compose.yml e que o nome da rede no compose bate com a rede externa criada.

Sintoma: certificado SSL não é emitido — erro "acme: error 403"

Causa: o domínio não está apontando para o IP do servidor, ou a porta 80 está bloqueada no firewall. O Let's Encrypt precisa acessar o servidor via HTTP na porta 80 para validar o domínio pelo httpChallenge.
Solução: confirme o DNS com dig +short app.seudominio.com — deve retornar o IP do servidor. Verifique se a porta 80 está aberta: ufw status ou nft list ruleset. Se o servidor estiver atrás de um NAT ou load balancer, considere usar o tlsChallenge ou dnsChallenge no lugar do httpChallenge.

Sintoma: Traefik não inicia — erro "acme.json: unsafe permissions"

Causa: o arquivo acme.json tem permissões diferentes de 600. O Traefik recusa iniciar para proteger as chaves privadas dos certificados.
Solução: execute chmod 600 /opt/traefik/acme.json e reinicie o container com docker compose restart traefik. Verifique com ls -la /opt/traefik/acme.json que a permissão está correta antes de subir novamente.

Sintoma: rota retorna 404 mesmo com labels corretas

Causa: conflito de nomes de routers ou serviços entre containers. Dois containers com o mesmo nome de router causam comportamento indefinido.
Solução: certifique-se de que cada container usa um nome único nas labels (ex: traefik.http.routers.blog, traefik.http.routers.api). Verifique os routers ativos via dashboard do Traefik em https://traefik.seudominio.com ou via API em http://localhost:8080/api/http/routers.

Sintoma: loop de redirecionamento (ERR_TOO_MANY_REDIRECTS)

Causa: o container da aplicação também está tentando redirecionar HTTP para HTTPS internamente, criando um loop com o redirecionamento já configurado no Traefik.
Solução: desative o redirecionamento HTTPS dentro da aplicação (ex: no WordPress, remova o force_ssl ou ajuste o wp-config.php). O Traefik já cuida do redirecionamento na camada de proxy — a aplicação deve receber apenas tráfego HTTP internamente.

Perguntas frequentes sobre Traefik como proxy reverso para Docker

O Traefik substitui o Nginx como proxy reverso para Docker?

O Traefik foi projetado especificamente para ambientes de containers e detecta automaticamente novos serviços via labels do Docker, sem necessidade de recarregar configuração. O Nginx pode ser usado como proxy reverso para Docker, mas exige configuração manual a cada novo container. Para ambientes com múltiplos serviços em containers, o Traefik é mais prático; para sites estáticos ou aplicações sem containers, o Nginx continua sendo uma escolha sólida.

O Traefik emite certificado SSL automaticamente?

Sim. O Traefik possui integração nativa com o Let's Encrypt via protocolo ACME. Ao configurar um resolver de certificados no arquivo traefik.yml e adicionar a label traefik.http.routers.meu-app.tls.certresolver=letsencrypt no container, o Traefik solicita, emite e renova o certificado TLS automaticamente, sem intervenção manual.

Como o Traefik roteia requisições para o container correto?

O Traefik lê as labels definidas em cada container no docker-compose.yml para determinar o roteamento. A label traefik.http.routers.nome.rule define a regra de roteamento, como Host(`meudominio.com`). Quando uma requisição chega na porta 80 ou 443, o Traefik verifica qual container corresponde à regra e encaminha o tráfego para a porta interna do serviço.

É possível usar o Traefik com múltiplos domínios no mesmo VPS?

Sim. O Traefik suporta múltiplos domínios e subdomínios simultaneamente. Cada container pode ter sua própria regra de roteamento baseada em Host, Path ou combinação de ambos. Basta definir labels distintas em cada serviço no docker-compose.yml e o Traefik gerencia o roteamento e os certificados SSL de forma independente para cada domínio.

O Traefik funciona sem Docker Swarm ou Kubernetes?

Sim. O Traefik funciona perfeitamente com Docker standalone (sem Swarm ou Kubernetes) em um único VPS. Basta configurar o provider docker no traefik.yml e montar o socket do Docker no container do Traefik. Essa é a configuração mais comum para VPS com múltiplos sites ou aplicações em containers.

Conclusão

  • Configure a rede externa e o acme.json antes de subir o Traefik — permissão 600 no arquivo de certificados é obrigatória e o Traefik recusará iniciar sem ela.
  • Use exposedByDefault: false sempre — isso garante que apenas containers explicitamente marcados com traefik.enable=true sejam expostos, evitando vazamentos acidentais de serviços internos.
  • Valide logs e rotas após cada deploy — o comando docker logs traefik --tail 50 e o dashboard em https://traefik.seudominio.com são os primeiros lugares para diagnosticar problemas de roteamento ou emissão de certificados.

Leia também

Precisa de ajuda com Docker e proxy reverso no VPS?

Configurar o Traefik corretamente exige atenção a detalhes de rede, permissões e DNS. Um VPS com recursos adequados e suporte técnico especializado faz toda a diferença para manter seus containers rodando com estabilidade e segurança.

Conheça os planos de VPS da AviraHost e hospede seus containers com performance

  • 0 Os usuários acharam isso útil
  • Traefik, Docker, proxy-reverso, containers, AviraHost
Esta resposta foi útil?

Artigos Relacionados

Otimizar cache Redis para aplicações PHP no Ubuntu 22.04

Para otimizar o cache Redis para aplicações PHP no Ubuntu 22.04, instale e configure o Redis,...

Configurar Alertas Automáticos com Zabbix no Ubuntu

Para configurar alertas automáticos com Zabbix no Ubuntu, instale o Zabbix Server, configure...

Otimizar MySQL: como reduzir uso de memória e acelerar consultas

Otimizar MySQL é o processo de ajustar configurações e consultas para reduzir o consumo de...

Entenda o que é Swap no Linux: como funciona e quando usar

Swap no Linux é um espaço em disco usado como extensão da memória RAM quando esta se esgota. O...

Guia Definitivo: Configurar Nginx como Proxy Reverso

Para configurar o Nginx como proxy reverso, instale o Nginx, crie um arquivo de configuração de...