Serve frontend from the root

This commit is contained in:
2025-07-18 06:35:36 +02:00
parent 1156bc315e
commit 3f6b49a69b
2 changed files with 22 additions and 16 deletions

View File

@ -7,11 +7,10 @@ import logging
import pathlib import pathlib
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from fastapi import FastAPI, Request, status from fastapi import FastAPI, HTTPException, Request, status
from fastapi.encoders import jsonable_encoder from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse from fastapi.responses import FileResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
@ -42,17 +41,6 @@ def valid_frontend_directory(frontend_dir: pathlib.Path) -> bool:
return False return False
def setup_frontend(app: FastAPI, settings: AdminServerSettings) -> None:
"""Setup frontend."""
if not settings.frontend_dir:
return
if not valid_frontend_directory(settings.frontend_dir):
LOG.error("Error: Not a valid frontend directory: %s", settings.frontend_dir)
return
frontend = StaticFiles(directory=settings.frontend_dir)
app.mount("/admin", frontend, name="frontend")
def create_admin_app( def create_admin_app(
settings: AdminServerSettings, settings: AdminServerSettings,
create_db: bool = False, create_db: bool = False,
@ -128,6 +116,25 @@ def create_admin_app(
dependencies = BaseDependencies(settings, get_db_session, get_async_session) dependencies = BaseDependencies(settings, get_db_session, get_async_session)
app.include_router(api.create_api_router(dependencies)) app.include_router(api.create_api_router(dependencies))
setup_frontend(app, settings)
@app.get("/")
def serve_frontend(request: Request) -> FileResponse:
"""Serve the frontend SPA index."""
LOG.info("Got this request: %r", request.url)
if not settings.frontend_dir:
raise HTTPException(status_code=404, detail="Not found.")
return FileResponse(settings.frontend_dir / "index.html")
@app.get("/{frontend_path:path}")
def serve_frontend_path(frontend_path: str) -> FileResponse:
"""Serve the frontend SPA.."""
LOG.info("Got request for %s", frontend_path)
if not settings.frontend_dir:
raise HTTPException(status_code=404, detail="Not found.")
static_file = settings.frontend_dir / frontend_path
if static_file.exists() and static_file.is_file():
return FileResponse(static_file)
return FileResponse(settings.frontend_dir / "index.html")
return app return app

View File

@ -10,7 +10,6 @@ import vueDevTools from 'vite-plugin-vue-devtools'
/** @type {import('vite').UserConfig} */ /** @type {import('vite').UserConfig} */
export default defineConfig({ export default defineConfig({
envPrefix: "SSHECRET_FRONTEND_", envPrefix: "SSHECRET_FRONTEND_",
base: process.env.NODE_ENV === "production" ? "/admin/" : "/",
plugins: [ plugins: [
vue({ vue({
template: { template: {