Как конфигурировать Node.js приложение?#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.