- 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>
41 lines
1.7 KiB
Python
41 lines
1.7 KiB
Python
"""Zentrale Einstellungen einer Instanz des Homelab Orchestrators.
|
|
|
|
Zwei Rollen, derselbe Code (User-Entscheid 24.09.2026, „zwei Instanzen, eine Oberfläche“):
|
|
box — auf der KI-Box: Box-Wart (Updates, Wächter, Modelle, Radar, Gateway für Lucy)
|
|
homelab — auf dem Proxmox-PC: Homelab-Teil (Proxmox-Host, Container, Arcane)
|
|
Beide kennen die jeweils andere Instanz als Partner: die Oberfläche zeigt beide Bereiche, und
|
|
jede Instanz prüft, ob die andere noch antwortet.
|
|
"""
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
from functools import lru_cache
|
|
from pathlib import Path
|
|
|
|
ROLLEN = ("box", "homelab")
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Einstellungen:
|
|
rolle: str # "box" | "homelab"
|
|
instanz: str # Anzeigename dieser Instanz
|
|
daten_dir: Path # Zustandsdateien dieser Instanz
|
|
partner_url: str # Basis-URL der anderen Instanz, leer = keine
|
|
partner_name: str # Anzeigename der anderen Instanz
|
|
|
|
|
|
@lru_cache(maxsize=1)
|
|
def einstellungen() -> Einstellungen:
|
|
rolle = os.environ.get("MC_ROLLE", "box").strip().lower() or "box"
|
|
if rolle not in ROLLEN:
|
|
raise ValueError(f"MC_ROLLE muss eine von {ROLLEN} sein, nicht {rolle!r}.")
|
|
box = rolle == "box"
|
|
standard_daten = os.environ.get("MC_MODELS_DIR", "/srv/models") if box else "/var/lib/mc2"
|
|
return Einstellungen(
|
|
rolle=rolle,
|
|
instanz=os.environ.get("MC_INSTANZ", "Box-Wart" if box else "Homelab"),
|
|
daten_dir=Path(os.environ.get("MC_DATEN_DIR", standard_daten)),
|
|
partner_url=os.environ.get("MC_PARTNER_URL", "").strip().rstrip("/"),
|
|
partner_name=os.environ.get("MC_PARTNER_NAME", "Homelab" if box else "Box-Wart"),
|
|
)
|