import os from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from db.init import init_database from routers import documents, chat, auth from core.config import settings @asynccontextmanager async def lifespan(app: FastAPI): await init_database() yield app = FastAPI(title="RAG Backend API", lifespan=lifespan) # Configure CORS — restrict to allowed origins from settings app.add_middleware( CORSMiddleware, allow_origins=settings.allowed_origins_list, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Register routers app.include_router(documents.router) app.include_router(chat.router) app.include_router(auth.router) # Serve frontend static files in single-container mode (e.g. Hugging Face Spaces). # Must be mounted AFTER all API routes to avoid catching API requests. static_dir = os.path.join(os.path.dirname(__file__), "static") if os.path.exists(static_dir): app.mount("/", StaticFiles(directory=static_dir, html=True), name="static") else: @app.get("/") async def root(): return {"status": "running"} if __name__ == "__main__": import uvicorn uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)