Kodokon kodokon.com

Configuración y secretos

Saca la configuración del código con dotenv, separa el desarrollo de la producción y mantén tus secretos fuera de Git.

8 min · 3 preguntas

Abrir esta lección en Kodokon

El puerto de escucha, la URL de la base de datos, las claves de API: nada de esto pertenece al código fuente. Estos valores cambian entre tu máquina y la producción, y algunos son secretos. La solución estándar: variables de entorno, cargadas desde un archivo .env en desarrollo. Instala dotenv con npm install dotenv, luego crea el archivo en la raíz del proyecto.

BASH
PORT=3000
DATABASE_URL=postgres://localhost:5432/kodokon
SESSION_SECRET=change-this-value
.env - una variable por línea

Importa dotenv/config al principio de tu punto de entrada: las variables del archivo se copian en process.env. Un buen hábito profesional: centraliza la lectura en un único módulo de configuración, valida las variables al arrancar y falla de inmediato si falta alguna. Un servidor que se niega a arrancar es mejor que un servidor que se cae en la primera petición.

JAVASCRIPT
import "dotenv/config";

const required = ["PORT", "SESSION_SECRET"];

for (const name of required) {
  if (!process.env[name]) {
    throw new Error("Missing variable: " + name);
  }
}

export const config = {
  port: Number(process.env.PORT),
  secret: process.env.SESSION_SECRET,
  isProd: process.env.NODE_ENV === "production"
};
config.js - el único módulo que lee process.env

En producción no hay archivo .env: el proveedor de alojamiento suministra los valores reales, y NODE_ENV vale production. Usa config.isProd para adaptar el comportamiento: logs detallados en desarrollo, mensajes de error contenidos en producción. Sube también al repositorio un archivo .env.example que enumere las variables esperadas con valores ficticios: documenta la configuración sin exponer los secretos.

JAVASCRIPT
import express from "express";
import { config } from "./config.js";

const app = express();

if (!config.isProd) {
  console.log("Development mode");
}

app.listen(config.port, () => {
  console.log("Port: " + config.port);
});
server.js - el resto del código ignora process.env

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Dónde pones la contraseña de la base de datos?
    • En una constante en el código fuente
    • En un archivo .env ignorado por Git
    • En el README del proyecto
    • En un comentario del archivo de configuración
  2. ¿Cuál es el propósito del archivo .env.example?
    • Guardar los valores reales de respaldo
    • Documentar las variables esperadas, sin valores sensibles
    • Configurar el entorno de pruebas
  3. Se ha subido un secreto por error. ¿Qué haces primero?
    • Borrar el commit y seguir adelante
    • Revocar el secreto y generar uno nuevo
    • Añadir el archivo a .gitignore