🚀 Deployment Guide
Visión General
PuntoHack se despliega en Vercel, aprovechando sus características de Serverless Functions, Edge Network, y Cron Jobs.
Prerequisitos
- ✅ Cuenta en Vercel
- ✅ Repositorio en GitHub/GitLab/Bitbucket
- ✅ Variables de entorno configuradas
- ✅ Base de datos Supabase configurada
Proceso de Deployment
Paso 1: Conectar Repositorio
- Ve a Vercel Dashboard
- Click en Add New Project
- Conecta tu repositorio de GitHub/GitLab/Bitbucket
- Selecciona el repositorio de PuntoHack
Paso 2: Configurar Proyecto
Framework Preset: Next.js
Root Directory: ./
Build Command: pnpm build
Output Directory: .next
Paso 3: Variables de Entorno
Agrega todas las variables necesarias en Vercel Dashboard:
# Clerk
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_live_...
CLERK_SECRET_KEY=sk_live_...
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/dashboard
# Supabase
DATABASE_URL=postgresql://...
NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=xxx
# Sentry
SENTRY_DSN=xxx
SENTRY_AUTH_TOKEN=xxx
NEXT_PUBLIC_SENTRY_DSN=xxx
# Cron
CRON_SECRET=xxx
# Environment
NODE_ENV=production
Paso 4: Deploy
- Click en Deploy
- Espera a que el build complete
- Verifica que el deployment fue exitoso
Configuración de Cron Jobs
vercel.json
{
"crons": [
{
"path": "/api/cron/update-hackathon-states",
"schedule": "* * * * *"
}
]
}
Nota: Los cron jobs se activan automáticamente después del primer deployment.
Endpoint de Cron
Archivo: src/app/api/cron/update-hackathon-states/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { db } from '@/core/db';
import { HackathonStatus } from '@prisma/client';
export async function GET(request: NextRequest) {
// Validar cron secret
const authHeader = request.headers.get('authorization');
if (authHeader !== `Bearer ${process.env.CRON_SECRET}`) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const now = new Date();
// REGISTRATION → RUNNING
const regToRunning = await db.hackathon.updateMany({
where: {
status: HackathonStatus.REGISTRATION,
registrationClosesAt: { lte: now },
},
data: { status: HackathonStatus.RUNNING },
});
// RUNNING → JUDGING
const runningToJudging = await db.hackathon.updateMany({
where: {
status: HackathonStatus.RUNNING,
judgingStartsAt: { lte: now },
},
data: { status: HackathonStatus.JUDGING },
});
// JUDGING → FINISHED
const judgingToFinished = await db.hackathon.updateMany({
where: {
status: HackathonStatus.JUDGING,
judgingEndsAt: { lte: now },
},
data: { status: HackathonStatus.FINISHED },
});
return NextResponse.json({
success: true,
timestamp: now.toISOString(),
updates: {
regToRunning: regToRunning.count,
runningToJudging: runningToJudging.count,
judgingToFinished: judgingToFinished.count,
},
});
}
Verificación Post-Deployment
1. Verificar Build
- ✅ Build completó sin errores
- ✅ No hay warnings críticos
- ✅ TypeScript compiló correctamente
2. Verificar Variables de Entorno
- ✅ Todas las variables están configuradas
- ✅ Valores son correctos (no placeholders)
- ✅ Secrets están protegidos
3. Verificar Funcionalidad
- ✅ Autenticación funciona
- ✅ Base de datos conecta
- ✅ Server Actions funcionan
- ✅ Cron jobs están activos
4. Verificar Performance
- ✅ Páginas cargan rápido
- ✅ No hay errores en consola
- ✅ Sentry captura errores correctamente
Monitoreo
Vercel Analytics
- Deployments: Historial de deployments
- Functions: Logs de Serverless Functions
- Cron Jobs: Estado de cron jobs
Sentry
- Errors: Errores en producción
- Performance: Métricas de performance
- Releases: Tracking de releases
Rollback
Desde Vercel Dashboard
- Ve a Deployments
- Selecciona el deployment anterior
- Click en Promote to Production
Desde CLI
vercel rollback [deployment-url]
Mejores Prácticas
1. Environment Variables
- ✅ Usar diferentes valores para dev/staging/prod
- ✅ No committear secrets
- ✅ Usar Vercel Environment Variables
2. Build Optimization
- ✅ Optimizar imágenes
- ✅ Minimizar bundle size
- ✅ Usar Server Components cuando sea posible
3. Error Handling
- ✅ Capturar errores con Sentry
- ✅ Mostrar mensajes user-friendly
- ✅ Logging estructurado
4. Testing
- ✅ Tests pasan antes de deploy
- ✅ Verificar en staging primero
- ✅ Smoke tests después de deploy
Troubleshooting
Build Fails
Causa: Errores de TypeScript o dependencias
Solución:
- Verificar logs de build
- Ejecutar
pnpm buildlocalmente - Verificar que todas las dependencias están instaladas
Variables de Entorno No Funcionan
Causa: Variables no configuradas o incorrectas
Solución:
- Verificar en Vercel Dashboard
- Reiniciar deployment
- Verificar que tienen el prefijo correcto (
NEXT_PUBLIC_)
Cron Jobs No Ejecutan
Causa: Configuración incorrecta o secret inválido
Solución:
- Verificar
vercel.json - Verificar
CRON_SECRET - Revisar logs de cron en Vercel
Próximos Pasos
- Troubleshooting - Solución de problemas
- Infrastructure - Infraestructura completa
- Development Guide - Setup local
Siguiente: Troubleshooting