# План миграции с 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/` | [`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 | `/` | [`get_content()`](app/api/routes/content_routes.py:137-238) | Получение контента с кешированием | | PUT | `/` | [`update_content()`](app/api/routes/content_routes.py:240-313) | Обновление метаданных | | POST | `/search` | [`search_content()`](app/api/routes/content_routes.py:315-440) | Поиск с фильтрами и пагинацией | | GET | `//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//chunk` | [`upload_chunk()`](app/api/routes/storage_routes.py:128-218) | Загрузка chunk'а файла | | GET | `/upload//status` | [`get_upload_status()`](app/api/routes/storage_routes.py:220-290) | Статус загрузки | | DELETE | `/upload/` | [`cancel_upload()`](app/api/routes/storage_routes.py:292-374) | Отмена загрузки | | DELETE | `/files/` | [`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//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/` | [`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//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.