From 211f3840a0193c7f42089fab9580cfaa6fb59672 Mon Sep 17 00:00:00 2001 From: IgorVolochay Date: Tue, 1 Sep 2026 11:04:44 +0300 Subject: [PATCH] Add logs limiter --- app/main.py | 45 ++++++++++++++++++++++++++------------------- app/tg_auth.py | 2 +- docker-compose.yml | 21 +++++++++++++++++++++ 3 files changed, 48 insertions(+), 20 deletions(-) diff --git a/app/main.py b/app/main.py index 8e408c0..5cc7c20 100644 --- a/app/main.py +++ b/app/main.py @@ -7,6 +7,7 @@ import asyncio from dotenv import load_dotenv from fastapi import FastAPI, Depends, Response, Header, HTTPException, status from guard import SecurityMiddleware, SecurityConfig, SecurityDecorator +from contextlib import asynccontextmanager from typing import Optional @@ -17,12 +18,35 @@ from rabbit_worker import RabbitWorker from tools.base_moderation import moderate_text from logger import logger, setup_logging from middleware import RequestLoggingMiddleware -from tg_auth import get_current_user_id, DEV_MODE +from tg_auth import get_current_user_id setup_logging() load_dotenv() +DEV_MODE: bool = os.getenv("DEV_MODE", "false").lower() == "true" +mongo_worker = MongoWorker() +_rabbit_worker: Optional[RabbitWorker] = None + + +def get_rabbit_worker() -> RabbitWorker: + global _rabbit_worker + if _rabbit_worker is None: + _rabbit_worker = RabbitWorker() + return _rabbit_worker + + +@asynccontextmanager +async def lifespan(app: FastAPI): + await mongo_worker.create_indexes() + if DEV_MODE: + logger.warning("⚠️ DEV_MODE is enabled — docs are exposed and Telegram initData auth is DISABLED") + logger.info("Application started on :5000") + yield + mongo_worker.client.close() + logger.info("Application shutdown completed.") + + app: FastAPI = FastAPI( title="This OR That", summary="OpenAPI schema for \"This OR That\" project!", @@ -31,6 +55,7 @@ app: FastAPI = FastAPI( docs_url="/docs" if DEV_MODE else None, redoc_url="/redoc" if DEV_MODE else None, openapi_url="/openapi.json" if DEV_MODE else None, + lifespan=lifespan, ) config = SecurityConfig( enable_rate_limiting=True, @@ -60,15 +85,6 @@ app.add_middleware(SecurityMiddleware, config=config) app.add_middleware(RequestLoggingMiddleware) app.state.guard_decorator = guard_deco app.state._security_middleware = _security_middleware -mongo_worker = MongoWorker() -_rabbit_worker: Optional[RabbitWorker] = None - - -def get_rabbit_worker() -> RabbitWorker: - global _rabbit_worker - if _rabbit_worker is None: - _rabbit_worker = RabbitWorker() - return _rabbit_worker MODERATION_SECRET = os.getenv("MODERATION_SECRET", "change-me-in-production") @@ -83,15 +99,6 @@ async def verify_moderation_secret( ) return x_moderation_secret - -@app.on_event("startup") -async def startup_event(): - await mongo_worker.create_indexes() - if DEV_MODE: - logger.warning("⚠️ DEV_MODE is enabled — docs are exposed and Telegram initData auth is DISABLED") - logger.info("Application started on :5000") - - @app.get("/check_user", status_code=200) async def check_user( user_id: int, diff --git a/app/tg_auth.py b/app/tg_auth.py index e1034a9..bb025fa 100644 --- a/app/tg_auth.py +++ b/app/tg_auth.py @@ -24,7 +24,7 @@ from logger import logger load_dotenv() -DEV_MODE: bool = os.getenv("DEV_MODE", "true").lower() == "true" +DEV_MODE: bool = os.getenv("DEV_MODE", "false").lower() == "true" TG_BOT_TOKEN: str = os.getenv("TG_BOT_TOKEN", "") # Maximum allowed age of initData in seconds (1 hour). diff --git a/docker-compose.yml b/docker-compose.yml index 5032aa0..ea4a80c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,6 +10,12 @@ services: - "127.0.0.1:${MONGO_PORT}:27017" networks: - tort-net + command: mongod --quiet + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "1" healthcheck: test: [ "CMD", "mongosh", "--username", "${MONGO_USER}", "--password", "${MONGO_PASS}", "--eval", "db.runCommand({ ping: 1 })" ] interval: 10s @@ -28,6 +34,11 @@ services: - "127.0.0.1:15672:15672" networks: - tort-net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "1" healthcheck: test: [ "CMD", "rabbitmq-diagnostics", "-q", "ping" ] interval: 10s @@ -58,6 +69,11 @@ services: MODERATION_SECRET: ${MODERATION_SECRET} DEV_MODE: ${DEV_MODE:-false} LOG_LEVEL: ${LOG_LEVEL:-INFO} + logging: + driver: "json-file" + options: + max-size: "50m" + max-file: "2" ports: - "127.0.0.1:5000:5000" networks: @@ -85,6 +101,11 @@ services: RABBIT_USER: ${RABBIT_USER} RABBIT_PASS: ${RABBIT_PASS} LOG_LEVEL: ${LOG_LEVEL:-INFO} + logging: + driver: "json-file" + options: + max-size: "50m" + max-file: "1" networks: - tort-net