Docker intermediate

Traefik Reverse Proxy con Docker Compose

Configura Traefik como un proxy inverso con certificados TLS automáticos para tus servicios Docker.

Resumen: Configurar Traefik como un proxy inverso compatible con Docker que obtiene y renueva automáticamente certificados TLS de Let’s Encrypt.

Entorno: Servidor Linux con Docker y Docker Compose instalados. Puertos 80 y 443 disponibles.

Requisitos:

  • Docker Engine 24+
  • Docker Compose v2
  • Un nombre de dominio apuntando a tu servidor
  • Puertos 80 y 443 accesibles desde internet

Pasos

1. Crear la Red de Docker

docker network create proxy

2. Estructura de Directorios

/opt/traefik/
├── docker-compose.yml
├── traefik.yml
├── config/
│   └── dynamic.yml
└── letsencrypt/

3. Configuración Estática de Traefik

Crear /opt/traefik/traefik.yml:

api:
  dashboard: true
  insecure: false

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: proxy

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web

log:
  level: INFO

4. Archivo Docker Compose

Crear /opt/traefik/docker-compose.yml:

services:
  traefik:
    image: traefik:v3.3
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro
      - ./letsencrypt:/letsencrypt
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.yourdomain.com`)"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.users=admin:${HASHED_PASSWORD}"

networks:
  proxy:
    external: true

5. Generar Contraseña de Autenticación Básica

sudo apt install apache2-utils
echo $(htpasswd -nb admin TuContraseñaSegura) | sed -e s/\\$/\\$\\$/g

6. Desplegar

cd /opt/traefik
docker compose up -d

Validación

  • Visitar https://traefik.yourdomain.com — debería mostrar el panel
  • Revisar logs: docker compose logs traefik
  • Verificar emisión de certificados TLS: docker compose exec traefik ls /letsencrypt

Reversión

cd /opt/traefik
docker compose down

Notas

  • La etiqueta traefik.http.middlewares.auth.basicauth.users requiere escape $$ en el hash de la contraseña debido a la expansión de variables de YAML/Docker Compose.
  • Para servicios solo internos, usar traefik.http.routers.service.rule=Host(...) sin exponer puertos.
  • Siempre fijar las etiquetas de imagen (como traefik:v3.3) para despliegues en producción.