Apariencia
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 viaopendkim - [ ] 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.mxcomprado - [ ] 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.mxcon la pública generada poropendkim-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:linkejecutado - [ ] 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 tinker→DB::connection()->getPdo()) - [ ]
php artisan migrate --forceejecutado - [ ]
php artisan storage:linkejecutado (creapublic/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,BigFiveQuestionsSeedercorridos - [ ] Backup diario automatizado de MySQL (
mysqldump) y destorage/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 secretcopiado aSTRIPE_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
ExpireMembershipsJobse ejecuta diariamente - [ ]
failed_jobstable 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_URLapunta al backend de producción - [ ] Verificar en el browser que
/logincarga y que no hay errores de CORS
11 · Docs desplegadas (este mismo manual)
- [ ]
npm run buildenhumae_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/healthdevuelve 200 conapp/database/cache/queueenok - [ ] Registro de candidato de prueba → verificación de email (revisar
/var/log/mail.logy 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}/downloadcon 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 listoSiguiente
Detalle exhaustivo de cada variable de entorno: Variables de entorno →

