From 3f6b49a69b56c8dff6d1109b77fcd7d80298066b Mon Sep 17 00:00:00 2001 From: Allan Eising Date: Fri, 18 Jul 2025 06:35:36 +0200 Subject: [PATCH] Serve frontend from the root --- .../src/sshecret_admin/core/app.py | 37 +++++++++++-------- packages/sshecret-frontend/vite.config.ts | 1 - 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/packages/sshecret-admin/src/sshecret_admin/core/app.py b/packages/sshecret-admin/src/sshecret_admin/core/app.py index 5a41f5f..29d7ec8 100644 --- a/packages/sshecret-admin/src/sshecret_admin/core/app.py +++ b/packages/sshecret-admin/src/sshecret_admin/core/app.py @@ -7,11 +7,10 @@ import logging import pathlib 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.exceptions import RequestValidationError -from fastapi.responses import JSONResponse -from fastapi.staticfiles import StaticFiles +from fastapi.responses import FileResponse, JSONResponse from fastapi.middleware.cors import CORSMiddleware from sqlalchemy.ext.asyncio import AsyncSession @@ -42,17 +41,6 @@ def valid_frontend_directory(frontend_dir: pathlib.Path) -> bool: 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( settings: AdminServerSettings, create_db: bool = False, @@ -128,6 +116,25 @@ def create_admin_app( dependencies = BaseDependencies(settings, get_db_session, get_async_session) 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 diff --git a/packages/sshecret-frontend/vite.config.ts b/packages/sshecret-frontend/vite.config.ts index 0f7fe67..c347369 100644 --- a/packages/sshecret-frontend/vite.config.ts +++ b/packages/sshecret-frontend/vite.config.ts @@ -10,7 +10,6 @@ import vueDevTools from 'vite-plugin-vue-devtools' /** @type {import('vite').UserConfig} */ export default defineConfig({ envPrefix: "SSHECRET_FRONTEND_", - base: process.env.NODE_ENV === "production" ? "/admin/" : "/", plugins: [ vue({ template: {