diff --git a/batcher/app/src/db/pg/pg.py b/batcher/app/src/db/pg/pg.py index 757fdc2..ff0cc46 100644 --- a/batcher/app/src/db/pg/pg.py +++ b/batcher/app/src/db/pg/pg.py @@ -1,7 +1,10 @@ +import asyncio + from app.src.config import PG_HOST, PG_PORT, PG_USER, PG_PASSWORD, PG_DB from pathlib import Path from starlette.requests import Request import asyncpg +import logging from asyncpg_trek import plan, execute, Direction from asyncpg_trek.asyncpg import AsyncpgBackend @@ -9,9 +12,17 @@ from asyncpg_trek.asyncpg import AsyncpgBackend DB_URL = f'postgresql://{PG_USER}:{str(PG_PASSWORD)}@{PG_HOST}:{PG_PORT}/{PG_DB}' MIGRATIONS_DIR = Path(__file__).parent.resolve() / "migrations" +logger = logging.getLogger("uvicorn") async def connect_pg() -> asyncpg.Pool: - return await asyncpg.create_pool(DB_URL) + while True: + try: + logger.info(DB_URL) + pg_conn = await asyncpg.create_pool(DB_URL) + return pg_conn + except OSError: + logger.info("Postgres is unavailable - sleeping") + await asyncio.sleep(2) async def get_pg(request: Request) -> asyncpg.Connection: diff --git a/batcher/app/src/db/rmq.py b/batcher/app/src/db/rmq.py index 4b86267..c89a317 100644 --- a/batcher/app/src/db/rmq.py +++ b/batcher/app/src/db/rmq.py @@ -1,5 +1,6 @@ import asyncio import aio_pika +import logging from starlette.requests import Request from aio_pika.abc import AbstractRobustConnection @@ -7,6 +8,7 @@ from ..config import RMQ_HOST, RMQ_PORT, RMQ_USER, RMQ_PASSWORD fqdn = f'amqp://{RMQ_USER}:{str(RMQ_PASSWORD)}@{RMQ_HOST}:{RMQ_PORT}/' +logger = logging.getLogger("uvicorn") async def get_connection() -> AbstractRobustConnection: while True: @@ -14,6 +16,7 @@ async def get_connection() -> AbstractRobustConnection: conn = await aio_pika.connect_robust(fqdn) return conn except ConnectionError: + logger.info("RabbitMQ is unavailable - sleeping") await asyncio.sleep(2) diff --git a/batcher/app/src/domain/setting/repos/rmq.py b/batcher/app/src/domain/setting/repos/rmq.py index bbdd515..5b5533a 100644 --- a/batcher/app/src/domain/setting/repos/rmq.py +++ b/batcher/app/src/domain/setting/repos/rmq.py @@ -7,7 +7,7 @@ from typing import Callable SETTING_QUEUE_NAME = "settings" async def consume_setting_updates(set_setting_func: Callable[[str, decimal.Decimal], None], chan: aio_pika.abc.AbstractChannel): - queue = await chan.get_queue(SETTING_QUEUE_NAME) + queue = await chan.declare_queue(SETTING_QUEUE_NAME) async with queue.iterator() as queue_iter: async for msg in queue_iter: diff --git a/bot/config.py b/bot/config.py index 1c6fd83..f555a2b 100644 --- a/bot/config.py +++ b/bot/config.py @@ -1,12 +1,10 @@ -import logging -from aiogram import Bot, types -from aiogram import Dispatcher -from create_bot import bot, token, WEBHOOK_URL -from handlers.register_handlers import register_all_handlers +from aiogram import Bot, Dispatcher, Router, types from aiogram.fsm.storage.memory import MemoryStorage +from create_bot import bot, WEBHOOK_URL +from handlers.register_handlers import register_all_handlers from loguru import logger -dp = Dispatcher(bot, storage=MemoryStorage()) +dp = Dispatcher(storage=MemoryStorage()) logger.add("logs.log", format = "{time} | {module} : {function} | {level} | {message}", level = "INFO", rotation = "1 week", compression = "zip")#, serialize = True) @@ -19,7 +17,9 @@ async def on_startup(): drop_pending_updates=True ) - register_all_handlers(dp) + router = Router() + register_all_handlers(router) + dp.include_router(router) async def on_shutdown(): diff --git a/bot/handlers/start_handler.py b/bot/handlers/start_handler.py index ff42ac5..5780dc8 100644 --- a/bot/handlers/start_handler.py +++ b/bot/handlers/start_handler.py @@ -1,23 +1,12 @@ -import asyncio from aiogram import Bot, Dispatcher, types -import re -import os -import time -import shutil -import random from create_bot import bot, request_url, important_message, url, token, bucket_name, username, password, endpoint_url from req import check_register -import urllib.request from messages import get_main_menu_message -from aiogram.fsm.context import FSMContext -from aiogram.fsm.state import State, StatesGroup from aiogram.enums import ParseMode from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove, InlineKeyboardMarkup, InlineKeyboardButton, WebAppInfo from loguru import logger -import boto3 -from botocore.config import Config def get_answer_keyboard(): button1 = InlineKeyboardButton(text='Главное меню', callback_data='main_menu') diff --git a/bot/requirements.txt b/bot/requirements.txt index 779bcd7..ee3af74 100644 --- a/bot/requirements.txt +++ b/bot/requirements.txt @@ -9,7 +9,9 @@ boto3==1.35.81 botocore==1.35.81 certifi==2024.8.30 charset-normalizer==3.4.0 +fastapi==0.115.6 frozenlist==1.5.0 +gunicorn==23.0.0 idna==3.10 jmespath==1.0.1 loguru==0.7.3 @@ -25,4 +27,5 @@ s3transfer==0.10.4 six==1.17.0 typing_extensions==4.12.2 urllib3==2.2.3 +uvicorn==0.32.1 yarl==1.18.3 diff --git a/docker-compose-prod.yml b/docker-compose-prod.yml index 69e9471..44d869d 100644 --- a/docker-compose-prod.yml +++ b/docker-compose-prod.yml @@ -27,14 +27,13 @@ services: depends_on: - backend volumes: - - ./clicker_bot:/app + - ./bot:/app environment: PROD: 1 env_file: - .env/prod/bot - .env/prod/web - command: - - /gunicorn.sh + command: /gunicorn.sh restart: on-failure # # memcached: diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 0bac9ec..653d56b 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -42,32 +42,32 @@ http { access_log /var/log/nginx/access.log upstreamlog; error_log /var/log/nginx/error.log; listen 80; -; listen 443 ssl http2; +# listen 443 ssl http2; charset utf-8; -; server_name kyc_clicker.ru www.kyc_clicker.ru; +# server_name kyc_clicker.ru www.kyc_clicker.ru; root /dist/; index index.html; -; ssl_certificate /etc/letsencrypt/live/kyc_clicker.ru/fullchain.pem; -; ssl_certificate_key /etc/letsencrypt/live/kyc_clicker.ru/privkey.pem; +# ssl_certificate /etc/letsencrypt/live/kyc_clicker.ru/fullchain.pem; +# ssl_certificate_key /etc/letsencrypt/live/kyc_clicker.ru/privkey.pem; -; include /etc/letsencrypt/options-ssl-nginx.conf; -; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; +# include /etc/letsencrypt/options-ssl-nginx.conf; +# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; -; if ($server_port = 80) { -; set $https_redirect 1; -; } -; if ($host ~ '^www\.') { -; set $https_redirect 1; -; } -; if ($https_redirect = 1) { -; return 301 https://crowngame.ru$request_uri; -; } +# if ($server_port = 80) { +# set $https_redirect 1; +# } +# if ($host ~ '^www\.') { +# set $https_redirect 1; +# } +# if ($https_redirect = 1) { +# return 301 https://crowngame.ru$request_uri; +# } -; location /.well-known/acme-challenge/ { -; root /var/www/certbot; -; } +# location /.well-known/acme-challenge/ { +# root /var/www/certbot; +# } # frontend location / {