Skip to main content

Variables de entorno

Se definen en .env (usar .env.example como base). bootstrap/load-env.ts lee .env del directorio de trabajo y no pisa variables ya presentes en el entorno del proceso. ConfigModule valida con Joi (src/config/env.validation.ts) al arrancar y no define validationOptions, por lo que las variables que el esquema no menciona se aceptan sin validar.

La columna Requerida indica lo que exige el esquema Joi; Default es el valor efectivo si falta (esquema o src/config/*.ts). No se documentan valores reales ni secretos.

Aplicación​

VariableRequeridaDefaultDescripciónDónde se lee
NODE_ENVNodevelopmentdevelopment, production o test. En production CORS restringe las cabeceras permitidas (CORS_ALLOWED_HEADERS_PROD); en otro caso acepta *. La imagen Docker la fija a productionbootstrap/cors.ts, config/app.config.ts (app.nodeEnv)
HOSTNo (no está en el esquema)localhostHost que se muestra en la URL del log de arranque y en la de Swagger. La imagen Docker la fija a 0.0.0.0config/app.config.ts, main.ts
PORTNo3000Puerto HTTPconfig/app.config.ts
APP_NAMESí—Nombre de la aplicación (título de Swagger y logs)config/app.config.ts, main.ts
APP_ENVNodevelopmentdevelopment, staging o production. Con production se desactiva Swagger/Scalar y el seeder de demo se niega a ejecutarseconfig/app.config.ts, main.ts, database/seeds/run-seed.ts

NODE_ENV y APP_ENV son independientes: el primero afecta a CORS; el segundo a la documentación de la API y a los seeds.

Base de datos​

VariableRequeridaDefaultDescripciónDónde se lee
MONGODB_URISí (URI válida)—URI de conexión MongoDB. Contiene credenciales: tratar como secretoconfig/database.config.ts, app.module.ts, scripts/*.js

JWT​

VariableRequeridaDefaultDescripciónDónde se lee
JWT_SECRETSí (mín. 32 caracteres)—Clave de firma de tokens (secreto)config/jwt.config.ts, core/auth/auth.module.ts
JWT_EXPIRES_INNo1dDuración del access tokenconfig/jwt.config.ts, core/auth/auth.module.ts

Almacenamiento (S3 / MinIO)​

VariableRequeridaDefaultDescripciónDónde se lee
STORAGE_ENDPOINTSí (URI)— (el código usaría http://localhost:9000, pero el esquema la exige)Endpoint interno del storage S3 compatibleconfig/storage.config.ts, core/storage/storage.service.ts, main.ts
STORAGE_PUBLIC_URLNo (no está en el esquema ni en .env.example)el valor de STORAGE_ENDPOINTURL base accesible por los clientes. Se usa para firmar URLs prefirmadas y para construir las URLs públicas (<publicUrl>/<bucket>/<key>). Defínela cuando el endpoint interno (por ejemplo un nombre de servicio Docker) no es alcanzable desde el navegador o desde Metaconfig/storage.config.ts, core/storage/storage.service.ts
STORAGE_ACCESS_KEYSí— (el código usaría minioadmin)Access key (secreto)config/storage.config.ts
STORAGE_SECRET_KEYSí— (el código usaría minioadmin)Secret key (secreto)config/storage.config.ts
STORAGE_BUCKETSí— (el código usaría crm-files)Nombre del bucketconfig/storage.config.ts, main.ts
STORAGE_REGIONNous-east-1Región S3config/storage.config.ts

docker-compose.yml reutiliza STORAGE_ACCESS_KEY y STORAGE_SECRET_KEY como credenciales raíz de MinIO (MINIO_ROOT_USER / MINIO_ROOT_PASSWORD, con fallback minioadmin solo para desarrollo local).

Redis / colas (BullMQ)​

VariableRequeridaDefaultDescripciónDónde se lee
REDIS_HOSTNoredisHost de Redisconfig/redis.config.ts, modules/queue/queue.module.ts, main.ts
REDIS_PORTNo6379Puertoconfig/redis.config.ts
REDIS_PASSWORDNo (admite vacío)—Contraseña (secreto)config/redis.config.ts
REDIS_DBNo0Base de datosconfig/redis.config.ts
BULL_PREFIXNocrm-bullPrefijo de las colasconfig/redis.config.ts, queue.module.ts

Redis lo usan la cola meta-webhook, la de mensajes programados y el lock de entrada. El docker-compose.yml levanta redis:7-alpine en 127.0.0.1:6379.

Cifrado en reposo​

VariableRequeridaDescripción
WHATSAPP_SESSION_ENCRYPTION_KEYSíClave AES-256 (base64, 32 bytes) para cifrar la sesión de WhatsApp
META_TOKEN_ENCRYPTION_KEYSíClave AES-256 (base64, 32 bytes) para cifrar los tokens de Meta. Debe ser distinta de la anterior

Generar con openssl rand -base64 32. Si faltan, tienen formato inválido o son iguales, la app no arranca. Ningún archivo src/config/*.ts las expone: se leen directamente de process.env mediante readEncryptionKey (core/crypto/secret-encryption.ts), desde connection/helpers/meta-token.helper.ts y whatsapp/auth/mongo-auth-state.ts. Ver Crypto.

Canales Meta (Instagram / Messenger)​

Todas opcionales: sin ellas el webhook de Meta responde 404 y el OAuth de Instagram no está disponible. Detalle en Meta.

VariableDefaultDescripciónClave de config
META_VERIFY_TOKEN—Token de verificación del webhook (mín. 16 caracteres)meta.verifyToken
META_APP_SECRET—Secreto de la app (firma del webhook de facebook, appsecret_proof)meta.appSecret
INSTAGRAM_APP_SECRET—Secreto de la app de Instagram (firma del webhook de instagram, OAuth)meta.instagramAppSecret
INSTAGRAM_APP_ID—App ID de Instagram (solo dígitos)meta.instagramAppId
META_OAUTH_REDIRECT_URI—Redirect URI registrado en Meta, exacto (http o https)meta.oauthRedirectUri
FRONTEND_URL—URL del frontend para redirigir tras el OAuth (http o https)meta.frontendUrl
META_GRAPH_API_VERSIONv25.0 (aplicado en meta-graph.client.ts; la config deja undefined)Versión de Graph API (vNN.N)meta.graphApiVersion
META_ENABLE_HUMAN_AGENT_TAGfalsetrue envía con el tag HUMAN_AGENTmeta.enableHumanAgentTag

Se leen en config/meta.config.ts y se consumen en modules/meta/services/ (meta-webhook.service.ts, meta-oauth.service.ts, meta-graph.client.ts, meta-outbound.dispatcher.ts). Las cadenas vacías se tratan como no definidas.

Migraciones y seeds​

VariableDefaultDescripciónDónde se lee
MIGRATION_DBfalseEjecuta migraciones de esquema al arrancarmain.ts
MIGRATION_DB_DATAfalseEjecuta migraciones de datos (catálogo de permisos, tenants)main.ts, permission-catalog-seed.service.ts, tenant.service.ts
RUN_SEEDSfalseEjecuta seeds; solo con APP_ENV=developmentmain.ts, database/seeds/seed.service.ts
FORCE_SEED_CLEANUPfalseFuerza limpieza en seedsdatabase/seeds/seed.service.ts

Testing​

VariableDefaultDescripciónDónde se lee
TESTINGfalseSi true, main.ts ejecuta la suite antes de levantar el servidor y npm run test:ci corre Jest (con false lo omite)main.ts, config/app.config.ts, scripts/test-runner.js

Variables solo de scripts​

No pasan por Joi; las leen scripts de scripts/ ejecutados a mano.

VariableScriptDescripción
PLATFORM_ADMIN_EMAIL, PLATFORM_ADMIN_PASSWORDbootstrap-platform-admin.js (npm run platform:bootstrap-admin)Credenciales del admin de plataforma; la contraseña exige mín. 12 caracteres (secreto)
PLATFORM_ADMIN_USERNAME, PLATFORM_ADMIN_FIRSTNAME, PLATFORM_ADMIN_LASTNAMEÍdemOpcionales; por defecto la parte local del email, Platform y Admin
MONGODB_URIbootstrap-platform-admin.js, migrate-message-ack.js, cleanup-whatsapp-test-contacts.js, migrations/*.jsConexión a Mongo

No son variables de entorno​

Constantes del código que a veces se confunden con configuración: API_PREFIX (api), API_DOCS_PATH (docs), STORAGE_HEALTH_PATH (/minio/health/live), PUBLIC_STORAGE_PREFIX (public/), AVATAR_STORAGE_PREFIX (avatars), SCHEDULED_MESSAGE_ENQUEUE_TIMEOUT_MS (6000), META_SEND_PATH, META_EXTERNAL_ID_SEPARATOR y VIDEO_THUMBNAIL_WIDTH. Son fijas; cambiarlas requiere tocar el código.

Cómo se carga​

// src/bootstrap/load-env.ts
// Lee .env (sin pisar variables ya definidas) antes de inicializar NestJS

// src/config/env.validation.ts
// Esquema Joi: presencia y formato; si falta una requerida la app no arranca

Archivos de config tipados​

Cada grupo de variables tiene su propio archivo en src/config/ (registrados con registerAs y cargados en ConfigModule.forRoot):

ArchivoClaveVariables que agrupa
app.config.tsappHOST, PORT, APP_NAME, APP_ENV, NODE_ENV, TESTING
database.config.tsdatabaseMONGODB_URI
jwt.config.tsjwtJWT_SECRET, JWT_EXPIRES_IN
storage.config.tsstorageSTORAGE_ENDPOINT, STORAGE_PUBLIC_URL, STORAGE_ACCESS_KEY, STORAGE_SECRET_KEY, STORAGE_BUCKET, STORAGE_REGION
redis.config.tsredisREDIS_HOST, REDIS_PORT, REDIS_PASSWORD, REDIS_DB, BULL_PREFIX
meta.config.tsmetaTodas las variables de Meta de arriba