# app-secrets Specification ## Purpose Хранение секретов приложения в слое метаданных с автогенерацией: единый стабильный секрет на инсталляцию без обязательной настройки окружения. ## Requirements ### Requirement: Хранение секрета приложения Слой метаданных SHALL хранить секрет подписи токенов приложения и SHALL возвращать один и тот же секрет при последующих запусках. #### Scenario: Первый запуск - **WHEN** секрет ещё не сохранён - **THEN** система генерирует случайный секрет и сохраняет его в слое метаданных #### Scenario: Повторный запуск - **WHEN** секрет уже сохранён - **THEN** система использует сохранённый секрет и не генерирует новый ### Requirement: Отсутствие ручного секрета Система SHALL работать без секрета, заданного в окружении, и SHALL не требовать его наличия при старте. #### Scenario: Секрет не задан в окружении - **WHEN** переменная секрета не задана - **THEN** система запускается, используя секрет из слоя метаданных ### Requirement: Конкурентный первый запуск При одновременном первом запуске нескольких инстансов на общей базе метаданных система SHALL обеспечивать единый сохранённый секрет для всех инстансов. #### Scenario: Гонка первого запуска - **WHEN** два инстанса одновременно обнаруживают отсутствие секрета - **THEN** сохраняется ровно один секрет, и оба инстанса используют его ### Requirement: Использование секрета для подписи URL При отсутствии отдельного секрета подписи URL система SHALL использовать секрет из слоя метаданных. #### Scenario: URL_SECRET не задан - **WHEN** отдельный секрет подписи URL не задан - **THEN** подпись URL объектов использует секрет приложения из слоя метаданных #### Scenario: URL_SECRET задан - **WHEN** отдельный секрет подписи URL задан - **THEN** он используется независимо от секрета приложения