diff --git a/docs/CODEX_KOMODO_5XX_2026-05-31.md b/docs/CODEX_KOMODO_5XX_2026-05-31.md new file mode 100644 index 0000000..9f9bf06 --- /dev/null +++ b/docs/CODEX_KOMODO_5XX_2026-05-31.md @@ -0,0 +1,123 @@ +# Codex-Prompt: Komodo 5xx-Spam Root-Cause + +Stand: 2026-05-31 +Auftraggeber: Operator +Vorarbeit: Claude (auto-mode), siehe Ermittlungsstand unten. + +## Auftrag + +`HomelabTraefik5xx` feuert dauerhaft fuer `service="komodo@docker"`. Quelle +finden, fixen, dokumentieren. Bitte einmal **bis zum Ende** durchziehen, nicht +nur eine Hypothese pruefen. + +## Vor Arbeitsbeginn lesen + +- `CLAUDE.md` +- `docs/WORKFLOW.md` +- `monitoring/prometheus/alerts.yml` +- `docs/ALERT_RULES.md` +- `ops/komodo/docker-compose.yml` +- `traefik/docker-compose.yml` +- `monitoring/prometheus/prometheus.yml` (Blackbox-Targets) +- `monitoring/blackbox/blackbox.yml` +- `ops/glance/config/glance.yml` (5 Komodo-URL-Stellen, **NICHT** die Quelle — siehe Ermittlung) + +## Ermittlungsstand (bereits geklaert) + +### Was gemessen wurde + +- Traefik-Access-Log: Source-IP ist **eure WAN-IP `217.249.121.39`** (Hairpin + aus dem Heimnetz). User-Agent leer (`"-"`). +- Muster: `GET /` 200 **alle 15s** + `GET /user` **500** alle 30s, plus + gelegentlich `POST /auth/login/GetLoginOptions` 200 und + `POST /read/GetCoreInfo` 500. +- Prometheus `sum by (code) (increase(traefik_service_requests_total{service="komodo@docker"}[5m]))`: + `200`=22, `500`=14 (Werte vom 2026-05-31 08:11 UTC). +- `docker logs komodo-core` ist still — keine internen Errors, nur normale + Execute-Requests. Komodo wirft den 500 also vermutlich auf Auth-Pfad + (`/user` ohne gueltige Session sollte `401` sein, nicht `500`). Das ist ein + Komodo-Bug-on-Top, **aber nicht die Frage**. + +### Ausgeschlossene Kandidaten (durch Test) + +- **Browser-Tabs** — User hat alle Komodo-Tabs zugemacht, Polling laeuft + weiter. +- **PWA auf Handy** — User hat keine. +- **Uptime-Kuma** — Container existiert nicht mehr. +- **Homepage** — entfernt. +- **Glance** — Test 2026-05-31 ~08:35 UTC: 130s gestoppt, 5xx-Rate + unveraendert (2/60s Baseline → 4/130s waehrend Stop). Trotz 5 Komodo-URL- + Eintraegen in `ops/glance/config/glance.yml` (search-shortcut Zeile 40, + bookmark Zeilen 131/768, monitor-Widget Zeile 237 mit `check-url: + http://komodo-core:9120`, docker-containers-Widget Zeile 725). Glance ist + raus. + +### Noch nicht getestete Kandidaten + +- **Posture-Check / cert-token-check.sh** (`services/posture-check/`) — koennte + periodisch Komodo-HTTPS pingen. 15s-/30s-Kadenz waere ungewoehnlich fuer + einen Cron-Job, aber pruefen. +- **Blackbox-Exporter** — pollt laut `monitoring/prometheus/prometheus.yml` + `https://komodo.kaleschke.info` alle 15s. Das erklaert den `GET / 200`- + Anteil sauber. Erklaert aber NICHT den `GET /user 500` 30s-Takt. +- **Komodo Periphery** — auf `komodo_net` und `frontend_net`. Sollte mit + Core via internes Netz reden, koennte aber per Misconfig die Public-URL + treffen. Logs noch nicht eingesehen. +- **Komodo Core selbst** mit `KOMODO_HOST=https://komodo.kaleschke.info` — + evtl. Self-Check via Public-URL. +- **Ein Gerat im LAN**, das wir noch nicht auf dem Schirm haben (zweiter + Rechner mit altem Tab, Smart-TV, etc.). + +### Was nicht geht + +- `tcpdump` fehlt auf dem Host. +- `conntrack` zeigt die Hairpin-Pakete nicht (NAT-Pre-Routing). + +## Naechste Schritte (Vorschlag) + +1. **Blackbox-Exporter ausschliessen**: Targets in `prometheus.yml` zeigen, + dass Blackbox NUR `https://komodo.kaleschke.info` pollt (also `/`, kein + `/user`). Bestaetigen. +2. **Posture-Check pruefen**: `services/posture-check/cert-token-check.sh` + lesen, Kadenz und Endpunkte protokollieren. Falls dort `/user` oder ein + 30s-Loop drin ist → Treffer. +3. **Periphery isolieren**: Periphery 2 min stoppen, Traefik-Log gegen- + checken. `docker stop komodo-periphery; sleep 130; ; docker + start komodo-periphery`. Vorsicht: Periphery-Down heisst Komodo-Deploy + funktioniert nicht — also nur kurz, kein Deploy in dem Fenster. +4. **Komodo-Core isolieren**: Wenn 1-3 nichts ergeben, Komodo-Core selbst 2 min + stoppen. Wenn Polling weiterlaeuft, ist der Client ausserhalb der Komodo- + Stack (LAN-Geraet). Wenn es aufhoert, polled Komodo Core sich selbst. +5. **LAN-Aufnahme via Komodo-Container**: Falls Container-Stack ausgeschlossen, + im komodo-core-Container per `ss -tnp state syn-recv` waehrend einer + typischen Polling-Sekunde mitschauen. Source-IP/Port der eingehenden + Connection liefert den Hairpin-Origin am genauesten. + +## Fix-Erwartung + +Sobald Quelle bekannt: + +- **Wenn Container im Stack**: Config so anpassen, dass die Anfrage intern + laeuft (kein Public-Hostname), inkl. Doku. +- **Wenn LAN-Geraet**: User informieren, was es ist; wenn moeglich Geraet + reparieren (Tab schliessen, App deinstallieren). Kein Repo-Change noetig. +- **Wenn nicht abstellbar**: separate Frage, ob `HomelabTraefik5xx` fuer + `service="komodo@docker"` mit einem Exclude versehen werden soll — aber nur + als letzter Ausweg. Default ist: Quelle fixen. + +## Doku am Ende + +- Eintrag in `docs/MIGRATION_LOG.md`: Datum, Symptom, Root-Cause, Fix, + Smoke-Test. +- Falls eine Glance-/Periphery-/sonstige Config-Aenderung noetig wird: + Standard-Loop (Commit → Push → Komodo-Deploy → Smoke), Co-Authored-By-Tag + mitgeben. + +## Regeln (nicht verhandelbar) + +- Git → Push → Komodo. Keine direkten Komodo-Edits. +- Stop/Start-Tests sind okay, aber nur kurz (≤ 3 min) und mit + Wiederanlauf-Schritt im selben Block. +- Secrets nicht ausgeben. +- Bei zwei gescheiterten Versuchen: stop, Pflichtmatrix aus + `docs/GITOPS_DRIFT_RUNBOOK.md`, Operator fragen.