Хранилище файлов
Planner использует S3-совместимое объектное хранилище для файлов с поддержкой локальной файловой системы как fallback.
Архитектура
- S3-клиент —
@aws-sdk/client-s3(поддерживает MinIO, Regru Cloud, AWS S3) - Локальный fallback — если
S3_ENDPOINTне задан, используетсяexpress.static()на/uploads - Два bucket'а: аватары (public-read) и документы (private)
Конфигурация
| Переменная | Описание |
|---|---|
S3_ENDPOINT | URL S3-совместимого сервера |
S3_ACCESS_KEY | Ключ доступа |
S3_SECRET_KEY | Секретный ключ |
S3_PUBLIC_URL | Публичный URL для доступа к файлам |
S3_BUCKET | Bucket для аватаров |
S3_DOCUMENTS_BUCKET | Bucket для документов |
Валидация файлов
Magic bytes
Проверка сигнатуры файла для предотвращения подделки расширения:
| Тип | Сигнатура |
|---|---|
| JPEG | FF D8 FF |
| PNG | 89 50 4E 47 |
| GIF | 47 49 46 38 |
| WebP | 52 49 46 46 ... 57 45 42 50 |
25 50 44 46 | |
| DOC/DOCX | D0 CF 11 E0 / 50 4B 03 04 |
| XLS/XLSX | D0 CF 11 E0 / 50 4B 03 04 |
| PPT/PPTX | D0 CF 11 E0 / 50 4B 03 04 |
| ZIP | 50 4B 03 04 |
| MP3 | 49 44 33 |
| MP4 | 00 00 00 ... 66 74 79 70 |
| WAV | 52 49 46 46 ... 57 41 56 45 |
Ограничения
- SVG заблокированы — XSS риск
- Макс. размер: 50MB (документы), 2MB (аватары)
- Content-Disposition: документы отдаются как
attachment - X-Content-Type-Options:
nosniff
Использование
StorageService — внутренний сервис, используется модулями:
- Users — аватары
- Tasks — вложения задач
- Comments — вложения комментариев
- Chat — вложения сообщений