275 lines
8.7 KiB
Python
275 lines
8.7 KiB
Python
"""
|
||
MY Network - Main Application Entry Point
|
||
Точка входа для приложения с поддержкой MY Network
|
||
"""
|
||
|
||
import asyncio
|
||
import logging
|
||
from pathlib import Path
|
||
|
||
# Настройка логирования
|
||
logging.basicConfig(
|
||
level=logging.INFO,
|
||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||
)
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# Определить режим запуска
|
||
def get_app_mode():
|
||
"""Определить режим запуска приложения."""
|
||
import os
|
||
|
||
# Проверить переменные окружения
|
||
if os.getenv('USE_FASTAPI', '').lower() == 'true':
|
||
return 'fastapi'
|
||
|
||
# Проверить наличие FastAPI зависимостей
|
||
try:
|
||
import fastapi
|
||
import uvicorn
|
||
return 'fastapi'
|
||
except ImportError:
|
||
pass
|
||
|
||
# Проверить наличие Sanic
|
||
try:
|
||
import sanic
|
||
return 'sanic'
|
||
except ImportError:
|
||
pass
|
||
|
||
# Fallback к минимальному серверу
|
||
return 'minimal'
|
||
|
||
|
||
def create_fastapi_app():
|
||
"""Создать FastAPI приложение с MY Network."""
|
||
try:
|
||
from fastapi import FastAPI
|
||
from fastapi.middleware.cors import CORSMiddleware
|
||
|
||
app = FastAPI(
|
||
title="MY Network",
|
||
description="Distributed Content Protocol v2.0",
|
||
version="2.0.0"
|
||
)
|
||
|
||
# CORS middleware
|
||
app.add_middleware(
|
||
CORSMiddleware,
|
||
allow_origins=["*"],
|
||
allow_credentials=True,
|
||
allow_methods=["*"],
|
||
allow_headers=["*"],
|
||
)
|
||
|
||
# Добавить MY Network маршруты
|
||
try:
|
||
from app.api.routes.my_network_routes import router as my_network_router
|
||
from app.api.routes.my_monitoring import router as monitoring_router
|
||
|
||
app.include_router(my_network_router)
|
||
app.include_router(monitoring_router)
|
||
|
||
logger.info("MY Network routes added to FastAPI")
|
||
|
||
except ImportError as e:
|
||
logger.warning(f"Could not import MY Network routes: {e}")
|
||
|
||
# Базовые маршруты
|
||
@app.get("/")
|
||
async def root():
|
||
return {"message": "MY Network v2.0 - Distributed Content Protocol"}
|
||
|
||
@app.get("/health")
|
||
async def health():
|
||
return {"status": "healthy", "service": "MY Network"}
|
||
|
||
return app
|
||
|
||
except Exception as e:
|
||
logger.error(f"Failed to create FastAPI app: {e}")
|
||
raise
|
||
|
||
|
||
def create_sanic_app():
|
||
"""Создать Sanic приложение с MY Network."""
|
||
try:
|
||
# Импортировать существующее Sanic приложение
|
||
from app.api import create_app
|
||
return create_app()
|
||
|
||
except Exception as e:
|
||
logger.error(f"Failed to create Sanic app: {e}")
|
||
raise
|
||
|
||
|
||
async def start_my_network_service():
|
||
"""Запустить MY Network сервис."""
|
||
try:
|
||
from app.core.my_network.node_service import NodeService
|
||
|
||
logger.info("Starting MY Network service...")
|
||
|
||
# Создать и запустить сервис
|
||
node_service = NodeService()
|
||
await node_service.start()
|
||
|
||
logger.info("MY Network service started successfully")
|
||
|
||
# Вернуть задачу для поддержания сервиса
|
||
async def keep_service_running():
|
||
try:
|
||
while node_service.is_running:
|
||
await asyncio.sleep(30) # Проверять каждые 30 секунд
|
||
except asyncio.CancelledError:
|
||
logger.info("MY Network service shutdown requested")
|
||
await node_service.stop()
|
||
raise
|
||
except Exception as e:
|
||
logger.error(f"MY Network service error: {e}")
|
||
await node_service.stop()
|
||
raise
|
||
|
||
return keep_service_running()
|
||
|
||
except ImportError as e:
|
||
logger.info(f"MY Network service not available: {e}")
|
||
return None
|
||
except Exception as e:
|
||
logger.error(f"Failed to start MY Network service: {e}")
|
||
return None
|
||
|
||
|
||
async def run_fastapi_server():
|
||
"""Запустить FastAPI сервер."""
|
||
try:
|
||
import uvicorn
|
||
|
||
# Создать приложение
|
||
app = create_fastapi_app()
|
||
|
||
# Запустить MY Network сервис в фоне
|
||
my_network_task = await start_my_network_service()
|
||
|
||
# Конфигурация сервера
|
||
config = uvicorn.Config(
|
||
app,
|
||
host="0.0.0.0",
|
||
port=8000,
|
||
log_level="info"
|
||
)
|
||
|
||
server = uvicorn.Server(config)
|
||
|
||
# Запустить сервер и MY Network параллельно
|
||
if my_network_task:
|
||
await asyncio.gather(
|
||
server.serve(),
|
||
my_network_task,
|
||
return_exceptions=True
|
||
)
|
||
else:
|
||
await server.serve()
|
||
|
||
except Exception as e:
|
||
logger.error(f"FastAPI server error: {e}")
|
||
raise
|
||
|
||
|
||
async def run_sanic_server():
|
||
"""Запустить Sanic сервер."""
|
||
try:
|
||
# Создать приложение
|
||
app = create_sanic_app()
|
||
|
||
# Запустить MY Network сервис в фоне
|
||
my_network_task = await start_my_network_service()
|
||
if my_network_task:
|
||
app.add_background_task(my_network_task)
|
||
|
||
# Запустить сервер
|
||
await app.create_server(
|
||
host="0.0.0.0",
|
||
port=8000,
|
||
debug=False,
|
||
access_log=True
|
||
)
|
||
|
||
except Exception as e:
|
||
logger.error(f"Sanic server error: {e}")
|
||
raise
|
||
|
||
|
||
async def run_minimal_server():
|
||
"""Запустить минимальный HTTP сервер."""
|
||
try:
|
||
from start_my_network import main as start_minimal
|
||
|
||
logger.info("Starting minimal MY Network server...")
|
||
start_minimal()
|
||
|
||
except Exception as e:
|
||
logger.error(f"Minimal server error: {e}")
|
||
raise
|
||
|
||
|
||
async def main():
|
||
"""Главная функция запуска."""
|
||
|
||
print("""
|
||
╔══════════════════════════════════════════════════════════════════════════════╗
|
||
║ MY NETWORK v2.0 ║
|
||
║ Distributed Content Protocol ║
|
||
║ ║
|
||
║ Starting application with MY Network integration... ║
|
||
╚══════════════════════════════════════════════════════════════════════════════╝
|
||
""")
|
||
|
||
# Определить режим запуска
|
||
app_mode = get_app_mode()
|
||
logger.info(f"Application mode: {app_mode}")
|
||
|
||
try:
|
||
if app_mode == 'fastapi':
|
||
logger.info("Starting FastAPI server with MY Network...")
|
||
await run_fastapi_server()
|
||
|
||
elif app_mode == 'sanic':
|
||
logger.info("Starting Sanic server with MY Network...")
|
||
await run_sanic_server()
|
||
|
||
else:
|
||
logger.info("Starting minimal MY Network server...")
|
||
await run_minimal_server()
|
||
|
||
except KeyboardInterrupt:
|
||
logger.info("Received keyboard interrupt, shutting down...")
|
||
except Exception as e:
|
||
logger.error(f"Application error: {e}")
|
||
raise
|
||
|
||
|
||
# FastAPI app для ASGI серверов (uvicorn, gunicorn)
|
||
try:
|
||
app = create_fastapi_app()
|
||
|
||
# Добавить startup event для MY Network
|
||
@app.on_event("startup")
|
||
async def startup_event():
|
||
"""Startup event для MY Network."""
|
||
my_network_task = await start_my_network_service()
|
||
if my_network_task:
|
||
# Запустить как фоновую задачу
|
||
import asyncio
|
||
asyncio.create_task(my_network_task)
|
||
|
||
except Exception as e:
|
||
logger.warning(f"Could not create FastAPI app instance: {e}")
|
||
app = None
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# Запуск через python app/main.py
|
||
asyncio.run(main()) |