1. Mapa de Infraestructura por Ambiente
Nvito opera en tres ambientes. Local se ejecuta en la maquina del desarrollador via Docker Compose. DEV y TEST corren en un VPS con Coolify, conectandose a servicios managed gratuitos en la nube.
Infraestructura por Ambiente
Local (maquina del desarrollador)
DEV (branch: develop)
TEST (branch: test)
Local (maquina del desarrollador)
DEV (branch: develop)
TEST (branch: test)
Servicios Managed (nube)
Local (maquina del desarrollador)
Servicios Managed (nube)
| Ambiente | Branch | Proposito | Usuarios |
|---|---|---|---|
| Local | cualquiera | Desarrollo individual, debugging, iteración rápida | Desarrolladores |
| DEV | develop | Integración continua, validación de features | Desarrolladores |
| TEST | test | QA formal, pruebas de regresion, validación funcional | Equipo QA + stakeholders |
Cada ambiente replica la misma arquitectura de servicios con proveedores distintos. En Local todo es autocontenido via Docker. En DEV/TEST los servicios de datos son managed en la nube (free tier), mientras que las aplicaciones corren como contenedores Docker en Coolify.
2. Proveedores por Servicio
| Servicio | Local | DEV / TEST | Notas |
|---|---|---|---|
| Base de datos | PostgreSQL 15 (Docker) | Neon PostgreSQL (Free) | 0.5 GB, auto-suspend 5 min, pooler PgBouncer integrado |
| Cache / Colas | Redis 7 (Docker) | Upstash Redis (Free) | 256 MB, 500K cmds/mes, TLS, 1 DB compartida DEV+TEST |
| Storage (S3) | MinIO (Docker) | Cloudflare R2 (Free) | 10 GB, egress gratis, API S3 compatible |
| MailDev (Docker) | Mailtrap (Free) | 100 emails/mes, inbox visual HTML | |
| Autenticación | Clerk (Dev mode, cloud) | Clerk (Dev mode, cloud) | 1 instancia compartida, claves pk_test_ / sk_test_ |
| Hosting apps | Procesos locales | Coolify (Docker en VPS) | VPS Contabo: 4 vCPU, 8 GB RAM, $6.15/mes |
2.1 Neon (PostgreSQL Remoto)
- Proyectos: 2 independientes (
nvito-devynvito-test), cada uno con su connection string. - Connection Pooler: PgBouncer integrado en modo Transaction, compatible con Prisma.
- URLs: Dos por proyecto:
DATABASE_URL(pooled, para la app) yDIRECT_URL(directa, para migraciones). - Limitación: Auto-suspend tras 5 min de inactividad; primer query al despertar tarda 3-5s.
2.2 Upstash (Redis Remoto)
- Database: 1 sola compartida DEV+TEST (free tier permite solo 1).
- Justificación: Redis almacena datos efímeros (cache + Bull queues); sin riesgo de colisión.
- Protocolo:
rediss://(TLS), soportado nativamente por Bull e ioredis.
2.3 Cloudflare R2 (Storage Remoto)
- Buckets: 8 en total (4 por ambiente):
{dev|test}-nvito-{uploads,assets,private,templates}. - Acceso público: Habilitado en
uploads,assetsytemplates. Deshabilitado enprivate. - CORS: Configurado por ambiente con los origenes correspondientes.
2.4 Cloudflare Pages (Sitios Estaticos)
Los sitios estáticos como nvito-landing (landing page) y nvito-docs (documentación) se despliegan directamente en Cloudflare Pages, sin pasar por Coolify/VPS. Esto permite:
- Despliegue automático al push a
main - CDN global con edge caching
- SSL automático
- $0 en hosting
| Sitio | Dominio | Stack |
|---|---|---|
| nvito-landing | nvito.mx | Astro 5, output static |
| nvito-docs | docs.nvito.mx (o ruta interna) | Next.js 16, output export |
3. Docker Compose Local
El archivo docker-compose.yml en nvito-api/ define 6 servicios que replican localmente la infraestructura managed remota.
3.1 Servicios y Puertos
| Servicio | Imagen | Puerto(s) | Función |
|---|---|---|---|
| postgres | postgres:15-alpine | 5432 | Base de datos principal (Prisma ORM) |
| redis | redis:7-alpine | 6379 | Cache, Bull queues, rate limiting |
| minio | minio/minio:latest | 9000 (API), 9001 (Console) | Storage S3-compatible (reemplaza R2) |
| minio-client | minio/mc:latest | — | Crea 4 buckets automáticamente al iniciar |
| maildev | maildev/maildev:latest | 1080 (Web UI), 1025 (SMTP) | Servidor SMTP local (reemplaza Mailtrap) |
| adminer | adminer:latest | 8080 | UI web para gestión de PostgreSQL |
3.2 Configuración Clave
PostgreSQL — Usuario nvito, password nvito_dev_password, DB nvito_dev. Incluye healthcheck con pg_isready y scripts de inicialización en ./docker/postgres/init/.
Redis — Persistencia con appendonly yes. Healthcheck via redis-cli ping.
MinIO — Credenciales minioadmin/minioadmin123. Console web en :9001. El servicio minio-client espera a que MinIO este healthy y luego crea los buckets nvito-uploads, nvito-assets, nvito-private y nvito-templates, configurando acceso público en los tres primeros.
MailDev — SMTP en :1025 sin autenticación. UI web para ver emails en http://localhost:1080.
3.3 Red y Volumenes
Todos los servicios comparten la red nvito-network (bridge). Los volumenes son externos y deben crearse antes del primer uso:
docker volume create invitia-api_postgres_data
docker volume create invitia-api_redis_data
docker volume create invitia-api_minio_data
3.4 Uso Diario
cd nvito-api
docker compose up -d # Iniciar infraestructura
docker compose ps # Verificar estado
docker compose logs -f redis # Logs de un servicio
docker compose down # Detener (datos persisten)
docker compose down -v # Detener + eliminar datos
4. Coolify — Hosting Remoto
4.1 Plataforma
| Aspecto | Detalle |
|---|---|
| VPS | Contabo Cloud VPS 10: 4 vCPU, 8 GB RAM, 150 GB SSD, Ubuntu 22.04 |
| Region | United States (Central) |
| Costo | $6.15 USD/mes ($4.95 + $1.20 region) |
| Reverse Proxy | Traefik (integrado en Coolify), SSL via Let's Encrypt |
| Deploy | Auto-deploy on push via GitLab webhooks |
4.2 Los 8 Servicios Docker
| Servicio | Ambiente | Branch | Puerto | Dominio |
|---|---|---|---|---|
nvito-api-dev | DEV | develop | 3000 | dev-api.nvito.mx |
nvito-api-test | TEST | test | 3000 | test-api.nvito.mx |
nvito-admin-dev | DEV | develop | 5050 | dev-admin.nvito.mx |
nvito-admin-test | TEST | test | 5050 | test-admin.nvito.mx |
nvito-invitations-dev | DEV | develop | 3001 | dev.nvito.mx |
nvito-invitations-test | TEST | test | 3001 | test.nvito.mx |
nvito-pwa-dev | DEV | develop | 3002 | dev-app.nvito.mx |
nvito-pwa-test | TEST | test | 3002 | test-app.nvito.mx |
4.3 Flujo de Deploy
- GitLab CI/CD ejecuta quality checks (lint, tests) y migraciones de BD si hay cambios en
prisma/migrations/. - Coolify detecta el push via webhook, construye la imagen Docker y despliega el contenedor.
- Traefik rutea el trafico al nuevo contenedor con SSL automático.
4.4 Conexión con GitLab
Coolify v4 no tiene integración nativa con GitLab. Se usa deploy keys: una SSH key generada en Coolify se agrega como Deploy Key en cada repo de GitLab. Cada servicio se configura como "Private Repository (with Deploy Key)".
4.5 Sin Suspension
Docker en VPS no duerme los contenedores. Esto es critico: nvito-api usa Bull queues con Redis para procesar emails, WhatsApp y jobs asincronos. Si el backend se suspende, los jobs en cola no se procesan.
5. Variables de Entorno por Ambiente
5.1 Variables Requeridas (env.validation.ts)
| Variable | Requerida | Default |
|---|---|---|
DATABASE_URL | Si | — |
CLERK_SECRET_KEY | Si | — |
CLERK_PUBLISHABLE_KEY | Si | — |
NODE_ENV | No | development |
PORT | No | 3000 |
REDIS_URL | No | redis://localhost:6379 |
SMTP_HOST / SMTP_PORT | No | localhost / 1025 |
5.2 Diferencias Clave entre Ambientes
| Variable | Local | DEV | TEST |
|---|---|---|---|
DATABASE_URL | postgresql://nvito:...@localhost:5432/nvito_dev | Neon pooled URL (nvito-dev) | Neon pooled URL (nvito-test) |
REDIS_URL | redis://localhost:6379 | rediss://...@upstash.io:6379 | misma DB Upstash |
R2_ENDPOINT | http://localhost:9000 (MinIO) | (no se usa, se usa R2_ACCOUNT_ID) | (no se usa) |
R2_BUCKET_UPLOADS | nvito-uploads | dev-nvito-uploads | test-nvito-uploads |
SMTP_HOST | localhost | sandbox.smtp.mailtrap.io | sandbox.smtp.mailtrap.io |
SMTP_PORT | 1025 | 2525 | 2525 |
SMTP_USER / SMTP_PASSWORD | (vacio) | Credenciales Mailtrap | Credenciales Mailtrap |
CORS_ORIGINS | http://localhost:5050,http://localhost:3002,... | https://dev-admin.nvito.mx,... | https://test-admin.nvito.mx,... |
FRONTEND_URL | http://localhost:3001 | https://dev.nvito.mx | https://test.nvito.mx |
CDN_URL | http://localhost:9000/nvito-uploads | R2 public URL (dev) | R2 public URL (test) |
5.3 Storage: Detección Local vs Remoto
La configuración de storage (storage.config.ts) se adapta automáticamente. En Local se usa R2_ENDPOINT apuntando a MinIO. En DEV/TEST se usa R2_ACCOUNT_ID y el SDK construye la URL de R2. La detección de MinIO usa R2_ENDPOINT.includes('localhost') para decidir como construir URLs públicas.
5.4 Email: SMTP Unificado
Todos los ambientes usan SMTP via nodemailer. Local: MailDev sin auth (:1025). DEV/TEST: Mailtrap con auth (:2525). El transporte solo agrega auth si SMTP_USER tiene valor.
5.5 Gestión de Secretos
- Local: Archivo
.env(excluido de git), opcionalmente via Bitwarden Secrets Manager (bws). - DEV/TEST: Variables configuradas en Coolify por servicio. Secretos criticos en Bitwarden.
- CI/CD: GitLab variables +
bws runpara inyectar secretos de BD en migraciones.
6. Topologia de Red
Topologia de Red
VPS Contabo — US Central
VPS Contabo — US Central
VPS Contabo — US Central
Servicios Externos
6.1 Flujo de un Request
- El usuario accede a
https://dev-admin.nvito.mx. - DNS resuelve a la IP del VPS Contabo.
- Traefik termina SSL y rutea al contenedor correcto según el dominio.
nvito-admin-devrenderiza la página (Next.js SSR) y llama adev-api.nvito.mx.nvito-api-devvalida JWT (Clerk), consulta Neon, lee/escribe Upstash y accede a R2.- La respuesta viaja de regreso por la misma ruta.
6.2 Registros DNS
Todos los subdominios apuntan a la misma IP. Traefik rutea por dominio:
dev-api.nvito.mx A <VPS_IP>
test-api.nvito.mx A <VPS_IP>
dev-admin.nvito.mx A <VPS_IP>
test-admin.nvito.mx A <VPS_IP>
dev.nvito.mx A <VPS_IP>
test.nvito.mx A <VPS_IP>
dev-app.nvito.mx A <VPS_IP>
test-app.nvito.mx A <VPS_IP>
6.3 Costos Mensuales
| Proveedor | Servicio | Costo |
|---|---|---|
| Neon | PostgreSQL (2 proyectos) | $0 |
| Upstash | Redis (1 database) | $0 |
| Cloudflare | R2 Storage (8 buckets) | $0 |
| Contabo + Coolify | VPS Cloud VPS 10 | $6.15 |
| Clerk | Auth (Dev mode) | $0 |
| Mailtrap | Email testing | $0 |
| Cloudflare | Pages (2 sitios estáticos) | $0 |
| Total | ~$6.15 USD/mes |
7. Versionado y Badge de Ambiente
7.1 Mapeo Formal de Ramas a Ambientes
Cada ambiente de Nvito está asociado a una rama específica de Git:
Ramas → Ambientes
Ramas Git
Ambientes
| Rama | Ambiente | Deploy |
|---|---|---|
develop | DEV (dev-*.nvito.mx) | Automático vía Coolify |
test | TEST (test-*.nvito.mx) | Automático vía Coolify |
main | PROD (*.nvito.mx) | Automático (futuro) |
La rama test funciona como puente fijo: las ramas release/X.Y.Z se mergean a test para triggear el deploy automático sin reconfigurar Coolify.
Para más detalles sobre el flujo completo de ramas y releases, consulta la guía de Versionado y Gitflow.
7.2 Variables de Ambiente para Identificación
Dos variables controlan la identificación visual del ambiente en el dashboard admin:
| Variable | Propósito | Valores |
|---|---|---|
NEXT_PUBLIC_APP_ENV | Identifica el ambiente actual | local, dev, test, production |
NEXT_PUBLIC_APP_VERSION | Versión de la aplicación | Se inyecta automáticamente desde package.json en build time |
7.3 Badge de Ambiente en el Admin
El componente EnvironmentBadge se muestra en el header del dashboard admin. Solo es visible en ambientes no productivos (LOCAL, DEV, TEST) y se oculta automáticamente en producción.
| Ambiente | Color | Ícono |
|---|---|---|
| LOCAL | Gris con borde punteado | Monitor |
| DEV | Azul complementario (#005587) | Server |
| TEST | Naranja (#F17F3A) | TestTube2 |
Al hacer clic en el badge se despliega un popover con información extendida: versión, ambiente y URL del API.