"""ml-service — FastAPI entrypoint. Monta: / → RedirectResponse /datasets /models /train /test /results → pagine Jinja /api/datasets /api/models /api/repos /api/trainings /api/tests /api/results → JSON /api/trainings/{id}/events → SSE /health → check /static/* → file statici """ from __future__ import annotations import logging from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from core import db, minio_client, redis_client, worker logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s") log = logging.getLogger(__name__) STATIC_DIR = Path(__file__).resolve().parent / "static" @asynccontextmanager async def lifespan(app: FastAPI): log.info("ml-service starting") await db.init_pool() try: minio_client.ensure_bucket() except Exception as e: log.warning("minio bucket ensure failed: %s", e) worker.start_workers() yield log.info("ml-service stopping") await worker.stop_workers() await db.close_pool() await redis_client.close() app = FastAPI(title="MEB ML Service", lifespan=lifespan) # static app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static") @app.get("/health") async def health(): pg_ok = True try: await db.fetchrow("SELECT 1") except Exception: pg_ok = False redis_ok = True try: await redis_client.client().ping() except Exception: redis_ok = False return { "status": "ok" if (pg_ok and redis_ok) else "degraded", "service": "ml", "postgres": "connected" if pg_ok else "disconnected", "redis": "connected" if redis_ok else "disconnected", "minio": "connected" if minio_client.check() else "disconnected", "version": "2.0.0", } from routers import ( # noqa: E402 datasets, models, pages, repos, results, tests, trainings, trainings_stream, ) app.include_router(pages.router) app.include_router(datasets.router) app.include_router(models.router) app.include_router(repos.router) app.include_router(trainings.router) app.include_router(trainings_stream.router) app.include_router(tests.router) app.include_router(results.router)