Веб-UI FastAPI, REST API v1, интерактивный setup без env.example

- Дашборд (Jinja2 + static), управление кластерами kind, задания и kubeconfig.
- API: health, stats, clusters CRUD, versions, jobs; документация app/docs/api_routes.md.
- Docker Compose: том app, uvicorn reload, KIND_K8S_PATCH_KUBECONFIG по умолчанию 1.
- setup_env_interactive.py: список переменных в скрипте, удалён env.example.
- Makefile: явный префикс docker/podman; прочие правки CLI и ядра кластеров.
This commit is contained in:
Sergey Antropoff
2026-04-04 05:39:53 +03:00
parent ae961ef5fe
commit e46a62cfdb
31 changed files with 2507 additions and 393 deletions
+50
View File
@@ -0,0 +1,50 @@
"""Проверка живости сервиса и доступности движка контейнеров.
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
from __future__ import annotations
import asyncio
import logging
import shutil
from fastapi import APIRouter
from core.cluster_lifecycle import container_engine_ping
logger = logging.getLogger("kind_k8s.api.health")
router = APIRouter(tags=["health"])
@router.get("/health", summary="Состояние сервиса и среды")
async def health() -> dict[str, object]:
"""
Проверка: процесс отвечает, в PATH есть kind/kubectl, доступен Docker/Podman API (``info``).
Без рабочего сокета создание kind-кластеров из UI невозможно.
"""
kind_ok = shutil.which("kind") is not None
kubectl_ok = shutil.which("kubectl") is not None
engine_ok, engine_msg, cli = await asyncio.to_thread(container_engine_ping)
logger.debug(
"health: kind=%s kubectl=%s engine=%s cli=%s",
kind_ok,
kubectl_ok,
engine_ok,
cli,
)
overall = "ok" if (kind_ok and kubectl_ok and engine_ok) else "degraded"
return {
"status": overall,
"kind_in_path": kind_ok,
"kubectl_in_path": kubectl_ok,
"container_cli": cli,
"container_engine_ok": engine_ok,
"container_engine_detail": engine_msg if not engine_ok else None,
}