Construida para privacidad, fiabilidad y portabilidad multi-nube. Cada decisión arquitectónica refleja un equilibrio deliberado entre simplicidad, seguridad y control operativo.
Internet
│
▼
┌─────────────────┐
│ Cloudflare │
│ Edge (TLS) │
└────────┬────────┘
│ Tunnel (outbound-only)
▼
┌───────────────────────────────────┐
│ VM · GCP / Azure / AWS │
│ │
│ ┌──────────┐ ┌───────────────┐ │
│ │ allerac │ │ PostgreSQL │ │
│ │ app │ │ + pgvector │ │
│ └──────────┘ └───────────────┘ │
│ │
│ ┌──────────┐ ┌───────────────┐ │
│ │ Ollama │ │ Prometheus │ │
│ │ (LLM) │ │ Loki Grafana│ │
│ └──────────┘ └───────────────┘ │
│ │
│ ┌────────────────────────────┐ │
│ │ Telegram Bot · Webhook │ │
│ └────────────────────────────┘ │
└───────────────────────────────────┘
▲
│ git push → deploy
GitHub ActionsTodo el tráfico público se enruta a través de Cloudflare Tunnel (cloudflared). El túnel crea una conexión cifrada solo de salida desde la VM al edge de Cloudflare — no se abren puertos de entrada en el firewall, no es necesario exponer una IP pública para la aplicación.
El stack de monitoreo corre completamente en la VM junto a la aplicación — sin dependencia de servicios externos. Logs y métricas permanecen en la máquina, sin coste adicional, y funcionan incluso sin acceso a internet.
Ollama ejecuta inferencia LLM directamente en la VM. Ningún prompt, conversación o dato de usuario se envía a proveedores externos de IA salvo configuración explícita. Esta es la base del modelo de privacidad: la IA corre donde viven los datos. Los modelos se descargan una vez y se almacenan en un volumen Docker persistente, sobreviviendo a despliegues y reinicios.
El contenedor de la aplicación es completamente sin estado — puede detenerse, reconstruirse y reiniciarse en cualquier momento sin pérdida de datos. Todo el estado persistente vive en volúmenes Docker externos.
Toda la infraestructura está definida en Terraform, dividida entre tres nubes (GCP, Azure, AWS) con estructura idéntica. Cambiar de nube es un terraform apply en el directorio destino. Los registros DNS son gestionados por Terraform y apuntan a IDs de Cloudflare Tunnel — cambiar de nube actualiza el DNS automáticamente.
Cada VM ejecuta un runner auto-hospedado de GitHub Actions, etiquetado por nube (gcp, azure, aws). Los despliegues se disparan con pushes a main y corren directamente en la VM destino — sin servicio CI externo. El servicio webhook recibe eventos de GitHub, valida firmas HMAC-SHA256 y dispara el script de actualización, que descarga el código más reciente y reinicia solo los contenedores que cambiaron.
El stack usa perfiles de Docker Compose para adaptarse al entorno sin mantener archivos compose separados. El mismo docker-compose.yml corre correctamente en un laptop de desarrollador, una VM de GCP, una VM de Azure y una instancia EC2 de AWS — sin modificaciones.