Saltar al contenido principal

🚀 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

  1. Ve a Vercel Dashboard
  2. Click en Add New Project
  3. Conecta tu repositorio de GitHub/GitLab/Bitbucket
  4. 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

  1. Click en Deploy
  2. Espera a que el build complete
  3. 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

  1. Ve a Deployments
  2. Selecciona el deployment anterior
  3. 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:

  1. Verificar logs de build
  2. Ejecutar pnpm build localmente
  3. Verificar que todas las dependencias están instaladas

Variables de Entorno No Funcionan

Causa: Variables no configuradas o incorrectas

Solución:

  1. Verificar en Vercel Dashboard
  2. Reiniciar deployment
  3. Verificar que tienen el prefijo correcto (NEXT_PUBLIC_)

Cron Jobs No Ejecutan

Causa: Configuración incorrecta o secret inválido

Solución:

  1. Verificar vercel.json
  2. Verificar CRON_SECRET
  3. Revisar logs de cron en Vercel

Próximos Pasos


Siguiente: Troubleshooting