2026-07-21 09:23:43 +08:00
|
|
|
|
from fastapi import APIRouter
|
2026-07-16 13:47:37 +08:00
|
|
|
|
|
|
|
|
|
|
from app.core.logging import get_logger
|
2026-08-03 17:24:45 +08:00
|
|
|
|
from app.db.platform_store import get_platform_store
|
2026-08-12 15:21:23 +08:00
|
|
|
|
from app.core.config import get_settings
|
|
|
|
|
|
from app.modules.storage.minio_store import ObjectStorageError, get_object_storage
|
2026-07-16 13:47:37 +08:00
|
|
|
|
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/health")
|
2026-07-21 09:23:43 +08:00
|
|
|
|
async def health_check() -> dict[str, object]:
|
2026-08-12 15:21:23 +08:00
|
|
|
|
# Health endpoints are called frequently by Docker and the frontend.
|
|
|
|
|
|
# Keep failures visible without emitting one INFO line per probe.
|
|
|
|
|
|
logger.debug("health check requested")
|
|
|
|
|
|
storage_status: dict[str, object] = {"enabled": get_settings().minio_enabled, "status": "disabled"}
|
|
|
|
|
|
if get_settings().minio_enabled:
|
|
|
|
|
|
try:
|
|
|
|
|
|
get_object_storage().ensure_bucket()
|
|
|
|
|
|
storage_status = {
|
|
|
|
|
|
"enabled": True,
|
|
|
|
|
|
"status": "ready",
|
|
|
|
|
|
"endpoint": get_settings().minio_endpoint,
|
|
|
|
|
|
"bucket": get_settings().minio_bucket,
|
|
|
|
|
|
}
|
|
|
|
|
|
except (ObjectStorageError, OSError) as exc:
|
|
|
|
|
|
logger.warning("MinIO health check failed: %s", exc)
|
|
|
|
|
|
storage_status = {
|
|
|
|
|
|
"enabled": True,
|
|
|
|
|
|
"status": "unavailable",
|
|
|
|
|
|
"endpoint": get_settings().minio_endpoint,
|
|
|
|
|
|
"error": str(exc),
|
|
|
|
|
|
}
|
2026-08-03 15:49:21 +08:00
|
|
|
|
return {
|
|
|
|
|
|
"code": 0,
|
|
|
|
|
|
"message": "ok",
|
2026-08-12 15:21:23 +08:00
|
|
|
|
"data": {**get_platform_store().health_metrics(), "storage": storage_status},
|
2026-08-03 15:49:21 +08:00
|
|
|
|
}
|
2026-07-21 09:23:43 +08:00
|
|
|
|
|