Kodokon kodokon.com

Конфигурация и секреты

Вынеси конфигурацию из кода с помощью dotenv, раздели разработку и продакшен и не пускай секреты в Git.

8 мин · 3 вопросов

Открыть этот урок в Kodokon

Порт прослушивания, URL базы данных, ключи API: ничему из этого не место в исходном коде. Эти значения меняются между твоей машиной и продакшеном, а некоторые из них - секреты. Стандартное решение: переменные окружения, которые в разработке загружаются из файла .env. Установи dotenv командой npm install dotenv, затем создай файл в корне проекта.

BASH
PORT=3000
DATABASE_URL=postgres://localhost:5432/kodokon
SESSION_SECRET=change-this-value
.env - по одной переменной на строку

Импортируй dotenv/config в самом начале точки входа: переменные из файла копируются в process.env. Хорошая профессиональная привычка: собрать чтение в одном модуле конфигурации, проверять переменные при старте и падать сразу, если какой-то не хватает. Сервер, который отказывается стартовать, лучше сервера, который падает на первом же запросе.

JAVASCRIPT
import "dotenv/config";

const required = ["PORT", "SESSION_SECRET"];

for (const name of required) {
  if (!process.env[name]) {
    throw new Error("Missing variable: " + name);
  }
}

export const config = {
  port: Number(process.env.PORT),
  secret: process.env.SESSION_SECRET,
  isProd: process.env.NODE_ENV === "production"
};
config.js - единственный модуль, который читает process.env

В продакшене файла .env нет: реальные значения даёт хостинг, а NODE_ENV равен production. Используй config.isProd, чтобы менять поведение: подробные логи в разработке, сдержанные сообщения об ошибках в продакшене. И ещё закоммить файл .env.example со списком ожидаемых переменных и фиктивными значениями: он документирует конфигурацию, не раскрывая секретов.

JAVASCRIPT
import express from "express";
import { config } from "./config.js";

const app = express();

if (!config.isProd) {
  console.log("Development mode");
}

app.listen(config.port, () => {
  console.log("Port: " + config.port);
});
server.js - остальной код ничего не знает про process.env

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Куда ты положишь пароль от базы данных?
    • В константу в исходном коде
    • В файл .env, игнорируемый Git
    • В README проекта
    • В комментарий в файле конфигурации
  2. Для чего нужен файл .env.example?
    • Хранить настоящие значения про запас
    • Документировать ожидаемые переменные, без чувствительных значений
    • Настраивать тестовое окружение
  3. Секрет попал в коммит по ошибке. Что ты сделаешь в первую очередь?
    • Удалю коммит и пойду дальше
    • Отзову секрет и сгенерирую новый
    • Добавлю файл в .gitignore