50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
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)
|