Docs

Ambientes

Guía completa de los 4 ambientes de Nvito: Local, DEV, TEST y Producción con proveedores, URLs y configuración

v1.1PublicadoMarzo 2026Equipo de desarrollo, arquitectos, stakeholders

1. Visión General

Nvito opera en 4 ambientes que reflejan el ciclo de vida del código desde el desarrollo hasta producción. Cada ambiente tiene su propia infraestructura de datos (BD, Redis, Storage, Email) y subdominios independientes.

AmbienteBranchPropósitoUsuariosHosting
LocalcualquieraDesarrollo individual, debugging, iteración rápidaDesarrolladoresDocker Compose (máquina local)
DEVdevelopIntegración continua, validación de featuresDesarrolladoresVPS Contabo + Coolify
TESTtestQA formal, pruebas de regresión, demos a stakeholdersQA + stakeholdersVPS Contabo + Coolify
PRODmainProducción real con usuarios finalesTodosRailway Pro + Cloudflare

2. Ambiente Local (Docker Compose)

El ambiente local replica toda la infraestructura de Nvito en la máquina del desarrollador usando Docker Compose. Permite trabajar sin conexión a internet y con iteraciones rápidas.

2.1 Arquitectura Local

2.2 Servicios Docker y Puertos

ServicioImagenPuerto(s)FunciónDatos persisten
postgrespostgres:15-alpine5432Base de datos principal (Prisma ORM)Sí (volumen externo)
redisredis:7-alpine6379Cache, Bull queues, rate limitingSí (volumen externo, AOF)
miniominio/minio:latest9000 (API), 9001 (Console)Storage S3-compatible (reemplaza R2)Sí (volumen externo)
minio-clientminio/mc:latestCrea 4 buckets automáticamente al iniciarN/A
maildevmaildev/maildev:latest1080 (Web UI), 1025 (SMTP)Servidor SMTP local (reemplaza Mailtrap)No (efímero)
admineradminer:latest8080UI web para gestión de PostgreSQLNo (efímero)

2.3 Aplicaciones Locales y Puertos

AplicaciónPuertoComandoDescripción
nvito-api3000npm run start:devBackend NestJS con hot reload
nvito-admin5050npm run devPanel admin Next.js
nvito-invitations3001npm run devServidor de invitaciones
nvito-pwa3002npm run devProgressive Web App
nvito-landing4321npm run devLanding page + smart link
nvito-docs3333npm run devHub de documentación

2.4 Setup Inicial

# 1. Crear volumenes Docker (una sola vez)
docker volume create invitia-api_postgres_data
docker volume create invitia-api_redis_data
docker volume create invitia-api_minio_data

# 2. Levantar infraestructura
cd nvito-api
docker compose up -d

# 3. Verificar que todos los servicios están healthy
docker compose ps

# 4. Aplicar migraciones de BD
npx prisma migrate deploy

# 5. Iniciar la aplicación
npm run start:dev

2.5 Credenciales Locales

ServicioUsuarioPasswordURL de acceso
PostgreSQLnvitonvito_dev_passwordpostgresql://nvito:nvito_dev_password@localhost:5432/nvito_dev
Redis— (sin auth)redis://localhost:6379
MinIOminioadminminioadmin123http://localhost:9001 (Console)
MailDevhttp://localhost:1080 (Web UI)
Adminernvitonvito_dev_passwordhttp://localhost:8080

2.6 Buckets de MinIO

El servicio minio-client crea automáticamente 4 buckets al iniciar:

BucketAcceso públicoContenido
nvito-uploadsFotos de galería, avatares, logos
nvito-assetsAssets estáticos de invitaciones
nvito-privateNoContratos, documentos internos
nvito-templatesTemplates HTML compilados de invitaciones

Clerk requiere internet

Clerk Auth siempre se conecta a la nube (no hay modo offline). Las claves pk_test_ y sk_test_ del modo desarrollo de Clerk son necesarias incluso en local. Es el único servicio externo obligatorio.

3. Ambiente DEV (VPS + Coolify)

El ambiente DEV refleja la rama develop y se usa para integración continua. Los desarrolladores ven aquí sus cambios desplegados automáticamente después de cada push.

3.1 Infraestructura

ComponenteProveedorDetalle
HostingVPS Contabo (Cloud VPS 10)4 vCPU, 8 GB RAM, 150 GB SSD, Ubuntu 22.04
IP212.28.185.197Compartida con TEST
PaaSCoolify v4Gestión de contenedores Docker
Reverse ProxyTraefikIntegrado en Coolify
SSLCloudflare Origin CertificateCertificado de 15 años, modo Full (Strict)
Base de datosNeon PostgreSQL (Free)Proyecto nvito-dev, 0.5 GB, auto-suspend 5 min
Cache/ColasUpstash Redis (Free)256 MB, 500K cmds/mes, TLS, compartido con TEST
StorageCloudflare R2 (Free)4 buckets con prefijo dev-nvito-*
EmailMailtrap (Free)100 emails/mes, inbox visual
AuthClerk (Dev mode)Instancia compartida con TEST

3.2 Subdominios y Servicios

ServicioBranchSubdominioPuerto interno
nvito-api-devdevelopdev-api.nvito.mx3000
nvito-admin-devdevelopdev-admin.nvito.mx5050
nvito-invitations-devdevelopdev-inv.nvito.mx3001
nvito-pwa-devdevelopdev-app.nvito.mx3002
nvito-landing-devdevelopdev-landing.nvito.mx4000

3.3 Flujo de Deploy

3.4 Limitaciones del Ambiente DEV

LimitaciónImpactoWorkaround
Neon auto-suspendBD duerme tras 5 min inactiva; primer query tarda 3-5sCold start esperado, no afecta desarrollo
Upstash compartidoDEV y TEST usan la misma DB RedisDatos efímeros (cache + queues), sin colisión en la práctica
Mailtrap 100/mesLímite de 100 emails en free tierSuficiente para desarrollo; emails se ven en inbox visual
VPS compartidoDEV y TEST comparten el mismo VPS8 GB RAM bastan para 8 contenedores ligeros

4. Ambiente TEST (VPS + Coolify)

El ambiente TEST refleja la rama test y se usa para QA formal antes de producción. Su estructura es idéntica a DEV con la única diferencia del prefijo de subdominios y la base de datos.

4.1 Diferencias con DEV

AspectoDEVTEST
Branchdeveloptest
Subdominiosdev-*.nvito.mxtest-*.nvito.mx
Base de datos NeonProyecto nvito-devProyecto nvito-test
Buckets R2dev-nvito-*test-nvito-*
PropósitoIntegración rápidaQA formal, regresión
Quién lo usaDesarrolladoresQA + stakeholders

4.2 Subdominios TEST

ServicioBranchSubdominio
nvito-api-testtesttest-api.nvito.mx
nvito-admin-testtesttest-admin.nvito.mx
nvito-invitations-testtesttest-inv.nvito.mx
nvito-pwa-testtesttest-app.nvito.mx
nvito-landing-testtesttest-landing.nvito.mx

TEST como staging

El ambiente TEST funciona como staging. Todo cambio que llega aquí ya pasó por DEV y los tests automatizados. Las demos a stakeholders y las validaciones finales se hacen en TEST antes de promover a producción.

5. Ambiente PROD (Railway)

El ambiente de producción corre en Railway (actualmente plan Hobby, con upgrade a Pro planificado al lanzar). El proyecto nvito-prod contiene 5 servicios: 4 aplicaciones web + PostgreSQL, comunicados vía private networking.

5.1 Arquitectura de Producción

5.2 Servicios en Railway

ServicioCustom DomainPuertoDominio Railway generadoEstado
nvito-apiapi.nvito.mx (vía Worker)3000nvito-api-production.up.railway.appCreado (sin deploy)
nvito-adminadmin.nvito.mx5050Creado (sin deploy)
nvito-invitationsinv.nvito.mx3001Creado (sin deploy)
nvito-pwaapp.nvito.mx3002Creado (sin deploy)
PostgreSQL— (private network)5432Creado (sin migraciones)

Estado actual

Los 4 servicios están creados como "Empty Service" en Railway. Falta conectar los repositorios de GitLab para habilitar auto-deploy (tarea pendiente P3). Las variables de entorno de producción también están pendientes de configuración (tarea P1).

5.3 Private Networking

Railway ofrece una red privada interna entre servicios del mismo proyecto. Esto significa que:

  • nvito-admin, nvito-invitations y nvito-pwa se comunican con nvito-api vía http://nvito-api.railway.internal:3000 (sin SSL overhead, sin internet)
  • PostgreSQL es accesible solo desde la red privada, no tiene IP pública
  • nvito-api tiene un dominio público generado (nvito-api-production.up.railway.app) que usa el Cloudflare Worker como origin
  • Los otros 3 servicios tienen custom domains directos (admin, inv, app)
  • La latencia interna es inferior a 1ms

5.4 Email en Producción

Nvito separa el correo corporativo del transaccional con dos dominios distintos:

AspectoCorporativo (nvito.mx)Transaccional (send.nvito.mx)
ProveedorCloudflare Email Routing + GmailResend
SMTPsmtp.gmail.comsmtp.resend.com:465
Direccioneshola@, soporte@, contacto@noreply@, eventos@
VolumenBajo (manual)Alto (automático, Bull queues)
PlanFreeFree (3K/mes, 100/dia)

5.5 R2 Buckets de Producción

BucketAcceso públicoContenido
nvito-uploadsSí (vía cdn.nvito.mx)Fotos de galería, avatares, logos
nvito-assetsAssets estáticos de invitaciones
nvito-templatesTemplates HTML compilados
nvito-privateNoContratos, documentos internos

CORS configurado para todos los subdominios *.nvito.mx.

5.6 Diferencias Clave con DEV/TEST

AspectoDEV/TESTPROD
HostingVPS + Coolify (self-managed)Railway (managed)
Plan RailwayHobby (upgrade a Pro al lanzar)
Base de datosNeon Free (auto-suspend)Railway PostgreSQL (always-on)
EmailMailtrap (testing)Resend en send.nvito.mx (producción)
API ProxyDirecto (A record a VPS)CF Worker + CloudflareTokenGuard
Auth keysClerk pk_test_ / sk_test_Clerk pk_live_ / sk_live_
R2 Buckets{env}-nvito-*nvito-* (sin prefijo, 4 buckets)
CF AccessSolo adminadmin + docs
SSL originCF Origin Certificate (15 años)Railway auto-SSL
LandingAstro 5.x en CF Pages (nvito.mx), SSR /join/[token] para deeplinks

6. Tabla Comparativa de Ambientes

ServicioLocalDEVTESTPROD
Base de datosPostgreSQL 15 (Docker)Neon Free (nvito-dev)Neon Free (nvito-test)Railway PostgreSQL
Cache / ColasRedis 7 (Docker)Upstash Free (compartido)Upstash Free (compartido)Upstash Pro o Free
Storage (S3)MinIO (Docker)R2 Free (dev-nvito-*)R2 Free (test-nvito-*)R2 Free (nvito-*)
EmailMailDev (Docker)Mailtrap FreeMailtrap FreeResend ($20/mes o Free)
AuthClerk Dev (cloud)Clerk Dev (cloud)Clerk Dev (cloud)Clerk Prod (cloud)
Hosting appsProcesos localesCoolify + VPSCoolify + VPSRailway Pro
CDNMinIO directoR2 public URLR2 public URLcdn.nvito.mx (R2 custom domain)
DeployManualAuto (Coolify webhook)Auto (Coolify webhook)Auto (Railway git deploy)
SSL— (HTTP)CF Origin Certificate (15 años)CF Origin Certificate (15 años)Railway auto-SSL
Dominiolocalhost:*dev-*.nvito.mxtest-*.nvito.mx*.nvito.mx

7. Variables de Entorno por Ambiente

7.1 Variables Críticas

VariableLocalDEVTESTPROD
NODE_ENVdevelopmentproductionproductionproduction
DATABASE_URLpostgresql://nvito:...@localhost:5432/nvito_devNeon pooled URLNeon pooled URLRailway private URL
REDIS_URLredis://localhost:6379rediss://...@upstash.io:6379misma Upstash DBUpstash TLS URL
CORS_ORIGINShttp://localhost:5050,...https://dev-admin.nvito.mx,...https://test-admin.nvito.mx,...https://admin.nvito.mx,...
FRONTEND_URLhttp://localhost:3001https://dev-inv.nvito.mxhttps://test-inv.nvito.mxhttps://inv.nvito.mx
CDN_URLhttp://localhost:9000/nvito-uploadsR2 public URL (dev)R2 public URL (test)https://cdn.nvito.mx
APP_DEEP_LINK_URLhttp://localhost:4000https://dev-landing.nvito.mxhttps://test-landing.nvito.mxhttps://nvito.mx

7.2 Variables de Autenticación

VariableLocalDEV/TESTPROD
CLERK_SECRET_KEYsk_test_...sk_test_...sk_live_...
CLERK_PUBLISHABLE_KEYpk_test_...pk_test_...pk_live_...
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEYpk_test_...pk_test_...pk_live_...

7.3 Variables de Storage

VariableLocalDEV/TESTPROD
R2_ENDPOINThttp://localhost:9000— (usa R2_ACCOUNT_ID)
R2_ACCOUNT_IDCloudflare Account IDCloudflare Account ID
R2_ACCESS_KEY_IDminioadminR2 API TokenR2 API Token
R2_SECRET_ACCESS_KEYminioadmin123R2 API SecretR2 API Secret
R2_BUCKET_UPLOADSnvito-uploadsdev-nvito-uploadsnvito-uploads
R2_BUCKET_ASSETSnvito-assetsdev-nvito-assetsnvito-assets
R2_BUCKET_PRIVATEnvito-privatedev-nvito-privatenvito-private
R2_BUCKET_TEMPLATESnvito-templatesdev-nvito-templatesnvito-templates

7.4 Variables de Email

VariableLocalDEV/TESTPROD
SMTP_HOSTlocalhostsandbox.smtp.mailtrap.iosmtp.resend.com
SMTP_PORT10252525465
SMTP_USER— (vacío)Credenciales Mailtrapresend
SMTP_PASSWORD— (vacío)Credenciales MailtrapResend API Key
SMTP_FROMnvito@localhosttest@nvito.mxnoreply@send.nvito.mx
CF_API_TOKEN— (no usado)— (no usado)Token secreto para CloudflareTokenGuard

7.5 Archivos de Entorno por Proyecto

Cada proyecto tiene archivos .env específicos para ambientes remotos:

ProyectoArchivosVariables actualizadas para *.nvito.mx
nvito-api.env.dev-remote, .env.test-remoteFRONTEND_URL, ADMIN_URL, CORS_ORIGINS, INVITATIONS_WEBHOOK_URL, CDN_URL, CDN_ALLOWED_ORIGINS, APP_DEEP_LINK_URL
nvito-adminnext.config.tsCSP img-src actualizado de cdn.nvito.com a cdn.nvito.mx
nvito-invitationsnext.config.mjsframe-ancestors actualizado con *.nvito.mx
nvito-pwa.env.exampleURLs actualizadas a *.nvito.mx
nvito-client.env.exampleURLs actualizadas a *.nvito.mx
nvito-landing.envPUBLIC_PWA_URL (URL de la PWA para fallback en smart link)

Consistencia de URLs

Todas las variables de entorno que referencian subdominios de Nvito usan el patrón {env}-{service}.nvito.mx en DEV/TEST y {service}.nvito.mx en producción. Al agregar un nuevo servicio, actualizar todas las variables de CORS y URL en los archivos de entorno de cada proyecto.

7.7 Detección Automática de Storage

La configuración de storage (storage.config.ts en nvito-api) se adapta automáticamente al ambiente:

7.8 Gestión de Secretos

AmbienteAlmacenamientoHerramienta
LocalArchivo .env (gitignored)Opcionalmente bws CLI
DEV/TESTDashboard Coolify (por servicio)Secretos críticos en Bitwarden SM
CI/CDGitLab Variables (BWS_ACCESS_TOKEN)bws run inyecta en runtime
PRODDashboard Railway (por servicio)Bitwarden SM para rotación

Nunca commitear secretos

Los archivos .env están en .gitignore. Las variables NEXT_PUBLIC_* son públicas por definición (se embeben en el JS del browser). Todo lo demás es secreto y debe gestionarse vía dashboard del proveedor o Bitwarden Secrets Manager.

Esta pagina fue util?