Skip to content

🧠 Conceptos Clave

Objetivo: Comprender por qué usamos Caddy en nuestro stack y cómo resuelve los desafíos de una arquitectura distribuida con múltiples aplicaciones.


En desarrollo necesitamos simular la misma arquitectura de producción que usa Reverse Proxy, pero con herramientas simples y configuración local.

Producción (Reverse Proxy):

HAProxy Rules → Tenant ASP.NET
→ Landings
→ Pasarela de Pagos

Desarrollo (Caddy):

Caddy Handlers → localhost:80 (Tenant local)
→ localhost:5250 (Landings local)
→ pagos.XXXXX.com (Servicio remoto)

1. Routing por path:

/ofertas/* → Aplicación de landings
/payment/* → Pasarela de pagos
/* → Aplicacion principal (fallback)

2. Transformación de URLs:

Input: /ofertas/decameron
Output: /render/decameron (a servicio de landings)

3. Headers específicos:

Host: Preservar dominio original
x-origin-site: Identificar tenant/sitio
HTTP_X_FRONTEND_HTTPS: Indicar protocolo HTTPS

Vs configurar cada servicio manualmente:

  • ❌ Configurar CORS en 5+ aplicaciones
  • ❌ Generar certificados SSL para cada puerto
  • ❌ Recordar qué puerto corre cada servicio
  • ❌ URLs localhost:PORT diferentes para cada dev

Con Caddy:

  • ✅ Una configuración centralizada
  • ✅ HTTPS automático para todos los servicios
  • ✅ URLs consistentes entre todos los devs
  • ✅ Simula exactamente el comportamiento de producción

🛡️ Decisiones de Seguridad y Performance

Section titled “🛡️ Decisiones de Seguridad y Performance”
Terminal window
{
auto_https disable_redirects
}

El problema sin esta configuración:

  1. IIS corre en puerto 80 (HTTP) por defecto en desarrollo
  2. Caddy quiere manejar puerto 80 para redirects HTTP → HTTPS
  3. Conflicto: Ambos intentan usar puerto 80
  4. Error: bind: address already in use

La solución:

  • disable_redirects permite que IIS mantenga puerto 80
  • Caddy solo maneja HTTPS (puerto 443)
  • Desarrolladores acceden directamente via HTTPS
  • Resultado: Coexistencia pacífica
Terminal window
reverse_proxy localhost:5000 {
header_up Host {host} # Preserva dominio original
header_up x-origin-site mi-motor.local # Identifica origen para el backend
header_up HTTP_X_FRONTEND_HTTPS on # Indica que viene de HTTPS
}

¿Por qué cada header?

  • Host {host}: El backend ASP.NET necesita saber el dominio real para generar URLs correctas
  • x-origin-site: Configuración multisitio - el backend decide qué configuración usar
  • HTTP_X_FRONTEND_HTTPS on: Compatibility con aplicaciones que verifican HTTPS
Terminal window
(cors) {
header {
Access-Control-Allow-Origin "{header.origin}"
Access-Control-Allow-Credentials "true"
Access-Control-Allow-Methods "GET, POST, PUT, PATCH, DELETE"
}
}

Permisivo en desarrollo, estricto en producción:

  • Desarrollo: Permite cualquier origen para testing
  • Producción: Solo dominios específicos autorizados

Para desarrollo:

  • Simula HAProxy localmente: Mismo routing logic, herramientas simples
  • Mix flexible: Algunos servicios locales, otros remotos según lo que desarrolles
  • Setup una vez: Configuración reutilizable entre developers
  • Debug distribuido: Logs centralizados de todo el routing

Para arquitectura:

  • Separación de responsabilidades: Cada aplicación hace una cosa bien
  • Especialización técnica: Landings en tech A, pagos en tech B, etc.
  • Deployment independiente: Deploy sin afectar otras aplicaciones
  • Resilencia: Falla de una aplicación no tumba el sistema completo

¿Vale la pena? - Setup inicial más complejo, pero desarrollo mucho más realista y menos debugging de integración.

Red y routing:

  • Configuración inicial más compleja que monolito
  • Debug distribuido requiere entender flujo completo
  • DNS local requiere configuración en cada máquina

Desarrollo:

  • Developers necesitan entender arquitectura distribuida
  • Setup inicial más largo que npm start
  • Algunos bugs solo aparecen en integración completa

Ahora que entiendes la arquitectura y el “por qué”:

  1. 🔧 Configuraciones: Profundiza en handlers, snippets y configuraciones avanzadas

  2. 🚨 Troubleshooting: Soluciones a problemas comunes