Merge branch 'main' into main

This commit is contained in:
Mikhail
2026-01-16 12:16:23 +03:00
committed by GitHub
96 changed files with 18924 additions and 1015 deletions
+70
View File
@@ -36,11 +36,13 @@ from app.services.referral_contest_service import referral_contest_service
from app.services.contest_rotation_service import contest_rotation_service
from app.services.nalogo_queue_service import nalogo_queue_service
from app.services.traffic_monitoring_service import traffic_monitoring_scheduler
from app.services.daily_subscription_service import daily_subscription_service
from app.utils.startup_timeline import StartupTimeline
from app.utils.timezone import TimezoneAwareFormatter
from app.utils.log_handlers import LevelFilterHandler, ExcludePaymentFilter
from app.utils.payment_logger import payment_logger, configure_payment_logger
from app.services.log_rotation_service import log_rotation_service
from app.services.ban_notification_service import ban_notification_service
class GracefulExit:
@@ -174,6 +176,7 @@ async def main():
maintenance_task = None
version_check_task = None
traffic_monitoring_task = None
daily_subscription_task = None
polling_task = None
web_api_server = None
telegram_webhook_enabled = False
@@ -219,6 +222,34 @@ async def main():
"SKIP_MIGRATION=true",
)
async with timeline.stage(
"Синхронизация тарифов из конфига",
"💰",
success_message="Тарифы синхронизированы",
) as stage:
try:
from app.database.crud.tariff import ensure_tariffs_synced
from app.database.database import AsyncSessionLocal
async with AsyncSessionLocal() as db:
await ensure_tariffs_synced(db)
except Exception as error:
stage.warning(f"Не удалось синхронизировать тарифы: {error}")
logger.error(f"❌ Не удалось синхронизировать тарифы: {error}")
async with timeline.stage(
"Синхронизация серверов из RemnaWave",
"🖥️",
success_message="Серверы синхронизированы",
) as stage:
try:
from app.database.crud.server_squad import ensure_servers_synced
from app.database.database import AsyncSessionLocal
async with AsyncSessionLocal() as db:
await ensure_servers_synced(db)
except Exception as error:
stage.warning(f"Не удалось синхронизировать серверы: {error}")
logger.error(f"❌ Не удалось синхронизировать серверы: {error}")
async with timeline.stage(
"Загрузка конфигурации из БД",
"⚙️",
@@ -239,7 +270,9 @@ async def main():
monitoring_service.bot = bot
maintenance_service.set_bot(bot)
broadcast_service.set_bot(bot)
ban_notification_service.set_bot(bot)
traffic_monitoring_scheduler.set_bot(bot)
daily_subscription_service.set_bot(bot)
from app.services.admin_notification_service import AdminNotificationService
@@ -596,6 +629,21 @@ async def main():
traffic_monitoring_task = None
stage.skip("Мониторинг трафика отключен настройками")
async with timeline.stage(
"Суточные подписки",
"💳",
success_message="Сервис суточных подписок запущен",
) as stage:
if daily_subscription_service.is_enabled():
daily_subscription_task = asyncio.create_task(
daily_subscription_service.start_monitoring()
)
interval_minutes = daily_subscription_service.get_check_interval_minutes()
stage.log(f"Интервал проверки: {interval_minutes} мин")
else:
daily_subscription_task = None
stage.skip("Суточные подписки отключены настройками")
async with timeline.stage(
"Сервис проверки версий",
"📄",
@@ -647,6 +695,8 @@ async def main():
webhook_lines.append(f"WATA: {_fmt(settings.WATA_WEBHOOK_PATH)}")
if settings.is_heleket_enabled():
webhook_lines.append(f"Heleket: {_fmt(settings.HELEKET_WEBHOOK_PATH)}")
if settings.is_freekassa_enabled():
webhook_lines.append(f"Freekassa: {_fmt(settings.FREEKASSA_WEBHOOK_PATH)}")
timeline.log_section(
"Активные webhook endpoints",
@@ -658,6 +708,7 @@ async def main():
f"Мониторинг: {'Включен' if monitoring_task else 'Отключен'}",
f"Техработы: {'Включен' if maintenance_task else 'Отключен'}",
f"Мониторинг трафика: {'Включен' if traffic_monitoring_task else 'Отключен'}",
f"Суточные подписки: {'Включен' if daily_subscription_task else 'Отключен'}",
f"Проверка версий: {'Включен' if version_check_task else 'Отключен'}",
f"Отчеты: {'Включен' if reporting_service.is_running() else 'Отключен'}",
]
@@ -712,6 +763,16 @@ async def main():
traffic_monitoring_scheduler.start_monitoring()
)
if daily_subscription_task and daily_subscription_task.done():
exception = daily_subscription_task.exception()
if exception:
logger.error(f"Сервис суточных подписок завершился с ошибкой: {exception}")
if daily_subscription_service.is_enabled():
logger.info("🔄 Перезапуск сервиса суточных подписок...")
daily_subscription_task = asyncio.create_task(
daily_subscription_service.start_monitoring()
)
if auto_verification_active and not auto_payment_verification_service.is_running():
logger.warning(
"Сервис автопроверки пополнений остановился, пробуем перезапустить..."
@@ -781,6 +842,15 @@ async def main():
except asyncio.CancelledError:
pass
if daily_subscription_task and not daily_subscription_task.done():
logger.info("ℹ️ Остановка сервиса суточных подписок...")
daily_subscription_service.stop_monitoring()
daily_subscription_task.cancel()
try:
await daily_subscription_task
except asyncio.CancelledError:
pass
logger.info("ℹ️ Остановка сервиса отчетов...")
try:
await reporting_service.stop()