Infraestructura y Ambientes
Tabla de Contenidos
- Mapa de Infraestructura por Ambiente
- Proveedores por Servicio
- Docker Compose Local
- Coolify — Hosting Remoto
- Variables de Entorno por Ambiente
- Topologia de Red
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.
| Ambiente | Branch | Proposito | Usuarios |
|---|---|---|---|
| Local | cualquiera | Desarrollo individual, debugging, iteracion rapida | Desarrolladores |
| DEV | develop | Integracion continua, validacion de features | Desarrolladores |
| TEST | test | QA formal, pruebas de regresion, validacion 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 | |
| Autenticacion | 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). - Limitacion: 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).
- Justificacion: Redis almacena datos efimeros (cache + Bull queues); sin riesgo de colision.
- 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 publico: Habilitado en
uploads,assetsytemplates. Deshabilitado enprivate. - CORS: Configurado por ambiente con los origenes correspondientes.
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) | Funcion |
|---|---|---|---|
| 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 automaticamente al iniciar |
| maildev | maildev/maildev:latest | 1080 (Web UI), 1025 (SMTP) | Servidor SMTP local (reemplaza Mailtrap) |
| adminer | adminer:latest | 8080 | UI web para gestion de PostgreSQL |
3.2 Configuracion Clave
PostgreSQL — Usuario nvito, password nvito_dev_password, DB nvito_dev. Incluye healthcheck con pg_isready y scripts de inicializacion 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 publico en los tres primeros.
MailDev — SMTP en :1025 sin autenticacion. 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 6 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 |
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 automatico.
4.4 Conexion con GitLab
Coolify v4 no tiene integracion 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,... | 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: Deteccion Local vs Remoto
La configuracion de storage (storage.config.ts) se adapta automaticamente. 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 deteccion de MinIO usa R2_ENDPOINT.includes('localhost') para decidir como construir URLs publicas.
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 Gestion 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
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 segun el dominio.
nvito-admin-devrenderiza la pagina (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>
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 |
| Total | ~$6.15 USD/mes |