KV версии 2 хранит несколько версий каждого секрета. Это позволяет откатить ошибочное изменение, защититься от одновременной перезаписи и управлять тем, сколько истории хранить.

Цель

Пройти полный жизненный цикл секрета: создать несколько версий, прочитать и откатить версию, ограничить хранение истории, включить check-and-set, удалить и восстановить версию и уничтожить её безвозвратно.

Предварительные требования

Для выполнения примера нужны:

  • Токен Stronghold с правами на путь secret/*.
  • Механизм секретов KV версии 2, смонтированный в secret/ (в режиме разработки он включён по умолчанию).

Шаг 1. Создайте версии секрета

Запишите секрет несколько раз, чтобы создать версии:

  1. Каждая запись создаёт новую версию:

    d8 stronghold kv put -mount=secret app/config username=app password=v1-pass
    d8 stronghold kv put -mount=secret app/config username=app password=v2-pass
  2. Команда kv patch меняет только указанные поля и сохраняет остальные:

    d8 stronghold kv patch -mount=secret app/config password=v3-pass

    Поле username остаётся прежним, password получает значение v3-pass. Результат — версия 3.

Шаг 2. Прочитайте нужную версию

Прочитайте текущую версию, версию 1 и метаданные секрета:

d8 stronghold kv get -mount=secret app/config
d8 stronghold kv get -mount=secret -version=1 app/config
d8 stronghold kv metadata get -mount=secret app/config

Первая команда возвращает текущую версию, вторая — версию 1. Третья показывает метаданные: текущую версию, время создания каждой версии и признаки удаления.

Шаг 3. Откатите версию

Откатите секрет к версии 1:

d8 stronghold kv rollback -mount=secret -version=1 app/config

Откат не меняет историю: содержимое версии 1 записывается как новая версия 4.

Шаг 4. Ограничьте историю

Задайте количество хранимых версий и срок их жизни:

d8 stronghold kv metadata put -mount=secret -max-versions=5 -delete-version-after=720h app/config
  • max-versions — сколько версий хранить. Самая старая версия сверх лимита удаляется автоматически.
  • delete-version-after — через какое время после создания версия помечается удалённой.

Шаг 5. Включите check-and-set

Check-and-set защищает от перезаписи, когда два клиента меняют секрет одновременно: запись проходит, только если клиент указал текущую версию.

  1. Включите check-and-set для секрета:

    d8 stronghold kv metadata patch -mount=secret -cas-required=true app/config
  2. Запись без версии теперь отклоняется:

    # Команда не задаёт параметр -cas, поэтому Stronghold отклоняет запись.
    d8 stronghold kv put -mount=secret app/config password=without-cas
  3. Запись с текущей версией проходит:

    d8 stronghold kv put -mount=secret -cas=4 app/config username=app password=v5-pass

    Если за это время секрет изменил другой клиент, версия не совпадёт, и запись будет отклонена.

Шаг 6. Удалите, восстановите и уничтожьте версию

Удалите последнюю версию, восстановите её и уничтожьте старые версии:

  1. Мягкое удаление помечает последнюю версию удалённой, данные остаются в хранилище:

    d8 stronghold kv delete -mount=secret app/config
  2. Восстановите версию:

    d8 stronghold kv undelete -mount=secret -versions=5 app/config
  3. Уничтожение удаляет данные версии безвозвратно:

    d8 stronghold kv destroy -mount=secret -versions=1,2 app/config

Проверка

Просмотрите метаданные секрета:

d8 stronghold kv metadata get -mount=secret app/config

В выводе версии 1 и 2 помечены как уничтоженные (destroyed: true), версия 5 восстановлена и является текущей, max_versions равен 5, cas_required равен true.

Очистка

Удалите секрет вместе со всеми версиями и метаданными:

d8 stronghold kv metadata delete -mount=secret app/config

Дополнительные ресурсы