Skip to content

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.

ServicioPara quéPlan mínimoCosto estimado
StripeCobro de membresías + webhooksStandard3.6% + 3 MXN por cargo
Storage localAvatares, documentos$0 / mes (incluido en el VPS)
SMTP local (Postfix)Correos transaccionales$0 / mes (incluido en el VPS)
Sentry (opcional)Error trackingTeam$26 / mes

Stripe (pagos)

1 · Crear cuenta

  1. Ve a stripe.comStart now.
  2. Email corporativo (idealmente finanzas@humae.com.mx).
  3. País de negocio: México.
  4. 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 → DevelopersAPI keys:

  • Publishable keySTRIPE_KEY
  • Secret keySTRIPE_SECRET (clic en "Reveal", copiar, nunca al frontend)

4 · Configurar el webhook

Dashboard → DevelopersWebhooksAdd endpoint:

CampoValor
Endpoint URLhttps://api.humae.com.mx/api/webhooks/stripe
DescriptionHUMAE membership activation
Events to sendcheckout.session.completed
API versionLatest (automatically updated)

Click Add endpoint. En la pantalla siguiente:

  • Copia el Signing secret (empieza con whsec_...) → STRIPE_WEBHOOK_SECRET en .env.

5 · Configurar datos del producto (opcional)

Si prefieres pre-crear el precio de membresía en vez de generarlo inline:

Dashboard → ProductsAdd 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.completed

El 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 memberships con status=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 %.

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 storage

3 · 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.mx

Configuració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):

TipoNombreValor
Amail.humae.com.mxIP del servidor
TXT (SPF)humae.com.mxv=spf1 ip4:<IP> ~all
TXT (DKIM)default._domainkey.humae.com.mxvalor generado por opendkim-genkey
TXT (DMARC)_dmarc.humae.com.mxv=DMARC1; p=none; rua=mailto:dmarc@humae.com.mx
PTR (reverse)IP → mail.humae.com.mxpedir 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.mx

Recomendaciones:

  • MAIL_FROM_ADDRESS debe ser una cuenta que existe en tu dominio (crear alias en Google Workspace / Zoho / el MX que elijas para recibir).
  • MAIL_REPLY_TO debe 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.log

Confirmar que:

  • Llega al inbox (no spam).
  • El header From: dice HUMAE <no-reply@humae.com.mx>.
  • El header Reply-To es soporte@humae.com.mx.
  • El header Authentication-Results del destinatario muestra dkim=pass y spf=pass.

Referencia técnica: SMTP local.


Sentry (error tracking opcional)

1 · Crear cuenta

sentry.ioTry Sentry for free → plan Developer (free) o Team ($26/mes).

2 · Crear proyectos

Sentry organiza por projects. Crear dos:

  • humae-backend — Platform: Laravel
  • humae-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.1

Instalar: 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

ServicioDónde vaVariables / acción
StripeBackendSTRIPE_KEY, STRIPE_SECRET, STRIPE_WEBHOOK_SECRET, STRIPE_CURRENCY, STRIPE_PRICE_CANDIDATE_6M
Storage localBackendFILESYSTEM_DISK=public · php artisan storage:link · backup restic
SMTP localBackend + servidorMAIL_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 + FrontendSENTRY_LARAVEL_DSN · NEXT_PUBLIC_SENTRY_DSN

Siguiente

DNS, subdominios y certificados SSL: DNS y dominios →

Manual de usuario HUMAE · Uso interno