1. Dominio Raíz
El dominio principal de Nvito es nvito.mx, registrado y gestionado íntegramente a través de Cloudflare Registrar. Esta decisión consolida DNS, proxy, SSL, WAF y registrar en un solo proveedor, eliminando la necesidad de coordinar nameservers entre servicios.
| Campo | Valor |
|---|---|
| Dominio | nvito.mx |
| Registrar | Cloudflare Registrar |
| Nameservers | Cloudflare (automático al usar CF Registrar) |
| Renovación | Anual (~$10.11 USD/año para .mx) |
| WHOIS Privacy | Incluido por Cloudflare |
| DNSSEC | Habilitado automáticamente |
Por qué Cloudflare Registrar
Cloudflare cobra el precio de costo del registro de dominio sin markup. Al tener el dominio y el DNS en el mismo proveedor, no hay propagación de nameservers y los cambios DNS toman efecto en segundos.
2. Mapa de Subdominios
Nvito utiliza 21 subdominios (incluyendo el dominio raíz) distribuidos en 3 ambientes (producción, DEV y TEST). Cada subdominio apunta a un servicio específico con un propósito bien definido.
2.1 Producción
| Subdominio | Servicio | Hosting | Acceso | Descripción |
|---|---|---|---|---|
nvito.mx | Landing page + Smart Link | Cloudflare Pages (PROD) / Coolify Docker (DEV/TEST) | Público | Sitio institucional, marketing y ruta SSR /join/[token] para deeplinks |
app.nvito.mx | nvito-pwa | Railway | Público | Progressive Web App para invitados y anfitriones |
inv.nvito.mx | nvito-invitations | Railway | Público | Micrositios de invitaciones generados por el motor |
api.nvito.mx | Cloudflare Worker → Railway | Worker proxy | Público (API) | API REST backend, protegida por Worker que oculta el origin |
cdn.nvito.mx | Cloudflare R2 | R2 Custom Domain | Público | Imágenes, assets, templates HTML de invitaciones |
admin.nvito.mx | nvito-admin | Railway | Privado (CF Access + Clerk) | Panel administrativo para gestión de eventos |
docs.nvito.mx | nvito-docs | Cloudflare Pages | Privado (CF Access) | Documentación técnica y de negocio |
send.nvito.mx | Resend (email transaccional) | Solo DNS (SPF/DKIM/DMARC) | N/A | Subdominio dedicado para email transaccional del sistema |
Estrategia de email con dos dominios
Nvito separa el correo corporativo del transaccional. El dominio raíz nvito.mx se usa para correo corporativo (hola@, soporte@, contacto@) vía Cloudflare Email Routing. El subdominio send.nvito.mx se usa exclusivamente para email transaccional (noreply@, eventos@) vía Resend. Esta separación protege la reputación del dominio raíz.
2.2 DEV (rama develop)
| Subdominio | Servicio | Hosting | Acceso |
|---|---|---|---|
dev-api.nvito.mx | nvito-api (dev) | VPS + Coolify | Público (API) |
dev-admin.nvito.mx | nvito-admin (dev) | VPS + Coolify | Privado (CF Access + Clerk) |
dev-app.nvito.mx | nvito-pwa (dev) | VPS + Coolify | Público |
dev-inv.nvito.mx | nvito-invitations (dev) | VPS + Coolify | Público |
dev-landing.nvito.mx | nvito-landing (dev) | VPS + Coolify | Privado (CF Zero Trust) |
2.3 TEST (rama test)
| Subdominio | Servicio | Hosting | Acceso |
|---|---|---|---|
test-api.nvito.mx | nvito-api (test) | VPS + Coolify | Público (API) |
test-admin.nvito.mx | nvito-admin (test) | VPS + Coolify | Privado (CF Access + Clerk) |
test-app.nvito.mx | nvito-pwa (test) | VPS + Coolify | Público |
test-inv.nvito.mx | nvito-invitations (test) | VPS + Coolify | Público |
test-landing.nvito.mx | nvito-landing (test) | VPS + Coolify | Privado (CF Zero Trust) |
admin siempre protegido
Independientemente del ambiente, admin.nvito.mx, dev-admin.nvito.mx y test-admin.nvito.mx están protegidos con Cloudflare Access (Zero Trust). El acceso público directo está bloqueado; se requiere autenticación vía email OTP antes de llegar a Clerk.
3. Convención de Nombres
La convención de nombres sigue un patrón predecible que permite identificar inmediatamente el ambiente y el servicio de cualquier subdominio.
Producción
{servicio}.nvito.mx
Donde {servicio} es uno de: app, inv, api, cdn, admin, docs, send, landing. El dominio raíz nvito.mx se reserva para la landing page en producción. En ambientes no productivos, se usa {env}-landing.nvito.mx. El subdominio send.nvito.mx solo existe en producción (DNS records, sin servicio web).
Ambientes no productivos
{env}-{servicio}.nvito.mx
Donde {env} es dev o test, y {servicio} es el mismo identificador que en producción.
Ejemplos
| Patrón | Producción | DEV | TEST |
|---|---|---|---|
| API Backend | api.nvito.mx | dev-api.nvito.mx | test-api.nvito.mx |
| Panel Admin | admin.nvito.mx | dev-admin.nvito.mx | test-admin.nvito.mx |
| Invitaciones | inv.nvito.mx | dev-inv.nvito.mx | test-inv.nvito.mx |
| PWA | app.nvito.mx | dev-app.nvito.mx | test-app.nvito.mx |
| Landing / Smart Link | nvito.mx | dev-landing.nvito.mx | test-landing.nvito.mx |
Consistencia con variables de entorno
Las variables CORS_ORIGINS, FRONTEND_URL y CDN_URL en cada ambiente siguen exactamente esta convención. Si se agrega un nuevo servicio, el subdominio debe seguir el mismo patrón.
4. Tipos de Registros DNS
Nvito utiliza 4 tipos principales de registros DNS en Cloudflare, cada uno con un propósito distinto.
4.1 Registro A (Address)
Apunta un subdominio a una dirección IPv4 fija. Se usa para los subdominios que apuntan al VPS de Contabo donde corre Coolify.
dev-api.nvito.mx A 212.28.185.197 Proxied
dev-admin.nvito.mx A 212.28.185.197 Proxied
test-api.nvito.mx A 212.28.185.197 Proxied
test-admin.nvito.mx A 212.28.185.197 Proxied
Todos apuntan a la misma IP del VPS. Traefik (dentro de Coolify) rutea al contenedor correcto según el header Host.
4.2 Registro CNAME (Canonical Name)
Apunta un subdominio a otro dominio (alias). Se usa para servicios managed que proveen su propio dominio.
nvito.mx CNAME nvito-landing.pages.dev # Cloudflare Pages (Astro 5.x)
docs.nvito.mx CNAME nvito-docs.pages.dev # Cloudflare Pages
cdn.nvito.mx CNAME {account}.r2.cloudflarestorage.com # R2 Custom Domain
app.nvito.mx CNAME {service}.up.railway.app # Railway (futuro)
4.3 Registro TXT (Text)
Almacena texto arbitrario. Se usa principalmente para verificación de propiedad y seguridad de email.
nvito.mx TXT "v=spf1 include:_spf.google.com include:_spf.mx.cloudflare.net ~all"
send.nvito.mx TXT "v=spf1 include:amazonses.com ~all"
Además, send.nvito.mx tiene registros DKIM configurados por Resend para firma de emails transaccionales.
| Registro | Dominio | Propósito |
|---|---|---|
| SPF (raiz) | nvito.mx | Autoriza Gmail y Cloudflare Email Routing como remitentes |
| SPF (send) | send.nvito.mx | Autoriza Resend (Amazon SES) como remitente transaccional |
| DKIM | send.nvito.mx | Firma criptográfica de emails transaccionales vía Resend |
| DMARC | _dmarc.nvito.mx | Política de validación: quarantine para mensajes que fallen SPF/DKIM |
4.4 Registro MX (Mail Exchange)
Define los servidores de correo entrante. nvito.mx recibe correo via Cloudflare Email Routing, que redirige las direcciones corporativas (hola@, soporte@, contacto@) a nvito.hq@gmail.com.
nvito.mx MX 10 isaac.mx.cloudflare.net
nvito.mx MX 23 linda.mx.cloudflare.net
nvito.mx MX 6 amir.mx.cloudflare.net
Tipos de Registros DNS
Registros DNS de nvito.mx
5. Árbol de Subdominios por Ambiente
Arbol de Subdominios — nvito.mx
Produccion
DEV (VPS + Coolify)
TEST (VPS + Coolify)
Produccion
DEV (VPS + Coolify)
TEST (VPS + Coolify)
6. Flujo de Resolución DNS
Cuando un usuario accede a cualquier subdominio de Nvito, el flujo de resolución pasa por Cloudflare antes de llegar al origin server.
Flujo de Resolucion DNS
Puntos clave del flujo
- Anycast: Cloudflare utiliza una red Anycast global. El DNS siempre resuelve a la IP del edge node más cercano al usuario, no a la IP real del origin.
- Proxy mode: Todos los subdominios tienen el proxy de Cloudflare habilitado (icono naranja en el dashboard). Esto oculta la IP real del origin.
- SSL termination: Cloudflare termina SSL en el edge y re-encripta la conexión al origin (modo Full).
- Cache: Los assets estáticos (imágenes, CSS, JS) se cachean en el edge. Las respuestas de API no se cachean.
7. Configuración Cloudflare
7.1 SSL/TLS
| Configuración | Valor | Descripción |
|---|---|---|
| Modo SSL | Full (Strict) | Cloudflare verifica el certificado del origin |
| Always Use HTTPS | Habilitado | Redirect automático HTTP → HTTPS |
| Minimum TLS Version | 1.2 | Rechaza conexiones TLS 1.0 y 1.1 |
| HSTS | Habilitado | max-age=31536000; includeSubDomains |
| Automatic HTTPS Rewrites | Habilitado | Reescribe URLs http:// en el HTML |
7.2 Proxy Mode
Todos los subdominios activos tienen el proxy de Cloudflare habilitado (icono naranja). Esto significa que:
- La IP real del origin nunca se expone en respuestas DNS públicas
- Todo el tráfico pasa por el edge de Cloudflare para DDoS protection, WAF y cache
- Los headers
CF-Connecting-IPyX-Forwarded-Forcontienen la IP real del cliente
Nunca desactivar proxy mode en producción
Si se desactiva el proxy (icono gris / DNS Only), la IP real del origin queda expuesta y se pierde toda la protección de Cloudflare: WAF, DDoS, SSL edge, Access. Solo se usa DNS Only para registros MX o TXT que no soportan proxy.
7.3 TTL de Registros DNS
| Contexto | TTL | Razón |
|---|---|---|
| Proxied records | Auto (300s) | Cloudflare controla el TTL cuando el proxy está activo |
| DNS Only records | 3600s (1h) | TTL estándar para registros no proxied (MX, TXT) |
Cuando un registro está proxied, Cloudflare ignora el TTL configurado y usa su propio (típicamente 300 segundos). Esto permite propagación rápida de cambios.
7.4 Page Rules y Configuration Rules
| Regla | Aplica a | Configuración |
|---|---|---|
| Cache Level: Standard | cdn.nvito.mx/* | Cache agresivo para assets estáticos |
| Browser Cache TTL: 4h | cdn.nvito.mx/* | Assets cached en el browser 4 horas |
| Security Level: High | api.nvito.mx/* | Challenge sospechosos antes de llegar al API |
| Cache Level: Bypass | api.nvito.mx/v1/* | Nunca cachear respuestas de la API REST |
8. Cloudflare Email Routing
Nvito utiliza Cloudflare Email Routing para gestionar el correo corporativo del dominio raíz nvito.mx. Este servicio gratuito redirige correos entrantes a un buzón centralizado sin necesidad de un servidor de correo propio.
8.1 Direcciones Configuradas
| Dirección | Destino | Propósito |
|---|---|---|
hola@nvito.mx | nvito.hq@gmail.com | Canal principal de contacto |
soporte@nvito.mx | nvito.hq@gmail.com | Soporte al cliente |
contacto@nvito.mx | nvito.hq@gmail.com | Contacto general y partnerships |
Sin catch-all
No se ha habilitado catch-all (capturar correos a direcciones no configuradas). Solo las 3 direcciones listadas aceptan correo. Esto reduce spam y evita que direcciones no existentes acumulen tráfico no deseado.
8.2 Registros DNS Automáticos
Cloudflare configura automáticamente los registros MX y SPF necesarios al activar Email Routing:
MX Records (recepción):
nvito.mx MX 6 amir.mx.cloudflare.net
nvito.mx MX 10 isaac.mx.cloudflare.net
nvito.mx MX 23 linda.mx.cloudflare.net
SPF Record (autorización de envío):
nvito.mx TXT "v=spf1 include:_spf.google.com include:_spf.mx.cloudflare.net ~all"
El SPF incluye tanto _spf.google.com (para envío futuro vía Gmail) como _spf.mx.cloudflare.net (para Cloudflare Email Routing).
8.3 Separación Correo Corporativo vs Transaccional
Cloudflare Email Routing
Correo Corporativo (nvito.mx)
Correo Transaccional (send.nvito.mx)
| Tipo | Dominio | Proveedor | Ejemplos |
|---|---|---|---|
| Corporativo | nvito.mx | Cloudflare Email Routing → Gmail | hola@, soporte@, contacto@ |
| Transaccional | send.nvito.mx | Resend (Amazon SES) | noreply@, eventos@ |
Esta separación protege la reputación del dominio raíz. Si los emails transaccionales generan bounces o quejas de spam, solo afectan al subdominio send.nvito.mx, no al dominio principal.
8.4 Gmail "Enviar como" (PENDIENTE)
Para poder responder correos desde Gmail con el remitente hola@nvito.mx (en lugar de nvito.hq@gmail.com), se necesita configurar "Enviar como" en Gmail usando SMTP de Gmail con un App Password.
| Paso | Estado |
|---|---|
Cuenta Gmail nvito.hq@gmail.com creada | Completado |
| Verificación en 2 pasos activada | Completado |
| App Password generado | Pendiente (Google requiere 24-72h después de activar 2FA) |
| Configurar "Enviar como" en Gmail | Pendiente |
Funcionalidad pendiente
Hasta que se complete la configuración de "Enviar como", los correos recibidos en hola@nvito.mx se pueden leer en Gmail pero las respuestas salen con remitente nvito.hq@gmail.com. No afecta la recepción de correo.
9. Archivos .well-known (Deep Links)
El dominio nvito.mx sirve archivos .well-known necesarios para que iOS y Android reconozcan la app móvil como manejador de links del dominio. Estos archivos permiten que al abrir https://nvito.mx/join/{token} en un dispositivo con la app instalada, el sistema operativo abra la app directamente en lugar del navegador.
9.1 apple-app-site-association (iOS Universal Links)
(
"applinks": (
"apps": [],
"details": [
(
"appIDs": ["TEAM_ID.com.nvito.client"],
"paths": ["/join/*"]
)
]
)
)
El archivo se sirve desde /.well-known/apple-app-site-association sin extensión .json. Apple requiere que se sirva con Content-Type: application/json sobre HTTPS.
9.2 assetlinks.json (Android App Links)
[
(
"relation": ["delegate_permission/common.handle_all_urls"],
"target": (
"namespace": "android_app",
"package_name": "com.nvito.client",
"sha256_cert_fingerprints": ["SHA256_PLACEHOLDER"]
)
)
]
Se sirve desde /.well-known/assetlinks.json. El sha256_cert_fingerprints se actualiza con el fingerprint real del certificado de firma al publicar la app en Google Play.
Dominio de deeplinks
Se decidió usar nvito.mx (dominio principal registrado) como dominio de deeplinks en lugar de nvito.app (no registrado). La ruta /join/[token] es una ruta SSR en nvito-landing que actúa como smart link: si la app está instalada se abre directamente, si no muestra botones de descarga y un fallback a la PWA (app.nvito.mx).
10. Troubleshooting DNS
10.1 Propagación DNS
Problema: Un cambio de DNS no se refleja inmediatamente.
Diagnostico:
# Verificar resolución actual
dig admin.nvito.mx +short
# Verificar directamente contra nameservers de Cloudflare
dig @1.1.1.1 admin.nvito.mx +short
# Verificar TTL restante
dig admin.nvito.mx +noall +answer
Solución: Los registros proxied de Cloudflare propagan en segundos. Si el cambio no se refleja, limpiar cache DNS local (sudo dscacheutil -flushcache en macOS) y verificar que no haya cache del browser.
10.2 Error 526 (Invalid SSL Certificate)
Problema: Cloudflare muestra error 526 al acceder a un subdominio.
Causa: El modo SSL está en "Full (Strict)" pero el origin no tiene un certificado válido.
Solución:
- Verificar que el origin tiene SSL (Let's Encrypt via Coolify/Traefik, o Railway auto-SSL)
- Si el certificado expiró, renovar en Coolify o cambiar temporalmente a modo "Full" (sin Strict)
- Para origins sin SSL propio, usar un Cloudflare Origin Certificate (15 años, gratuito)
10.3 Proxy Mode vs DNS Only
Problema: Un subdominio no carga o muestra timeout.
Diagnostico: Verificar si el registro está proxied:
# Si retorna IP de Cloudflare (104.x.x.x, 172.x.x.x) → proxied
# Si retorna IP del VPS (212.28.185.197) → DNS Only
dig admin.nvito.mx +short
Causa común: Si el registro está en DNS Only, el tráfico va directo al VPS sin pasar por Cloudflare. Si el VPS no tiene SSL configurado para ese dominio, el navegador rechaza la conexión.
10.4 Cache de Cloudflare
Problema: Cambios en la aplicación no se reflejan en el navegador.
Solución:
- Purge cache en Cloudflare: Dashboard > Caching > Purge Everything (o por URL específica)
- Development Mode: Activar temporalmente en Cloudflare para bypass de cache (3 horas)
- Verificar headers de cache:
curl -I https://cdn.nvito.mx/path/to/assety revisarCF-Cache-Status
| CF-Cache-Status | Significado |
|---|---|
HIT | Servido desde cache de Cloudflare |
MISS | Origin consultado, respuesta cacheada para próximas requests |
BYPASS | Cache deshabilitado para esta ruta |
DYNAMIC | Contenido dinámico, no cacheable |
EXPIRED | Cache existía pero el TTL expiró, se re-validó con origin |