Routing & Endpunkte¶
Stand: Phase B, Block 7 in Arbeit (Block 7.3 abgeschlossen, 2026-04-25). Geltungsbereich: Heute erreichbare Endpunkte sind als 🟢 live markiert, das Block-7-Vollstand-Ziel als 🟡 geplant, rein interne Container-Endpunkte als 🔵 intern. Phase 8+ (Tenant-User- Provisioning, Connector-Subsystem, Knowledge-Hub, …) ist nicht enthalten.
Diese Seite ist ein Inventar, kein Runbook. Sie sagt was wo läuft, nicht warum (→ Konzepte) und nicht wie aufsetzen (→ Deployment- Runbooks).
TLDR — Quick-Reference¶
| Was du tun willst | Wo du hingehst | Auth | Status |
|---|---|---|---|
| Operator-Tenants verwalten (CRUD) | https://platform.kora.luki-net.org/admin/operator/tenants |
Keycloak kora-platform / operator-ui |
🟢 |
| Modules-Registry (Read-Only) + Per-Tenant-Toggle | https://platform.kora.luki-net.org/admin/operator/modules |
Keycloak kora-platform / operator-ui |
🟢 |
| Operator-Templates verwalten (CRUD) | https://platform.kora.luki-net.org/admin/operator/templates |
Keycloak kora-platform / operator-ui |
🟢 |
| Tenant-eigene Chatbots ansehen (Tenant-UI) | https://platform.kora.luki-net.org/tenant/dashboard |
Keycloak kora-tenants / tenant-ui |
🟢 |
| Platform-API direkt ansprechen | https://platform.kora.luki-net.org/api/v1/... |
Bearer-Token (jeder Realm) | 🟢 |
| Keycloak-Admin-Console | https://auth.kora.luki-net.org/admin/master/console/ |
Master-Realm-Admin-User | 🟢 |
| Live-Health-Probe (Platform-API) | https://platform.kora.luki-net.org/health/live |
unauth | 🟢 |
| Platform-Doku (diese Seite + alle anderen) | https://docs.kora.luki-net.org/ |
unauth | 🟢 |
| Demo-Widget testen (AVS-Demo) | https://demo.avs.luki-net.org/demo |
unauth | 🟢 |
| Demo-Doku | https://docs.avs.luki-net.org/ |
unauth | 🟢 |
| Operator-Audit-Log einsehen + CSV-Export | …/admin/operator/audit |
Keycloak operator-ui |
🟢 |
| Connectors-Stub (Block-13-Hinweis) | …/admin/operator/connectors |
Keycloak operator-ui |
🟢 (Stub) |
1. Externe Einstiegspunkte¶
User-facing Domains, die per öffentlichem DNS auflösbar und per NPMplus mit TLS-Termination versorgt sind. TLS-Zertifikate stammen aus Let's-Encrypt (NPMplus-eigene ACME-Integration).
| Domain | Zweck | Auth-Modus | Status |
|---|---|---|---|
platform.kora.luki-net.org |
Platform-API + Operator-UI + Tenant-UI (Path-Routing) | OIDC (Keycloak) | 🟢 |
auth.kora.luki-net.org |
Keycloak (beide Realms + Admin-Console) | Master-Realm + Realm-Logins | 🟢 |
docs.kora.luki-net.org |
MkDocs-Material Platform-Doku | unauth | 🟢 |
demo.avs.luki-net.org |
AVS-Demo-Surface (Widget-Playground, Demo-Chatbot) | unauth (Widget public, Demo-Admin SSO) | 🟢 |
docs.avs.luki-net.org |
AVS-Demo-Doku (separates MkDocs) | unauth | 🟢 |
1a. Pfade auf platform.kora.luki-net.org¶
| Pfad | Bedient | Auth | Status |
|---|---|---|---|
/ |
(TBD — Block 14 entscheidet Default-Redirect) | — | 🟡 |
/admin/operator/ |
Operator-UI SPA (Vue 3, Tenants + Templates aktiv) | Realm kora-platform, Client operator-ui, Operator-Rolle |
🟢 |
/admin/operator/tenants |
Tenants-CRUD (Liste/Create/Detail/Edit/Soft-Delete) | dito | 🟢 |
/admin/operator/templates |
Templates-CRUD inkl. Reaktivieren | dito | 🟢 |
/admin/operator/modules |
Modules-Registry (Read-Only) + Per-Tenant-Toggle in Tenants-Detail-Tab | Realm kora-platform, Client operator-ui, Operator-Rolle |
🟢 |
/admin/operator/audit |
Audit-Log-Viewer (List/Filter/Detail-Expand/CSV-Export) | dito | 🟢 |
/admin/operator/connectors |
Connectors-Stub mit Block-13-Hinweis (kein Backend-Read) | dito | 🟢 (Stub) |
/tenant/ |
Tenant-UI SPA (Block-5-Scaffolding + Template-Update-Banner) | Realm kora-tenants, Client tenant-ui |
🟢 |
/api/v1/... |
Platform-REST-API (siehe §5) | Bearer-Token (jeder Realm) | 🟢 |
/auth/* |
Nicht bedient — Auth-Endpoints liegen ausschließlich auf auth.kora.luki-net.org (siehe §6). Trifft FastAPI und gibt {"detail":"Not Found"} zurück. |
— | ❌ |
/health/live, /health/ready |
Liveness + Readiness | unauth | 🟢 |
/metrics |
Prometheus-Scrape (IP-Allowlist) | IP-Gating + interner Scrape | 🔵 |
Tenant-Subdomain (z. B.
<slug>.kora.luki-net.org): im Konzept §17 für Phase D angedacht, nicht Teil von Phase B. Kein DNS-Eintrag heute. Tenants laufen aktuell unter dem Path-Prefix/tenant/auf der Platform-Domain.
1b. Localhost-Dev-Endpunkte¶
Für lokale Entwicklung (make dev-platform, make operator-ui-dev,
make tenant-ui-dev):
| URL | Service | Status |
|---|---|---|
http://localhost:8280/ |
Platform-API (StaticFiles + REST) | 🟢 |
http://localhost:8236/ |
Keycloak (beide Realms) | 🟢 |
http://localhost:5173/tenant/ |
Vite-Dev tenant-ui (proxyt /api/* → 8280) |
🟢 |
http://localhost:5174/admin/operator/ |
Vite-Dev operator-ui (proxyt /api/* → 8280) |
🟢 |
http://localhost:8237/ |
mkdocs-Container (Platform-Doku live) | 🟢 |
http://localhost:8233/dashboard |
Qdrant-Dashboard | 🔵 |
http://localhost:8239/ |
MailHog-UI (Test-Mail-Sink) | 🔵 |
2. Reverse-Proxy-Layer (NPMplus)¶
NPMplus terminiert TLS für alle externen Subdomains und proxyt im
HTTP-Klartext zu den Containern. Cert-Quelle: Let's-Encrypt via
NPMplus-eigener ACME-Integration. Keine produktive NPMplus-Regel für
/admin/operator/* separat nötig — der FastAPI-Mount in der Platform-
API liefert das Operator-UI-Bundle direkt aus (siehe §5).
graph LR
Browser[Browser]
subgraph npm[NPMplus Reverse-Proxy]
npm_demo[demo.avs.luki-net.org]
npm_docs_avs[docs.avs.luki-net.org]
npm_platform[platform.kora.luki-net.org]
npm_auth[auth.kora.luki-net.org]
npm_docs_kora[docs.kora.luki-net.org]
end
subgraph stack[Container-Network]
c_avs_api[avs-api:8080]
c_avs_docs[avs-mkdocs:8000]
c_kora_api[kora-platform-api:8080]
c_kora_kc[kora-platform-keycloak:8080]
c_kora_docs[kora-platform-mkdocs:8000]
end
Browser --> npm_demo
Browser --> npm_docs_avs
Browser --> npm_platform
Browser --> npm_auth
Browser --> npm_docs_kora
npm_demo --> c_avs_api
npm_docs_avs --> c_avs_docs
npm_platform --> c_kora_api
npm_auth --> c_kora_kc
npm_docs_kora --> c_kora_docs
Mapping:
| Subdomain | NPMplus-Stream-Target | Host-Port |
|---|---|---|
platform.kora.luki-net.org |
kora-platform-api:8080 |
8280 |
auth.kora.luki-net.org |
kora-platform-keycloak:8080 |
8236 |
docs.kora.luki-net.org |
kora-platform-mkdocs:8000 |
8237 |
demo.avs.luki-net.org |
avs-api:8080 (Demo-Stack) |
8080 |
docs.avs.luki-net.org |
avs-mkdocs:8000 (Demo-Stack) |
8001 |
NPMplus-Setup-Details für auth.kora.luki-net.org siehe Runbook
NPMplus auth.kora.luki-net.org;
für /admin/operator/* siehe
Operator-UI Keycloak-Client.
3. Interne Service-Topologie¶
Alle Platform-Services laufen im Docker-Network kora-platform-net,
DNS-Auflösung erfolgt über Container-Name (kora-platform-api,
kora-platform-postgres, …). Demo-Stack-Services laufen analog im
avs-net. Beide Networks sind heute getrennt; eine geplante
Cross-Network-Verbindung (Konzept §15a) lässt die Platform-API später
den Demo-vLLM-LB mitnutzen.
| Service | Container-Name | Image | Intern | Host-Port | Auth | Beschreibung |
|---|---|---|---|---|---|---|
| Platform-API | kora-platform-api |
local build (Dockerfile.platform) |
8080 | 8280 | OIDC + RLS | FastAPI; serviert auch tenant-ui + operator-ui Bundles |
| Postgres | kora-platform-postgres |
postgres:16-alpine |
5432 | 8232 | Role-basiert (kora_platform_app, _vendor, …) | RLS-enforced Tenant-Daten |
| Qdrant | kora-platform-qdrant |
qdrant/qdrant:latest |
6333/6334 | 8233/8234 | API-Key (intern) | Vektordaten, Collection-per-Chatbot |
| Redis | kora-platform-redis |
redis:7-alpine |
6379 | 8235 | unauth (intern only) | Cache + Tenant-Slug-Lookup |
| Keycloak | kora-platform-keycloak |
quay.io/keycloak/keycloak:26.0 |
8080 | 8236 | OIDC | Beide Realms |
| Keycloak-DB | kora-platform-keycloak-db |
postgres:16-alpine |
5432 | — | Role-basiert | Keycloak-State |
| MailHog | kora-platform-mailhog |
mailhog/mailhog:latest |
8025/1025 | 8239/8226 | unauth | Dev-Mail-Sink für Keycloak |
| Embedder | kora-platform-embedder |
local build | 5000 | — | unauth (intern) | multilingual-e5-large |
| Scheduler | kora-platform-scheduler |
mcuadros/ofelia:latest |
— | — | Docker-Socket | Cron-Jobs (Chatbot-Cleanup …) |
| MkDocs | kora-platform-mkdocs |
squidfunk/mkdocs-material:latest |
8000 | 8237 | unauth | Live-Reload Platform-Doku |
Persistente Volumes: kora_platform_postgres_data,
kora_platform_qdrant_data, kora_platform_redis_data,
kora_platform_keycloak_db_data. Bind-Mount-Disziplin siehe
Runbook.
Demo-Stack-Container (
avs-api,avs-vllm,avs-vllm-lb,avs-keycloak,avs-redis,avs-qdrant,avs-minio,avs-postgres,avs-grafana,avs-prometheus,avs-gpu-exporter,avs-mkdocs) laufen imavs-net. Der Platform-Stack greift heute nicht auf sie zu — Cross-Network-Brücke kommt mit Block 14.
4. GPU-Inferenz-Topologie¶
Heute ausschließlich im Demo-Stack. Der Platform-Stack hat keinen
eigenen vLLM-Service; Block 14 verbindet Platform-API mit avs-vllm-lb
via Cross-Network-Bridge.
graph LR
api[avs-api]
lb[avs-vllm-lb<br/>nginx least_conn]
local[vllm<br/>luki-ai GPU 0<br/>RTX 4090]
remote[VLLM_5090_HOST<br/>192.168.0.223:8000<br/>RTX 5090]
api --> lb
lb -- vllm:8000 --> local
lb -- 192.168.0.223:8000 --> remote
local -. healthcheck /v1/models .-> lb
remote -. healthcheck via max_fails=3, fail_timeout=30s .-> lb
lb -. /lb-health .- api
| Node | Hardware | vLLM-Port | Health-Pfad | Erreichbar von | Status |
|---|---|---|---|---|---|
vllm (luki-ai, GPU 0) |
RTX 4090 | 8000 (intern) | GET /v1/models (compose-Healthcheck) |
avs-vllm-lb (gleiches Network) |
🟢 |
192.168.0.223 (Remote-Node) |
RTX 5090 | 8000 (LAN) | max_fails=3 / fail_timeout=30s aus Nginx |
avs-vllm-lb (LAN-Routing + iptables) |
🟢 |
avs-vllm-lb |
nginx:alpine | 8000 | GET /lb-health → 200 OK |
avs-api (Demo-Net) |
🟢 |
| GPU-Exporter (luki-ai) | n/a | 9835 (intern) | Prometheus-Scrape | avs-prometheus (Demo-Net) |
🟢 |
| GPU-Exporter (Remote) | n/a | 9835 (LAN) | Prometheus-Scrape | avs-prometheus direkt |
🟢 |
Failover: nginx least_conn mit max_fails=3 / fail_timeout=30s
markiert einen Upstream nach drei Fehlversuchen für 30 s als down. Der
verbleibende Node nimmt allen Traffic. keepalive 32 hält Connections
warm.
iptables-Restriktion auf Remote-Node (
DOCKER-USER-Chain): beschränkt Zugriff auf192.168.0.223:8000und:9835aufluki-ai-IP. Codifiziert seit TODO-Platform-04 als idempotentes Skriptinfra/remote-node/docker-firewall.sh+ systemd-Service-Templateinfra/remote-node/docker-firewall.service. Aufruf-Reihenfolge + Verifikation + Rollback im Runbook Remote-vLLM-Node-Setup. Pattern: Delete-then-Insert-Position-1 mit IPv4-RETURN-Whitelist + IPv4/IPv6-DROP-Catchall.
5. API-Endpunkt-Familien¶
Alle Pfade unter https://platform.kora.luki-net.org. Auth via
Authorization: Bearer <jwt>-Header; Realm-Auswahl je Familie.
| Präfix | Zweck | Realm/Scope | Status |
|---|---|---|---|
/api/v1/me, /api/v1/whoami |
Identity-Echo | jeder authentifizierte Scope | 🟢 |
/api/v1/tenants/me, /api/v1/tenants/{id}/chatbots |
Tenant-Self-View, Chatbot-Liste | tenant + operator + vendor | 🟢 |
/api/v1/platform/tenants/* |
Operator-Tenants-CRUD | operator (write), operator/vendor (read) | 🟢 |
/api/v1/platform/modules |
Modul-Katalog | operator/vendor | 🟢 |
/api/v1/tenants/{id}/modules |
Pro-Tenant-Modul-Toggle + Audit | tenant (read), operator/vendor (write) | 🟢 |
/api/v1/operator/templates/* |
Templates-CRUD | operator/vendor | 🟢 |
/api/v1/tenant/templates, /api/v1/tenant/chatbots/{id}/template-update |
Tenant-Template-Read + Diff/Apply | jeder Scope (RLS-gegated) | 🟢 |
/api/v1/platform/audit, /api/v1/platform/audit/{id}, /api/v1/platform/audit/export.csv |
Audit-Reader (List/Filter/Detail/CSV-Export) | operator/vendor | 🟢 |
/api/v1/platform/tenants/bulk-soft-delete |
Bulk-Soft-Delete für Tenants (atomar, single Audit-Entry) | operator | 🟢 |
/api/v1/platform/tenants/{id}/modules/bulk |
Bulk-Module-Toggle pro Tenant (atomar, single Audit-Entry) | operator/vendor | 🟢 |
/api/v1/users/me/preferences (GET, PATCH) |
User-UI-Preferences (Theme), beide Realms, Lazy-Create, kein Audit | jeder authentifizierte User | 🟢 |
/health/live, /health/ready |
Liveness, Readiness (DB+Redis+KC) | unauth | 🟢 |
/metrics |
Prometheus-Scrape | IP-Allowlist (CIDR) | 🔵 |
/admin/operator/*, /tenant/* |
SPA-Bundle + Vue-Router-Fallback | unauth (Auth läuft im SPA) | 🟢 |
Vollständige OpenAPI-Definition (Pfad + Schema) liefert FastAPI unter
https://platform.kora.luki-net.org/docs(Swagger UI) bzw./redoc— beide nur intern erreichbar, weil sie unauth sind und die NPMplus-Regel sie ausspart. Lokal:http://localhost:8280/docs.
Pfad-Präfix-Inkonsistenz (TODO-Block-7-01)¶
Operator-Resources sind über zwei Präfixe verteilt:
/api/v1/platform/tenants(Block 7.1a)/api/v1/platform/modules(Block 6)/api/v1/platform/audit(Block 7.4)/api/v1/operator/templates(Block 5)
Die Vereinheitlichung auf einen Präfix ist als TODO-Block-7-01 in
offene-todos.md deferred (Score 45,
Trigger nach 7.4). Block 7.4 hat den Präfix-Drift nicht aufgelöst —
neue Routen liegen unter /api/v1/platform/audit*, der Templates-
Präfix /api/v1/operator/* bleibt unverändert. Bestehende Clients
(operator-ui-Frontend, smoke-Tests) nutzen die jeweils realen
Präfixe — die Doku spiegelt den Bestand, nicht das Ziel.
6. Auth-Endpunkte (Keycloak)¶
Beide Realms laufen auf derselben Keycloak-Instanz unter
https://auth.kora.luki-net.org — nicht unter
https://platform.kora.luki-net.org/auth/... (dort gibt es kein
NPMplus-Routing zur Keycloak-Instanz, FastAPI antwortet mit 404).
Operator-UI nutzt https://auth.kora.luki-net.org/realms/kora-platform/...,
Tenant-UI nutzt https://auth.kora.luki-net.org/realms/kora-tenants/....
Keycloak läuft mit der modernen Pfad-Konvention ohne /auth/-Präfix
(siehe quay.io/keycloak/keycloak:24+).
| Realm | Client | Typ | Zweck | Status |
|---|---|---|---|---|
kora-platform |
kora-api |
confidential | Operator + Vendor-Support Backend-Token | 🟢 |
kora-platform |
kora-api-vendor-breakglass |
confidential, 2 h Session-Cap | Notfall-Vendor-Zugriff | 🟢 |
kora-platform |
kora-api-vendor-tunnel |
confidential, 2 h Session-Cap | Vendor-Audit-Tunnel | 🟢 |
kora-platform |
operator-ui |
public, PKCE S256 | Operator-UI SPA | 🟢 |
kora-platform |
kora-platform-audit |
confidential, Client-Credentials-Flow, view-events-Rolle |
Service-Account für den Audit-Poller | 🟢 |
kora-tenants |
kora-api |
confidential | Tenant-API-Backend | 🟢 |
kora-tenants |
tenant-ui |
public, PKCE S256 | Tenant-UI SPA | 🟢 |
Token-Endpunkt-Pattern:
https://auth.kora.luki-net.org/realms/<realm>/protocol/openid-connect/token
Authorization-Endpunkt-Pattern:
https://auth.kora.luki-net.org/realms/<realm>/protocol/openid-connect/auth
Admin-Console:
https://auth.kora.luki-net.org/admin/master/console/ — nur für
Master-Realm-Admins (KC_BOOTSTRAP_ADMIN_USERNAME aus .env.platform).
Tagesgeschäft (Tenant-User-Provisioning, Rolle-Zuweisung) läuft NICHT
über die Admin-Console, sondern über kcadm.sh oder ab Block 12 über
das Platform-Backend.
Service-Accounts:
kora-platform-auditist live imkora-platform-Realm, angelegt durch das Init-Scriptinfra/keycloak/init-scripts/create-audit-service-account.sh(idempotent, regeneriert das Secret beim Re-Run nicht). Der archivierteTODO-B2-03markiert diese Arbeit als abgeschlossen — der TODO-B2-03-Kommentar indocker-compose.platform.yml:188ist nur eine Code-Annotation auf bereits erledigte Arbeit, kein offener Task.Source-of-Truth-Modell: Das Realm-JSON deklariert den Soll- Zustand, Init-Scripts in
infra/keycloak/init-scripts/garantieren den Ist-Zustand idempotent. Hintergrund: ein Realm-JSON-Re-Import würde Confidential-Client-Secrets regenerieren und damit den Stack zerlegen — deshalb ist der Re-Import nach dem Erstanlegen tabu, und neue/nachträgliche Clients werden überkcadm.sh create clients -f <client.json>nachgezogen. Der 2026-04-25-Drift (operator-ui im JSON, nicht im laufenden Realm) ist mitcreate-operator-ui-client.shgeschlossen (TODO-Platform-05archiviert). Verifikations-Befehl als verbindliche Quelle:docker exec kora-platform-keycloak /opt/keycloak/bin/kcadm.sh get clients -r <realm> --fields clientId | sort.Drift-Pattern (2026-04-26 / 2026-04-27, alle archiviert nach TODO-Platform-09): Sieben Datenpunkte in drei Tagen — alle gefixt, Anti-Drift-Disziplin etabliert.
- Realm-JSON ↔ Live-Keycloak — operator-ui-Client (TODO-Platform-05): operator-ui- Client war im Soll-JSON, fehlte im Ist-Realm. Init-Skript
create-operator-ui-client.shschließt die Lücke.- Frontend-Konfig ↔ NPMplus-Routing — operator-ui Auth-URL (TODO-Platform-06):
useAuth.tsdefaultete auf/auth(relativ → resolved aufplatform.kora.luki-net.org/auth), wo NPMplus aber keine Keycloak-Route hat. Default jetzt absolut aufhttps://auth.kora.luki-net.org.- E2E-Tests ↔ Prod-Login-Pfad (TODO-Platform-06): Bestehende Playwright-Specs seedeten den Token via
window.__KORA_E2E_SEED__und übersprangen denuseAuth.login()-Authorize-Redirect. Anti-Regression-Specauth-redirect.spec.tstestet ohne Seed-Hook.- Frontend-OIDC-Scope ↔ Realm-Architektur — operator-ui (TODO-Platform-08): Frontend fragte OIDC-Standard-Scopes (
openid profile email) an, die im Custom-Scope-Realm nicht existieren. Frontend- Scope-Request reduziert aufopenid kora-scope— Realm- Architektur (Custom-Scope-only) bleibt unangetastet.- Frontend-Pfad-Doppelung — operator-ui post-login redirect (TODO-Platform-09 Drift #5):
useAuth.login()speichertewindow.location.pathname(volle Pfadkomponente inkl. Router-Base) alspost_login_redirect;router.replace(target)mitcreateWebHistory("/admin/operator/")verdoppelte den Pfad zu/admin/operator/admin/operator/.... Fix:pathRelativeToBase()-Helper schneidet die Router-Base ab.- OAuth
state mismatchbei Re-Login (TODO-Platform-09 Drift #6): Folge von Drift #5 — verifiziert nach #5-Fix.- Realm-JSON ↔ Live —
defaultClientScopesaller Clients (TODO-Platform-09 Drift #7): Realm-JSONs deklarierten in beiden Realms für alle ClientsdefaultClientScopes: ["openid","profile","email","roles","kora-scope"], die OIDC-Standard-Scopes existieren aber als Client-Scope- Objekte gar nicht. Live-Zustand war seit Anfang sauber["kora-scope"]. Re-Import wäre an dem aspirativen JSON gescheitert. JSON in beiden Realms auf den Live-Soll konsolidiert. Plus: TODO-Platform-07 (tenant-ui Auth-URL, analog #2) und tenant-ui Scope-Patch (analog #4) im selben Lauf gefixt.Lessons-Learned:
- Source-of-Truth-Disziplin gilt für jede Schicht einzeln — Realm-JSON, Live-Keycloak, Frontend-Konfig, NPMplus-Routing und Test-Suite-Realismus.
- „Tests grün" reicht nicht, wenn die Tests den fehleranfälligen Pfad bypassen.
- Realm-Architektur prüfen, bevor Standard-OIDC-Konventionen angenommen werden. Custom-Scope-Patterns sind valide Architektur-Entscheidungen — Frontend muss sich an die Realm-Konvention anpassen, nicht umgekehrt.
- Der Frontend-Router-Base ist eine versteckte Schicht:
createWebHistory(base)interagiert mitwindow.location.pathname- Speicherung im Auth-Flow. Wenn der Auth-Composable nicht weiß, was die Router-Base ist, produziert er Pfad-Doppelungen beim Post-Login-Redirect.Konsequenz / Anti-Drift-Disziplin: Source-of-Truth pro Schicht ist deklarativ benannt und verlinkt in
auth-stack-soll-zustand.md. Drifts werden viascripts/verify-auth-stack.shregelmäßig geprüft (read-only, idempotent, exit != 0 bei Drift, CI-tauglich für Block 14). Künftige Auth-Änderungen müssen zuerst die Soll-Zustand-Doku aktualisieren und das Skript grün halten.
7. Observability¶
| Service | URL | Auth | Was siehst du dort | Status |
|---|---|---|---|---|
Prometheus (avs-prometheus, Demo-Stack) |
http://luki-ai:9090 |
unauth (LAN) | Scrape-Targets + PromQL-Eingabe | 🟢 |
Grafana (avs-grafana, Demo-Stack) |
http://luki-ai:3000 |
Login (Demo-Admin-Passwort) | Dashboards (vLLM, GPU, API-Latency) | 🟢 |
Platform-API /metrics |
https://platform.kora.luki-net.org/metrics |
IP-Allowlist | FastAPI-Prometheus-Counter (Requests, RLS-Hits, …) | 🟢 |
| GPU-Exporter local | http://luki-ai:9835/metrics |
unauth (LAN) | NVIDIA SMI-Werte luki-ai | 🟢 |
| GPU-Exporter remote | http://192.168.0.223:9835/metrics |
unauth + iptables-Gate | NVIDIA SMI-Werte 5090 | 🟢 |
| Keycloak Admin-Events | siehe Admin-Console (Events-Tab) |
Master-Realm | User-Provisioning + Login-Audit | 🟢 |
platform_audit_log (DB-Tabelle) |
direkter SQL-Zugriff | DB-Admin | Operator-Mutationen (tenant.created, …) |
🟢 (UI 🟢 unter /admin/operator/audit) |
Prometheus-Konfig liegt in monitoring/prometheus/prometheus.yml. Die
Demo-Prometheus-Instanz scrapet sowohl Demo- als auch Platform-Targets
über die Cross-Network-Bridge — Platform-Stack braucht keinen eigenen
Prometheus.
8. Status-Legende¶
| Marker | Bedeutung |
|---|---|
| 🟢 live | Heute erreichbar, in Production-Nutzung oder lokal-dev getestet |
| 🟡 geplant | NPMplus-Roll-Out aus Block 14 (Phase-B-tail) — alle Operator-UI-Routen sind seit Block-7.4-Merge live unter dem FastAPI-StaticFiles-Mount auf platform.kora.luki-net.org |
| 🔵 intern | Nur im Docker-Network sichtbar, nicht extern routebar; Operator-Tools, Health-Check-Subsysteme, Container-zu-Container-Kommunikation |
Phase-D-Endpunkte (Tenant-User-Provisioning, Connector-Subsystem, Knowledge-Hub) sind in dieser Tabelle bewusst nicht enthalten — sie kommen erst nach Block 7-Abschluss in Reichweite.
Letzte Aktualisierung¶
2026-04-25 · initialer Merge 9c0c51d, §6-Audit-SA-Korrektur +
operator-ui-Status-Caveat in Branch docs/todos-from-routing-discovery
(Merge b3c6ebd), operator-ui-Live-Import + Status-Reset auf 🟢 in
Branch platform/fix-operator-ui-client-live-import (Merge 3e2398b),
/admin/operator/modules 🟡 → 🟢 nach Block-7.3-Merge,
/admin/operator/audit + /admin/operator/connectors + Bulk-Routen
🟡 → 🟢 nach Block-7.4-Merge 0b93d60.
2026-04-26 · §1a /auth/* als „nicht bedient" explizit dokumentiert,
§6 Auth-Subdomain-Klarstellung (operator-ui & tenant-ui nutzen
auth.kora.luki-net.org, nicht platform.kora.luki-net.org/auth),
Drift-Pattern um den dritten Datenpunkt erweitert
(Frontend-Konfig + Test-Suite-Realismus, TODO-Platform-06 Merge
283ca47).
2026-04-26 · §6 Drift-Pattern um Datenpunkt #4 erweitert
(Frontend-OIDC-Scope ↔ Realm-Architektur, TODO-Platform-08 Merge
e287c3b37355b673b377fc1ddc761f1e6e0adc81). Lessons-Learned-Block formalisiert; TODO-Platform-09
(systematische Auth-Stack-Verifikation, Trigger vor Block 8) als
Konsequenz hinzugefügt. Status /admin/operator/* bleibt 🟡 bis -09.
2026-04-27 · TODO-Platform-09 abgeschlossen (Merge 7909ce852590aed5e65684a8dbe9ed160bf7d227). §6
Drift-Pattern auf 7 Datenpunkte finalisiert (Drifts #5/#6/#7 hinzu);
Anti-Drift-Disziplin etabliert via
scripts/verify-auth-stack.sh
(57 Checks über 6 Schichten + 2 Realms, exit 0 = sauber) und
neuer Soll-Zustand-Doku
auth-stack-soll-zustand.md.
TODO-Platform-07 + Tenant-UI Scope-Patch (analog -06/-08) im selben
Lauf gefixt; tenant-ui erhielt erstmalig E2E-Anti-Regression-Specs.
Status /admin/operator/* und /tenant/* jetzt vollständig 🟢.
Stand reflektiert Block 7.4 (Audit-Log-Viewer + Bulk-Ops + Connectors-
Stub, Merge 0b93d60) als jüngsten relevanten Code-Stand. Block 7
ist mit diesem Merge vollständig abgeschlossen — alle Operator-UI-
Routen sind 🟢. Phase-B-Tail-Tasks: NPMplus-Path-Routing-Konsolidierung
(Block 14), Tier/Limits-UI (TODO-Block-7-3-01 → Block 12).