Вопрос “в каком формате хранить пароль от базы” звучит как второстепенный, пока не выясняется, что выбор формата влияет на то, насколько легко секрет случайно закоммитить, засветить в логах или отдать стороннему сервису.
Сравнение по практическим критериям
| Формат | Стандартное игнорирование в .gitignore | Легко ли случайно закоммитить | Поддержка комментариев |
|---|---|---|---|
| .env | Да, повсеместная конвенция | Средний риск, если забыли добавить в .gitignore | Да |
| JSON (config.json) | Нет единой конвенции | Высокий риск, обычно не в списке игнора по умолчанию | Нет |
| YAML (secrets.yaml) | Нет единой конвенции | Высокий риск | Да |
| TOML (аналогично) | Нет единой конвенции | Высокий риск | Да |
Почему .env стал негласным стандартом именно для секретов
Экосистема dotenv и практика двенадцатифакторного приложения закрепили .env как место для конфигурации, отличной от кода. У этого формата уже есть повсеместная конвенция игнорирования в .gitignore — почти любой шаблон gitignore для любого стека включает .env по умолчанию, чего нельзя сказать про произвольный config.json или secrets.yaml.
Риск смешивания секретов с обычным конфигом
config.yaml:
app_name: MyApp
db_password: real-secret-here
log_level: info
Секрет внутри обычного конфигурационного файла, который логично коммитить (app_name, log_level), создаёт риск: разработчик коммитит файл целиком, не задумываясь, что внутри есть один чувствительный ключ среди безобидных настроек.
Практическая рекомендация
Держите секреты физически отдельно от остального конфига — в .env, который по умолчанию игнорируется большинством шаблонов, а не смешанным с обычными настройками в одном YAML или JSON файле. Для передачи секретов между форматами (например, в MCP-сервер, ожидающий JSON) конвертируйте в момент необходимости, а не храните секрет постоянно в неудобном для игнорирования формате.
Как быстро проверить, не засветился ли секрет в конфиге
.env Mask Secrets маскирует значения перед демонстрацией содержимого, а Git History Secret-Scrub Dry-Run Simulator показывает, что попадёт под очистку, если секрет уже случайно закоммичен.
Итоговый чеклист
.env — практический стандарт для секретов именно благодаря повсеместной конвенции игнорирования в .gitignore, а не из-за особых технических свойств формата.
Смешивание секретов с обычным конфигом в одном YAML или JSON файле повышает риск случайного коммита всего файла целиком.
Конвертация в другой формат уместна в момент реальной необходимости (например, для MCP-сервера), а не как постоянное место хранения секрета.