- 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
2.9 KiB
2.9 KiB
Proposal
Why
S3-совместимое хранилище (Garage на s3.localnet) в проде недоступно извне, поэтому
отдача медиа не может идти напрямую из хранилища в браузер. Нужен слой хранения,
который всегда отдаёт блобы через бэкенд, и локальный бэкенд для инсталляций без S3.
What Changes
- Ввести интерфейс
storage.Backend: Put/Delete/Get/Ping/EnsureBucket/Bucket,URL(всегда подписанный URL приложения) и обязательныйServeObject. - Реализовать бэкенд локальной ФС: блобы под корневым каталогом по непрозрачным ключам
objects/{id}/{role}{ext}, защита от обхода пути, отдача черезServeContent. - Реализовать отдачу S3 через бэкенд:
ServeObjectтянет объект rangedGetObjectиз Garage (внутренняя сеть) и стримит браузеру; presigned URL больше не используются. - Публичный маршрут
/api/objects/<key>с HMAC-подписью, сроком, Range и Content-Type обслуживает и авторизованных, и анонимные share-ссылки. - Ввести
STORAGE_BACKEND=s3|fsиFS_ROOT; убратьS3_PUBLIC_URL; переименоватьS3_PRESIGN_TTL→OBJECT_URL_TTL; дефолт —s3. - Сделать метку хранилища в health динамической.
- Сделать формулировки отдачи файлов нейтральными к бэкенду в спеках
photosиshare-links.
Capabilities
New Capabilities
storage-backends: выбор и работа объектного хранилища — S3-совместимое (Garage) и локальная ФС; блобы всегда отдаются через бэкенд по подписанному URL, хранилище клиенту не раскрывается.
Modified Capabilities
photos: получение фото и скачивание не требуют presigned URL и обслуживаются бэкендом (подписанный URL).share-links: просмотр по ссылке отдаёт подписанный URL, обслуживаемый бэкендом.
Impact
backend/internal/storage(интерфейс, общийSigner, FS-бэкенд, S3-proxy-отдача), сервисыphotosиalbums,app(маршрут отдачи, health),cmd/*,config.- Удаление presign-пути AWS SDK из
storage. .env.example,project.md,deploy/nginx-sse.conf.- Спеки
photos,share-links, новаяstorage-backends. - Не затрагивает слой метаданных.