Traefik

Traefik es un proxy inverso compatible con Docker que incluye su propio panel de supervisión. Es además un balanceador de carga adaptado a la computación en la nube mediante microservicios. Traefik se integra con los principales componentes de infraestructura configurándose a sí mismo automáticamente y de forma dinámica. Traefik es simple de operar pero capaz de manejar sistemas complejos y grandes en entornos diversos y diferentes capas de la pila de red como HTTP, TCP o UDP. Proporciona funcionalidades de intermediario que aumenta sus capacidades para realizar balanceo de carga o servir como gateway API.
Como proxy inverso intercepta las peticiones entrantes y las redirige a los servicios adecuados. A diferencia de proxys inversos configurados de forma estática, Traefik usa descubrimiento de servicios para configurarse a sí mismo según los servicios en ejecución. Puede hacer de proxy en diferentes capas de la pila de red proporcionando funcionalidades como balanceo de carga, limitación de peticiones, circuit breaker, duplicación o mirroring, autenticación y más. También soporta terminación de SSL y puede usar un proveedor ACME como Let’s Encrypt para la generación automática de certificados.
Enlaces
https://doc.traefik.io/traefik/
groales/traefik - traefik - ICT
Requisitos
- Docker instalado
- Redirección de los puertos TCP 80 y 443 (http, https) hacia el servidor docker
- Un registro DNS wildcard o comodín (catch-all DNS record) es un registro en una zona DNS que puede coincidir con consultas de nombres de dominio inexistentes. Se crea utilizando el símbolo * en el extremo izquierdo de un nombre de dominio, por ejemplo: *. dominio.com.
Traefik es un reverse proxy moderno y ligero que detecta servicios Docker automáticamente y los expone vía HTTP/HTTPS con reglas declarativas (labels) y certificados TLS automáticos con Let's Encrypt.
Características
- 🔒 HTTPS automático con Let's Encrypt (HTTP-01)
- 🧠 Descubrimiento automático de servicios Docker
- 🧷 Redirección HTTP→HTTPS
- 🧰 Dashboard web (seguro por dominio)
- 🧩 Middlewares: auth básica, headers de seguridad, rate limit, etc.
Requisitos
- Docker + Docker Compose
- Red Docker externa
proxy - Dominio apuntando al servidor (para dashboard y certificados)
- Puertos 80 y 443 accesibles desde Internet
Arquitectura
Internet → Traefik (80/443) → Servicios (en red proxy)
Despliegue
1) Crear red proxy
docker network create proxy
2) Clonar y configurar
git clone https://git.ictiberia.com/groales/traefik
cd traefik
# Crear carpeta para ACME
mkdir -p letsencrypt
touch ./letsencrypt/acme.json
chmod 600 ./letsencrypt/acme.json
3) Editar configuración
IMPORTANTE: Antes de desplegar, edita los siguientes archivos con tus datos reales:
traefik.yml:
certificatesResolvers:
letsencrypt:
acme:
email: tu-email@tudominio.com # ← EDITA AQUÍ
docker-compose.yaml:
labels:
- "traefik.http.routers.traefik.rule=Host(`traefik.tudominio.com`)" # ← EDITA AQUÍ
4) Desplegar
docker network create proxy # Si no existe
docker compose up -d
Traefik dispone de los siguientes archivos de configuración:
- traefik.yml: fichero de configuración estática. Este fichero define los puertos en que Traefik estará escuchando (Entrypoints), la parte de obtención de certificados a través de Let’s Ecrypt, etc.
- traefik_dynamic.yml: fichero de configuración dinámica. Contiene configuración de parámetros que pueden cambiar durante la ejecución, como middlewares, rutas para servicios externos que no están en Docker, etc.
- acme.json: Almacena los certificados que Traefik genera para cada uno de nuestro servicios.
traefik.yml
En la ruta /var/lib/docker/volumes/traefik_config/_data crea el fichero traefik.ymlcon el contenido:
# Traefik Dashboard
api:
dashboard: true
insecure: true
# Puertos de escucha de Traefik y redirección automatica
entryPoints:
web:
address: ':80'
http:
redirections:
entryPoint:
to: websecure
scheme: https
priority: 100
websecure:
address: ':443'
# Certificates from an ACME server
certificatesResolvers:
letsencrypt:
acme:
email: 'email@email.com'
storage: /etc/ssl/certs/acme.json
tlsChallenge: {}
providers:
docker:
watch: true
network: proxy
exposedByDefault: false # No expone los contenedores por defecto
file:
filename: /etc/traefik/traefik_dynamic.yml
watch: true
log:
level: INFO
accessLog: {}
traefik_dynamic.yml
En la ruta /var/lib/docker/volumes/traefik_config/_data crea el fichero traefik_dynamic.ymlcon el contenido:
http:
# Traefik Middlewares
middlewares:
# Usuarios con validacion basica
simpleAuth:
basicAuth:
users:
- 'admin:$apr1$Bc8RJ6KW$.XVxhYuIvbz6Llz9tZ.451'
# Whitelist para los rangos de IPs privadas
privateIPs:
IPAllowList:
sourceRange:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
# Lineas para certificado custom. Eliminar si no usa
tls:
certificates:
- CertFile: /certificate.crt
KeyFile: /certificate.key
Para poder haver una validación de usuario básica y validarnos en el panel web de Traefik, usaremos el "middleware simpleAuth"
Generamos el hash y lo incluimos en el fichero traefik_dynamic.yml
openssl passwd -apr1 SuperSecreta123
$apr1$Bc8RJ6KW$.XVxhYuIvbz6Llz9tZ.451
Si queremos añadir servicios externos al entorno docker añadimos "routers" y "services"
serversTransports:
insecureTransport:
insecureSkipVerify: true
# routers para servicios externos
routers:
other_service:
rule: Host(`other_service.domain.com`)
middlewares:
- privateIPs
service: other_service
tls:
certResolver: letsencrypt
# servicios externos
services:
other_service:
loadBalancer:
serversTransport: insecureTransport
servers:
- url: 'https://x.x.x.x'
Portainer
Add a new stack – Portainer Documentation
Web editor
En Portainer «Stack» agregamos nuevo usando el editor WEB pegando el contenido del fichero docker-compose y el contenido del fichero de variables

docker-compose
services:
traefik:
image: traefik
container_name: traefik
restart: always
ports:
- "80:80"
- "443:443"
- "8080:8080" # Dashboard
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik_config:/etc/traefik
- traefik_certs:/etc/ssl/certs
networks:
- proxy
volumes:
traefik_config:
external: true
traefik_certs:
external: true
networks:
proxy:
external: true
Para publicar el dashboard detrás del propio Traefik, deberás añadir al fichero docker-compose.yaml las siguientes etiquetas al servicio
labels:
- traefik.enable=true
- traefik.http.routers.api.rule=Host(`traefik.dominio.com`)
- traefik.http.routers.api.service=api@internal
- traefik.http.routers.api.tls=true
- traefik.http.routers.api.tls.certresolver=letsencrypt
- traefik.http.routers.api.middlewares=simpleAuth@file,privateIPs@file
NAT Hairpinning
-
IP origen: 192.168.5.1
-
IP destino: 192.168.5.5

