env-master

Модель данных

Пять сущностей, которых достаточно, чтобы описать любую конфигурацию.

Организация, проект, окружение

Организация — граница биллинга и участников. Внутри неё проекты, внутри проектов окружения (dev, staging, production и любые свои). Записи живут в окружении: одно и то же имя ключа в разных окружениях — разные значения, и это нормальный, ожидаемый случай.

Запись: переменная или секрет

Хранилище одно, а поведение задаёт видимость:

ВидимостьКто видит значениеКогда использовать
plainвсе, у кого есть доступ к проектууровень логирования, URL сервиса
maskedпо явному запросу, с записью в аудитпароли, токены, ключи API
restrictedтолько машины, человеку — никогдаключи, которые не нужны людям вовсе

Имя ключа — [A-Z][A-Z0-9_]*. Переменная обязана быть plain, секрет — masked или restricted.

Версии и метки

Каждое изменение создаёт новую версию. Метки указывают, какая версия чем является:

  • current — то, что читают потребители;
  • previous — предыдущее значение, откат в одно действие;
  • pending — значение, которое уже создано, но ещё не применено (см. ротацию).

Откат не переставляет указатели, а публикует старое значение новой версией: история остаётся монотонной, и по ней видно, что откат вообще был.

Сервис и machine identity

Сервис — сущность первого класса, а не побочный продукт токена. К нему привязываются identity: у каждой свой способ входа, свой TTL токена и свой скоуп — проект, окружение и, если нужно, набор ключей.

Роли

Две независимые плоскости. Роль в организации управляет проектами и участниками, но сама по себе не даёт доступа к секретам — за это отвечает роль в проекте (admin, member, viewer). Всё запрещено по умолчанию.