Хранилище файлов
S3-совместимое хранилище — Cloudflare R2 в prod, MinIO в dev
Все файлы (материалы задач, референсы, готовые ролики, safebot-видео) лежат в S3-совместимом хранилище:
- Production — Cloudflare R2
- Development — MinIO из docker-compose (
localhost:9000, консоль:9001)
Клиент: src/lib/storage/r2.ts (AWS SDK v3). Переключение между R2 и MinIO — только через env (R2_ENDPOINT, R2_REGION, ключи).
Поток загрузки (presigned)
Файлы не проходят через сервер приложения:
1. POST /api/uploads/presign → presigned PUT URL
2. Браузер: PUT файл напрямую в S3
3. POST /api/uploads/confirm/[fileId] → запись FileObject в БДFileObject хранит storageKey, bucket, mimeType, size и кто загрузил. Доменные модели (Material, ReadyContentFile, Reference, SafebotItem) ссылаются на объекты хранилища.
Функции клиента
| Функция | Назначение |
|---|---|
getPresignedUrl(key) | URL для прямой загрузки (PUT) |
getPublicUrl(key) | Публичный URL для отображения (R2_PUBLIC_URL) |
deleteObject(key) | Удаление объекта |
Admin UI — /storage
Страница «Хранилище» (permission admin.manage_storage): статистика, просмотр файлов. Локально ссылается на MinIO-консоль (NEXT_PUBLIC_MINIO_CONSOLE_URL).
Удаление файлов в доменных моделях — soft delete. Физическая чистка хранилища — отдельная операция.