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