Files
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

2.9 KiB

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