Skip to content

Service Media

plutogr edited this page May 23, 2026 · 2 revisions

Сервис Media (TravelAgency.Media)

Сервис загрузки и выдачи медиафайлов: загрузка файлов в S3-совместимое хранилище (MinIO), скачивание по Id, presigned URL с TTL, автогенерация превью для изображений.


Содержание

  1. Назначение и роль
  2. Стек и зависимости
  3. Структура проектов
  4. Домен
  5. API (HTTP)
  6. Инфраструктура и хранилище
  7. Конфигурация и запуск

1) Назначение и роль

  • Загрузка файлов (изображения JPEG/PNG/WebP/GIF, PDF): сохранение в MinIO/S3, запись метаданных в БД, привязка к пользователю (владелец). Для изображений — автоматическая генерация thumbnails (превью).
  • Скачивание по Id: возврат файла (stream) с корректным Content-Type и именем файла.
  • Presigned URL: выдача временной ссылки на скачивание с TTL (минуты) — для безопасной передачи ссылок во внешние системы или клиенту без проксирования бинарных данных через API.
  • Удаление: только владелец может удалить файл; при удалении удаляются и превью из хранилища.
  • Собственная БД: travel_media (метаданные файлов, владелец, StorageKey, превью). Хранилище: S3-совместимое (MinIO).

2) Стек и зависимости

Компонент Технология
Платформа .NET 10, ASP.NET Core
БД PostgreSQL, EF Core
Хранилище MinIO / AWS S3 (AWSSDK.S3)
Медиатор MediatR (Upload, Get, Presign, Delete)
Обработка изображений генерация thumbnails (например, ImageSharp или встроенные средства) в Infrastructure
JWT авторизация (RequireAuthenticated)
Логирование Serilog
Трейсинг OpenTelemetry
Общее Shared.Contracts, Shared.Infrastructure

3) Структура проектов

src/Services/Media/
├── TravelAgency.Media.Domain/         # MediaFile, MediaFileThumbnail (StorageKey, OwnerId)
├── TravelAgency.Media.Application/     # Upload, Get, Presign, Delete; IStorageService (абстракция)
├── TravelAgency.Media.Infrastructure/  # S3StorageService, BucketInitializer, ImageProcessing, DbContext
├── TravelAgency.Media.API/             # MediaController
├── TravelAgency.Media.UnitTests/
└── TravelAgency.Media.IntegrationTests/

4) Домен

  • MediaFile — Id, OwnerId (UserId), StorageKey (ключ в S3), ContentType, FileName, размер, дата загрузки; коллекция Thumbnails.
  • MediaFileThumbnail — размер (например, 200px), StorageKey превью. При удалении файла удаляются все превью из хранилища.

5) API (HTTP)

Базовый маршрут: /media (через Gateway: /api/v1/media/*). Все эндпоинты требуют аутентификации (RequireAuthenticated).

Метод Путь Описание
POST /media/upload Загрузка файла (multipart/form-data). Поддержка изображений и PDF. Возврат 201, UploadMediaResponse (Id, presigned URL и при необходимости превью).
GET /media/{id} Скачивание файла по Id (stream, Content-Type, FileName). 404 если не найден или нет прав.
POST /media/presign Тело: PresignMediaQuery (Id, при необходимости TTL). Возврат PresignMediaResponse (URL с TTL).
DELETE /media/{id} Удаление файла. Только владелец; 403 при попытке удалить чужой файл. 204 при успехе.

Ограничения: MIME-типы и максимальный размер файла настраиваются (в Application/API); при нарушении — 400.


6) Инфраструктура и хранилище

  • S3StorageService (IStorageService): загрузка (UploadAsync), скачивание (DownloadAsync), удаление (DeleteAsync), генерация presigned URL (GeneratePresignedUrlAsync). Использует IAmazonS3 (AWSSDK.S3), конфигурация через Storage:ServiceUrl, AccessKey, SecretKey, BucketName.
  • BucketInitializer (HostedService): при старте проверяет существование бакета; при отсутствии создаёт (PutBucketAsync). Имя бакета из Storage:BucketName (например, media).
  • Image processing: генерация thumbnails при загрузке изображений; ключи превью сохраняются в БД (MediaFileThumbnail) и в S3. При удалении файла удаляются все связанные ключи в S3.
  • MediaDbContext — MediaFile, MediaFileThumbnail; миграции в Infrastructure.
  • Health check: readiness включает проверку S3 (S3HealthCheck — например, GetBucketLocationAsync). Liveness — без зависимостей.
  • Миграции: UseMediaMigrations вызывается в pipeline (после CORS и т.д.).

7) Конфигурация и запуск

  • ConnectionStrings:MediaDb — PostgreSQL (travel_media).
  • Storage:ServiceUrl — URL MinIO (например, http://minio:9000).
  • Storage:AccessKey, Storage:SecretKey — учётные данные MinIO (в Docker — MINIO_ROOT_USER, MINIO_ROOT_PASSWORD).
  • Storage:BucketName — имя бакета (media); создаётся при старте, если не существует.
  • Storage:PresignTtlMinutes — TTL presigned URL в минутах (например, 60).
  • JwtSettings — для идентификации владельца (OwnerId) при загрузке и проверки прав при удалении.
  • В Docker Compose: media-service, порт 5050→8080, зависит от postgres и minio. ASPNETCORE_RUN_MIGRATIONS=true. Переменные Storage задаются через environment.

См. также: Архитектура, Сервис API Gateway.

Clone this wiki locally