fix(frontend): no-cache Header für Static-Files und Index

Browser haben nach Deploys die alten app.js / style.css aus dem Cache
weiterbenutzt. Mit Cache-Control: no-cache, must-revalidate wird bei
jeder Anfrage revalidiert (304 wenn unverändert, 200 wenn neu).
This commit is contained in:
root 2026-05-14 02:24:58 +00:00
parent b57f44cc73
commit d4b0d21ed1

View File

@ -5,12 +5,22 @@ from pathlib import Path
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.responses import FileResponse, JSONResponse from fastapi.responses import FileResponse, JSONResponse
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from starlette.types import Scope
from app.api.jobs import router as jobs_router from app.api.jobs import router as jobs_router
from app.core.config import settings from app.core.config import settings
from app.core.db import init_db from app.core.db import init_db
from app.core.mac_client import MacClient from app.core.mac_client import MacClient
class NoCacheStaticFiles(StaticFiles):
"""StaticFiles, die Browser zu Revalidierung zwingen (verhindert hängende Caches nach Deploy)."""
async def get_response(self, path: str, scope: Scope):
response = await super().get_response(path, scope)
response.headers["Cache-Control"] = "no-cache, must-revalidate"
return response
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s") logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s")
log = logging.getLogger("voice-agent") log = logging.getLogger("voice-agent")
@ -29,12 +39,12 @@ app = FastAPI(title=settings.app_name, lifespan=lifespan)
app.include_router(jobs_router) app.include_router(jobs_router)
STATIC_DIR = Path(__file__).resolve().parent / "static" STATIC_DIR = Path(__file__).resolve().parent / "static"
app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") app.mount("/static", NoCacheStaticFiles(directory=STATIC_DIR), name="static")
@app.get("/") @app.get("/")
def index(): def index():
return FileResponse(STATIC_DIR / "index.html") return FileResponse(STATIC_DIR / "index.html", headers={"Cache-Control": "no-cache, must-revalidate"})
@app.get("/health") @app.get("/health")