2025-08-02 00:18:09 +03:00
|
|
|
|
# Архитектура
|
|
|
|
|
|
|
|
|
|
|
|
## Обзор системы
|
|
|
|
|
|
|
|
|
|
|
|
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
|
2025-09-01 20:36:15 +03:00
|
|
|
|
Core API-->>Quoter: Author ID
|
2025-08-02 00:18:09 +03:00
|
|
|
|
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 как общее файловое хранилище
|
|
|
|
|
|
|
|
|
|
|
|
### Производительность
|
|
|
|
|
|
- Асинхронная обработка запросов
|
|
|
|
|
|
- Кэширование списка файлов
|
|
|
|
|
|
- Ленивая генерация миниатюр
|
|
|
|
|
|
|
|
|
|
|
|
### Мониторинг
|
|
|
|
|
|
- Структурированное логирование
|
|
|
|
|
|
- Метрики использования квот
|
|
|
|
|
|
- Отслеживание ошибок
|