Files
crawle-snapp/admin/main.py
T
2026-06-30 17:57:07 +03:30

53 lines
1.3 KiB
Python

"""FastAPI admin application."""
from __future__ import annotations
import os
import subprocess
import sys
from pathlib import Path
from fastapi import FastAPI
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles
from admin.models import init_db
from admin.routes import router
app = FastAPI(title="Seed Admin", docs_url=None, redoc_url=None)
app.include_router(router)
_STATIC = Path(__file__).parent / "static"
app.mount("/static", StaticFiles(directory=str(_STATIC)), name="static")
_rq_worker: subprocess.Popen[bytes] | None = None
@app.on_event("startup")
def on_startup() -> None:
global _rq_worker
init_db()
if os.environ.get("SKIP_INTERNAL_WORKER", "").lower() in ("1", "true", "yes"):
return
redis_url = os.environ.get("REDIS_URL", "redis://localhost:6379/0")
_rq_worker = subprocess.Popen(
[sys.executable, "-m", "rq", "worker", "--url", redis_url, "batch"],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
@app.on_event("shutdown")
def on_shutdown() -> None:
if _rq_worker is not None:
_rq_worker.terminate()
try:
_rq_worker.wait(timeout=5)
except subprocess.TimeoutExpired:
_rq_worker.kill()
@app.get("/")
def dashboard() -> FileResponse:
return FileResponse(str(_STATIC / "dashboard.html"))