Variables de entorno
Se cargan desde .env (Bun lo lee automáticamente). Copia de partida:
cp .env.example .env.
Base de datos
Sección titulada «Base de datos»| Variable | Requerida | Descripción |
|---|---|---|
DATABASE_URL |
✅ | postgresql://usuario:clave@host:5432/db |
Seguridad (obligatorias en producción)
Sección titulada «Seguridad (obligatorias en producción)»| Variable | Descripción |
|---|---|
BOLETO_HMAC_SECRET |
Firma HMAC de los QR. Fail-fast: la API no arranca sin él |
REFRESH_TOKEN_SECRET |
Firma de refresh tokens; sin él los logins no traen refreshToken |
CRON_SECRET |
Header x-cron-secret de los jobs; vacío = endpoints abiertos |
NOTIFICACION_WEBHOOK_SECRET |
Header x-webhook-secret del webhook de rebotes; vacío = abierto |
| Variable | Default | Descripción |
|---|---|---|
CORREO_PROVEEDOR |
consola |
consola (dev, imprime) o smtp |
SMTP_HOST / SMTP_PORT |
— / 587 |
Servidor SMTP (solo si smtp) |
SMTP_SECURE |
false |
true TLS directo (465); false STARTTLS (587) |
SMTP_USER / SMTP_PASS |
— | Credenciales SMTP |
CORREO_FROM |
— | Remitente, p. ej. PISA <no-reply@tudominio.mx> |
Red y límites
Sección titulada «Red y límites»| Variable | Default | Descripción |
|---|---|---|
PORT |
5000 |
Puerto de escucha (valor inválido = 5000) |
APP_URL |
http://localhost:5000 |
Base pública para links (verificación de email) |
CORS_ORIGIN |
vacío | Orígenes permitidos, coma-separados; vacío = sin CORS |
RATE_LIMIT_MAX |
300 |
Requests por IP por minuto (global) |
RATE_LIMIT_AUTH_MAX |
30 |
Límite de los endpoints de login |
TRUST_PROXY |
false |
true tras proxy/LB: confía en X-Forwarded-For |
Jobs y retención
Sección titulada «Jobs y retención»| Variable | Default | Descripción |
|---|---|---|
CRON_ENABLED |
true |
false apaga los jobs (réplicas sin cron) |
CRON_TZ |
vacío | Zona horaria de los jobs (vacío = local) |
RETENCION_SESIONES_DIAS |
30 |
Retención de sesiones |
RETENCION_INTENTOS_DIAS |
90 |
Retención de intentos de login |
Archivos
Sección titulada «Archivos»| Variable | Default | Descripción |
|---|---|---|
UPLOADS_DIR |
./uploads |
Disco para los SVGs subidos (Bun.write crea carpetas) |
Ejemplo mínimo de producción
Sección titulada «Ejemplo mínimo de producción»DATABASE_URL="postgresql://pisa:fuerte@db:5432/pisa"BOLETO_HMAC_SECRET="…32+ caracteres aleatorios…"REFRESH_TOKEN_SECRET="…otro distinto…"CRON_SECRET="…otro distinto…"NOTIFICACION_WEBHOOK_SECRET="…otro distinto…"CORREO_PROVEEDOR="smtp"SMTP_HOST="smtp.tudominio.mx"SMTP_USER="no-reply@tudominio.mx"SMTP_PASS="…"CORREO_FROM="PISA <no-reply@tudominio.mx>"APP_URL="https://pisa.tudominio.mx"CORS_ORIGIN="https://pisa.tudominio.mx"TRUST_PROXY="true"CRON_TZ="America/Mexico_City"