O Traefik é um moderno roteador HTTP e TCP reverso e um balanceador de carga feito para implantar microserviços com facilidade. Ele suporta vários backends (Docker, Kubernetes, etc.) para gerenciar suas configurações automaticamente e de forma dinâmica. Comparado ao Nginx, o Traefik se destaca por sua configuração dinâmica, mas ambos são excelentes ferramentas e a escolha entre eles depende das necessidades específicas do seu projeto.
Tópicos
- Pré-requisitos
- Criar os Arquivos de Configuração
- Criar o arquivo Dynamic.yml
- Criar o arquivo acme.json
- Criar o arquivo docker-compose.yml para Traefik
- Iniciar o Serviço
- Verificar a Instalação
- Testar com um aplicação
- Conclusão
Pré-requisitos
Certifique-se de que você tem o Docker e o Docker Compose instalados em seu sistema. Você pode conferir como instala-los aqui
Você também precisará ter as portas 80 e 443 abertas em seu roteador.
Também vai precisar de um dominio, você pode adquirir um gratuitamente em serviços como ClouDNS ou NIC.ua (é necessário fornecer informações de cartão de crédito).
Configurar as entradas necessárias no seu domínio, por exemplo, crie um CNAME apontando para “proxy.meudominio.com”.
Criar os Arquivos de Configuração
Crie três arquivos de configuração, traefik.yml, dynamic.yml e acme.json, no diretório de sua escolha.
Criar o arquivo Traefik.yml
/dockerapp/traefik2/traefik.yml
api:
dashboard: true
entryPoints:
http:
address: ":80"
http:
redirections:
entryPoint:
to: https
https:
address: ":443"
http:
middlewares:
- secureHeaders@file
- page-ratelimit@file
tls:
certResolver: letsencrypt
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
filename: /config/dynamic.yml
certificatesResolvers:
letsencrypt:
acme:
email: [email protected]
storage: acme.json
keyType: EC384
httpChallenge:
entryPoint: http
#caServer: https://acme-staging-v02.api.letsencrypt.org/directory
caServer: https://acme-v02.api.letsencrypt.org/directory
Aqui está uma breve explicação do que está presente neste arquivo:
- API e Dashboard:
dashboard: true
: Ativa o painel de controle do Traefik, permitindo monitorar e gerenciar o tráfego por meio de uma interface web.
- Pontos de Entrada (EntryPoints):
- Configura dois pontos de entrada, um para HTTP (porta 80) e outro para HTTPS (porta 443).
- Para o ponto de entrada HTTP, é configurado um redirecionamento automático para o ponto de entrada HTTPS.
- Configuração de HTTPS:
- Para o ponto de entrada HTTPS, são aplicados middlewares como “secureHeaders” e “page-ratelimit”, que ajudam a fortalecer a segurança e impor limites na taxa de requisições.
- Usa o certificado TLS gerenciado pelo resolvedor de certificados chamado “letsencrypt”.
- Provedores:
docker
: Configura o Traefik para obter dinamicamente informações sobre serviços e rotas a partir do Docker.file
: Indica que as configurações dinâmicas serão carregadas a partir do arquivo “dynamic.yml”.
- Resolvedor de Certificados (certificatesResolvers):
letsencrypt
: Configura o Traefik para usar o provedor de certificados Let’s Encrypt.- Inclui informações como o e-mail associado aos certificados, o armazenamento do certificado (“acme.json”), o tipo de chave (“EC384”), e a configuração do desafio HTTP.
O arquivo “dynamic.yml” especificado no provedor “file” é onde as configurações específicas dos serviços, rotas e outros detalhes dinâmicos são definidos. Essa separação permite que as alterações sejam feitas sem a necessidade de reinicialização do Traefik.
Basicamente a única alteração que você precisaria fazer nesse caso é adicionar o seu e-mail no campo correspondente;
Lembre-se de que o e-mail configurado no arquivo traefik.yml é importante, pois será usado para renovar os certificados SSL quando eles expirarem.
em seguida vamos criar o arquivo de configuração dinâmica
Criar o arquivo Dynamic.yml
/dockerapp/traefik2/config/dynamic.yml
http:
middlewares:
secureHeaders:
headers:
frameDeny: true
sslRedirect: true
browserXssFilter: true
contentTypeNosniff: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
customFrameOptionsValue: SAMEORIGIN
user-auth:
basicAuth:
users:
- "usuario:hashdasenha"
page-ratelimit:
rateLimit:
average: 50
burst: 50
tls:
options:
default:
cipherSuites:
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
minVersion: VersionTLS12
O arquivo “dynamic.yml” contém as configurações específicas para o Traefik, ajustando o comportamento do proxy reverso e do controlador de tráfego conforme necessário. Aqui está uma breve explicação do que está presente neste arquivo:
- Middlewares HTTP:
secureHeaders
: Aplica configurações de segurança nos cabeçalhos HTTP.frameDeny
: Impede que o conteúdo seja incorporado em frames.sslRedirect
: Redireciona automaticamente para HTTPS.browserXssFilter
: Ativa a filtragem de XSS no navegador.contentTypeNosniff
: Impede a interpretação MIME incorreta.forceSTSHeader
: Força a inclusão do cabeçalho Strict-Transport-Security (HSTS).stsIncludeSubdomains
: Inclui todos os subdomínios no HSTS.stsPreload
: Habilita a listagem no HSTS Preload.stsSeconds
: Define a duração em segundos do HSTS (31.536.000 segundos = 1 ano).customFrameOptionsValue
: Define a política personalizada de opções de frame como SAMEORIGIN.
user-auth
: Implementa autenticação básica para o usuário “usuario” com a senha correspondente em formato de hash.page-ratelimit
: Configura limites na taxa de requisições.average
: Média permitida de requisições por segundo.burst
: Número máximo de requisições permitidas em um curto intervalo.
- TLS (Transport Layer Security):
- Configura as opções TLS padrão.
cipherSuites
: Lista de suites de criptografia preferenciais.minVersion
: Versão mínima do TLS permitida (TLS 1.2 neste caso).
- Configura as opções TLS padrão.
Essas configurações visam fortalecer a segurança, implementar autenticação básica, controlar a taxa de requisições e garantir comunicações seguras por meio do protocolo TLS.
Você vai precisar fazer uma edição alterando onde esta usuario:hashdasenha para seu próprio usuário e senha.
Você pode gerar um hash para sua senha htpasswd usando um utilitário online ou a ferramenta htpasswd disponível na maioria dos sistemas Linux. Por exemplo, você pode usar o comando:
htpasswd -nb teste minhasenha
Neste cenário, você criaria um hash para o usuário “teste” utilizando a senha escolhida, que no exemplo foi definida como “minhasenha”.
pegue o hash gerado e altere no arquivo ex:
teste:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj
Criar Arquivo acme.json
/dockerapp/traefik2/acme/acme.json
O arquivo acme.json é usado para armazenar certificados SSL ACME. Inicialmente, este arquivo deve estar vazio. Certifique-se de que este arquivo tenha permissões de leitura e gravação apenas para o usuário root:
touch acme.json
chmod 600 acme.json
Criar o arquivo docker-compose.yml para Traefik
/dockerapp/traefik2/docker-compose.yml
version: '3.3'
services:
traefik:
image: traefik:latest
container_name: traefik
restart: always
security_opt:
- no-new-privileges:true
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /dockerapp/traefik2/traefik.yml:/traefik.yml:ro
- /dockerapp/traefik2/config:/config
- /dockerapp/traefik2/acme/acme.json:/acme.json
environment:
TZ: America/Sao_Paulo
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`proxy.meudominio.com`)"
- "traefik.http.routers.traefik-secure.service=api@internal"
- "traefik.http.routers.traefik-secure.middlewares=user-auth@file"
networks:
proxy:
external: true
No arquivo acima ele vai criar um container usando a ultima imagem do traefik
security_opt: - no-new-privileges:true
: Aplica a configuração de segurança para não permitir novos privilégios no contêiner já que ele vai rodar no docker.sock.
networks
: Define a rede externa chamada “proxy” e a marca como externa, indicando que ela já existe fora do escopo do Docker Compose.
Atualize o host para o seu domínio, onde está proxy.meudominio.com
.
Cuidado que ele esta entre acentos graves (`) e não aspas.
O sinal `
é chamado de acento grave. No contexto de programação ou formatação de texto, também pode ser conhecido como “backtick” ou “crase” em português. O nome exato pode variar dependendo do contexto linguístico ou técnico em que está sendo utilizado.
Você tem a opção de utilizar uma rede já existente ou criar uma nova , por meio do comando abaixo:
docker network create --driver=bridge proxy
Iniciar o Serviço
Agora você pode iniciar o serviço Traefik usando o Docker Compose com o seguinte comando:
docker compose up -d
Verificar a Instalação
Você pode verificar se o Traefik está funcionando corretamente acessando a interface da web do Traefik em http://proxy.meudominio.com
Testar com um aplicação
Vamos utilizar o servidor web Nginx para testar o Traefik.
- Crie uma pasta para o Nginx no seu diretório de arquivos Docker.
- Adicione o arquivo docker-compose.yml.
docker-compose.yml
version: '3'
services:
nginx:
image: nginx:latest
labels:
- traefik.enable=true
- traefik.http.routers.nginx.rule=Host(`nginx.meudominio.com`)
- traefik.http.routers.nginx.entrypoints=https
- traefik.http.routers.nginx.tls.certresolver=letsencrypt
- traefik.http.routers.nginx.middlewares=auth
networks:
- proxy
networks:
proxy:
external: true
altere para o host para o nome do seu domínio
execute o serviço usando o comando abaixo:
sudo docker compose up -d
Acesse pelo navegador a pagina https://nginx.meudominio.com
Conclusão
Parabéns! Você instalou com sucesso o Traefik usando o Docker Compose. Agora você pode começar a configurar o Traefik para atender às suas necessidades.
Não consegui. Já testei diversos tutoriais do traefik e simplesmente não funciona. DNS apontado, não consigo nem acessar a configuração do traefik, nem os outros 15 containers rodando no docker.
Analise os registros do container do Traefik para identificar possíveis problemas. Preste atenção a mensagens de erro ou alertas que possam indicar falhas na configuração.
Verifique se as portas necessárias para o funcionamento do Traefik estão abertas no seu roteador. Você pode usar ferramentas online para verificar o estado das portas.
Considere o uso de um domínio de nível superior (TLD).
Se você estiver usando um domínio gratuito, isso pode ser a causa dos problemas. Experimente com um TLD como .com para verificar se isso resolve o problema.
Caso ainda assim não funcione, considere migrar para uma solução mais simples, como o Caddy. O Caddy é conhecido por sua facilidade de uso e configuração automática de HTTPS.