Files
ds-galo/openspec/specs/app-secrets/spec.md
iu 8638d1bbfc chore(openspec): archive completed changes and sync main specs
- archive local-fs-storage-backend, sqlite-metadata-backend,
  storage-orphan-reconciliation, metadata-managed-jwt-secret, default-local-backends
- sync specs: storage-backends, metadata-backends, storage-reconciliation,
  app-secrets; update photos/share-links
- defaults reflected in specs: SQLite and local FS
2026-10-11 10:19:44 +03:00

48 lines
2.9 KiB
Markdown

# 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** он используется независимо от секрета приложения