Arquitectura de Microservicios Multi-Bot: 6 Asistentes Telegram en un Solo VPS
Share
Arquitectura de Microservicios Multi-Bot: 6 Asistentes Telegram en un Solo VPS
Introducción
En el ecosistema de automatización empresarial, gestionar múltiples asistentes conversacionales de forma eficiente es un desafío técnico real. Este artículo documenta una arquitectura de producción que orquesta 6 bots de Telegram independientes, cada uno con lógica de negocio específica, ejecutándose en un único servidor VPS mediante contenedores Docker.
La solución combina FastAPI para endpoints REST, Flask para procesamiento de comandos con Gemini AI, y n8n para flujos de trabajo visuales. Todo detrás de Traefik como reverse proxy con SSL automático.
Arquitectura del Sistema
Componentes Principales
La infraestructura se divide en dos capas principales:
Capa de APIs (bot-system)
- bot-api (Puerto 3000): FastAPI con uvicorn. Maneja webhooks de Telegram, endpoints REST y envío de mensajes.
- bot-proxy (Puerto 3010): Flask server que procesa llamadas a Gemini AI y ejecuta comandos específicos de cada bot.
Capa de Automatización (n8n-stack)
- n8n (Puerto 5678): Orquestador de workflows con interfaz visual.
- Traefik (Puertos 80/443): Reverse proxy con Let's Encrypt automático.
- Redis & PostgreSQL: Almacenamiento para n8n.
Estructura de Directorios
vps2-bot-system/
├── docker-compose.yml
├── Dockerfile (Python 3.12)
├── code/
│ ├── claude_proxy.py (369KB - 6 bots)
│ ├── deploy-api/
│ │ └── main.py (293KB)
│ ├── emma_prestamos_api.py
│ ├── carlitos_prestamos_api.py
│ └── extract_insights.py
└── n8n-config/
├── docker-compose.yml
└── Dockerfile.n8n
Configuración de Bots
Cada uno de los 6 bots activos tiene su propio directorio de datos y configuración:
| ID Cliente | Tipo de Servicio | Directorio Datos |
|-----------|------------------|------------------|
| er0002 | Gestión de préstamos | `/opt/bot-system/data/er0002/` |
| cr0001 | Gestión de préstamos | `/opt/bot-system/data/cr0001/` |
| ac0001 | Control de chatarrera | `/opt/bot-system/data/ac0001/` |
| av0004 | Asistente general | `/opt/bot-system/data/av0004/` |
| gr0002 | Gestión de negocio | `/opt/bot-system/data/gr0002/` |
| bg0001 | Asistente ejecutivo | `/opt/bot-system/data/bg0001/` |
Esta separación permite:
- Aislamiento de datos entre clientes
- Configuración independiente por bot
- Escalado granular por servicio
- Auditoría por cliente
Flujo de Trabajo Operacional
Desarrollo Local y Sincronización
El flujo de desarrollo mantiene un respaldo local sincronizado con producción:
1. Subir cambios al VPS
scp code/claude_proxy.py vps2:/opt/bot-system/code/
scp code/deploy-api/main.py vps2:/opt/bot-system/code/deploy-api/
2. Reiniciar contenedores
ssh vps2 "cd /opt/bot-system && docker compose restart"
3. Monitorear logs en tiempo real
ssh vps2 "docker logs -f bot-api --tail 50"
ssh vps2 "docker logs -f bot-proxy --tail 50"
Este patrón permite:
- Hot reload sin downtime completo
- Rollback rápido manteniendo versión local
- Debugging remoto con logs en tiempo real
Integración con Gemini AI
El `claude_proxy.py` (369KB) actúa como intermediario entre Telegram y Gemini. Características clave:
- Procesamiento de comandos semánticos: Detecta intenciones del usuario usando NLP.
- Routing por cliente: Cada bot usa su propia API key de Gemini.
- Caché de respuestas frecuentes: FAQ bypass para consultas repetitivas.
- Formato de bloques semánticos: Similar a `[REGISTRAR_COMPRA]{json}[/REGISTRAR_COMPRA]`.
Networking y Seguridad
Docker Networking
Regla crítica: Los contenedores NO pueden usar `localhost` entre sí. Se debe usar nombres de servicio:❌ Incorrecto
CLAUDE_PROXY = "http://localhost:3010"
✅ Correcto
CLAUDE_PROXY = "http://bot-proxy:3010"
Whitelist de IPs
El `claude_proxy.py` solo acepta peticiones de:
- `127.0.0.1` (localhost)
- `::1` (IPv6 localhost)
- `172.x.x.x` (Red interna Docker)
SSL y Dominio
Traefik maneja automáticamente:
- Certificado Let's Encrypt para `bot.varelainsights.com`
- Renovación automática cada 90 días
- Redirección HTTP → HTTPS
Lecciones Aprendidas
1. Path Fixing en Migración
Cuando se migró desde un servidor anterior, se requirieron 49 correcciones de rutas en `main.py`:
Antes
/home/emma/prestamos.json
Después
/data/er0002/prestamos.json
2. Docker Compose Networking
Se identificaron 17 referencias a `localhost` que debían cambiar a nombres de servicio:
claude_proxy.py
requests.post('http://bot-api:3000/send', ...)
3. Traefik Registration Delay
Después de reiniciar contenedores, esperar ~15 segundos para que Traefik re-registre las rutas.
Conclusión
Esta arquitectura demuestra que es posible gestionar múltiples bots conversacionales en producción sin complejidad excesiva. Los puntos clave son:
- Separación de responsabilidades: FastAPI para APIs, Flask para procesamiento IA, n8n para workflows.
- Aislamiento por cliente: Cada bot tiene su sandbox de datos independiente.
- Sincronización continua: Respaldo local que permite desarrollo rápido y rollback seguro.
La solución soporta 6 bots activos con un solo VPS de recursos modestos, procesando comandos con Gemini AI y manteniendo disponibilidad 24/7 mediante Docker Compose y Traefik.