uploader-bot/docs/SANIC_TO_FASTAPI_MIGRATION_...

560 lines
27 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# План миграции с Sanic на FastAPI для uploader-bot
## Обзор текущей архитектуры
### Статус миграции
**ЧАСТИЧНО МИГРИРОВАН** - В проекте уже используются оба фреймворка одновременно:
- ✅ Основное приложение FastAPI уже создано в [`main.py`](main.py:46-141)
- ✅ Частично реализованы FastAPI роуты в [`fastapi_v3_routes.py`](app/api/fastapi_v3_routes.py) и [`fastapi_node_routes.py`](app/api/fastapi_node_routes.py)
- ⚠️ Основная функциональность все еще на Sanic
### Гибридная архитектура
Приложение запускается в одном из режимов (определяется в [`main.py:19-44`](main.py:19-44)):
1. **FastAPI режим** - если доступен FastAPI или установлена переменная `USE_FASTAPI=true`
2. **Sanic режим** - fallback к Sanic приложению
3. **Минимальный режим** - если ни один фреймворк недоступен
## Инвентаризация Sanic эндпоинтов
### 1. Аутентификация и авторизация ([`auth_routes.py`](app/api/routes/auth_routes.py))
**Blueprint:** `auth_bp = Blueprint("auth", url_prefix="/api/v1/auth")`
| Метод | Путь | Функция | Описание |
|-------|------|---------|----------|
| POST | `/register` | [`register_user()`](app/api/routes/auth_routes.py:36-184) | Регистрация пользователя с валидацией |
| POST | `/login` | [`login_user()`](app/api/routes/auth_routes.py:186-336) | Вход с JWT токенами |
| POST | `/refresh` | [`refresh_tokens()`](app/api/routes/auth_routes.py:338-440) | Обновление access токенов |
| POST | `/logout` | [`logout_user()`](app/api/routes/auth_routes.py:442-495) | Выход с инвалидацией сессии |
| GET | `/me` | [`get_current_user()`](app/api/routes/auth_routes.py:497-587) | Информация о текущем пользователе |
| PUT | `/me` | [`update_current_user()`](app/api/routes/auth_routes.py:590-679) | Обновление профиля |
| POST | `/api-keys` | [`create_api_key()`](app/api/routes/auth_routes.py:681-755) | Создание API ключей |
| GET | `/sessions` | [`get_user_sessions()`](app/api/routes/auth_routes.py:757-811) | Список активных сессий |
| DELETE | `/sessions/<session_id>` | [`revoke_session()`](app/api/routes/auth_routes.py:813-870) | Отзыв сессии |
**Особенности:**
- Rate limiting декораторы
- Комплексная валидация с Pydantic схемами
- JWT токены с ротацией
- Поддержка API ключей
- Управление сессиями
### 2. Управление контентом ([`content_routes.py`](app/api/routes/content_routes.py))
**Blueprint:** `content_bp = Blueprint("content", url_prefix="/api/v1/content")`
| Метод | Путь | Функция | Описание |
|-------|------|---------|----------|
| POST | `/` | [`create_content()`](app/api/routes/content_routes.py:32-135) | Создание контента с метаданными |
| GET | `/<content_id>` | [`get_content()`](app/api/routes/content_routes.py:137-238) | Получение контента с кешированием |
| PUT | `/<content_id>` | [`update_content()`](app/api/routes/content_routes.py:240-313) | Обновление метаданных |
| POST | `/search` | [`search_content()`](app/api/routes/content_routes.py:315-440) | Поиск с фильтрами и пагинацией |
| GET | `/<content_id>/download` | [`download_content()`](app/api/routes/content_routes.py:442-518) | Скачивание с контролем доступа |
**Особенности:**
- Комплексная система разрешений
- Redis кеширование
- Streaming downloads
- Квоты пользователей
- Статистика доступа
### 3. Файловое хранилище ([`storage_routes.py`](app/api/routes/storage_routes.py))
**Blueprint:** `storage_bp = Blueprint("storage", url_prefix="/api/v1/storage")`
| Метод | Путь | Функция | Описание |
|-------|------|---------|----------|
| POST | `/upload` | [`initiate_upload()`](app/api/routes/storage_routes.py:28-126) | Инициация chunked upload |
| POST | `/upload/<upload_id>/chunk` | [`upload_chunk()`](app/api/routes/storage_routes.py:128-218) | Загрузка chunk'а файла |
| GET | `/upload/<upload_id>/status` | [`get_upload_status()`](app/api/routes/storage_routes.py:220-290) | Статус загрузки |
| DELETE | `/upload/<upload_id>` | [`cancel_upload()`](app/api/routes/storage_routes.py:292-374) | Отмена загрузки |
| DELETE | `/files/<content_id>` | [`delete_file()`](app/api/routes/storage_routes.py:376-456) | Удаление файла |
| GET | `/quota` | [`get_storage_quota()`](app/api/routes/storage_routes.py:458-530) | Информация о квоте |
| GET | `/stats` | [`get_storage_stats()`](app/api/routes/storage_routes.py:532-609) | Статистика хранилища |
| POST | `/cleanup` | [`cleanup_orphaned_files()`](app/api/routes/storage_routes.py:611-708) | Очистка (админ) |
**Особенности:**
- Chunked uploads с прогрессом
- Валидация файлов и типов
- Управление квотами
- Background cleanup
### 4. Блокчейн интеграция ([`blockchain_routes.py`](app/api/routes/blockchain_routes.py))
**Blueprint:** `blockchain_bp = Blueprint("blockchain", url_prefix="/api/v1/blockchain")`
| Метод | Путь | Функция | Описание |
|-------|------|---------|----------|
| GET | `/wallet/balance` | [`get_wallet_balance()`](app/api/routes/blockchain_routes.py:29-111) | Баланс TON кошелька |
| GET | `/wallet/transactions` | [`get_wallet_transactions()`](app/api/routes/blockchain_routes.py:113-208) | История транзакций |
| POST | `/transaction/send` | [`send_transaction()`](app/api/routes/blockchain_routes.py:210-347) | Отправка TON транзакций |
| GET | `/transaction/<tx_hash>/status` | [`get_transaction_status()`](app/api/routes/blockchain_routes.py:349-458) | Статус транзакции |
| POST | `/wallet/create` | [`create_wallet()`](app/api/routes/blockchain_routes.py:460-543) | Создание кошелька |
| GET | `/stats` | [`get_blockchain_stats()`](app/api/routes/blockchain_routes.py:545-634) | Статистика блокчейна |
**Особенности:**
- TON блокчейн интеграция
- Безопасное хранение приватных ключей
- Лимиты транзакций
- Monitoring и статистика
### 5. Системное здоровье ([`health_routes.py`](app/api/routes/health_routes.py))
**Blueprint:** `health_bp = Blueprint("health", version=1)`
| Метод | Путь | Функция | Описание |
|-------|------|---------|----------|
| GET | `/health` | [`health_check()`](app/api/routes/health_routes.py:23-31) | Базовая проверка |
| GET | `/health/detailed` | [`detailed_health_check()`](app/api/routes/health_routes.py:34-115) | Детальная проверка компонентов |
| GET | `/health/ready` | [`readiness_check()`](app/api/routes/health_routes.py:118-135) | Kubernetes readiness |
| GET | `/health/live` | [`liveness_check()`](app/api/routes/health_routes.py:138-144) | Kubernetes liveness |
| GET | `/metrics` | [`prometheus_metrics()`](app/api/routes/health_routes.py:147-160) | Prometheus метрики |
| GET | `/stats` | [`system_stats()`](app/api/routes/health_routes.py:163-193) | Системная статистика |
| GET | `/debug/info` | [`debug_info()`](app/api/routes/health_routes.py:196-226) | Debug информация |
### 6. MY Network API ([`my_network_sanic.py`](app/api/routes/my_network_sanic.py))
**Blueprint:** `bp = Blueprint("my_network", url_prefix="/api/my")`
| Метод | Путь | Функция | Описание |
|-------|------|---------|----------|
| GET | `/node/info` | [`get_node_info()`](app/api/routes/my_network_sanic.py:32-54) | Информация о ноде |
| GET | `/node/peers` | [`get_node_peers()`](app/api/routes/my_network_sanic.py:57-83) | Список пиров |
| POST | `/node/peers/connect` | [`connect_to_peer()`](app/api/routes/my_network_sanic.py:86-116) | Подключение к пиру |
| DELETE | `/node/peers/<peer_id>` | [`disconnect_peer()`](app/api/routes/my_network_sanic.py:119-146) | Отключение пира |
| GET | `/content/list` | [`get_content_list()`](app/api/routes/my_network_sanic.py:149-220) | Список контента в сети |
| GET | `/content/<content_hash>/exists` | [`check_content_exists()`](app/api/routes/my_network_sanic.py:223-262) | Проверка существования |
| GET | `/sync/status` | [`get_sync_status()`](app/api/routes/my_network_sanic.py:265-286) | Статус синхронизации |
| POST | `/sync/start` | [`start_network_sync()`](app/api/routes/my_network_sanic.py:289-310) | Запуск синхронизации |
| GET | `/network/stats` | [`get_network_stats()`](app/api/routes/my_network_sanic.py:313-383) | Статистика сети |
| GET | `/health` | [`health_check()`](app/api/routes/my_network_sanic.py:386-426) | Здоровье сети |
### 7. Мониторинг MY Network ([`my_monitoring_sanic.py`](app/api/routes/my_monitoring_sanic.py))
**Blueprint:** `bp = Blueprint("my_monitoring", url_prefix="/api/my/monitor")`
| Метод | Путь | Функция | Описание |
|-------|------|---------|----------|
| GET | `/` | [`monitoring_dashboard()`](app/api/routes/my_monitoring_sanic.py:32-79) | HTML дашборд |
| GET | `/ascii` | [`get_ascii_status()`](app/api/routes/my_monitoring_sanic.py:82-107) | ASCII статус |
| GET | `/live` | [`live_monitoring_data()`](app/api/routes/my_monitoring_sanic.py:110-149) | Живые данные |
### 8. Межузловое общение ([`node_communication.py`](app/api/node_communication.py))
**Blueprint:** `node_bp = Blueprint("node", url_prefix="/api/node")`
| Метод | Путь | Функция | Описание |
|-------|------|---------|----------|
| POST | `/handshake` | [`node_handshake()`](app/api/node_communication.py:63-142) | Хэндшейк между нодами |
| POST | `/content/sync` | [`content_sync()`](app/api/node_communication.py:145-238) | Синхронизация контента |
| POST | `/network/ping` | [`network_ping()`](app/api/node_communication.py:241-289) | Пинг между нодами |
| GET | `/network/status` | [`network_status()`](app/api/node_communication.py:292-324) | Статус ноды |
| POST | `/network/discover` | [`network_discover()`](app/api/node_communication.py:327-378) | Обнаружение нод |
### 9. Простые роуты
- [`account.py`](app/api/routes/account.py:4-8) - одна функция `s_api_v1_account_get()`
- [`_system.py`](app/api/routes/_system.py) - системные функции с git info и статусами
## Анализ существующих FastAPI роутов
### 1. V3 API совместимость ([`fastapi_v3_routes.py`](app/api/fastapi_v3_routes.py))
**Уже реализовано:**
- `/api/v3/node/status` - статус ноды
- `/api/v3/network/stats` - статистика сети
- `/api/v3/content/list` - список контента
- `/api/v1/node` - совместимость с v1
- `/api/my/monitor` - мониторинг MY Network
- `/api/my/handshake` - хэндшейк MY Network
### 2. Межузловое общение ([`fastapi_node_routes.py`](app/api/fastapi_node_routes.py))
**Уже реализовано:**
- `/api/node/handshake` - обработка хэндшейка
- `/api/node/content/sync` - синхронизация контента
- `/api/node/network/ping` - пинг между нодами
- `/api/node/network/status` - статус ноды (GET)
- `/api/node/network/discover` - обнаружение нод
**⚠️ ДУБЛИРОВАНИЕ:** Межузловое общение реализовано И в Sanic, И в FastAPI!
## Анализ Middleware
### Текущий Sanic Middleware ([`middleware.py`](app/api/middleware.py))
**Критически важные компоненты:**
1. **SecurityMiddleware** - CORS, CSP, безопасные заголовки
2. **RateLimitMiddleware** - лимитирование запросов через Redis
3. **AuthenticationMiddleware** - JWT токены, API ключи, права
4. **CryptographicMiddleware** - ed25519 подписи для межузлового общения
5. **RequestContextMiddleware** - контекст запроса, логирование
**Middleware Pipeline:**
1. [`maintenance_middleware()`](app/api/middleware.py:605-612) - режим обслуживания
2. [`request_middleware()`](app/api/middleware.py:443-526) - основной пайплайн
3. [`response_middleware()`](app/api/middleware.py:529-554) - обработка ответов
4. [`exception_middleware()`](app/api/middleware.py:557-601) - обработка ошибок
**Особенности:**
- Ed25519 криптографические подписи для межузлового общения
- Rate limiting с различными паттернами
- Комплексная аутентификация
- Детальное логирование и метрики
### Совместимость с FastAPI
**✅ Совместимые компоненты:**
- Логирование и контекст
- Базовая безопасность
- CORS
**⚠️ Требуют адаптации:**
- Rate limiting (Sanic-специфичный код)
- Аутентификация (декораторы и middleware)
- Ed25519 криптография (заголовки и проверка подписей)
- Обработка исключений (Sanic exceptions)
## Зависимости и совместимость
### Анализ requirements.txt
```python
fastapi==0.104.1 # ✅ Уже включен
uvicorn==0.24.0 # ✅ ASGI сервер
sanic==23.12.1 # ⚠️ Нужно удалить после миграции
sqlalchemy==2.0.23 # ✅ Совместим
redis==5.0.1 # ✅ Совместим
PyNaCl==1.5.0 # ✅ Ed25519 криптография
pyjwt==2.8.0 # ✅ JWT токены
bcrypt==4.1.2 # ✅ Хеширование паролей
```
**Конфликтов зависимостей НЕТ** - обе библиотеки могут сосуществовать.
## Детальный план миграции
### Фаза 1: Подготовка (1-2 дня)
#### 1.1 Создание FastAPI Middleware
```python
# app/api/fastapi_middleware.py
from fastapi import FastAPI, Request, Response
from fastapi.middleware.base import BaseHTTPMiddleware
class FastAPISecurityMiddleware(BaseHTTPMiddleware):
# Адаптация SecurityMiddleware
class FastAPIRateLimitMiddleware(BaseHTTPMiddleware):
# Адаптация RateLimitMiddleware
class FastAPIAuthMiddleware(BaseHTTPMiddleware):
# Адаптация AuthenticationMiddleware
class FastAPICryptoMiddleware(BaseHTTPMiddleware):
# Адаптация CryptographicMiddleware
```
#### 1.2 Создание FastAPI Dependencies
```python
# app/api/fastapi_dependencies.py
from fastapi import Depends, HTTPException, Request
from typing import Optional
async def get_current_user(request: Request) -> Optional[User]:
# Извлечение пользователя из токена
async def require_auth(user: User = Depends(get_current_user)) -> User:
# Требование авторизации
async def check_permissions(permission: str):
# Проверка разрешений
async def check_rate_limit(pattern: str = "api"):
# Проверка rate limit
```
#### 1.3 Создание Pydantic моделей
```python
# app/api/fastapi_models.py
from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime
class UserResponse(BaseModel):
id: str
username: str
email: str
# ... остальные поля
class ContentResponse(BaseModel):
id: str
title: str
# ... остальные поля
```
### Фаза 2: Миграция маршрутов по модулям (7-10 дней)
#### 2.1 Приоритет 1: Аутентификация (2 дня)
```python
# app/api/fastapi_auth_routes.py
from fastapi import APIRouter, Depends, HTTPException
from fastapi.security import HTTPBearer
router = APIRouter(prefix="/api/v1/auth", tags=["auth"])
@router.post("/register")
async def register_user(user_data: UserRegistrationSchema):
# Миграция register_user()
@router.post("/login")
async def login_user(credentials: UserLoginSchema):
# Миграция login_user()
```
**Ключевые изменения:**
- Sanic `response.json()` → FastAPI return dict
- Sanic `request.json` → FastAPI Pydantic models
- Sanic декораторы → FastAPI `Depends()`
- Sanic `Blueprint` → FastAPI `APIRouter`
#### 2.2 Приоритет 2: Контент и хранилище (3 дня)
```python
# app/api/fastapi_content_routes.py
# app/api/fastapi_storage_routes.py
```
**Сложности:**
- Streaming responses для downloads
- File uploads с validation
- Chunked uploads
#### 2.3 Приоритет 3: Блокчейн интеграция (2 дня)
```python
# app/api/fastapi_blockchain_routes.py
```
#### 2.4 Приоритет 4: MY Network и мониторинг (3 дня)
```python
# app/api/fastapi_my_network_routes.py
# app/api/fastapi_monitoring_routes.py
```
**Сложности:**
- HTML templates для monitoring dashboard
- WebSocket connections (если есть)
### Фаза 3: Удаление дублирования (1-2 дня)
#### 3.1 Объединение межузлового общения
- Удалить [`node_communication.py`](app/api/node_communication.py) (Sanic версия)
- Оставить [`fastapi_node_routes.py`](app/api/fastapi_node_routes.py)
- Проверить совместимость ed25519 подписей
#### 3.2 Консолидация роутинга
- Удалить регистрацию Sanic blueprints из [`__init__.py`](app/api/__init__.py:237-285)
- Добавить все FastAPI роутеры в main FastAPI app
### Фаза 4: Обновление инициализации (1 день)
#### 4.1 Модификация main.py
```python
# Удалить create_sanic_app() и run_sanic_server()
# Сделать FastAPI режимом по умолчанию
def get_app_mode():
return 'fastapi' # Принудительно FastAPI
```
#### 4.2 Обновление lifecycle управления
```python
# Перенести EnhancedSanic функциональность в FastAPI
@app.on_event("startup")
async def startup_event():
# Инициализация БД, Redis, ed25519, MY Network
@app.on_event("shutdown")
async def shutdown_event():
# Graceful shutdown
```
### Фаза 5: Тестирование и оптимизация (2-3 дня)
#### 5.1 Тестирование
- Unit тесты для всех endpoints
- Integration тесты для межузлового общения
- Load testing для performance
- Тестирование ed25519 криптографии
#### 5.2 Очистка кодовой базы
- Удалить Sanic imports
- Удалить sanic из requirements.txt
- Обновить docker configurations
- Обновить documentation
## Потенциальные проблемы и решения
### 1. Ed25519 криптографические подписи
**Проблема:** Sanic-специфичная обработка заголовков и контекста
**Решение:**
- Создать FastAPI middleware для ed25519
- Использовать FastAPI dependency injection
- Сохранить полную совместимость протокола
### 2. Rate Limiting
**Проблема:** Sanic-специфичные декораторы и middleware
**Решение:**
- Портировать на FastAPI middleware + dependencies
- Сохранить Redis backend
- Использовать slowapi библиотеку как альтернативу
### 3. File Uploads и Streaming
**Проблема:** Разные API для file handling
**Решение:**
- FastAPI UploadFile для uploads
- StreamingResponse для downloads
- Сохранить chunked upload логику
### 4. WebSocket connections (если есть)
**Проблема:** Потенциальные WebSocket endpoints
**Решение:**
- FastAPI имеет нативную поддержку WebSocket
- Портировать с минимальными изменениями
### 5. HTML Templates
**Проблема:** Jinja2 templates в monitoring
**Решение:**
- FastAPI совместим с Jinja2
- Использовать FastAPI templating patterns
## Mermaid диаграммы архитектуры
### Текущая гибридная архитектура
```mermaid
graph TB
Client[Client Requests] --> Main[main.py]
Main --> Mode{App Mode}
Mode -->|FastAPI| FastAPI[FastAPI App]
Mode -->|Sanic| Sanic[Sanic App]
Mode -->|Minimal| Minimal[Minimal Server]
FastAPI --> FV3[fastapi_v3_routes.py]
FastAPI --> FNode[fastapi_node_routes.py]
Sanic --> SAuth[auth_routes.py]
Sanic --> SContent[content_routes.py]
Sanic --> SStorage[storage_routes.py]
Sanic --> SBlockchain[blockchain_routes.py]
Sanic --> SHealth[health_routes.py]
Sanic --> SMyNet[my_network_sanic.py]
Sanic --> SMonitor[my_monitoring_sanic.py]
Sanic --> SNode[node_communication.py]
subgraph "Shared Components"
DB[(Database)]
Redis[(Redis Cache)]
Ed25519[Ed25519 Crypto]
MyNetwork[MY Network Service]
end
FastAPI --> DB
FastAPI --> Redis
FastAPI --> Ed25519
FastAPI --> MyNetwork
Sanic --> DB
Sanic --> Redis
Sanic --> Ed25519
Sanic --> MyNetwork
```
### Целевая FastAPI архитектура
```mermaid
graph TB
Client[Client Requests] --> FastAPI[FastAPI App]
FastAPI --> Auth[auth_routes.py]
FastAPI --> Content[content_routes.py]
FastAPI --> Storage[storage_routes.py]
FastAPI --> Blockchain[blockchain_routes.py]
FastAPI --> Health[health_routes.py]
FastAPI --> MyNet[my_network_routes.py]
FastAPI --> Monitor[monitoring_routes.py]
FastAPI --> Node[node_routes.py]
FastAPI --> V3Compat[v3_compat_routes.py]
subgraph "FastAPI Middleware Stack"
Security[Security Middleware]
RateLimit[Rate Limit Middleware]
AuthMW[Auth Middleware]
Crypto[Crypto Middleware]
Context[Context Middleware]
end
FastAPI --> Security
Security --> RateLimit
RateLimit --> AuthMW
AuthMW --> Crypto
Crypto --> Context
subgraph "Shared Services"
DB[(Database)]
Redis[(Redis Cache)]
Ed25519[Ed25519 Crypto]
MyNetwork[MY Network Service]
end
Context --> DB
Context --> Redis
Context --> Ed25519
Context --> MyNetwork
```
## Оценка трудозатрат
| Фаза | Компонент | Время | Сложность |
|------|-----------|--------|-----------|
| 1 | Middleware адаптация | 2 дня | Высокая |
| 2.1 | Auth routes | 2 дня | Средняя |
| 2.2 | Content + Storage | 3 дня | Высокая |
| 2.3 | Blockchain | 2 дня | Средняя |
| 2.4 | MY Network + Monitoring | 3 дня | Высокая |
| 3 | Удаление дублирования | 1 день | Низкая |
| 4 | Обновление инициализации | 1 день | Средняя |
| 5 | Тестирование | 3 дня | Высокая |
| **Итого** | | **17 дней** | |
## Рекомендации
### 1. Поэтапная миграция
- НЕ делать big bang migration
- Мигрировать по одному модулю
- Поддерживать работоспособность на каждом этапе
### 2. Сохранение совместимости
- Сохранить все API endpoints и форматы
- Особое внимание к ed25519 межузловому протоколу
- Сохранить все headers и форматы ответов
### 3. Тщательное тестирование
- Unit tests для каждого migrated endpoint
- Integration tests для межузлового общения
- Performance testing
- Backwards compatibility testing
### 4. Мониторинг миграции
- Логирование всех изменений
- Метрики производительности
- Error tracking
- Rollback plan для каждой фазы
### 5. Документация
- Обновить API документацию
- Автоматическая генерация OpenAPI docs
- Обновить deployment guides
## Заключение
Проект уже находится в **переходном состоянии** с частичной поддержкой FastAPI. Основная сложность миграции заключается в:
1. **Сложном middleware stack** с ed25519 криптографией
2. **Большом количестве endpoints** (40+ эндпоинтов)
3. **Межузловом протоколе** который требует точной совместимости
4. **File upload/download** функциональности
Однако, благодаря:
- ✅ Уже частично созданной FastAPI инфраструктуре
- ✅ Отсутствию конфликтов зависимостей
- ✅ Хорошо структурированному коду
- ✅ Использованию SQLAlchemy (framework-agnostic)
Миграция **выполнима в течение 2-3 недель** при правильном планировании и поэтапном подходе.
**Ключевой фактор успеха:** Сохранение полной совместимости ed25519 межузлового протокола для корректной работы распределенной MY Network.