import asyncio import os from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse from contextlib import asynccontextmanager from config.logging import get_logger from storage.db import init_db from scheduler.runner import start_scheduler from api.routes import router from config.settings import HOST, PORT logger = get_logger("main") @asynccontextmanager async def lifespan(app: FastAPI): # Startup logger.info("Starting WebGuard application...") init_db() start_scheduler() os.makedirs("screenshots", exist_ok=True) os.makedirs("recordings", exist_ok=True) logger.info("WebGuard startup complete.") yield logger.info("Shutting down WebGuard...") # Shutdown (nothing needed) app = FastAPI( title="WebGuard", description="Full-stack website monitoring with AI analysis", version="1.0.0", lifespan=lifespan, ) # API routes app.include_router(router) # Static files (screenshots) app.mount("/screenshots", StaticFiles(directory="screenshots"), name="screenshots") # Frontend app.mount("/static", StaticFiles(directory="frontend"), name="static") @app.get("/") async def root(): return FileResponse("frontend/index.html") if __name__ == "__main__": import uvicorn uvicorn.run("app:app", host=HOST, port=PORT, reload=False)