#best_practice #package #devops
TL;DR Конфигурация хранится в переменных окружения без значений по умолчанию. Если какой-либо переменной нет или формат не верный, то приложение не должно запускаться. Требуемые переменные описываются в env.example. Реализация dotenv-safe
Теория
Каждому #nodejs разработчику следует знать 12 факторный манифест . Следование его принципам позволит создавать масштабируемые веб-приложения и комфортно сотрудничать с DevOps инженерами. Третий фактор говорит, что конфигурация должна храниться в настройках окружения (env vars). Рекомендую с этим фактором ознакомиться, там подробно описано почему стоит использовать именной такой подход.
Применение
Значения всех переменных окружения доступны:
- в терминале с помощью команды
env- на уровне Node.js кода с помощью объекта
process.env. Значения конкретной переменной
<NAME> доступно:- в терминале с помощью
$<NAME>- на уровне Node.js кода с помощью
process.env.<NAME>Установить переменные окружения можно:
– посредством команды export. Например:
export NODE_ENV=production . Результат команды не сохраняется между сессиями консоли. Для внесения долгосрочный изменений в окружение команду необходимо прописать в .bashrc или его аналог.– посредством команды source
– В момент запуска процесса как ИМЯ=ЗНАЧЕНИЕ перед самой командой. Пример:
NODE_ENV=production DEBUG=0 node src/index.js Работает как в терминале, так и в npm scripts.– Изменением значений в
process.env уже во время работы приложения. .env
.env файл с переменными окружения используется для упрощения локальной разработки. На всех других окружениях его использование является плохой практиков. .env никогда не должен храниться в git репозитории. Поддержка есть во всех IDEA. Для консоли есть расширения, например autoenv. На уровне кода общепринятым пакетом является dotenv. Он вычитывает в process.env значения из .env, но не заменяет уже существующие значения..env.example
.env.example описывает все требуемые переменные окружения для работы приложения. Там можно и нужно делать комментарии. Это single source of truth для вашего DevOps инженера. Его необходимо хранить в git. Если приложение, не имеет какого-либо из ожидаемых переменных, то оно не должно стартовать. Fail fast! Этот функционал обеспечивает пакет dotenv-safe, который является оберткой над dotenv.Советы по уменьшению количества переменных
– Используйте connection string. Пример:
DB_URL=postgresql://postgres:password@localhost:5432/database– Используйте JSON в значениях переменных. Пример:
const stripeConfig = JSON.parse(process.env.STRIPE_CONFIG)– Используйте значения через запятую. Пример:
const adminList = process.env.ADMINS.split(',')Распространенные ошибки
– Отсутствие приведение типа. Все ключи объекта
process.env имеют значения типа string. Пример, вопреки ожиданиям при запуск с SOME_FEATURE=false код if process.env.SOME_FEATURE ... будет исполнен.– Использование значений по умолчанию. Пример,
const logLevel = process.env.LOG_LEVEL || 'info'. Это приводит к неявной конфигурации и дорогостоящим ошибкам.– Ошибка в путях к
.env из-за использования относительных, а не абсолютных путей.– Ошибка характерная для FE разработчиков: не понимание разницы между переменными окружения в build-а и run time.
– Ошибка характерная для microservice разработчиков в проектах с Service discovery: различие локального и прод окружений. Необходимо запускать Consul или его аналоги через Docker.