Architecture Decision Record

Active theme: Light

← Приклади записів рішень

Налаштування змінних середовища

Зміст:

Підсумок

Проблема

Ми хочемо, щоб наші застосунки можна було налаштовувати поза межами артефактів/бінарників/вихідного коду, так щоб одна збірка могла поводитися по-різному залежно від середовища розгортання.

  • Для цього ми хочемо використовувати налаштування через змінні середовища.

  • Ми хочемо керувати конфігурацією за допомогою файлів, які можна версіонувати.

  • Ми хочемо забезпечити певну ергономіку досвіду розробника, наприклад знати, що можна налаштувати і які є відповідні значення за замовчуванням.

Рішення

Обрано файли .env із пов’язаним файлом значень за замовчуванням і файлом схеми.

Статус

Ухвалено. Відкриті до розгляду нових можливостей, коли вони з’являтимуться.

Подробиці

Припущення

Ми віддаємо перевагу відокремленню коду застосунку від коду середовища. Ми припускаємо, що застосунок має працювати по-різному в різних середовищах, як-от у середовищі розробки, тестовому середовищі, демонстраційному середовищі, робочому середовищі тощо.

Ми віддаємо перевагу галузевій практиці «12 factor app» і ще більше пов’язаній практиці «15 factor app».

Багато наших попередніх проєктів використовували конвенцію файлу .env чи подібного каталогу .env. Типова практика — не зберігати їх у системі контролю версій, а натомість розгортати, версіонувати та керувати ними іншим способом.

Обмеження

Ми хочемо тримати секрети поза системою контролю версій (VCS) управління вихідним кодом (SCM).

Ми прагнемо до сумісності з популярними програмними фреймворками та бібліотеками. Наприклад, Node має модуль «dotenv» для читання налаштувань змінних середовища.

Позиції

Ми розглянули кілька підходів:

  • Зберігати конфігурацію в застосунку, наприклад у файлі config.js.

  • Зберігати конфігурацію в середовищі, наприклад у файлі .env.

  • Отримувати конфігурацію з відомого розташування, наприклад із сервера ліцензій.

Аргумент

Ми обрали підхід із файлом .env, тому що:

  • Він популярний, зокрема серед експертів.

  • Він відповідає шаблону файлів .env, які наші команди успішно використовували багато разів у багатьох проєктах.

  • Він простий. Зокрема, нас наразі влаштовують суттєві компроміси, які ми бачимо, як-от відсутність можливостей аудиту порівняно з підходом із сервером ліцензій.

Наслідки

Нам потрібно знайти спосіб відокремити публічні налаштування змінних середовища від будь-якого керування секретами.

Пов’язане

Пов’язані рішення

Ми очікуємо, що всі наші застосунки використовуватимуть цей підхід.

Ми плануватимемо оновлення будь-яких наших застосунків, що використовують менш потужний підхід, як-от жорстке кодування в бінарному файлі чи у вихідному коді.

Ми залишимо без змін будь-які наші застосунки, що використовують потужніший підхід, як-от сервер ліцензування.

Пов’язані вимоги

Ми додамо можливості DevOps для цих файлів, зокрема хуки, тести та безперервну інтеграцію.

Нам потрібно навчити всіх колег-розробників цьому рішенню.

Пов’язані артефакти

Кожна зона, куди ми розгортаємо, потребуватиме власного файлу .env та пов’язаних файлів.

Пов’язані принципи

Легко скасовувати.

Примітки

Приклад файлу .env:

NAME=Alice Anderson
EMAIL=alice@example.com

Приклад файлу .env.defaults:

NAME=Joe Doe
EMAIL=joe@example.com

Приклад файлу .env.schema лише з ключами:

NAME
EMAIL