Saltar a contenido

Proxy Inverso — Traefik v2.11

Esta guía detalla el funcionamiento del proxy Traefik implementado en el ecosistema Timeliber. Traefik reemplaza a Nginx simplificando el Service Discovery y proveyendo certificados SSL automáticos con Let's Encrypt para no tener que renovarlos manualmente.

⚠️ Ubicación real de Traefik: el servicio Traefik corre FUERA del workspace, en ~/traefik/docker-compose.yml. La carpeta infra/traefik/ actualmente está vacía (legacy — registrado en TECH_DEBT.md como INFRA-DOC3). Las labels Traefik (traefik.enable=true, etc.) sí viven en cada docker-compose.yml de los servicios expuestos — eso es service discovery, no contraría que Traefik viva externo. Detalle de redes → networks-architecture.md §4.

El Flujo Completo de una Petición HTTP

Cuando un usuario realiza una solicitud, el flujo de vida de la petición es el siguiente:

  1. DNS y Entrada: El cliente localiza la IP del servidor mediante los registros DNS del dominio. La petición llega a Traefik en el servidor, escuchando en los puertos públicos 80 o 443.
  2. Evaluación de Routers: Traefik evalúa la ruta entrante consultando sus routers. El router compara dominios (Host(\travel.timeliber.com.co`)) y opcionalmente prefijos de rutas (PathPrefix(`/api`)`).
  3. Resolución SSL: Si es encriptado (websecure, 443), el router utiliza su certresolver (Let's Encrypt) para buscar o renovar el certificado SSL y desencriptar la petición.
  4. Pasaje al Servicio Interno: Tras emparejar la petición HTTP con el router adecuado, el tráfico se deriva al servicio subyacente de Docker usando su balanceador interno.
  5. Red Interna de Redirección: El servidor redirige la petición al container de destino utilizando la red de Docker compartida proxy-net apuntando al puerto-interno.

Qué es cada Label y para qué sirve

Para que Traefik descubra servicios expuestos, solo hace falta agregar estos labels en el docker-compose.yml del contenedor:

  • "traefik.enable=true": Indica a Traefik que debe gestionar el tráfico de este contenedor. Por defecto está restringido para no tomar control sobre contenedores no deseados.
  • "traefik.http.routers.<app-name>.rule=Host(\dominio`) && PathPrefix(`/ruta`)`: Define la ruta lógica. Asigna el dominio al cual va a responder este contenedor.
  • "traefik.http.routers.<app-name>.entrypoints=websecure": Fuerza al servicio a utilizar el punto de entrada TLS, es decir, HTTPS bajo el puerto 443.
  • "traefik.http.routers.<app-name>.tls.certresolver=letsencrypt": Instruye a Traefik generar automáticamente certificados SSL para este host usando Let's Encrypt a través del certresolver configurado.
  • "traefik.http.services.<app-name>.loadbalancer.server.port=<puerto-interno>": Especifica qué puerto expone internamente el contenedor a la red proxy-net donde Traefik enviará el tráfico final.

Por qué los containers necesitan estar en proxy-net

Docker utiliza el aislamiento de red nativo. A pesar de los labels de service discovery, Traefik no interactúa mediante la red virtual pública con el host del servidor.

Traefik requiere pertenecer a la misma subred interna (bridge network) del contenedor para poder alcanzar su IP privada. proxy-net asume esta responsabilidad. Si el contenedor no interactúa con Traefik sobre proxy-net compartida, el proxy regresará un "Bad Gateway" o "Gateway Timeout" en las respuestas de cara al cliente por no alcanzar el host aislado.

Dashboard y Configuración en Caliente

Una de las grandes fortalezas de Traefik es poder visualizar en tiempo real su estado operativo mediante el dashboard disponible en https://traefik.timeliber.com.co.

Cómo ver los routers activos en el Dashboard: En la sección principal, ingresando a HTTP > Routers, podrás listar los endpoints de cada app generados dinámicamente mediante providers de Docker. En esta sección puedes verificar: 1. El estado del router en Success. 2. Hacia qué servicio Docker interno de proxy-net está balanceando la carga. 3. El estado de la resolución SSL por Let's Encrypt de cada uno.

El monitoreo ocurre de manera automática en tiempo caliente sin la necesidad de escribir o recargar configuraciones manuales complejas para cada nuevo microservicio.