from __future__ import annotations from contextlib import asynccontextmanager from pathlib import Path import asyncio import logging from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from starlette.middleware.sessions import SessionMiddleware from uvicorn.middleware.proxy_headers import ProxyHeadersMiddleware from config import get_settings from database import init_db from routers import admin, guest, pages from traffic_worker import traffic_grant_worker logging.basicConfig(level=logging.INFO) @asynccontextmanager async def lifespan(_: FastAPI): Path(get_settings().database_path).parent.mkdir(parents=True, exist_ok=True) await init_db() stop_event = asyncio.Event() worker = asyncio.create_task(traffic_grant_worker(stop_event)) yield stop_event.set() await worker app = FastAPI(title="Remna Site", lifespan=lifespan) settings = get_settings() # Dokploy/Traefik: корректный https и Host app.add_middleware(ProxyHeadersMiddleware, trusted_hosts="*") app.add_middleware( SessionMiddleware, secret_key=settings.secret_key, max_age=settings.session_max_age, same_site="lax", https_only=False, ) app.mount("/static", StaticFiles(directory="static"), name="static") app.include_router(pages.router) app.include_router(admin.router) app.include_router(guest.router)