Skip to content

Хранилище файлов

Planner использует S3-совместимое объектное хранилище для файлов с поддержкой локальной файловой системы как fallback.

Архитектура

  • S3-клиент@aws-sdk/client-s3 (поддерживает MinIO, Regru Cloud, AWS S3)
  • Локальный fallback — если S3_ENDPOINT не задан, используется express.static() на /uploads
  • Два bucket'а: аватары (public-read) и документы (private)

Конфигурация

ПеременнаяОписание
S3_ENDPOINTURL S3-совместимого сервера
S3_ACCESS_KEYКлюч доступа
S3_SECRET_KEYСекретный ключ
S3_PUBLIC_URLПубличный URL для доступа к файлам
S3_BUCKETBucket для аватаров
S3_DOCUMENTS_BUCKETBucket для документов

Валидация файлов

Magic bytes

Проверка сигнатуры файла для предотвращения подделки расширения:

ТипСигнатура
JPEGFF D8 FF
PNG89 50 4E 47
GIF47 49 46 38
WebP52 49 46 46 ... 57 45 42 50
PDF25 50 44 46
DOC/DOCXD0 CF 11 E0 / 50 4B 03 04
XLS/XLSXD0 CF 11 E0 / 50 4B 03 04
PPT/PPTXD0 CF 11 E0 / 50 4B 03 04
ZIP50 4B 03 04
MP349 44 33
MP400 00 00 ... 66 74 79 70
WAV52 49 46 46 ... 57 41 56 45

Ограничения

  • SVG заблокированы — XSS риск
  • Макс. размер: 50MB (документы), 2MB (аватары)
  • Content-Disposition: документы отдаются как attachment
  • X-Content-Type-Options: nosniff

Использование

StorageService — внутренний сервис, используется модулями:

  • Users — аватары
  • Tasks — вложения задач
  • Comments — вложения комментариев
  • Chat — вложения сообщений