Модель данных
Пять сущностей, которых достаточно, чтобы описать любую конфигурацию.
Организация, проект, окружение
Организация — граница биллинга и участников. Внутри неё проекты, внутри
проектов окружения (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). Всё запрещено по умолчанию.