# Архитектура ## Обзор системы Quoter - это микросервис для управления файлами с поддержкой квот, миниатюр и интеграции с S3 хранилищами. ## Компоненты системы ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Web Client │ │ Mobile App │ │ API Client │ └─────────┬───────┘ └─────────┬───────┘ └─────────┬───────┘ │ │ │ └──────────────────────┼──────────────────────┘ │ ┌─────────────▼─────────────┐ │ Quoter Service │ │ (Actix Web Server) │ └─────────────┬─────────────┘ │ ┌───────────────────────┼───────────────────────┐ │ │ │ ┌─────▼─────┐ ┌───────▼──────┐ ┌─────▼─────┐ │ Redis │ │ Core API │ │ S3/Storj│ │ (Quotas & │ │(Auth & Shout)│ │ (Storage) │ │ Cache) │ │ │ │ │ └───────────┘ └──────────────┘ └───────────┘ ``` ## Основные модули ### 1. AppState (`src/app_state.rs`) Центральное состояние приложения, содержащее: - Подключения к Redis, Storj S3, AWS S3 - Методы для работы с квотами - Кэширование списка файлов ### 2. Handlers (`src/handlers/`) Обработчики HTTP запросов: - `upload.rs` - загрузка файлов - `proxy.rs` - получение файлов и генерация миниатюр - `quota.rs` - управление квотами - `serve_file.rs` - обслуживание файлов ### 3. Auth (`src/auth.rs`) Аутентификация через GraphQL API ядра: - Валидация JWT токенов - Управление файлами пользователей в Redis ### 4. Core (`src/core.rs`) Интеграция с API ядра: - Получение данных shout для оверлеев ### 5. Thumbnail (`src/thumbnail.rs`) Обработка изображений: - Создание миниатюр различных размеров - Поддержка различных форматов ### 6. S3 Utils (`src/s3_utils.rs`) Утилиты для работы с S3: - Загрузка/скачивание файлов - Определение MIME типов - Генерация ключей ## Поток данных ### Загрузка файла ```mermaid sequenceDiagram participant Client participant Quoter participant Core API participant Redis participant S3 Client->>Quoter: POST / (file + token) Quoter->>Core API: Validate token Core API-->>Quoter: Author ID Quoter->>Redis: Check quota Redis-->>Quoter: Current quota Quoter->>S3: Upload file S3-->>Quoter: Success Quoter->>Redis: Update quota Quoter->>Redis: Save file info Quoter-->>Client: Filename ``` ### Получение файла ```mermaid sequenceDiagram participant Client participant Quoter participant Redis participant S3 Client->>Quoter: GET /filename Quoter->>Redis: Get file path Redis-->>Quoter: File path Quoter->>S3: Check file exists S3-->>Quoter: File exists Quoter->>S3: Download file S3-->>Quoter: File data Quoter-->>Client: File content ``` ## Структура данных ### Redis схемы #### Квоты пользователей ``` Key: quota:{user_id} Type: String Value: bytes_used (u64) TTL: None (permanent) ``` #### Файлы пользователей ``` Key: {user_id} Type: Set Value: [filename1, filename2, ...] TTL: None (permanent) ``` #### Маппинг путей файлов ``` Key: filepath_mapping Type: Hash Field: filename Value: filepath TTL: None (permanent) ``` #### Информация о файлах ``` Key: files:{filename} Type: String Value: mime_type TTL: None (permanent) ``` ### S3 структура ``` bucket/ ├── original_files/ │ ├── image1.jpg │ ├── image2.png │ └── document.pdf ├── thumbnails/ │ ├── image1_10.jpg │ ├── image1_40.jpg │ ├── image1_110.jpg │ ├── image1_300.jpg │ ├── image1_600.jpg │ ├── image1_800.jpg │ └── image1_1400.jpg └── webp_thumbnails/ ├── image1_10.jpg/webp ├── image1_40.jpg/webp └── ... ``` ## Безопасность ### Аутентификация - JWT токены через GraphQL API ядра - Валидация токенов для всех операций записи ### Авторизация - Проверка квот перед загрузкой - Изоляция файлов по пользователям ### CORS - Настроен для кросс-доменных запросов - Поддержка credentials ## Масштабирование ### Горизонтальное масштабирование - Stateless архитектура - Redis как общее хранилище состояния - S3 как общее файловое хранилище ### Производительность - Асинхронная обработка запросов - Кэширование списка файлов - Ленивая генерация миниатюр ### Мониторинг - Структурированное логирование - Метрики использования квот - Отслеживание ошибок