Cómo desplegar Traefik como reverse proxy con Docker y SSL automático
Traefik es un reverse proxy moderno que se integra nativamente con Docker. La gracia es que detecta tus contenedores automáticamente y gestiona los certificados SSL con Let's Encrypt sin que tengas que tocar nada. En este artículo monto una configuración básica pero lista para producción.
¿Qué necesitas?
Un servidor con Docker y Docker Compose instalados, un dominio apuntando a tu IP y los puertos 80 y 443 abiertos. Nada más.
Estructura de archivos
Vamos a trabajar con esta estructura mínima:
traefik/
├── docker-compose.yml
├── traefik.yml
└── acme.json # se crea vacío, aquí guarda los certs
Paso 1 — El archivo de configuración de Traefik
Crea traefik.yml con la configuración base. Aquí le decimos que escuche en los puertos estándar y que use Let's Encrypt para los certificados.
api: dashboard: true entryPoints: web: address: ":80" http: redirections: entryPoint: to: websecure # redirige todo HTTP → HTTPS websecure: address: ":443" providers: docker: exposedByDefault: false # solo exponemos lo que marcamos certificatesResolvers: letsencrypt: acme: email: tu@email.com storage: /acme.json httpChallenge: entryPoint: web
Paso 2 — El docker-compose.yml
Aquí levantamos Traefik y le montamos los volúmenes necesarios. El acme.json debe existir antes de arrancar y tener permisos 600, si no Let's Encrypt falla.
services: traefik: image: traefik:v3.0 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 labels: - "traefik.enable=true" - "traefik.http.routers.dashboard.rule=Host(`traefik.tudominio.com`)" - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt" - "traefik.http.routers.dashboard.service=api@internal" networks: default: name: traefik-net external: true
⚠ importante
Antes de arrancar crea el archivo acme.json y dale los permisos correctos:
# crear la red compartida docker network create traefik-net # crear acme.json con permisos estrictos touch acme.json chmod 600 acme.json # arrancar docker compose up -d
Paso 3 — Exponer un servicio
Ahora cualquier contenedor que quieras exponer solo necesita estos labels. Traefik lo detecta solo y gestiona el certificado automáticamente.
services: mi-app: image: nginx networks: - traefik-net labels: - "traefik.enable=true" - "traefik.http.routers.mi-app.rule=Host(`app.tudominio.com`)" - "traefik.http.routers.mi-app.tls.certresolver=letsencrypt" networks: traefik-net: external: true
// resultado
Con esto tienes https://app.tudominio.com funcionando con certificado SSL válido en cuestión de segundos. Let's Encrypt emite el cert la primera vez que entra tráfico al dominio.
Conclusión
Traefik elimina toda la fricción de gestionar nginx como reverse proxy a mano. No más bloques server {}, no más certbot corriendo en cron. Una vez que lo tienes montado, exponer un nuevo servicio es añadir tres labels al compose y listo.
Para entornos con varios servicios Docker es, sin duda, la opción más cómoda que he probado.