diff --git a/handlers/__pycache__/instructions.cpython-310.pyc b/handlers/__pycache__/instructions.cpython-310.pyc index 6299e604..06826c5b 100644 Binary files a/handlers/__pycache__/instructions.cpython-310.pyc and b/handlers/__pycache__/instructions.cpython-310.pyc differ diff --git a/handlers/__pycache__/key_management.cpython-310.pyc b/handlers/__pycache__/key_management.cpython-310.pyc index 8d7f0407..6ac1ea69 100644 Binary files a/handlers/__pycache__/key_management.cpython-310.pyc and b/handlers/__pycache__/key_management.cpython-310.pyc differ diff --git a/handlers/__pycache__/keys.cpython-310.pyc b/handlers/__pycache__/keys.cpython-310.pyc index ff42bbce..9ad47006 100644 Binary files a/handlers/__pycache__/keys.cpython-310.pyc and b/handlers/__pycache__/keys.cpython-310.pyc differ diff --git a/handlers/__pycache__/notifications.cpython-310.pyc b/handlers/__pycache__/notifications.cpython-310.pyc index f8a62af4..f211f260 100644 Binary files a/handlers/__pycache__/notifications.cpython-310.pyc and b/handlers/__pycache__/notifications.cpython-310.pyc differ diff --git a/handlers/__pycache__/pay.cpython-310.pyc b/handlers/__pycache__/pay.cpython-310.pyc index 1a6c3746..968c448d 100644 Binary files a/handlers/__pycache__/pay.cpython-310.pyc and b/handlers/__pycache__/pay.cpython-310.pyc differ diff --git a/handlers/__pycache__/profile.cpython-310.pyc b/handlers/__pycache__/profile.cpython-310.pyc index 73873ab9..57b9cf51 100644 Binary files a/handlers/__pycache__/profile.cpython-310.pyc and b/handlers/__pycache__/profile.cpython-310.pyc differ diff --git a/handlers/__pycache__/start.cpython-310.pyc b/handlers/__pycache__/start.cpython-310.pyc index 0aabfdb4..f2e09e8b 100644 Binary files a/handlers/__pycache__/start.cpython-310.pyc and b/handlers/__pycache__/start.cpython-310.pyc differ diff --git a/main.py b/main.py index 1cac57f3..8fadc2c0 100644 --- a/main.py +++ b/main.py @@ -1,16 +1,14 @@ import asyncio import logging - -from aiogram.webhook.aiohttp_server import (SimpleRequestHandler, - setup_application) +import signal +from aiogram.webhook.aiohttp_server import (SimpleRequestHandler, setup_application) from aiohttp import web from bot import bot, dp, router from config import WEBAPP_HOST, WEBAPP_PORT, WEBHOOK_PATH, WEBHOOK_URL from database import init_db from handlers.notifications import notify_expiring_keys -from handlers.pay import \ - payment_webhook +from handlers.pay import payment_webhook logging.basicConfig(level=logging.DEBUG) @@ -26,6 +24,18 @@ async def on_startup(app): async def on_shutdown(app): await bot.delete_webhook() + for task in asyncio.all_tasks(): + task.cancel() + try: + await asyncio.gather(*asyncio.all_tasks(), return_exceptions=True) + except Exception as e: + logging.error(f"Error during shutdown: {e}") + + +async def shutdown_site(site): + logging.info("Остановка сайта...") + await site.stop() # Остановка сайта + logging.info("Сервер остановлен.") async def main(): dp.include_router(router) @@ -44,8 +54,23 @@ async def main(): await site.start() print(f"Webhook URL: {WEBHOOK_URL}") - await asyncio.Event().wait() + + # Обработка сигналов завершения + loop = asyncio.get_event_loop() + for sig in (signal.SIGINT, signal.SIGTERM): + loop.add_signal_handler(sig, lambda: asyncio.create_task(shutdown_site(site))) + + try: + await asyncio.Event().wait() # Ожидание сигнала остановки + finally: + # Убедимся, что сессии закрыты и задачи завершены + pending = asyncio.all_tasks() + for task in pending: + task.cancel() + await asyncio.gather(*pending, return_exceptions=True) if __name__ == '__main__': - asyncio.run(main()) - + try: + asyncio.run(main()) + except Exception as e: + logging.error(f"Ошибка при запуске приложения: {e}")