Змінні оточення

При розробці веб-застосунків часто використовується доступ до баз даних, різних сервісів, API тощо. Доступ до цих сервісів відбувається переважно за допомогою секретних ключів. Виникає проблема, коли потрібно синхронізувати проєкт з репозиторієм на GitHub. Адже ці ключі та паролі (з огляду безпеки) не можна викладати у загальний доступ.

Для розв'язання цього питання використовують змінні середовища. Їх створюють за допомогою модуля dotenv, а завантажують з файлів з розширенням .env.

Ці файли створює сам розробник. Файли .env можна розмістити як в корені проєкту, так і в якомусь підкаталозі.

Після підключення модуля у нашому додатку, зміні оточення додаються в об'єкт process.env. А вже із нього ці змінні ми можемо використовувати в нашому проєкті.

Файл .env ОБОВʼЯЗКОВО треба додати до файлу .gitignore. Утім, для інших розробників можна створити .env.example зі структурою оригінального файлу, але із заміненими значеннями секретних ключів.

Розберемо роботу з цими файлами:

Встановимо модуль

terminal
npm i dotenv

Заімпортуємо модуль в наш проєкт сервера

index.js
const dotenv = require("dotenv");

У корені проєкту створимо файл .env і додамо у нього змінні:

.env
APP_NAME='My App'
PORT=3000
MONGO_URL='real_mongodb_url'
SECRET_KEY=12345678

Тепер у файлі програми index.js треба якомога раніше підключити наш файл.

index.js
dotenv.config({ path: "./.env" });

І тепер визначені в .env змінні будуть доступні в нашій програмі як:

process.env.APP_NAME;
process.env.PORT;
process.env.MONGO_URL;
process.env.SECRET_KEY;

Щоб в цьому переконатися, можна вивести їх в консоль:

index.js
console.log(process.env.APP_NAME);

У файлі .env ми можемо зберігати URL, порти, ключі від вервісів і баз даних тощо.

Коментарі у файлі .env пишуть після символа #.

Як приклад візьмемо порт нашого сервера з оточення. Можна також (не обовʼязково) якщо порт буде невизначений, то дати йому дефолтне значення 3000:

index.js
// ===========SERVER INIT=========== //
const port = process.env.PORT || 3000;

app.listen(port, () => {
  console.log(`Server is up and running on port ${port}`);
});

Завантаження різних файлів оточення в залежності від запущеного скрипта

При запуску сервера можемо визначити змінну оточення, в якій зберігатимемо назву режиму в якому запускаємо сервер. Для цього пропишемо відповідне налаштування в package.json в розділі scripts:

package.json
"dev": "NODE_ENV=development nodemon index.js",
"prod": "NODE_ENV=production node index.js"

Тобто на цьому етапі ми в змінну оточення process.env.NODE_ENV визначаємо в якому режимі запустили сервер.

Створимо два окремі файли production.env та development.env в яких будемо зберігати різні конфігурації змінних оточення. Покладемо ці файди в папку enviroments.

enviroments/development.env
APP_NAME='dev'
enviroments/production.env
APP_NAME='prod'

Раніше ми вже розглянули підключення файлу змінних оточення. Тепер будемо підключати різні файли в залежності від змінної NODE_ENV визначеної при запуску сервера. Також виведемо в консоль NODE_ENV і APP_NAME і запустимо сервер в різних режимах:

index.js
const envPath =
  process.env.NODE_ENV === "production"
    ? "./enviroments/production.env"
    : "./enviroments/development.env";

dotenv.config({ path: envPath });

console.log(process.env.APP_NAME);
console.log(process.env.NODE_ENV);

Запустимо сервер у двох режимах і переконаємося, що вантажиться відповідний файл змінних оточення:

terminal
npm run dev
Вантажиться development.env
terminal
npm run prod
Вантажиться production.env

Тобто NODE_ENV - встановлюється під час запуску сервера коли запускаємо скрипт. Відповідно знаючи яка конфігурація оточення у нас, ми й під'єднуємо той чи інший файл змінних оточення.

ЩЕ РАЗ ПОПЕРЕДЖЕННЯ: Ці файли треба додати в .gitignore, бо вони містять секретні дані і не можна їх вантажити на GitHub.

Щоб поділитися шаблоном цих файлів створіть їх копії production.env.example та development.env.example. АЛЕ замініть всі секретні параметри.

Покликання:

dotenv

Підсвічення синтаксису файлів .env

Last updated