100 lines
2.8 KiB
Python
100 lines
2.8 KiB
Python
|
|
"""YakPanel - Main FastAPI application"""
|
||
|
|
from contextlib import asynccontextmanager
|
||
|
|
from fastapi import FastAPI
|
||
|
|
from fastapi.middleware.cors import CORSMiddleware
|
||
|
|
from sqlalchemy import select
|
||
|
|
|
||
|
|
from app.core.config import get_settings, set_runtime_config_overrides
|
||
|
|
from app.core.database import init_db, AsyncSessionLocal
|
||
|
|
from app.models.config import Config
|
||
|
|
from app.api import (
|
||
|
|
auth,
|
||
|
|
backup,
|
||
|
|
dashboard,
|
||
|
|
user,
|
||
|
|
site,
|
||
|
|
ftp,
|
||
|
|
database,
|
||
|
|
files,
|
||
|
|
crontab,
|
||
|
|
firewall,
|
||
|
|
ssl,
|
||
|
|
monitor,
|
||
|
|
docker,
|
||
|
|
plugin,
|
||
|
|
soft,
|
||
|
|
terminal,
|
||
|
|
config,
|
||
|
|
logs,
|
||
|
|
node,
|
||
|
|
service,
|
||
|
|
public_installer,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
@asynccontextmanager
|
||
|
|
async def lifespan(app: FastAPI):
|
||
|
|
"""Application lifespan - init DB on startup, load config from DB"""
|
||
|
|
await init_db()
|
||
|
|
# Load panel config from DB (persisted settings from Settings page)
|
||
|
|
async with AsyncSessionLocal() as db:
|
||
|
|
result = await db.execute(select(Config))
|
||
|
|
rows = result.scalars().all()
|
||
|
|
overrides = {r.key: r.value for r in rows if r.value is not None}
|
||
|
|
set_runtime_config_overrides(overrides)
|
||
|
|
yield
|
||
|
|
# Cleanup if needed
|
||
|
|
|
||
|
|
|
||
|
|
settings = get_settings()
|
||
|
|
app = FastAPI(
|
||
|
|
title=settings.app_name,
|
||
|
|
version=settings.app_version,
|
||
|
|
lifespan=lifespan,
|
||
|
|
)
|
||
|
|
|
||
|
|
_cors_origins = ["http://localhost:5173", "http://127.0.0.1:5173"]
|
||
|
|
_extra = (settings.cors_extra_origins or "").strip()
|
||
|
|
if _extra:
|
||
|
|
_cors_origins.extend([o.strip() for o in _extra.split(",") if o.strip()])
|
||
|
|
|
||
|
|
app.add_middleware(
|
||
|
|
CORSMiddleware,
|
||
|
|
allow_origins=_cors_origins,
|
||
|
|
allow_credentials=True,
|
||
|
|
allow_methods=["*"],
|
||
|
|
allow_headers=["*"],
|
||
|
|
)
|
||
|
|
|
||
|
|
app.include_router(auth.router, prefix="/api/v1")
|
||
|
|
app.include_router(backup.router, prefix="/api/v1")
|
||
|
|
app.include_router(dashboard.router, prefix="/api/v1")
|
||
|
|
app.include_router(site.router, prefix="/api/v1")
|
||
|
|
app.include_router(ftp.router, prefix="/api/v1")
|
||
|
|
app.include_router(database.router, prefix="/api/v1")
|
||
|
|
app.include_router(files.router, prefix="/api/v1")
|
||
|
|
app.include_router(crontab.router, prefix="/api/v1")
|
||
|
|
app.include_router(firewall.router, prefix="/api/v1")
|
||
|
|
app.include_router(ssl.router, prefix="/api/v1")
|
||
|
|
app.include_router(monitor.router, prefix="/api/v1")
|
||
|
|
app.include_router(docker.router, prefix="/api/v1")
|
||
|
|
app.include_router(plugin.router, prefix="/api/v1")
|
||
|
|
app.include_router(soft.router, prefix="/api/v1")
|
||
|
|
app.include_router(node.router, prefix="/api/v1")
|
||
|
|
app.include_router(service.router, prefix="/api/v1")
|
||
|
|
app.include_router(terminal.router, prefix="/api/v1")
|
||
|
|
app.include_router(config.router, prefix="/api/v1")
|
||
|
|
app.include_router(user.router, prefix="/api/v1")
|
||
|
|
app.include_router(logs.router, prefix="/api/v1")
|
||
|
|
app.include_router(public_installer.router, prefix="/api/v1")
|
||
|
|
|
||
|
|
|
||
|
|
@app.get("/")
|
||
|
|
async def root():
|
||
|
|
return {"app": settings.app_name, "version": settings.app_version}
|
||
|
|
|
||
|
|
|
||
|
|
@app.get("/api/health")
|
||
|
|
async def health():
|
||
|
|
return {"status": "ok"}
|