Opera y lanza

Checklist de despliegue y seguridad

Despliega web y admin con migraciones explícitas, cron, readiness, red fiable y controles de producción.

Sincronizado con el commit e632762 del starter.

Usa esta lista final cuando la aplicación ya funcione en local. El objetivo no es solo un despliegue verde: es una versión que puedas autenticar, cobrar, operar, restaurar y administrar sin atajos de desarrollo.

Elige la forma del despliegue

  • Web y consola admin son builds separados y deben usar orígenes separados; pueden compartir repositorio, base, secreto de autenticación y etiqueta de versión.
  • Se documenta Vercel porque vercel.json trae cron, pero sirve cualquier host Node con PostgreSQL, Redis, HTTPS, secretos y un programador autenticado.
  • Usa una URL PostgreSQL con pool para tráfico serverless y, si hace falta, una directa para migraciones. Migra antes de promover código; no se ejecuta desde el build.
  • Empieza CSP en modo report-only, observa los hosts usados por analítica, Turnstile, Stripe y almacenamiento, y prueba la política antes de imponerla.

Está listo para producción cuando: ambos builds parten de la misma versión, migraciones verificadas, /api/ready sano, backup restaurable, el ejecutor de cola elegido y el webhook Stripe probados, sin flags demo y roles admin de lectura/escritura correctos.

Despliega web y apps/admin como servicios con orígenes separados. Usa Node >=24.22.1 <25 y pnpm 10.22.0; ejecuta pnpm lint, pnpm test:cov, pnpm build y después pnpm db:migrate:prod y pnpm db:check:prod. Las migraciones nunca son automáticas.

Controles obligatorios

  • BETTER_AUTH_SECRET fuerte, URL públicas y de autenticación correctas, PostgreSQL productivo y copias con pruebas de restauración.
  • Límites distribuidos en Redis y una fuente de IP explícitamente fiable.
  • Claves de producción de Turnstile si captcha está activado; demos y registro de enlaces de autenticación desactivados.
  • CRON_SECRET y un ejecutor predeterminado: /api/cron/jobs autenticado cada cinco minutos, pnpm jobs:run --production programado, o pnpm jobs:work --production continuo. vercel.json configura el horario HTTP.
  • Claves live de Stripe, webhook verificado, Billing Portal seguro y los cuatro Price ID principales exigidos por el validador actual.
  • Credenciales de almacenamiento S3 compatible privado, mínimo privilegio, CORS correcto y URL firmadas breves.
  • Un dominio remitente verificado y políticas de retención y legales revisadas para tus mercados.

Usa /api/health para vida y /api/ready para entorno, base, migraciones, Redis y cola. Una cola degradada requiere alerta aunque sirva tráfico.

Hay HSTS en producción y ruta CSP report-only. Observa reportes antes de aplicar una política compatible. Tras desplegar prueba auth, aislamiento, checkout/webhooks, ejecución de cola, exportación/borrado y MFA admin. Lee DEPLOYMENT.md, docs/security-headers.md y .env.example.

La versión actual también incluye imágenes reforzadas para web, admin, worker y Content Studio, y pnpm launch:check para unir configuración, contenedores, migraciones, integridad, retención, tests y builds. Sigue Contenedores y lanzamiento y demuestra recuperación con Copias y restore.

Valida la configuración real de producción

Ejecuta pnpm env:setup:prod para preparar .env.production.local y después pnpm env:check:prod. Web y Admin necesitan PostgreSQL, Redis, secretos de auth/cron, orígenes públicos y de auth, Resend y remitente, claves privada/webhook de Stripe, Portal y cuatro Prices, y credenciales de almacenamiento privado. El validador compartido exige estos valores aunque una pantalla no use el proveedor. Dejar claves vacías no desactiva facturación o almacenamiento; retirar una capacidad requiere cambiar explícitamente validación y ejecución.

BETTER_AUTH_URL y NEXT_PUBLIC_AUTH_BASE_URL de Admin apuntan a Admin; NEXT_PUBLIC_WEB_URL sigue siendo la app de clientes. Inyecta variables de producción en el worker y los comandos de publicación desde el gestor de secretos del host. Consulta las reglas de entorno. Aplica 0037_neat_excalibur.sql antes de actualizar auth y la migración independiente de Payload antes de Studio.