Apariencia
Servicios externos
HUMAE consume un único SaaS (Stripe) y uno opcional (Sentry). Todo lo demás —almacenamiento de archivos y envío de correo— se resuelve en el propio servidor del backend. Esta página es la guía paso-a-paso para provisionar cada uno.
| Servicio | Para qué | Plan mínimo | Costo estimado |
|---|---|---|---|
| Stripe | Cobro de membresías + webhooks | Standard | 3.6% + 3 MXN por cargo |
| Storage local | Avatares, documentos | — | $0 / mes (incluido en el VPS) |
| SMTP local (Postfix) | Correos transaccionales | — | $0 / mes (incluido en el VPS) |
| Sentry (opcional) | Error tracking | Team | $26 / mes |
Stripe (pagos)
1 · Crear cuenta
- Ve a stripe.com → Start now.
- Email corporativo (idealmente
finanzas@humae.com.mx). - País de negocio: México.
- Completar datos fiscales — Stripe los exige antes de activar pagos en vivo:
- RFC de la empresa
- Domicilio fiscal
- Cuenta bancaria (CLABE) para depósitos
- Representante legal
Stripe aprueba la cuenta en 24–72h.
2 · Activar live mode
En el dashboard, esquina superior izquierda — toggle Test mode / Live mode. Todo el deploy de producción debe correr en Live mode.
Test vs Live
Las keys pk_test_... y sk_test_... son para desarrollo. En producción usa pk_live_... y sk_live_.... Confirmar que STRIPE_KEY en .env.production empieza con pk_live_ antes de exponer al público.
3 · Obtener API keys
Dashboard → Developers → API keys:
- Publishable key →
STRIPE_KEY - Secret key →
STRIPE_SECRET(clic en "Reveal", copiar, nunca al frontend)
4 · Configurar el webhook
Dashboard → Developers → Webhooks → Add endpoint:
| Campo | Valor |
|---|---|
| Endpoint URL | https://api.humae.com.mx/api/webhooks/stripe |
| Description | HUMAE membership activation |
| Events to send | checkout.session.completed |
| API version | Latest (automatically updated) |
Click Add endpoint. En la pantalla siguiente:
- Copia el Signing secret (empieza con
whsec_...) →STRIPE_WEBHOOK_SECRETen.env.
5 · Configurar datos del producto (opcional)
Si prefieres pre-crear el precio de membresía en vez de generarlo inline:
Dashboard → Products → Add product:
- Name:
Membresía HUMAE — Candidato 6 meses - Price:
499.00 MXN - Billing:
One-time
Copia el price_id (price_...) → STRIPE_PRICE_CANDIDATE_6M.
(Si no lo pones, el backend genera price_data inline. Ambas formas funcionan.)
6 · Verificación
Dispara un pago de prueba en test mode primero:
bash
# En local con Stripe CLI
stripe trigger checkout.session.completedEl webhook debe llegar al backend y activar una membresía. Revisa:
- Dashboard Stripe → Webhooks → tu endpoint → últimos eventos
- Log del backend:
[StripeWebhook] checkout.session.completed processed. session=... - DB: debe existir un registro en
membershipsconstatus=active
7 · Activar pagos reales
Una vez probado: repite en live mode con una tarjeta real propia, monto mínimo. Después del webhook exitoso, refund desde el Stripe dashboard.
Referencias técnicas: Integración Stripe · Webhooks.
Storage local (archivos)
No hay signup — los archivos se guardan en el propio servidor del backend.
1 · Dimensionar el volumen de storage/
Reservar un volumen persistente para humae_backend/storage/app. Referencia: ~2.5 MB por candidato activo. Provisión inicial ~50 GB con alertas al 70 %.
2 · Permisos y symlink
Tras el primer deploy, como parte del flujo de despliegue:
bash
cd /var/www/humae_backend
php artisan storage:link
chown -R www-data:www-data storage
chmod -R 775 storage3 · Backup offsite
Programar restic (o equivalente) corriendo diario contra un bucket S3 externo o disco cifrado remoto. Retención 14 días × 12 semanas × 12 meses (ver Infraestructura → Almacenamiento local).
4 · Verificación
bash
# Escribir y leer un archivo de prueba en el disco público
php artisan tinker --execute="Storage::disk('public')->put('check.txt','ok'); echo Storage::disk('public')->get('check.txt');"
# Confirmar que se sirve por HTTP (requiere storage:link)
curl -I https://api.humae.com.mx/storage/check.txt
# → HTTP/2 200
# Borrar el archivo de prueba
php artisan tinker --execute="Storage::disk('public')->delete('check.txt');"Referencia técnica: Storage local.
SMTP local (correos)
Correo transaccional enviado por el Postfix del mismo servidor del backend. Sin SaaS intermedio.
1 · Abrir puerto 25 saliente con el provider
Muchos providers cloud (AWS, GCP, DigitalOcean free tier) bloquean el puerto 25 saliente por default. Antes de provisionar el servidor:
- Abrir un ticket al provider pidiendo desbloquear 25 outbound, o
- Elegir un provider/plan que permita SMTP saliente sin restricciones (Hetzner, OVH, algunos planes de AWS).
Sin este paso, Postfix local no puede entregar correo a ningún MTA destino.
2 · Instalar Postfix + OpenDKIM
En Debian/Ubuntu:
bash
sudo apt update
sudo apt install -y postfix opendkim opendkim-tools mailutils
# Setup: elegir "Internet Site" y hostname = mail.humae.com.mxConfiguración mínima de /etc/postfix/main.cf y generación de keys DKIM: ver SMTP local.
3 · Configurar registros DNS
Todos apuntan al servidor de HUMAE (no a un SaaS):
| Tipo | Nombre | Valor |
|---|---|---|
A | mail.humae.com.mx | IP del servidor |
TXT (SPF) | humae.com.mx | v=spf1 ip4:<IP> ~all |
TXT (DKIM) | default._domainkey.humae.com.mx | valor generado por opendkim-genkey |
TXT (DMARC) | _dmarc.humae.com.mx | v=DMARC1; p=none; rua=mailto:dmarc@humae.com.mx |
| PTR (reverse) | IP → mail.humae.com.mx | pedir al provider de IP |
PTR es obligatorio
Sin PTR válido apuntando a mail.humae.com.mx, Gmail/Outlook rechazan o marcan todo como spam.
4 · Configurar Laravel
En .env:
env
MAIL_MAILER=smtp
MAIL_HOST=127.0.0.1
MAIL_PORT=25
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=no-reply@humae.com.mx
MAIL_FROM_NAME=HUMAE
MAIL_REPLY_TO=soporte@humae.com.mxRecomendaciones:
MAIL_FROM_ADDRESSdebe ser una cuenta que existe en tu dominio (crear alias en Google Workspace / Zoho / el MX que elijas para recibir).MAIL_REPLY_TOdebe ser monitoreada por humanos — los usuarios responderán pidiendo soporte.
5 · Warm-up de IP
Las primeras 2-3 semanas después de exponer el correo:
- Mandar volumen bajo y creciente (100 → 500 → 2000 correos/día).
- Monitorear bounce rate y complaint rate en
/var/log/mail.log. - Una IP nueva sin historia es tratada con sospecha por Gmail.
6 · Verificación
bash
# Postfix corriendo
sudo systemctl status postfix
# Enviar un correo de prueba
php artisan tinker --execute="\Mail::raw('HUMAE smoke test', fn(\$m) => \$m->to('tu_correo@gmail.com')->subject('HUMAE smoke'));"
# Revisar que Postfix lo procesó y entregó
sudo tail -f /var/log/mail.logConfirmar que:
- Llega al inbox (no spam).
- El header
From:diceHUMAE <no-reply@humae.com.mx>. - El header
Reply-Toessoporte@humae.com.mx. - El header
Authentication-Resultsdel destinatario muestradkim=passyspf=pass.
Referencia técnica: SMTP local.
Sentry (error tracking opcional)
1 · Crear cuenta
sentry.io → Try Sentry for free → plan Developer (free) o Team ($26/mes).
2 · Crear proyectos
Sentry organiza por projects. Crear dos:
humae-backend— Platform: Laravelhumae-frontend— Platform: Next.js
Cada uno te da un DSN.
3 · Configurar backend
En humae_backend/.env:
SENTRY_LARAVEL_DSN=https://abc123@o111.ingest.sentry.io/222
SENTRY_TRACES_SAMPLE_RATE=0.1Instalar: composer require sentry/sentry-laravel. Publicar config: php artisan sentry:publish.
4 · Configurar frontend
En humae_frontend/.env.production:
NEXT_PUBLIC_SENTRY_DSN=https://def456@o111.ingest.sentry.io/333
SENTRY_AUTH_TOKEN=sntrys_... (para source maps upload en build)Instalar: npm install @sentry/nextjs. Wizard: npx @sentry/wizard@latest -i nextjs.
5 · Verificación
Disparar un error de prueba:
bash
# Backend
php artisan tinker
>>> throw new \RuntimeException('Sentry test');
# Frontend: en una ruta temporal
throw new Error('Sentry frontend test');Revisar Sentry dashboard → Issues. Debe aparecer el error en ≤ 2 minutos.
Tabla resumen — lugares para copiar keys / configurar
| Servicio | Dónde va | Variables / acción |
|---|---|---|
| Stripe | Backend | STRIPE_KEY, STRIPE_SECRET, STRIPE_WEBHOOK_SECRET, STRIPE_CURRENCY, STRIPE_PRICE_CANDIDATE_6M |
| Storage local | Backend | FILESYSTEM_DISK=public · php artisan storage:link · backup restic |
| SMTP local | Backend + servidor | MAIL_MAILER=smtp, MAIL_HOST=127.0.0.1, MAIL_PORT=25, MAIL_FROM_*, MAIL_REPLY_TO · Postfix + OpenDKIM · DNS SPF/DKIM/DMARC/PTR |
| Sentry (opt) | Backend + Frontend | SENTRY_LARAVEL_DSN · NEXT_PUBLIC_SENTRY_DSN |
Siguiente
DNS, subdominios y certificados SSL: DNS y dominios →

