20 Apps, 1 VPS, $200/Mes: La Arquitectura Que No Te Enseñan en los Tutoriales

Lo que estás por leer no es un tutorial teórico de Docker. Es la documentación de una arquitectura real que está en producción hoy, sirviendo clientes reales, corriendo 20+ aplicaciones SaaS en un solo servidor VPS de Hostinger por $200 USD al mes.

En IAmanos construimos apps con inteligencia artificial para empresas mexicanas. Cada app necesita su propio dominio, su propia base de datos, su propio SSL, y su propio entorno aislado. La solución enterprise para esto costaría $3,000+ mensuales en AWS. Nuestra solución cuesta $200.

Este artículo es el deep-dive técnico completo: la lista real de apps, la arquitectura de contenedores, el rol de Traefik como reverse proxy, los scripts de deploy, las estrategias de backup, y los números detrás de todo. Si estás considerando correr múltiples apps en un solo servidor, este artículo te va a ahorrar semanas de prueba y error.

Las Apps en Producción: Lista Real y Completa

Estos son los servicios que corren en nuestro VPS de Hostinger (KVM, IP 168.231.64.157) al momento de escribir este artículo. No son mockups ni prototipos — son apps con usuarios reales, datos reales y uptime real.

Apps SaaS completas

  1. WouWou — Plataforma veterinaria con IA. Chat Ayu con visión, 206 razas, cotizador de estética, tienda. Más info. URL: wouwou.iamanos.com
  2. GlamBook — Sistema de reservas para salones de belleza. Diseño L’Oréal edition, 25+ modelos Prisma, 26 servicios, 4 staff. URL: glambook.iamanos.com
  3. Lead Desk — CRM comercial con pipeline, tareas, WhatsApp templates, métricas y panel de admin. URL: leads.iamanos.com
  4. PrintDesk — Gestión para imprentas digitales. Cotizador automático, control de trabajos, entregas. URL: printdesk.iamanos.com
  5. Credit-Solo — Plataforma de préstamos SOFOM. Simulador de crédito, scoring, expedientes digitales. URL: credit-solo.iamanos.com
  6. FisioCore — Gestión para clínicas de fisioterapia. Expedientes, rutinas, progreso de pacientes. URL: fisiocore.iamanos.com
  7. Capitán Inventario — Control de inventarios con IA. Alertas de stock, predicción de demanda, reportes. URL: capitan.iamanos.com
  8. Fenga — Generación de diseños con IA. Templates, personalización por marca, exportación. URL: fenga.iamanos.com
  9. Terminal — Secretaria IA. Agenda, recordatorios, gestión de contactos con lenguaje natural. URL: terminal.iamanos.com
  10. Results OS — Dashboard SEO. Métricas de posicionamiento, tracking de keywords, reportes automatizados. URL: results.iamanos.com

Herramientas del ecosistema

  1. Cotizador — Cotizador público con 4 tiers ($2,500 / $5,000 / $7,500 / Premium). Integración con Lead Desk. URL: coti.iamanos.com
  2. Chat iAmanos — Chat IA público potenciado por Claude Sonnet. URL: chat.iamanos.com
  3. iamanos.com — Sitio principal con SSR, blog con 1,500+ posts, fábrica de apps. URL: iamanos.com
  4. Benditos Sueños — Plataforma para tienda de colchones. Catálogo, cotizador, leads. URL: benditossuenos.iamanos.com
  5. SEO Content Studio — Herramienta interna de generación de contenido SEO.

Infraestructura compartida

  1. Traefik — Reverse proxy + auto-SSL. La pieza central que hace posible todo.
  2. N8N — Automatización de workflows. Webhooks, integraciones, cron jobs.
  3. 15 instancias PostgreSQL — Una por cada app que necesita base de datos relacional.

En total: más de 35 contenedores Docker corriendo simultáneamente en un solo servidor.

La Arquitectura: Cómo Conviven 35+ Contenedores Sin Matarse

La clave de esta arquitectura es el aislamiento. Cada app vive en su propio mundo, pero todas comparten el acceso al exterior a través de Traefik.

Red Docker: aislamiento por app

Cada app tiene su propia red Docker interna. WouWou tiene la red wouwou-network que conecta su contenedor Next.js con su contenedor PostgreSQL. Lead Desk tiene leaddesk-network. Nadie más puede acceder a esas redes internas.

Adicionalmente, existe una red compartida llamada traefik-network (o web) a la que todos los servicios web se conectan. Esta red es la que Traefik usa para enrutar tráfico. Un contenedor puede estar en dos redes: su red interna (para comunicarse con su PostgreSQL) y la red de Traefik (para recibir tráfico web).

¿Por qué este diseño? Seguridad. Si un atacante logra explotar una vulnerabilidad en PrintDesk, solo puede acceder a la base de datos de PrintDesk. Las bases de datos de WouWou, Lead Desk y todas las demás son invisibles desde ese contenedor.

Traefik como puerta de entrada única

Traefik es el único contenedor que expone los puertos 80 y 443 al exterior. Ninguna app expone puertos directamente. Todo el tráfico pasa por Traefik, que decide a qué contenedor enviarlo según el dominio del request.

La configuración de Traefik se hace mediante labels en el docker-compose.yml de cada app. Cuando agregas una nueva app, Traefik la detecta automáticamente por el Docker socket y empieza a enrutar tráfico hacia ella.

Los certificados SSL se generan automáticamente con Let’s Encrypt vía HTTP challenge. Cuando Traefik detecta un nuevo servicio con un dominio que no tiene certificado, inicia el challenge, obtiene el certificado, y lo almacena. La renovación también es automática. En un año de operación, nunca hemos tenido un certificado expirado.

PostgreSQL por app: una instancia, un contenedor

Cada app que necesita base de datos relacional tiene su propio contenedor PostgreSQL 16 Alpine. Las razones son las que detallamos en nuestro artículo sobre automatización con IA: aislamiento de seguridad, backups independientes, recursos aislados y versiones independientes.

El overhead es mínimo: PostgreSQL Alpine consume ~30MB de RAM en idle. Con 15 instancias, eso son 450MB. Nuestro VPS tiene 16GB de RAM, así que PostgreSQL consume menos del 3% de los recursos disponibles.

Los volúmenes de datos de PostgreSQL son Docker named volumes con driver local. Persisten entre reinicios de contenedores y entre rebuilds de imágenes. La data NO se pierde cuando haces docker compose down y docker compose up.

Contenedores de app: Node.js Alpine + standalone output

Cada app Next.js se construye con Docker multi-stage builds. La imagen final es Node.js 20 Alpine (~150MB) con solo el output standalone de Next.js. No incluye node_modules completos, no incluye código fuente, no incluye devDependencies.

Las apps se comunican con su PostgreSQL por hostname Docker (el nombre del servicio en docker-compose.yml). La URL de conexión se pasa por variable de entorno en el .env del VPS.

Scripts de Deploy: De Código Local a Producción en 90 Segundos

Cada proyecto en IAmanos tiene un archivo deploy.sh en la raíz. El script hace exactamente tres cosas:

Paso 1: rsync del código local al VPS

El código fuente se sincroniza desde la máquina de desarrollo al VPS usando rsync sobre SSH. Solo se copian los archivos que cambiaron. Un deploy típico transfiere 5-20 archivos modificados, no todo el proyecto.

El rsync excluye: node_modules/, .next/, .git/, archivos de entorno local. Solo sube código fuente, configuración de Docker y archivos estáticos.

Paso 2: Docker build en el VPS

Una vez que el código está en el VPS, el script ejecuta docker build con el Dockerfile multi-stage. Docker cachea las layers que no cambiaron (dependencies, Prisma generate), así que solo rebuilds las layers que tienen cambios de código.

Un build típico tarda 30-60 segundos. Si solo cambió código de la app (no dependencies ni Prisma schema), puede tomar 15 segundos gracias al cache de layers.

Paso 3: Docker Compose up

El último comando es docker compose up -d [nombre-servicio]. Docker Compose detecta que la imagen cambió, detiene el contenedor viejo, y arranca uno nuevo con la imagen actualizada. El downtime es de 2-5 segundos.

Las demás apps no se ven afectadas. Solo se reinicia el contenedor que cambió. Si estás desplegando WouWou, Lead Desk sigue corriendo sin interrupción.

El proceso completo

Desde que ejecutas bash deploy.sh en tu terminal local hasta que la nueva versión está en producción: 60-90 segundos. Sin CI/CD, sin GitHub Actions, sin Jenkins, sin pipelines. Un script bash de 15 líneas que hace el trabajo.

¿Es esta la forma más sofisticada de hacer deploy? No. ¿Es la más práctica para un equipo pequeño que despliega 3-5 veces al día? Absolutamente sí. La complejidad de un sistema de CI/CD no se justifica cuando tu pipeline es: “ejecutar un bash script”.

Recursos del VPS: Cuánto Consume Todo Esto

Nuestro VPS Hostinger KVM tiene las siguientes especificaciones:

  • CPU: 8 vCPUs
  • RAM: 16 GB
  • Disco: 200 GB NVMe SSD
  • Bandwidth: 8 TB/mes
  • Ubicación: Dallas, TX (latencia <50ms desde CDMX)

Distribución real de recursos

RAM: En operación normal, el consumo total de RAM es de aproximadamente 8-10 GB. PostgreSQL consume ~450MB (30MB x 15 instancias), las apps Next.js consumen ~4-5 GB (300-400MB cada una), Traefik consume ~100MB, N8N consume ~300MB, y el OS + Docker engine consume ~2 GB. Quedan 6-8 GB libres para picos de tráfico.

CPU: En idle, el CPU está al 5-10%. Durante builds de Docker, sube al 60-80% por 30-60 segundos. Durante picos de tráfico con IA (múltiples chats de Ayu activos), puede llegar al 30-40%. Nunca hemos visto 100% sostenido.

Disco: Las imágenes Docker ocupan ~3 GB (150MB x 20 imágenes). Las bases de datos PostgreSQL ocupan ~2 GB total. Los volúmenes de uploads y logs ocupan ~5 GB. En total, ~10 GB de 200 GB. El disco no es un bottleneck.

Red: El tráfico mensual está en ~500 GB de 8 TB disponibles. Lejos del límite. Incluso con tráfico 10x mayor, no alcanzaríamos el cap.

Cuándo necesitaríamos un segundo VPS

Basado en los patrones actuales, estimamos que necesitaríamos un segundo VPS cuando:

  • Tengamos 30+ apps con bases de datos (RAM sería el bottleneck).
  • Alguna app individual tenga 10,000+ usuarios concurrentes (necesitaría su propia instancia).
  • Necesitemos redundancia geográfica (un VPS en México, otro en USA).

A nuestro ritmo actual de crecimiento, eso está a 12-18 meses. Cuando llegue el momento, la migración es simple: mover algunas apps al nuevo VPS, agregar Traefik al nuevo servidor, y actualizar DNS. Los Dockerfiles y Compose files se copian tal cual.

Backups y Recuperación: El Plan Para Cuando Todo Sale Mal

Un VPS único es un single point of failure. Si el disco se corrompe, si Hostinger tiene un outage, si un atacante borra todo — necesitas un plan de recuperación.

Estrategia de backup actual

Bases de datos: Cada instancia de PostgreSQL tiene un cron job que ejecuta pg_dump diariamente y guarda el dump en un volumen separado. Los dumps se rotan (mantenemos los últimos 7 días).

Código fuente: Todo el código está en repositorios Git en la máquina de desarrollo local. Si el VPS se pierde completamente, re-desplegamos todo desde local con los deploy.sh scripts. El tiempo estimado de recuperación total es de 2-4 horas.

Variables de entorno: Los archivos .env de cada app están documentados y almacenados de forma segura fuera del VPS. Si necesitamos reconstruir desde cero, sabemos exactamente qué variables necesita cada app.

Snapshots del VPS: Hostinger ofrece snapshots semanales del VPS completo. Si algo falla catastróficamente, podemos restaurar un snapshot y perder máximo una semana de datos (las bases de datos se restaurarían del pg_dump diario).

Qué haríamos si el VPS muere completamente

  1. Contratar un nuevo VPS (5 minutos).
  2. Instalar Docker y Traefik (30 minutos).
  3. Ejecutar deploy.sh de cada app (15 apps x 2 minutos = 30 minutos).
  4. Restaurar bases de datos desde pg_dump (15 apps x 5 minutos = 75 minutos).
  5. Actualizar DNS si la IP cambió (5 minutos, propagación 1-24 horas).

Tiempo total de recuperación: ~3 horas (más propagación de DNS).

Costos Desglosados: Cada Peso Que Gastamos en Infraestructura

Transparencia total. Estos son los costos reales mensuales de toda la infraestructura:

  • VPS Hostinger KVM 2: $200 USD/mes — 8 vCPUs, 16 GB RAM, 200 GB NVMe, 8 TB bandwidth
  • Dominios (.com): ~$50 USD/mes prorrateado — compramos dominios anuales, prorrateando sale a esto
  • API Anthropic (Claude): ~$150 USD/mes — todos los chatbots y features IA de todas las apps
  • Google AI APIs: ~$50 USD/mes — Imagen 4 para generación de imágenes, Maps para geolocalización
  • Resend (email transaccional): $0 — tier gratuito (3,000 emails/mes, suficiente para nuestro volumen)
  • Let’s Encrypt SSL: $0 — certificados gratuitos vía Traefik
  • GitHub: $0 — tier gratuito para repos privados
  • Monitoring (custom scripts): $0 — Docker logs + scripts bash propios

Total mensual: ~$450 USD

Para poner en contexto: una sola licencia de WouWou a $377 MXN/mes (~$22 USD) no cubre ni el 5% de la infra. Pero 20 clientes de WouWou ($440 USD) cubren toda la infraestructura. Y WouWou es solo una de las 15 apps que generan revenue.

Comparación con AWS equivalente

Para el mismo setup en AWS:

  • EC2 t3.xlarge (4 vCPU, 16 GB): ~$120/mes
  • 15 instancias RDS PostgreSQL db.t3.micro: ~$225/mes (15 x $15)
  • Application Load Balancer: ~$30/mes
  • Route 53 (DNS): ~$15/mes
  • ACM (SSL): $0 (pero requiere ALB)
  • EBS (storage): ~$40/mes
  • Data transfer: ~$50/mes
  • CloudWatch (monitoring): ~$20/mes

Total AWS estimado: ~$500/mes — similar en costo pero con mucha más complejidad operativa. Y eso es con instancias micro. Con instancias de producción reales (db.t3.medium, t3.2xlarge), fácilmente $2,000-3,000/mes.

Monitoreo y Alertas: Cómo Sabemos Que Todo Funciona

No usamos Datadog, New Relic ni Grafana. Para nuestro setup, son overkill. Esto es lo que usamos:

Docker logs

Cada contenedor tiene su log accesible con docker logs [nombre]. Para troubleshooting, filtramos por timestamp: docker logs --since 1h wouwou-app muestra los logs de la última hora.

Health checks en Docker Compose

Cada servicio tiene un healthcheck definido en docker-compose.yml. Docker reinicia automáticamente los contenedores que no pasan el healthcheck 3 veces consecutivas. Esto maneja la mayoría de los crashes transitorios sin intervención humana.

Scripts de monitoreo propios

Un cron job cada 5 minutos hace curl a cada dominio y verifica que responda 200. Si alguno no responde, envía una alerta por email (vía Resend) y por webhook a un canal de Slack. Simple, efectivo, gratis.

Monitoreo de recursos

docker stats muestra el consumo de CPU y RAM de cada contenedor en tiempo real. Un cron job cada hora registra estos datos en un archivo de log para analizar tendencias. Si algún contenedor excede el 80% de su límite de memoria, genera una alerta.

¿Es esto tan sofisticado como un stack de observabilidad enterprise? No. ¿Cubre el 95% de los problemas que hemos tenido en un año de operación? Sí. El 5% restante lo resolvimos con SSH + docker logs + sentido común.

La Lección: No Necesitas AWS Para Construir un Negocio de Software Serio

La industria del software ha normalizado la complejidad innecesaria. “Necesitas Kubernetes”, “necesitas microservicios”, “necesitas un equipo de DevOps”. Para una startup con menos de 50,000 usuarios concurrentes, nada de eso es cierto.

Un VPS bien configurado con Docker y Traefik puede correr 20+ apps de producción por $200/mes. No necesitas Kubernetes porque no tienes un cluster. No necesitas microservicios porque cada app ya está aislada en su contenedor. No necesitas un equipo de DevOps porque un script bash de 15 líneas hace el deploy.

Esto no es “infraestructura de juguete”. Son apps reales con clientes reales, procesando datos reales, corriendo 24/7 con uptimes superiores al 99.5%. La diferencia con una empresa que paga $10,000/mes en AWS es que nosotros usamos ese dinero en construir más apps en lugar de pagarlo a Amazon.

Si quieres construir un ecosistema de apps como el nuestro, o si necesitas una sola app que funcione bien desde el primer día, conoce nuestra fábrica de apps o ve lo que ya hemos construido.

¿Quieres una app con IA para tu negocio? Agenda una llamada →

Preguntas Frecuentes

¿Cuántas apps puedo correr en un solo VPS con Docker?

Depende de los recursos del VPS. En un VPS con 16GB de RAM y 8 vCPUs (como el de IAmanos en Hostinger, $200/mes), cómodamente puedes correr 20-25 apps Next.js con sus respectivas bases de datos PostgreSQL. Cada app consume ~300-400MB de RAM y su PostgreSQL ~30MB adicionales. El bottleneck suele ser la RAM, no el CPU ni el disco.

¿Traefik maneja el SSL automáticamente para todos los dominios?

Sí. Traefik integra Let’s Encrypt nativamente y genera certificados SSL para cada dominio usando HTTP challenge. Cuando agregas un nuevo servicio con un dominio en las labels de Docker Compose, Traefik detecta el servicio, genera el certificado automáticamente y lo renueva antes de que expire. No necesitas configurar nada manualmente para SSL.

¿Qué pasa si el VPS se cae? ¿Se pierden todas las apps?

Sí, un VPS único es un single point of failure. Para mitigar esto, IAmanos usa: backups diarios de bases de datos con pg_dump, código fuente en Git local, snapshots semanales del VPS, y variables de entorno documentadas. El tiempo de recuperación total estimado es de 3 horas para levantar todo en un nuevo VPS desde cero.

¿Cuánto cuesta un VPS para correr múltiples apps Docker?

IAmanos usa un VPS Hostinger KVM por $200 USD/mes con 8 vCPUs, 16GB RAM, 200GB NVMe y 8TB bandwidth. Esto corre 20+ apps con sus bases de datos. Para empezar con 3-5 apps, un VPS de $50-100/mes con 8GB RAM es suficiente. El costo equivalente en AWS con RDS y ALB sería $500-3,000/mes.

¿IAmanos puede configurar esta arquitectura para mi empresa?

Sí. IAmanos no solo construye apps, también configura y mantiene la infraestructura de producción completa: VPS, Docker, Traefik, SSL, bases de datos, scripts de deploy y monitoreo. Puedes cotizar tu proyecto completo (app + infraestructura) en coti.iamanos.com.