devorbit's picture
Initial deployment - secrets removed
26e1c2e
"""
Murshid Backend — FastAPI entrypoint.
Architecture:
API Layer → app/api/routes/
Service Layer→ app/services/
ML Layer → app/ml/
Repository → app/repositories/
Database → app/db/ (SQLAlchemy + Alembic, MySQL)
"""
from __future__ import annotations
from contextlib import asynccontextmanager
from pathlib import Path
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from app.api.routes import db_viewer, health, queries, rules, stats
from app.ml.pipeline import load_models, unload_models
_FRONTEND_DIR = Path(__file__).resolve().parent.parent.parent / "murshid_frontend"
@asynccontextmanager
async def lifespan(app: FastAPI):
load_models()
yield
unload_models()
app = FastAPI(
title="Murshid API",
description=(
"MITRE ATT&CK-Aligned Techniques Mapping for SOC Analysts. "
"Transforms Wazuh IDS rules into actionable threat intelligence."
),
version="1.0.0",
lifespan=lifespan,
)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(health.router)
app.include_router(stats.router)
app.include_router(db_viewer.router)
app.include_router(rules.router)
app.include_router(queries.router)
if _FRONTEND_DIR.is_dir():
app.mount("/", StaticFiles(directory=str(_FRONTEND_DIR), html=True), name="frontend")