Usa este checklist antes de cada despliegue a producción para garantizar que todas las configuraciones estén correctas y prevenir errores comunes.
Pre-Despliegue
Sección titulada «Pre-Despliegue»1. Variables de Entorno Obligatorias
Sección titulada «1. Variables de Entorno Obligatorias»Base de Datos
Sección titulada «Base de Datos»-
DATABASE_URLconfigurada con Neon connection string- Formato:
postgresql://user:pass@ep-xxx.aws.neon.tech/neondb?sslmode=require - Obtener de: console.neon.tech
- Formato:
Autenticación
Sección titulada «Autenticación»-
JWT_SECRETgenerado conopenssl rand -base64 32- ⚠️ Nunca reutilizar el mismo secret de desarrollo
- ⚠️ Generar uno único para producción
-
CLIENT_URLcon dominio de producción- Formato:
https://talentbricks.ai(sin trailing slash)
- Formato:
Stripe (Modo Producción)
Sección titulada «Stripe (Modo Producción)»-
STRIPE_API_KEYcambiado ask_live_*(no test)- Obtener de: dashboard.stripe.com/apikeys
-
STRIPE_WEBHOOK_SECRETdel webhook de producción (no test)- Formato:
whsec_* - Obtener de: dashboard.stripe.com/webhooks
- Formato:
-
PAYMENTS_MONTHLY_SUBSCRIPTION_PLAN_IDconprice_live_*- Obtener de: dashboard.stripe.com/prices
-
PAYMENTS_ANNUAL_SUBSCRIPTION_PLAN_IDconprice_live_*- Obtener de: dashboard.stripe.com/prices
Email (SendGrid)
Sección titulada «Email (SendGrid)»-
SENDGRID_API_KEYconfigurado- Formato:
SG.* - Obtener de: app.sendgrid.com/settings/api_keys
- Formato:
-
SENDGRID_FIELD_FROM_EMAILcon email verificado en SendGrid -
SENDGRID_FIELD_FROM_NAMEcon nombre de tu marca
Administradores
Sección titulada «Administradores»-
ADMIN_EMAILScon emails reales (separados por coma)- Ejemplo:
admin@empresa.com,juan@empresa.com - Estos usuarios tendrán acceso al dashboard de admin
- Ejemplo:
2. Almacenamiento de Videos (elige una opción)
Sección titulada «2. Almacenamiento de Videos (elige una opción)»Solo si usas videos en producción (recomendado). La variable STORAGE_PROVIDER controla el
proveedor activo.
-
STORAGE_PROVIDERconfigurado:awsoazure
Opción A: AWS S3 + CloudFront
Sección titulada «Opción A: AWS S3 + CloudFront»-
AWS_S3_IAM_ACCESS_KEYconfigurado- Obtener de: console.aws.amazon.com/iam
-
AWS_S3_IAM_SECRET_KEYconfigurado -
AWS_S3_FILES_BUCKETconfigurado- Ejemplo:
talentbricks-videos-prod
- Ejemplo:
-
AWS_S3_REGIONconfigurado- Ejemplo:
us-east-1
- Ejemplo:
-
CLOUDFRONT_DOMAINconfigurado- Formato:
d1234567890abc.cloudfront.net(sin https://)
- Formato:
-
CLOUDFRONT_KEY_PAIR_IDconfigurado- Obtener de: CloudFront → Key pairs
-
CLOUDFRONT_PRIVATE_KEYconfigurado (en una línea con\n)- Formato:
-----BEGIN RSA PRIVATE KEY-----\nMIIE...\n-----END RSA PRIVATE KEY-----
- Formato:
Verificar:
- Usuario IAM tiene permisos
s3:PutObjectys3:GetObject - Bucket S3 tiene CORS configurado correctamente
- CloudFront distribution está en estado “Deployed”
Opción B: Azure Blob Storage
Sección titulada «Opción B: Azure Blob Storage»-
AZURE_STORAGE_ACCOUNT_NAMEconfigurado- Obtener de: portal.azure.com → Storage accounts
-
AZURE_STORAGE_ACCOUNT_KEYconfigurado- Obtener de: Storage Account → Security + networking → Access keys
-
AZURE_STORAGE_CONTAINER_NAMEconfigurado- Ejemplo:
videos
- Ejemplo:
Verificar:
- Container creado con acceso privado (sin acceso anónimo)
- La key es válida (se puede rotar en el portal de Azure si es necesario)
3. Autenticación Social (Opcional)
Sección titulada «3. Autenticación Social (Opcional)»Google OAuth
Sección titulada «Google OAuth»-
GOOGLE_CLIENT_IDconfigurado- Obtener de: console.cloud.google.com/apis/credentials
-
GOOGLE_CLIENT_SECRETconfigurado - Authorized redirect URIs incluye:
https://tu-dominio.com/auth/google/callback
GitHub OAuth
Sección titulada «GitHub OAuth»-
GITHUB_CLIENT_IDconfigurado- Obtener de: github.com/settings/developers
-
GITHUB_CLIENT_SECRETconfigurado - Authorization callback URL es:
https://tu-dominio.com/auth/github/callback
4. Analytics (Opcional)
Sección titulada «4. Analytics (Opcional)»Plausible
Sección titulada «Plausible»-
PLAUSIBLE_API_KEYconfigurado si usas Plausible- Obtener de: plausible.io/settings
Google Analytics 4
Sección titulada «Google Analytics 4»-
REACT_APP_GOOGLE_ANALYTICS_IDconfigurado si usas GA4- Formato:
G-XXXXXXXXXX - Obtener de: analytics.google.com
- Formato:
5. OpenAI (Funciones AI)
Sección titulada «5. OpenAI (Funciones AI)»-
OPENAI_API_KEYconfigurado si usas funciones AI- Obtener de: platform.openai.com/api-keys
6. Configuración de Base de Datos
Sección titulada «6. Configuración de Base de Datos»-
Migraciones de Prisma ejecutadas:
Ventana de terminal # En Fly.ioflyctl ssh console -C "cd /app && npx prisma migrate deploy"# En Railwayrailway run npx prisma migrate deploy -
Índices de base de datos creados correctamente
-
Connection pooling habilitado en Neon (recomendado)
7. Seguridad
Sección titulada «7. Seguridad»- Variables de entorno no están en el código fuente
-
.envestá en.gitignore - Secrets de producción son diferentes a desarrollo
- HTTPS habilitado en dominio custom
- Certificado SSL válido (auto-gestionado por Fly.io/Railway)
8. Build & Deploy
Sección titulada «8. Build & Deploy»Si usas Fly.io:
Sección titulada «Si usas Fly.io:»# Verificar que flyctl está autenticadoflyctl auth whoami
# Verificar secrets configuradosflyctl secrets list -a talentbricksai
# Deploywasp deploy fly deploySi usas Railway:
Sección titulada «Si usas Railway:»# Verificar variablesrailway variables
# Deploy (automático en git push, o manual):railway upPost-Despliegue
Sección titulada «Post-Despliegue»1. Health Check Básico
Sección titulada «1. Health Check Básico»-
La app carga sin errores en
https://tu-dominio.com -
Página de inicio (landing) se muestra correctamente
-
No hay errores 500 en la consola del navegador
-
No hay errores en logs del servidor:
Ventana de terminal # Fly.ioflyctl logs -a talentbricksai# Railwayrailway logs --tail
2. Flujo de Autenticación
Sección titulada «2. Flujo de Autenticación»- Registro de nuevo usuario funciona
- Email de verificación llega correctamente
- Verificar en SendGrid → Activity
- Login con email + password funciona
- “Olvidé mi contraseña” funciona
- Email de reset llega
- Link de reset funciona
- (Opcional) Login con Google funciona
- (Opcional) Login con GitHub funciona
3. Flujo de Pago (Stripe)
Sección titulada «3. Flujo de Pago (Stripe)»- Página de pricing carga correctamente
- Click en “Comprar Curso” redirige a Stripe Checkout
- Checkout muestra el precio correcto
- Usar tarjeta de prueba de Stripe funciona:
- Tarjeta:
4242 4242 4242 4242 - Fecha: cualquier fecha futura
- CVC: cualquier 3 dígitos
- Tarjeta:
- Después del pago, usuario es redirigido a la app
- Webhook de Stripe se recibe correctamente:
Ventana de terminal # Verificar en Stripe DashboardWebhooks → tu endpoint → Recent deliveries → 200 OK - Usuario tiene acceso al curso comprado
- Enrollment aparece en base de datos:
SELECT * FROM "Enrollment" WHERE "userId" = <user-id>;
4. Flujo de Suscripciones
Sección titulada «4. Flujo de Suscripciones»- Click en plan mensual redirige a Stripe Checkout
- Pago de suscripción se procesa correctamente
- Usuario tiene
subscriptionStatus = 'active'en DB - Acceso a contenido premium funciona
- Cancelación de suscripción funciona (portal de Stripe)
5. Videos (AWS S3 + CloudFront)
Sección titulada «5. Videos (AWS S3 + CloudFront)»- Abrir un curso con video
- El video carga correctamente (no error 403)
- URL del video es de CloudFront (no S3 directo)
- Formato correcto:
https://d123.cloudfront.net/... - Formato incorrecto:
https://s3.amazonaws.com/...
- Formato correcto:
- Video se reproduce sin problemas
- Signed URL expira después del tiempo configurado (ej: 1 hora)
6. Dashboard de Admin
Sección titulada «6. Dashboard de Admin»- Usuarios en
ADMIN_EMAILSpueden acceder a/admin - Usuarios normales no pueden acceder a
/admin(redirige o muestra error) - Dashboard muestra estadísticas correctas:
- Total de usuarios
- Cursos activos
- Enrollments
- Revenue (si aplica)
7. Funcionalidades de Curso
Sección titulada «7. Funcionalidades de Curso»- Lista de cursos carga correctamente
- Detalle de curso muestra información correcta
- Lecciones se marcan como completadas
- Progreso del curso se actualiza en tiempo real
- Certificado se genera al completar curso
- Certificado se puede descargar en PDF
8. Emails
Sección titulada «8. Emails»- Email de bienvenida llega al registrarse
- Email de verificación llega con link correcto
- Email de reset de password funciona
- Emails tienen el branding correcto (from name, from email)
- Emails no caen en spam
- Verificar SPF/DKIM en SendGrid
- Hacer prueba con Gmail, Outlook, etc.
9. Analytics
Sección titulada «9. Analytics»- Plausible/GA4 está recibiendo eventos
- Pageviews se registran correctamente
- Eventos custom funcionan (si aplica)
10. Performance
Sección titulada «10. Performance»- Tiempo de carga de landing page < 3 segundos
- Tiempo de carga de dashboard < 2 segundos
- Imágenes están optimizadas
- No hay memory leaks en logs
Ventana de terminal # Verificar memoriaflyctl status -a talentbricksai
11. Monitoreo
Sección titulada «11. Monitoreo»- Configurar alertas de uptime (ej: UptimeRobot, Pingdom)
- Configurar alertas de errores (ej: Sentry, Rollbar)
- Configurar monitoreo de logs
- Configurar alertas de uso de DB (Neon dashboard)
Rollback Plan
Sección titulada «Rollback Plan»Si algo sale mal, tener plan de rollback:
# Ver deployments anterioresflyctl releases -a talentbricksai
# Rollback a versión anteriorflyctl releases rollback -a talentbricksaiRailway
Sección titulada «Railway»- Dashboard → Deployments
- Encontrar deployment funcional anterior
- Click ••• → Redeploy
Reversar Migraciones de DB (último recurso)
Sección titulada «Reversar Migraciones de DB (último recurso)»# ⚠️ Peligroso - solo si migraciones rompen la appnpx prisma migrate resolve --rolled-back <migration-name>Checklist de Seguridad Adicional
Sección titulada «Checklist de Seguridad Adicional»- Rate limiting configurado para endpoints sensibles
- CORS configurado correctamente en
main.wasp - Cookies tienen flags
SecureyHttpOnly - Inputs están validados con Zod
- Queries/Actions verifican permisos del usuario
- No hay SQL injection vectors
- No hay XSS vectors (todo el contenido está sanitizado)
- Secrets no están en logs
- Error messages no revelan información sensible
Plataformas de Despliegue
Sección titulada «Plataformas de Despliegue»Ver guía completa: Despliegue en Fly.io
Comandos útiles:
# Ver statusflyctl status -a talentbricksai
# Ver logsflyctl logs -a talentbricksai --tail
# SSH a la instanciaflyctl ssh console -a talentbricksai
# Ver secretsflyctl secrets list -a talentbricksai
# Configurar secretflyctl secrets set SECRET_NAME=value -a talentbricksaiRailway.app
Sección titulada «Railway.app»Ver guía completa: Despliegue en Railway
Comandos útiles:
# Ver statusrailway status
# Ver logsrailway logs --tail
# Ver variablesrailway variables
# Configurar variablerailway variables set SECRET_NAME=value
# Abrir dashboardrailway openChecklist de Migración
Sección titulada «Checklist de Migración»Si estás migrando de otra plataforma o cambiando configuración:
- Backup completo de base de datos antes de migrar
- Exportar variables de entorno del sistema anterior
- Probar en staging antes de producción (si tienes)
- Configurar DNS con TTL bajo (ej: 300s) para rollback rápido
- Sincronizar usuarios/datos si cambiaste de DB
- Actualizar webhooks en servicios externos (Stripe, etc.)
- Verificar que emails llegan después de migración
Ver guía completa: Migración de Variables de Entorno
Troubleshooting Rápido
Sección titulada «Troubleshooting Rápido»App no inicia
Sección titulada «App no inicia»- Ver logs:
flyctl logsorailway logs - Verificar que todas las variables REQUIRED están configuradas
- Verificar formato de variables (ej:
DATABASE_URL)
Webhooks de Stripe fallan
Sección titulada «Webhooks de Stripe fallan»- Verificar
STRIPE_WEBHOOK_SECRETes correcto - Verificar URL del webhook en Stripe dashboard
- Probar con CLI de Stripe:
stripe listen --forward-to localhost:3001/stripe-webhook
Videos no cargan (403)
Sección titulada «Videos no cargan (403)»- Verificar
CLOUDFRONT_PRIVATE_KEYestá en formato correcto - Verificar CloudFront distribution permite signed URLs
- Verificar IAM permissions en S3
Emails no llegan
Sección titulada «Emails no llegan»- Verificar
SENDGRID_API_KEYes válido - Verificar sender email está verificado en SendGrid
- Ver Activity en SendGrid dashboard
- Verificar SPF/DKIM records
Recursos Adicionales
Sección titulada «Recursos Adicionales»- Variables de Entorno - Referencia completa
- Guía de Despliegue en Fly.io
- Guía de Despliegue en Railway
- Migración de Variables de Entorno
- Monitoreo y Logs
- Estrategia de Backups
Soporte
Sección titulada «Soporte»Si encuentras problemas:
- Revisar logs del servidor
- Revisar documentación específica del error
- Buscar en Wasp Discord
- Abrir issue en GitHub con logs y detalles