Конфигурация окружения и секреты
Держите пароли, API-ключи и настройки для разных сред вне исходного кода
Главная идея: вашей программе нужны значения, которые меняются между вашим ноутбуком и настоящим сервером - пароль базы данных, API-ключ, номер порта. Прописывать их прямо в
.js-файлах небезопасно и негибко. Конфигурация окружения позволяет передавать эти значения извне кода, поэтому один и тот же код работает везде, а ваши секреты никогда не попадают в систему контроля версий.
К концу урока вы сможете:
- читать конфигурацию из
process.env, - хранить локальные настройки в файле
.envи загружать их через dotenv, - не пускать
.envв Git с помощью.gitignoreи поставлять безопасный.env.example, - проверять конфигурацию при запуске и задавать разумные значения по умолчанию для каждой среды.
1. Проблема: секреты в коде
Представьте, что вы подключаетесь к базе данных прямо внутри исходного файла:
// db.js -- так делать НЕЛЬЗЯ
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: 'db.myapp.com',
user: 'admin',
password: 'S3cr3t-Pa55!', // настоящий пароль, попавший в Git
});
На вашей машине это работает, но здесь три серьёзные проблемы:
- Утечка секретов. Как только вы сделаете
git commit, этот пароль навсегда останется в истории репозитория - даже если позже вы удалите строку. Любой, у кого есть доступ к репозиторию (или к публичной копии на GitHub), сможет его прочитать. - Непереносимость. Вашему ноутбуку, ноутбуку коллеги и продакшн-серверу нужны разные значения. Жёстко прописанные строки заставляют менять код только ради смены хоста.
- Сложно менять. Когда ключ скомпрометирован, вы хотите заменить его за секунды, а не искать по файлам и заново развёртывать приложение.
Аналогия. Считайте исходный код рецептом, который вы публикуете в кулинарной книге, а секреты - ключом от вашего дома. Рецептом вы поделитесь с радостью, но ключ от дома внутри него печатать не станете. Конфигурация - это запечатанный конверт, который вы отдаёте тому, кто готовит на вашей кухне: он остаётся при среде, а не при рецепте.