Estructura de proyecto, env vars y configuracion
Estructura de proyecto, variables de entorno y configuración
Una API que funciona en tu máquina pero falla en producción casi siempre tiene un problema de configuración. La regla de oro del enfoque Twelve-Factor es separar la configuración del código: lo que cambia entre tu portátil, el servidor de pruebas y producción (puertos, URLs de base de datos, claves) vive en el entorno, nunca dentro de los archivos versionados en Git.
Una estructura sencilla y escalable
mi-api/
src/
config.js # lee y valida process.env
app.js # crea la app Express (sin escuchar)
server.js # arranca y escucha en el puerto
routes/
middleware/
db/
.env # NUNCA se sube a Git
.env.example # plantilla que sí se versiona
.gitignoreSeparar app.js (la configuración de Express) de server.js (el listen) te permite importar la app en tus tests sin abrir un puerto real.
Centraliza y valida la configuración
// src/config.js
import 'dotenv/config';
function required(name) {
const value = process.env[name];
if (!value) throw new Error(`Falta la variable de entorno ${name}`);
return value;
}
export const config = {
port: Number(process.env.PORT ?? 3000),
databaseUrl: required('DATABASE_URL'),
nodeEnv: process.env.NODE_ENV ?? 'development',
};Atención
Añade .env a tu .gitignore el primer día. Subir credenciales a un repositorio, aunque sea privado, es la fuga de secretos más común y la más cara de revertir.
Falla rápido, no a medias
Si falta DATABASE_URL, es mejor que la app no arranque a que lance un error críptico en la primera consulta de un usuario real. Validar al inicio convierte un fallo silencioso en un error claro y temprano.
¿Qué archivo debe versionarse en Git para documentar las variables sin filtrar secretos?
Ejercicio práctico
Objetivo: montar una configuración robusta que falle rápido.
- Crea
config.jscon la funciónrequired()de arriba y al menosPORTyDATABASE_URL. - Crea un
.env.exampley añade.enval.gitignore. - Añade scripts a
package.json:"dev": "node --watch src/server.js"y"start": "node src/server.js". - Arranca sin
DATABASE_URLy comprueba que el proceso muere con un mensaje claro.
Entregable: tu config.js, tu .env.example y una captura del error al faltar una variable.
Para recordar
- La configuración va en el entorno, no en el código.
.envnunca se sube;.env.examplesí.- Valida todas las variables al arrancar y falla rápido con un mensaje útil.