Как хранить конфигурацию и переменные окружения в Node.js-приложении?
Основы Node.js
Конфигурацию держат в переменных окружения и читают через process.env. Секреты не попадают в репозиторий, а один и тот же код работает в разных средах.
Принципы
- Код не знает, где запущен: адрес БД, ключи и порты приходят снаружи (идея 12-factor).
- Значения в
process.env— всегда строки, поэтому числа и булевы приводят явно. - Файл
.envнужен только локально и добавляется в.gitignore; в production значения задаёт окружение, секрет-хранилище или оркестратор. - Конфиг валидируют при старте: приложение должно упасть сразу, а не на первом запросе.
import { z } from 'zod';
const env = z.object({
PORT: z.coerce.number().default(3000),
DATABASE_URL: z.string().url(),
NODE_ENV: z.enum(['development', 'test', 'production']),
}).parse(process.env);
export default env;В Node.js 20+ есть флаг node --env-file=.env app.js, поэтому отдельный пакет не всегда нужен.
Коротко для собеседования
Конфиг идёт из окружения, секреты не коммитятся, значения приводятся к нужным типам и проверяются на старте.