docker traefik ssl Mayo 2026

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:

estructura del proyecto bash
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.

traefik.yml yaml
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.

docker-compose.yml yaml
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:

terminal bash
# 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.

ejemplo — cualquier servicio yaml
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.

← volver al blog escrito por bursao