El repositorio incluye CI (typecheck, lint) pero no despliega automáticamente. Sigue estos pasos para publicar en producción.
1. Base de datos (Neon o Supabase)
Neon (recomendado con Vercel)
- Crea un proyecto en neon.tech.
- Copia la connection string (
postgresql://...?sslmode=require). - En local, una vez:
pnpm run db:migratecontra esa URL para crear/actualizar tablas (fuente de verdad:drizzle/). - Tras el primer deploy:
pnpm run db:migrateypnpm run db:sync:plansen la BD de producción (sincroniza Free/Pro/Enterprise, incluidofeature_culqi). También puedes abrir Admin → Planes (dispara el mismo upsert).
Gate pre-prod: en staging corre
pnpm run staging:gate(seed + smoke registro→pago→QR→check-in). Ver Staging pre-producción.
Supabase
- Crea proyecto en supabase.com.
- Settings → Database → Connection string (URI).
- Misma lógica:
pnpm run db:migratecontra la URL remota.
Neon y Supabase incluyen backups automáticos. Actívalos en el panel del proveedor.
2. Vercel
- Importa el repo en vercel.com.
- Framework: Next.js (detectado automáticamente).
- Build:
pnpm run build· Install:pnpm install. - Añade todas las variables de
.env.exampleen Settings → Environment Variables.
Variables críticas en producción
| Variable | Notas |
|---|---|
DATABASE_URL | Postgres remoto (SSL) |
BETTER_AUTH_SECRET | ≥32 caracteres, único por entorno |
TICKET_SIGNING_KEY | ≥32 caracteres, único por entorno |
CRON_SECRET | Obligatorio en producción (≥16 caracteres) |
NEXT_PUBLIC_APP_URL | https://tudominio.com |
| SMTP | Resend, SendGrid o similar (no Mailtrap) |
CULQI_SECRET_KEY / NEXT_PUBLIC_CULQI_PUBLIC_KEY | Cobros de licencias (plataforma). Distintos a las llaves del organizador. |
CULQI_WEBHOOK_SECRET | Firma del webhook /api/webhooks/culqi (obligatorio en prod si Culqi está activo) |
3. Crons en producción
El archivo vercel.json en la raíz programa:
| Ruta | Horario (UTC) | Función |
|---|---|---|
/api/cron/events | 03:00 diario | Marcar eventos pasados como completados |
/api/cron/subscriptions | 04:00 diario | Renovaciones y ciclo de planes |
/api/cron/broadcasts | Cada 15 min | Cola de emails masivos |
/api/cron/registration-holds | Cada 5 min | Liberar reservas de inscripción vencidas |
/api/cron/finance-digest | Cada hora (:05) | Resumen financiero diario (hora 00 zona plataforma) |
/api/cron/backup | 05:00 domingos | Verificación y conteo de tablas |
Vercel envía Authorization: Bearer <CRON_SECRET> en las invocaciones programadas.
Prueba manual:
curl -H "Authorization: Bearer TU_CRON_SECRET" https://tudominio.com/api/cron/events
4. Post-deploy
- Registra el primer super admin (flujo de registro + asignación de rol
super_adminen BD o botón Inicializar roles en superadmin). pnpm run db:sync:plans(o Admin → Planes) para asegurarfeature_culqien Free/Pro/Enterprise.- Activa Culqi de plataforma en Admin → Medios de pago (cobros de suscripción).
- Verifica correo OTP con SMTP de producción.
- Revisa logs de Vercel: busca el prefijo
[culqi]en fallos de orden/confirm/webhook. - Configura dominio personalizado en Vercel.
- Comprueba salud:
GET https://tudominio.com/api/health
5. Deploy automático (GitHub Actions)
El workflow .github/workflows/deploy.yml ejecuta typecheck y despliega a Vercel en push a main.
Secrets requeridos en GitHub → Settings → Secrets:
| Secret | Dónde obtenerlo |
|---|---|
VERCEL_TOKEN | Vercel → Account → Tokens |
VERCEL_ORG_ID | Vercel → Project → Settings → General |
VERCEL_PROJECT_ID | Idem |
Si prefieres deploy solo desde el dashboard de Vercel, puedes desactivar este workflow.
6. Documentación (opcional)
El sitio Astro en /docs puede desplegarse por separado o servirse en NEXT_PUBLIC_DOCS_URL.