Ir al contenido

Referencia completa de todas las variables configurables. Las variables del servidor van en .env.server (desarrollo) o como secrets en Fly.io (producción). Las variables del cliente van en .env.client.


VariableObligatoriaDevProducción
DATABASE_URLSolo si no usas wasp start dbAuto (Wasp lo configura)Connection string de Neon

Ejemplo de producción:

DATABASE_URL=postgresql://user:pass@ep-xxx.us-east-2.aws.neon.tech/neondb?sslmode=require

Importante: Neon requiere ?sslmode=require al final. Sin esto, la conexión falla.


VariableObligatoriaDevProducción
JWT_SECRETSí (en producción)Cualquier stringopenssl rand -base64 32

Generar un JWT_SECRET seguro:

Ventana de terminal
openssl rand -base64 32

VariableObligatoriaDevProducción
STRIPE_API_KEYsk_test_... (Dashboard → Test mode)sk_live_... (Dashboard → Live mode)
STRIPE_WEBHOOK_SECRETwhsec_... (Stripe CLI)whsec_... (Dashboard → Webhooks)
PAYMENTS_MONTHLY_SUBSCRIPTION_PLAN_IDprice_test_monthlyprice_live_...
PAYMENTS_ANNUAL_SUBSCRIPTION_PLAN_IDprice_test_annualprice_live_...
PAYMENTS_CREDITS_10_PLAN_IDNoprice_test_creditsprice_live_...

Cómo obtener el STRIPE_WEBHOOK_SECRET en desarrollo:

Ventana de terminal
stripe listen --forward-to localhost:3001/payments-webhook
# Imprime: Your webhook signing secret is whsec_...

Cómo obtener el STRIPE_WEBHOOK_SECRET en producción:

  1. Stripe Dashboard → Developers → Webhooks
  2. Crear endpoint: https://tu-app.fly.dev/payments-webhook
  3. Copiar el Signing Secret

Pagos — Lemon Squeezy (alternativa a Stripe)

Sección titulada «Pagos — Lemon Squeezy (alternativa a Stripe)»
VariableObligatoriaNotas
LEMONSQUEEZY_API_KEYSolo si usas Lemon SqueezyDesde app.lemonsqueezy.com
LEMONSQUEEZY_STORE_IDSolo si usas Lemon SqueezyID de tu store
LEMONSQUEEZY_WEBHOOK_SECRETSolo si usas Lemon SqueezyDefinido al crear webhook

TalentBricksAI usa Stripe como procesador principal. Ver docs de Open SaaS para Lemon Squeezy.


VariableObligatoriaNotas
POLAR_ORGANIZATION_ACCESS_TOKENSolo si usas PolarDesde dashboard de Polar
POLAR_WEBHOOK_SECRETSolo si usas PolarDefinido al crear webhook
POLAR_SANDBOX_MODESolo si usas Polartrue en dev, false en producción

VariableObligatoriaNotas
GOOGLE_CLIENT_IDSolo si usas Google OAuthDesde Google Cloud Console
GOOGLE_CLIENT_SECRETSolo si usas Google OAuthDesde Google Cloud Console
GITHUB_CLIENT_IDSolo si usas GitHub OAuthDesde GitHub Developer Settings
GITHUB_CLIENT_SECRETSolo si usas GitHub OAuthDesde GitHub Developer Settings

Setup de Google OAuth: Ver Wasp docs — Google Auth


VariableObligatoriaDevProducción
SENDGRID_API_KEYEn producciónNo necesario (Dummy provider)SG.... (obligatorio)

En desarrollo, los emails se imprimen en la consola del servidor — no se envían realmente.

Obtener API Key de SendGrid: app.sendgrid.com/settings/api_keys

Para configuración completa, ver Email y SendGrid.


La variable STORAGE_PROVIDER controla qué proveedor usa la app (aws por defecto).

VariableObligatoriaDevProducción
STORAGE_PROVIDERNo (default: aws)No necesarioaws o azure
VariableObligatoriaDevProducción
AWS_S3_IAM_ACCESS_KEYSolo en producciónNo necesario (YouTube en dev)AKIA...
AWS_S3_IAM_SECRET_KEYSolo en producciónNo necesarioSecret del usuario IAM
AWS_S3_FILES_BUCKETSolo en producciónNo necesarioNombre exacto del bucket
AWS_S3_REGIONSolo en producciónNo necesarioEj: us-east-1
CLOUDFRONT_DOMAINSolo en producciónNo necesarioEj: d1234abc.cloudfront.net
CLOUDFRONT_KEY_PAIR_IDSolo en producciónNo necesarioKey ID de CloudFront
CLOUDFRONT_PRIVATE_KEYSolo en producciónNo necesarioContenido del .pem en una línea

Formato del CLOUDFRONT_PRIVATE_KEY (en una línea):

Ventana de terminal
CLOUDFRONT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIE...\n-----END RSA PRIVATE KEY-----"
VariableObligatoriaDevProducción
AZURE_STORAGE_ACCOUNT_NAMESolo en producciónNo necesarioNombre de la Storage Account
AZURE_STORAGE_ACCOUNT_KEYSolo en producciónNo necesarioKey de acceso (base64, ~88 chars)
AZURE_STORAGE_CONTAINER_NAMESolo en producciónNo necesarioNombre del container (ej: videos)

VariableObligatoriaDevProducción
ADMIN_EMAILSTu email de pruebaEmails de todos los admins
ADMIN_EMAILS=admin@empresa.com,otro-admin@empresa.com

VariableObligatoriaDevProducción
REDIS_URLNoNo necesarioredis:// o rediss:// (TLS)

Sin esta variable, el rate limiting usa memoria local — correcto para una sola instancia. Configúrala si escalas a múltiples réplicas del servidor.

REDIS_URL=redis://localhost:6379 # Local / Railway
REDIS_URL=rediss://:password@host.upstash.io:6380 # Upstash (TLS)

Ver guía completa: Redis para Rate Limiting


VariableObligatoriaNotas
OPENAI_API_KEYNo (solo si usas features de IA)Desde platform.openai.com

VariableObligatoriaNotas
PLAUSIBLE_API_KEYNoDesde tu cuenta de Plausible
PLAUSIBLE_SITE_IDNoEj: talentbricks.ai
PLAUSIBLE_BASE_URLNoDefault: https://plausible.io/api
GOOGLE_ANALYTICS_CLIENT_EMAILNoService account de Google Cloud
GOOGLE_ANALYTICS_PRIVATE_KEYNoPrivate key en base64
GOOGLE_ANALYTICS_PROPERTY_IDNoID de la propiedad GA4

VariableObligatoriaDevProducción
CLIENT_URLEn producciónAuto (Wasp configura localhost)https://talentbricks.ai

Las variables del cliente deben comenzar con REACT_APP_.

VariableObligatoriaNotas
REACT_APP_GOOGLE_ANALYTICS_IDNoEj: G-XXXXXXXXXX

app/
├── .env.server ← Variables del servidor (no subir a Git)
├── .env.server.example ← Template con todas las variables
├── .env.client ← Variables del cliente (no subir a Git)
└── .env.client.example ← Template con todas las variables

Los archivos .env.server y .env.client están en .gitignore. Nunca subir valores reales a Git.

Ventana de terminal
# Configurar una variable
wasp deploy fly cmd --context server secrets set VARIABLE=valor
# Ver variables configuradas (solo nombres, no valores)
flyctl secrets list -a talentbricksai
# Verificar que una variable está configurada (en consola del servidor)
flyctl ssh console -a talentbricksai -C "env | grep NOMBRE_VARIABLE"

TalentBricksAI incluye validación automática de variables de entorno al iniciar el servidor. Esto previene despliegues con configuración incompleta.

  • REQUIRED: Obligatorias siempre en producción (ej: DATABASE_URL, STRIPE_API_KEY)
  • CONDITIONAL: Obligatorias solo si una feature está habilitada (ej: AWS S3 para videos)
  • OPTIONAL: Opcionales, con degradación graceful (ej: analytics, OpenAI)

Si falta una variable REQUIRED, el servidor no iniciará y mostrará un error claro:

🚨 ENVIRONMENT VALIDATION FAILED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
REQUIRED Variables Missing (3)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
❌ STRIPE_API_KEY
Stripe API key for payment processing
Get it: https://dashboard.stripe.com/apikeys
❌ SENDGRID_API_KEY
SendGrid API key for email delivery
Get it: https://app.sendgrid.com/settings/api_keys
❌ JWT_SECRET
Secret for signing JWT tokens
Get it: Run: openssl rand -base64 32
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 Complete reference: /operaciones/variables-entorno
🔧 Deployment checklist: /operaciones/checklist-produccion

Variables CONDITIONAL y OPTIONAL generarán advertencias (warnings) pero no detendrán el servidor.

La validación está en app/src/server/envValidation.ts y se ejecuta automáticamente al importar app/src/server/utils.ts.

Ver también:


□ DATABASE_URL (Neon, con ?sslmode=require)
□ JWT_SECRET (openssl rand -base64 32)
□ STRIPE_API_KEY (sk_live_*)
□ STRIPE_WEBHOOK_SECRET (del webhook de producción)
□ PAYMENTS_MONTHLY_SUBSCRIPTION_PLAN_ID (price_live_*)
□ PAYMENTS_ANNUAL_SUBSCRIPTION_PLAN_ID (price_live_*)
□ ADMIN_EMAILS (emails reales de admins)
□ SENDGRID_API_KEY (obligatorio para email)
□ CLIENT_URL (https://talentbricks.ai)
□ AWS_S3_IAM_ACCESS_KEY (para videos)
□ AWS_S3_IAM_SECRET_KEY (para videos)
□ AWS_S3_FILES_BUCKET (para videos)
□ AWS_S3_REGION (para videos)
□ CLOUDFRONT_DOMAIN (para videos)
□ CLOUDFRONT_KEY_PAIR_ID (para URLs firmadas)
□ CLOUDFRONT_PRIVATE_KEY (para URLs firmadas)

Opcionales según features habilitadas:

□ GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET (si usas Google OAuth)
□ GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET (si usas GitHub OAuth)
□ OPENAI_API_KEY (si usas features de IA)
□ PLAUSIBLE_API_KEY / PLAUSIBLE_SITE_ID (si usas Plausible Analytics)
□ REACT_APP_GOOGLE_ANALYTICS_ID (si usas Google Analytics)
□ REDIS_URL (si tienes múltiples réplicas del servidor)