Skip to content

Checklist maestro de deploy

Antes de publicar HUMAE a producción, el desarrollador responsable debe completar los 12 pasos de abajo. Cada uno enlaza a la página con el detalle técnico exacto (keys, comandos, validaciones).

Regla de oro

No marques un paso como completado hasta que verifiques que funciona end-to-end. El deploy se rompe en los pasos que se asumen.

Los 12 pasos

1 · Cuenta SaaS + infraestructura propia lista

  • [ ] Stripe — cuenta activada (no solo test mode) con datos fiscales completos
  • [ ] Servidor de producción — VPS/bare-metal con ~50 GB en el volumen que hospeda storage/app (avatares + documentos)
  • [ ] Postfix instalado en el mismo servidor, escuchando sólo en 127.0.0.1:25, con DKIM via opendkim
  • [ ] Puerto 25 saliente abierto por el provider (muchos cloud providers lo bloquean por defecto — pedir habilitación antes del deploy)

Detalles: Servicios externos · Storage local · SMTP local.

2 · Dominios comprados y DNS apuntando

  • [ ] humae.com.mx comprado
  • [ ] Subdominios configurados: www, api, docs
  • [ ] DNS propagado (verificar con dig)
  • [ ] Certificados SSL válidos (Let's Encrypt o Cloudflare)

Detalles: DNS y dominios.

3 · Registros DNS de correo

Al enviar desde Postfix propio, la reputación depende de que los MTA destino validen nuestros registros DNS:

  • [ ] A para mail.humae.com.mx → IP del servidor
  • [ ] SPF (TXT) en humae.com.mx: v=spf1 ip4:<IP> ~all
  • [ ] DKIM (TXT) en default._domainkey.humae.com.mx con la pública generada por opendkim-genkey
  • [ ] DMARC (TXT) en _dmarc.humae.com.mx: v=DMARC1; p=none; rua=mailto:dmarc@humae.com.mx
  • [ ] PTR (reverse DNS)mail.humae.com.mx (pedir al provider de IP)

Detalles: SMTP local → DNS.

4 · Variables de entorno del backend

Archivo humae_backend/.env en producción debe tener todas estas definidas:

  • [ ] APP_KEY, APP_URL, APP_ENV=production, APP_DEBUG=false
  • [ ] FRONTEND_URL, SANCTUM_STATEFUL_DOMAINS
  • [ ] DB (DB_*), Redis (REDIS_*)
  • [ ] QUEUE_CONNECTION=redis, CACHE_STORE=redis, SESSION_DRIVER=redis
  • [ ] Stripe (STRIPE_KEY, STRIPE_SECRET, STRIPE_WEBHOOK_SECRET, STRIPE_CURRENCY)
  • [ ] Storage local (FILESYSTEM_DISK=public) + php artisan storage:link ejecutado
  • [ ] Mail SMTP local (MAIL_MAILER=smtp, MAIL_HOST=127.0.0.1, MAIL_PORT=25, MAIL_FROM_*, MAIL_REPLY_TO)
  • [ ] (opcional) SENTRY_LARAVEL_DSN

Referencia exhaustiva: Variables de entorno.

5 · Variables de entorno del frontend

Archivo humae_frontend/.env.production (o variables inyectadas en Vercel/Netlify):

  • [ ] NEXT_PUBLIC_API_URL
  • [ ] NEXT_PUBLIC_SITE_URL
  • [ ] (opcional) NEXT_PUBLIC_SENTRY_DSN

Referencia: Variables de entorno.

6 · Base de datos MySQL 8 aprovisionada

  • [ ] Servidor MySQL 8.0+ con privilegios para crear DB
  • [ ] Usuario y password con acceso solo a la DB de HUMAE (no root)
  • [ ] Conexión desde el backend verificada (php artisan tinkerDB::connection()->getPdo())
  • [ ] php artisan migrate --force ejecutado
  • [ ] php artisan storage:link ejecutado (crea public/storage → storage/app/public)
  • [ ] Permisos en storage/ correctos (chown -R www-data:www-data storage && chmod -R 775 storage)
  • [ ] php artisan db:seed --class=RolesAndPermissionsSeeder, MembershipPlansSeeder, CountriesSeeder, StatesSeeder, MajorCitiesSeeder, FunctionalAreasSeeder, CareerLevelsSeeder, SkillsSeeder, LanguagesSeeder, DegreeLevelsSeeder, PsychometricTestsSeeder, BigFiveQuestionsSeeder corridos
  • [ ] Backup diario automatizado de MySQL (mysqldump) y de storage/app (restic) a almacenamiento offsite

Detalles: Infraestructura → Base de datos.

7 · Redis (cache + queue) aprovisionado

  • [ ] Instancia Redis 6+ (self-hosted o Upstash/Redis Cloud)
  • [ ] Acceso restringido por red/IP o autenticado con password
  • [ ] Conexión verificada desde el backend

Detalles: Infraestructura → Redis.

8 · Webhook de Stripe configurado y firmado

  • [ ] En Stripe Dashboard → Webhooks → Add endpoint: https://api.humae.com.mx/api/webhooks/stripe
  • [ ] Evento suscrito: checkout.session.completed
  • [ ] Signing secret copiado a STRIPE_WEBHOOK_SECRET
  • [ ] Evento de prueba disparado y confirmado que llega al backend (200 OK)

Detalles: Servicios externos → Stripe.

9 · Queue worker + scheduler corriendo

  • [ ] Supervisor configurado con el proceso php artisan queue:work --queue=default --tries=3 --max-time=3600
  • [ ] Cron del servidor apuntando a * * * * * php /path/to/humae_backend/artisan schedule:run >> /dev/null 2>&1
  • [ ] Verificar que ExpireMembershipsJob se ejecuta diariamente
  • [ ] failed_jobs table revisable desde admin

Detalles: Infraestructura → Worker + cron · catálogo completo en Cronjobs y tareas programadas.

10 · Frontend desplegado y apuntando a la API

  • [ ] Build limpio: npm run typecheck && npm run lint && npm run test && npm run build
  • [ ] Deploy a Vercel / Netlify / Cloudflare Pages
  • [ ] NEXT_PUBLIC_API_URL apunta al backend de producción
  • [ ] Verificar en el browser que /login carga y que no hay errores de CORS

11 · Docs desplegadas (este mismo manual)

  • [ ] npm run build en humae_docs/ limpio
  • [ ] Deploy a Cloudflare Pages / Vercel / Netlify
  • [ ] Accesible desde https://docs.humae.com.mx
  • [ ] Búsqueda (⌘ K) funciona

12 · Verificación post-deploy end-to-end

Ejecutar los smoke tests en este orden:

  • [ ] GET /api/v1/health devuelve 200 con app/database/cache/queue en ok
  • [ ] Registro de candidato de prueba → verificación de email (revisar /var/log/mail.log y que el correo llegue a un inbox real) → login → checkout Stripe test → webhook dispara → membresía activa
  • [ ] Subir avatar y confirmar que la URL pública /storage/avatars/{user_id}/... sirve la imagen
  • [ ] Subir documento y confirmar que sólo se descarga vía /api/v1/me/profile/documents/{id}/download con sesión válida
  • [ ] Agendar entrevista → recibir email enviado por el SMTP local (inbox real, no spam)
  • [ ] Descargar CV PDF
  • [ ] Login de recruiter → abrir directorio → asignar candidato → mover en pipeline

Si algo falla en la verificación, no hagas rollback sin leer los logs primero. La mayoría de fallos son de configuración (.env mal), no de código.


Resumen visual

┌──────────────────────────────────────────────────────────┐
│  Cuenta SaaS + infra propia                              │
│  Stripe  ·  Storage local (disco)  ·  SMTP local (Postfix)│
├──────────────────────────────────────────────────────────┤
│  Dominios + DNS                                          │
│  humae.com.mx  ·  www  ·  api  ·  docs  ·  mail          │
│  SPF + DKIM + DMARC + PTR para correo                    │
├──────────────────────────────────────────────────────────┤
│  Infra                                                   │
│  MySQL 8  ·  Redis  ·  PHP 8.3  ·  Node 20               │
│  Postfix + OpenDKIM  ·  Supervisor + cron                │
├──────────────────────────────────────────────────────────┤
│  Claves configuradas                                     │
│  Backend: APP_KEY + STRIPE + MAIL_HOST + DB + REDIS      │
│  Frontend: NEXT_PUBLIC_API_URL                           │
├──────────────────────────────────────────────────────────┤
│  Webhook Stripe firmado + probado                        │
├──────────────────────────────────────────────────────────┤
│  Queue worker + scheduler corriendo                      │
├──────────────────────────────────────────────────────────┤
│  Verificación end-to-end exitosa                         │
└──────────────────────────────────────────────────────────┘
                         ✓ Deploy listo

Siguiente

Detalle exhaustivo de cada variable de entorno: Variables de entorno →

Manual de usuario HUMAE · Uso interno