Repository navigation
Service Media
plutogr edited this page May 23, 2026
·
2 revisions
Сервис загрузки и выдачи медиафайлов: загрузка файлов в S3-совместимое хранилище (MinIO), скачивание по Id, presigned URL с TTL, автогенерация превью для изображений.
- Назначение и роль
- Стек и зависимости
- Структура проектов
- Домен
- API (HTTP)
- Инфраструктура и хранилище
- Конфигурация и запуск
- Загрузка файлов (изображения JPEG/PNG/WebP/GIF, PDF): сохранение в MinIO/S3, запись метаданных в БД, привязка к пользователю (владелец). Для изображений — автоматическая генерация thumbnails (превью).
- Скачивание по Id: возврат файла (stream) с корректным Content-Type и именем файла.
- Presigned URL: выдача временной ссылки на скачивание с TTL (минуты) — для безопасной передачи ссылок во внешние системы или клиенту без проксирования бинарных данных через API.
- Удаление: только владелец может удалить файл; при удалении удаляются и превью из хранилища.
- Собственная БД: travel_media (метаданные файлов, владелец, StorageKey, превью). Хранилище: S3-совместимое (MinIO).
| Компонент | Технология |
|---|---|
| Платформа | .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 |
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/
- MediaFile — Id, OwnerId (UserId), StorageKey (ключ в S3), ContentType, FileName, размер, дата загрузки; коллекция Thumbnails.
- MediaFileThumbnail — размер (например, 200px), StorageKey превью. При удалении файла удаляются все превью из хранилища.
Базовый маршрут: /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.
- 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 и т.д.).
- 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.
- Обзор проекта
- Архитектура и зависимости
- API-карта
- Gateway
- Identity
- Catalog
- Booking
- Chat
- Media
- gRPC контракты
- Архитектура
- Детали реализации
- Сервис API Gateway
- Сервис Identity
- Сервис Catalog
- ADR-001. Модель тура
- Сервис Booking
- Сервис Chat
- Сервис Media
- Содержимое сайта
- Стек и версии
- Глоссарий
- Соответствие экранов и API