Вступление
Развертывание приложения требует, чтобы разработчики тщательно продумали его настройку. Многие приложения развертываются в среде разработки перед развертыванием в производственной среде. Нам нужно убедиться, что каждая среда настроена правильно, это может иметь катастрофические последствия, если наше производственное приложение, например, использует нашу базу данных разработки.
Переменные среды позволяют нам управлять конфигурацией наших приложений отдельно от нашей кодовой базы. Разделение конфигураций упрощает развертывание нашего приложения в разных средах.
Большие приложения обычно имеют много переменных среды. Чтобы лучше управлять ими, мы можем использовать библиотеку dotenv , которая позволяет нам загружать переменные среды из файла.
Что такое переменные среды?
Из программирования мы знаем, что переменные - это сохраненные значения, которые можно изменять. Они изменчивы и могут меняться - отсюда и название переменных .
Переменные среды - это внешние по отношению к нашему приложению переменные, которые находятся в ОС или в контейнере приложения, в котором выполняется. Переменная среды - это просто имя, сопоставленное со значением.
По соглашению, имя пишется с заглавной буквы, например
[email protected]
. Значения представляют собой строки.
Если вы откроете терминал или приложение командной строки в Linux, Mac
OS или Windows и введете set
, вы увидите список всех переменных среды
для вашего пользователя.
Зачем использовать переменные среды?
Переменные среды отлично подходят для разделения конфигураций приложений. Как правило, для работы наших приложений требуется установить множество переменных. Используя внешние конфигурации, ваше приложение можно легко развернуть в различных средах. Эти изменения не зависят от изменений кода, поэтому они не требуют перестройки приложения для внесения изменений.
Данные, которые меняются в зависимости от среды, в которой работает ваше приложение, должны быть заданы как переменные среды. Вот несколько распространенных примеров:
- HTTP-порт и адрес
- Информация о соединении с базой данных, кешем и прочим хранилищем
- Расположение статических файлов / папок
- Конечные точки внешних сервисов
- Например, в среде разработки ваше приложение будет указывать на URL-адрес тестового API, тогда как в производственной среде ваше приложение будет указывать на URL-адрес действующего API.
Конфиденциальные данные, такие как ключи API, не должны быть в исходном коде или известны лицам, которым не нужен доступ к этим внешним службам.
Переменные среды в Node.js
Рассмотрим приложение Hello World Node.js с переменными среды для хоста и порта, на котором работает приложение.
Создайте новый файл с именем hello.js
рабочей области и добавьте
следующее:
const http = require('http');
// Read the host address and the port from the environment
const hostname = process.env.HOST;
const port = process.env.PORT;
// Return JSON regardless of HTTP method or route our web app is reached by
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.end(`{"message": "Hello World"}`);
});
// Start a TCP server listening for connections on the given port and host
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Node.js предоставляет глобальную переменную process.env
- объект,
содержащий все переменные среды, доступные пользователю, запускающему
приложение. Ожидается, что имя хоста и порт, на котором будет работать
приложение, будут определены средой.
Вы можете запустить это приложение, введя эту команду в терминале,
HOST=localhost PORT=3000 node hello.js
, если у вас установлен
Node.js. На консоли вы увидите следующее сообщение:
Server running at http://localhost:3000/
Создавать и читать переменные среды очень просто. Допустим, мы пишем микросервис, который взаимодействует с экземпляром MySQL и Redis , мы также хотели бы, чтобы сведения о подключении были доступны в переменных нашей среды.
У нас может получиться такая команда:
$ DB_HOST=localhost DB_PORT=3306 DB_USER=test DB_PASSWORD=verySecret123!$ DB_MAX_CONNECTIONS=15 CACHE_ADDR=localhost CACHE_PORT= 6379 HOST=localhost PORT=3000 node hello.js
Разработка с использованием нескольких переменных среды быстро становится громоздкой. Было бы лучше, если бы переменные среды, которые нам нужно было настроить, хранились в одном центральном месте приложения, например в файле.
Библиотека dotenv
Эта библиотека выполняет одну простую задачу: загружает переменные среды
из файла .env
process.env
в Node.js. Давайте использовать dotenv
для предыдущего примера.
Во-первых, нам нужно установить его через npm
:
$ npm init # Optional, creates a local package.json that prevents global installs
$ npm install dotenv --save
Затем мы вносим одно минимальное изменение в код, добавляем эту строку в
начало hello.js
:
require('dotenv').config()
Теперь в том же каталоге вашего приложения создайте новый файл с именем
.env
и добавьте следующее:
HOST=localhost
PORT=3000
Переменные среды объявляются так же, как если бы вы вводили их в
оболочку перед запуском команды узла. Вместо того, чтобы разделять
каждое присвоение переменной пробелом, мы разделяем их новой строкой .
Теперь в вашей оболочке, если вы введете node hello.js
, приложение
будет работать на порту 3000
на вашем localhost
!
Даже если dotenv
, это не обязательно. Если файл .env не найден,
библиотека .env
Вы можете продолжать использовать переменные среды,
определенные вне файла.
Примечание . Существует также множество вариантов dotenv
для
других языков программирования и фреймворков. Очень популярным
руководством по созданию современных веб-приложений является приложение
«Двенадцать факторов» . Документ был создан
многими разработчиками, создававшими приложения «Программное обеспечение
как услуга». Одним из 12 аспектов современного масштабируемого
приложения является конфигурация, в частности использование переменных
среды для хранения конфигурации. Популярность этой методологии
способствовала созданию и популярности dotenv
и подобных модулей.
Использование в производстве
Хранение переменных среды в файле связано с одним золотым правилом:
никогда не фиксируйте его в репозитории исходного кода. Вы не хотите,
чтобы посторонние получали доступ к секретам, таким как ключи API. Если
вы используете dotenv
для управления переменными среды, обязательно
.env
файл .env в свой .gitignore
или соответствующий черный список
для вашего инструмента контроля версий.
Если вы не можете зафиксировать .env
, тогда разработчику должен быть
какой-то способ узнать, какие переменные среды требуются для запуска
программного обеспечения. Обычно разработчики перечисляют переменные
среды, необходимые для запуска программы, в README
или аналогичной
внутренней документации.
Некоторые разработчики создают и поддерживают .sample-env
в
репозитории исходного кода. В этом образце файла будут перечислены все
переменные среды, используемые приложением, например:
HOST=
PORT=
Затем разработчик клонирует репозиторий, копирует .sample-env
в новый
.env
и заполняет значения.
Если ваше приложение работает на физической или виртуальной машине
(например, капли Digital
Ocean , Amazon
EC2 и виртуальные машины
Azure ),
то вы можете создать .env, войдя на сервер, и он будет работать так же,
как и .env
на вашем локальном компьютере.
Если ваше приложение работает в контейнере
докеров или в провайдере платформы как
услуги, таком как Heroku или Openshift, вы
сможете настраивать переменные среды без использования файла .env
Помните , что он не работает тихо, поэтому это не повлияет на работу приложения, если файл отсутствует.
Заключение
Переменные среды существуют вне кода нашего приложения, они доступны там, где наше приложение работает. Их можно использовать для отделения конфигурации нашего приложения от его кода, что позволяет легко развертывать наши приложения в различных средах.
В приложениях Node.js переменные среды доступны через глобальную
переменную process.env
Мы можем установить переменные среды перед
запуском команды node
или использовать dotenv
которая позволяет нам
определять переменные среды в файле .env
.env
никогда не должен находиться в репозитории исходного кода.