Coolify escribe `null` al inlinear una variable marcada como `mostrar una
sola vez`, asi que `MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}` se resolvia a
vacio, MySQL se negaba a inicializar y el contenedor entraba en bucle de
reinicio; `web` abortaba con `dependency failed to start`.
Ahora el compose declara las variables en lista y por nombre pelado, sin
interpolacion, y el portal acepta MYSQL_DATABASE / MYSQL_USER / MYSQL_PASSWORD
como alternativa a los DB_*. Un solo juego de variables alimenta a los dos
contenedores.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
55 lines
2.4 KiB
JavaScript
55 lines
2.4 KiB
JavaScript
// 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),
|
|
};
|