uploader-bot/app/main.py

275 lines
8.7 KiB
Python
Raw 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.

"""
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.monitor_routes 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 MyNetworkNodeService
logger.info("Starting MY Network service...")
# Создать и запустить сервис
node_service = MyNetworkNodeService()
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())