108 lines
4.2 KiB
Python
108 lines
4.2 KiB
Python
import sys
|
||
from fastapi import FastAPI
|
||
from instance.config import setup_logging
|
||
import logging
|
||
|
||
logging.basicConfig(
|
||
level=logging.INFO,
|
||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||
handlers=[logging.StreamHandler(sys.stdout)],
|
||
force=True
|
||
)
|
||
|
||
|
||
from instance.configdb import init_postgresql, init_mongodb, close_connections
|
||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||
from apscheduler.triggers.cron import CronTrigger
|
||
from app.routes import router, subscription_router, sup_router
|
||
from app.services.db_manager import DatabaseManager
|
||
from instance.configdb import get_postgres_session
|
||
from app.services.mongo_rep import MongoDBRepository
|
||
from app.services.xui_rep import PanelInteraction
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
app = FastAPI()
|
||
|
||
database_manager = DatabaseManager(session_generator=get_postgres_session)
|
||
mongo_repo = MongoDBRepository()
|
||
async def delete_depleted_clients_task():
|
||
"""
|
||
Удаляет исчерпанных клиентов на всех серверах из MongoDB.
|
||
"""
|
||
try:
|
||
# Получаем список серверов из MongoDB
|
||
servers = await mongo_repo.list_servers()
|
||
if not servers:
|
||
logger.warning("Список серверов пуст. Задача пропущена.")
|
||
return
|
||
|
||
# Проходим по каждому серверу и вызываем delete_depleted_clients
|
||
for server in servers:
|
||
base_url = server.get("base_url")
|
||
login_data = server.get("login_data")
|
||
certificate = server.get("certificate")
|
||
|
||
if not base_url or not login_data:
|
||
logger.error(f"Пропуск сервера из-за отсутствия данных: {server}")
|
||
continue
|
||
|
||
# Создаём экземпляр PanelInteraction
|
||
panel = PanelInteraction(
|
||
base_url=base_url,
|
||
login_data=login_data,
|
||
logger=logger,
|
||
certificate=certificate
|
||
)
|
||
|
||
# Выполняем удаление исчерпанных клиентов
|
||
response = await panel.delete_depleted_clients()
|
||
if response:
|
||
logger.info(f"Удаление клиентов завершено успешно для сервера: {base_url}")
|
||
else:
|
||
logger.warning(f"Не удалось удалить клиентов для сервера: {base_url}")
|
||
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при выполнении задачи delete_depleted_clients: {e}")
|
||
|
||
scheduler = AsyncIOScheduler()
|
||
|
||
@app.on_event("startup")
|
||
async def startup():
|
||
"""
|
||
Инициализация подключения к базам данных.
|
||
"""
|
||
try:
|
||
scheduler.add_job(delete_depleted_clients_task, CronTrigger(hour=23, minute=59))
|
||
scheduler.start()
|
||
logger.info("Инициализация PostgreSQL...")
|
||
await init_postgresql()
|
||
logger.info("PostgreSQL успешно инициализирован.")
|
||
|
||
logger.info("Инициализация MongoDB...")
|
||
await init_mongodb()
|
||
logger.info("MongoDB успешно инициализирован.")
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при инициализации баз данных: {e}")
|
||
raise RuntimeError("Не удалось инициализировать базы данных")
|
||
|
||
@app.on_event("shutdown")
|
||
async def shutdown():
|
||
"""
|
||
Закрытие соединений с базами данных.
|
||
"""
|
||
try:
|
||
logger.info("Закрытие соединений с базами данных...")
|
||
await close_connections()
|
||
logger.info("Соединения с базами данных успешно закрыты.")
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при закрытии соединений: {e}")
|
||
|
||
app.include_router(router, prefix="/api")
|
||
#app.include_router(payment_router, prefix="/api")
|
||
app.include_router(subscription_router, prefix="/api")
|
||
app.include_router(sup_router, prefix="/api")
|
||
@app.get("/")
|
||
def read_root():
|
||
return {"message": "FastAPI приложение работает!"}
|