// Configuración central. Todo tiene valor por omisión para que la demo // arranque sin archivo .env. const bandera = (valor, porOmision) => (valor === undefined ? porOmision : valor === 'true'); export const config = { port: Number(process.env.PORT ?? 4180), /** * Se aceptan los nombres nativos de la imagen de MySQL (MYSQL_DATABASE, * MYSQL_USER, MYSQL_PASSWORD) además de los DB_*. Así, al desplegar, un * solo juego de variables alimenta a los dos contenedores y no hay que * mantener dos nombres para el mismo dato ni interpolar nada en el compose. */ db: { host: process.env.DB_HOST ?? '127.0.0.1', port: Number(process.env.DB_PORT ?? 3307), user: process.env.DB_USER ?? process.env.MYSQL_USER ?? 'root', password: process.env.DB_PASSWORD ?? process.env.MYSQL_PASSWORD ?? 'insta_root_demo', database: process.env.DB_NAME ?? process.env.MYSQL_DATABASE ?? 'insta_portal', }, // Vigencia del enlace de acceso y de la sesión, en minutos. magicLinkMinutos: Number(process.env.MAGIC_LINK_MINUTOS ?? 15), sesionMinutos: Number(process.env.SESION_MINUTOS ?? 480), cookieNombre: 'insta_sesion', /** * En la demo el enlace de acceso se muestra en pantalla en lugar de * enviarse por correo, para que cualquiera pueda entrar y probarla. * OJO: con esto activo, quien conozca un correo dado de alta obtiene una * sesión sin más. Es una decisión consciente para una demostración con * datos ficticios. Para uso real hay que ponerlo en false y enviar el * enlace por correo. */ mostrarEnlaceEnPantalla: bandera(process.env.MOSTRAR_ENLACE, true), // Cookie Secure y SameSite=Strict cuando el portal va detrás de HTTPS. cookieSegura: bandera(process.env.COOKIE_SEGURA, false), // Solo con un proxy de confianza delante se cree el X-Forwarded-For. confiarProxy: bandera(process.env.CONFIAR_PROXY, false), /** * Límite de enlaces de acceso por origen y por ventana, para que nadie los * pida en ráfaga. El loopback queda exento: ahí viven el desarrollo y las * pruebas. * * OJO detrás de un proxy: sin CONFIAR_PROXY=true todas las peticiones se * ven llegar desde la IP del proxy y comparten el mismo cupo, así que un * puñado de personas probando la demo lo agotaría entre todas. */ enlacesPorVentana: Number(process.env.ENLACES_POR_VENTANA ?? 60), ventanaMinutos: Number(process.env.VENTANA_MINUTOS ?? 5), };