- introduce storage.Backend with S3 and local file-system implementations - deliver all blobs via signed GET/HEAD /api/objects/<key> (Range, Content-Type) - stream S3 objects through the backend; remove presigned URL path - share shared HMAC Signer between backends - remove S3_PUBLIC_URL; rename S3_PRESIGN_TTL to OBJECT_URL_TTL - make storage label in health dynamic; nginx proxy_buffering off for objects
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. - Не затрагивает слой метаданных.