- kern/einstellungen.py: MC_ROLLE (box|homelab), Instanzname, Datenordner, Partner-URL - kern/zeit.py: eine Zeitzone statt sechs Kopien - app.py/steward.py: Box-Router und Warm-Set nur in der Rolle box; der Homelab-Teil laedt nichts von der Box - /api/health nennt Rolle und Instanz; Engine/Gateway/Hirn nur auf der Box - /api/partner (Lebenszeichen) und /api/partner/<pfad> (Durchreiche, ohne Schleifen und SSE) - Waechter prueft die andere Instanz (rot erst nach 5 Takten, ein Neustart ist kein Alarm) - notify.sh: Zweitweg direkt an die Telegram-Bot-API, wenn hermes send scheitert oder fehlt; Token nicht in der Prozessliste, Tests greifen nie auf die echte .env - update_verlauf erkennt "OK telegram direkt" Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
39 lines
1.3 KiB
Python
39 lines
1.3 KiB
Python
"""Health-/Status-Endpoint — schlanker Lebenszeichen-Check einer Instanz.
|
|
|
|
Seit 24.09.2026 nennt er auch Rolle und Namen der Instanz: Die Partner-Instanz liest daran ab,
|
|
wer ihr antwortet. Engine, Gateway und Hirn gibt es nur auf der KI-Box."""
|
|
|
|
from config import VERSION
|
|
from fastapi import APIRouter
|
|
from kern.einstellungen import einstellungen
|
|
from pydantic import BaseModel
|
|
|
|
router = APIRouter(prefix="/api")
|
|
|
|
|
|
class HealthResponse(BaseModel):
|
|
status: str
|
|
version: str
|
|
rolle: str
|
|
instanz: str
|
|
engine_reachable: bool | None = None
|
|
gateway_reachable: bool | None = None
|
|
brain: dict | None = None
|
|
|
|
|
|
@router.get("/health", response_model=HealthResponse, response_model_exclude_none=True)
|
|
def health() -> dict:
|
|
e = einstellungen()
|
|
antwort: dict = {"status": "ok", "version": VERSION, "rolle": e.rolle, "instanz": e.instanz}
|
|
if e.rolle == "box":
|
|
from services import gateway, llamaswap
|
|
|
|
antwort.update(
|
|
engine_reachable=llamaswap.engine_reachable(),
|
|
gateway_reachable=gateway.gateway_reachable(),
|
|
# Echte Hirn-Bereitschaft: Engine kann erreichbar sein, das Agent-Hirn aber tot
|
|
# (Crash/OOM nach Engine-Update). Das wäre sonst ein silent fail.
|
|
brain=llamaswap.brain_status(),
|
|
)
|
|
return antwort
|