Como Instalar Traefik com Docker

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

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:

  1. 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.
  2. 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.
  3. 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”.
  4. 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”.
  5. 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:

  1. 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.
  2. 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).

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.

  1. Crie uma pasta para o Nginx no seu diretório de arquivos Docker.
  2. 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.

2 comentários em “Como Instalar Traefik com Docker”

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

    Responder
    • 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.

      Responder

Deixe um comentário