Aqui está um tutorial completo em formato .md para facilitar a configuração de um serviço genérico com Docker Compose e Traefik. Esse documento explica cada etapa e como ajustar o template para seu próprio serviço.
Este tutorial ensina a configurar um serviço qualquer usando Docker Compose e Traefik como proxy reverso, com suporte a HTTPS e redirecionamento automático de HTTP para HTTPS. O objetivo é facilitar a adaptação para diferentes serviços, bastando alterar variáveis como o nome do serviço, a imagem e o domínio.
- Docker e Docker Compose instalados.
- Rede externa Docker já criada para uso do Traefik e dos serviços:
docker network create minha_rede
- Domínio configurado e apontado para o IP do servidor, se desejar acesso via HTTPS.
Este arquivo define:
- O serviço que você deseja executar.
- Configurações específicas para o Traefik atuar como proxy reverso e aplicar HTTPS.
O Traefik é configurado com uma configuração dinâmica que inclui:
- Roteamento baseado em domínio/subdomínio.
- Certificado SSL automático (usando Let's Encrypt).
- Redirecionamento automático de HTTP para HTTPS.
Aqui está a estrutura básica do arquivo docker-compose.yml para o seu serviço genérico.
version: "3.7"
services:
# Serviço genérico - Substitua `nome_servico` e `PORTA_INTERNA` conforme necessário
nome_servico:
image: NOME_DA_IMAGEM # Exemplo: dpage/pgadmin4
environment:
- ENV_VAR1=valor1 # Substitua por variáveis específicas do serviço, se necessário
- ENV_VAR2=valor2
networks:
- minha_rede # Rede externa para comunicação com Traefik e outros serviços
ports:
- "PORTA_EXTERNA:PORTA_INTERNA" # Exemplo: "8080:80"
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
resources:
limits:
cpus: "0.5"
memory: 512M
labels:
- "traefik.enable=true" # Habilita o serviço no Traefik
- "traefik.http.routers.nome_servico-router.rule=Host(`subdominio.dominio.com`)" # Exemplo: myapp.mydomain.com
- "traefik.http.routers.nome_servico-router.entryPoints=web,websecure"
- "traefik.http.routers.nome_servico-router.tls.certResolver=default"
- "traefik.http.services.nome_servico-service.loadbalancer.server.port=PORTA_INTERNA" # Porta interna do contêiner
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" # Redireciona HTTP para HTTPS
networks:
minha_rede:
external: true
name: minha_rede- Substitua
nome_servico: Este é o identificador do seu serviço. Escolha um nome representativo. - Imagem do Serviço (
NOME_DA_IMAGEM): A imagem Docker que o serviço usará (ex.:nginx,dpage/pgadmin4, etc.). - Variáveis de Ambiente (
ENV_VAR1,ENV_VAR2): Variáveis específicas do serviço. Adicione ou remova conforme necessário. - Portas (
PORTA_EXTERNA:PORTA_INTERNA): Mapeie as portas conforme seu serviço.PORTA_EXTERNAé a porta do host;PORTA_INTERNAé a porta interna do serviço. - Traefik Labels:
traefik.http.routers.nome_servico-router.rule=Host("subdominio.dominio.com"): Substituasubdominio.dominio.compelo domínio ou subdomínio do seu serviço.traefik.http.routers.nome_servico-router.entryPoints: Define as entradas (HTTP e HTTPS).traefik.http.routers.nome_servico-router.tls.certResolver=default: Gera certificado SSL automaticamente com o resolver configurado.traefik.http.services.nome_servico-service.loadbalancer.server.port: Porta interna do serviço para o Traefik rotear.
Para permitir o roteamento e redirecionamento de HTTP para HTTPS, adicione a configuração dinâmica para o Traefik. Você pode incluir diretamente no docker-compose.yml, mas para modularidade, pode criar um arquivo dynamic_conf.yml:
http:
routers:
nome_servico-router:
rule: "Host(`subdominio.dominio.com`)" # Substitua pelo subdomínio e domínio desejado
entryPoints:
- web
- websecure
tls:
certResolver: default # Certificado SSL automático (ACME)
middlewares:
- redirect-to-https # Middleware para redirecionar HTTP para HTTPS
service: nome_servico-service
services:
nome_servico-service:
loadBalancer:
servers:
- url: "http://nome_servico:PORTA_INTERNA" # Substitua `PORTA_INTERNA` pela porta interna do serviço
middlewares:
redirect-to-https:
redirectScheme:
scheme: https-
Router:
- Nome do Router: Substitua
nome_servico-routerpelo nome do seu serviço. - Regra (
rule): Configuresubdominio.dominio.comcom o domínio ou subdomínio desejado para acessar o serviço. - Certificado SSL:
certResolver: defaultusa o resolver configurado no Traefik para emitir certificados SSL automaticamente (via Let's Encrypt).
- Nome do Router: Substitua
-
Service:
- LoadBalancer: Defina
nome_servicoePORTA_INTERNApara o nome e porta interna do contêiner, respectivamente. Isso permite que o Traefik direcione o tráfego para o serviço correto.
- LoadBalancer: Defina
-
Middleware:
- Redirecionamento HTTPS:
redirect-to-httpsredireciona automaticamente o tráfego HTTP para HTTPS, garantindo a segurança da conexão.
- Redirecionamento HTTPS:
Para iniciar o serviço, execute o comando:
docker-compose up -dEsse comando:
- Inicia o contêiner do seu serviço.
- Configura o Traefik para atuar como proxy reverso com HTTPS.
- Expõe o serviço no domínio/subdomínio configurado.
- Acesse o serviço usando o domínio ou subdomínio configurado (ex.:
https://subdominio.dominio.com). - Verifique se o Traefik aplicou corretamente o redirecionamento e o certificado SSL.
Para rodar o pgAdmin com Traefik, precisamos de dois arquivos:
- docker-compose.yml: Define o serviço
pgAdmin, incluindo configurações de rede, variáveis de ambiente, portas e labels específicas para o Traefik. - dynamic_conf.yml: Configuração dinâmica de Traefik, especificando regras de roteamento, middlewares e serviços.
Para configurar o pgAdmin usando este template, o docker-compose.yml ficaria assim:
version: "3.7"
services:
pgadmin:
image: dpage/pgadmin4
environment:
- PGADMIN_DEFAULT_EMAIL=admin@example.com
- PGADMIN_DEFAULT_PASSWORD=securepassword
networks:
- minha_rede
ports:
- "8080:80"
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
resources:
limits:
cpus: "0.5"
memory: 512M
labels:
- "traefik.enable=true"
- "traefik.http.routers.pgadmin-router.rule=Host(`pgadmin.example.com`)"
- "traefik.http.routers.pgadmin-router.entryPoints=web,websecure"
- "traefik.http.routers.pgadmin-router.tls.certResolver=default"
- "traefik.http.services.pgadmin-service.loadbalancer.server.port=80"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
networks:
minha_rede:
external: true
name: minha_redeservices.pgadmin: Define o contêinerpgAdmin.image: A imagemdpage/pgadmin4é usada para criar o serviço.environment: Configura variáveis de ambiente para o pgAdmin. Altere para seu email e senha.networks: Conecta opgAdminà redeminha_redepara comunicação com o Traefik.ports: Expõe a porta interna80dopgAdminna porta8080do host.deploy: Define o modoreplicatede aloca limites de CPU e memória.labels: Configurações específicas para o Traefik:"traefik.enable=true": Habilita o serviço no Traefik."traefik.http.routers.pgadmin-router.rule=Host('pgadmin.example.com')": Define que o serviço responde apgadmin.example.com."traefik.http.routers.pgadmin-router.entryPoints=web,websecure": Configura o roteador para HTTP e HTTPS."traefik.http.routers.pgadmin-router.tls.certResolver=default": Solicita certificados SSL via Let's Encrypt."traefik.http.services.pgadmin-service.loadbalancer.server.port=80": Configura o Traefik para rotear o tráfego para a porta80interna dopgAdmin."traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https": Redireciona HTTP para HTTPS.
Exemplo de Serviço com pgAdmin exemplo do arquivo dynamic_conf.yml completo para o serviço pgAdmin, usando as configurações do tutorial.
http:
routers:
pgadmin-router:
rule: "Host(`pgadmin.example.com`)" # Substitua com o domínio/subdomínio desejado
entryPoints:
- web
- websecure
tls:
certResolver: default # Resolver SSL para certificado HTTPS
middlewares:
- redirect-to-https # Middleware para redirecionar HTTP para HTTPS
service: pgadmin-service
services:
pgadmin-service:
loadBalancer:
servers:
- url: "http://pgadmin:80" # Porta interna do serviço pgAdmin
middlewares:
redirect-to-https:
redirectScheme:
scheme: https-
Router (
pgadmin-router):rule: Define a regra de domínio/subdomínio para acessar o serviço.entryPoints: Define os pontos de entrada para HTTP (web) e HTTPS (websecure).tls: Configura o Traefik para solicitar um certificado SSL.middlewares: Inclui o middleware de redirecionamento para HTTPS.service: Roteia o tráfego para opgadmin-service.
-
Service (
pgadmin-service):url: Define o URL interno para o serviçopgAdmin, acessando-o pela porta 80.
-
Middlewares:
redirect-to-https: Força o redirecionamento de HTTP para HTTPS para garantir que todas as conexões sejam seguras.
Esse exemplo de dynamic_conf.yml pode ser adaptado para outros serviços, alterando o nome do serviço, domínio e portas conforme necessário.
Esse template facilita a configuração de serviços usando Docker e Traefik com suporte para HTTPS. Basta ajustar as variáveis principais no docker-compose.yml e no dynamic_conf.yml para adaptar a qualquer serviço que precise de um domínio, SSL, e proxy reverso.
Este tutorial fornece uma base sólida para usar Docker Compose e Traefik em diferentes cenários, e cada seção foi pensada para que você possa adaptar a qualquer necessidade específica do seu serviço.