{"prompt": "System: proxmox | Component: cloudflared\n\nSymptome:\n- Browser zeigt: 530 The origin has been unregistered from Argo Tunnel\n- cloudflared logs: 'failed to dial to edge with quic: timeout: no recent network activity'\n- Tunnel verbindet sich kurz (Registered), bricht dann sofort wieder ab\n- Betrifft alle Subdomains des Tunnels\n- Alle 4 connIndex fallen nacheinander aus\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: UDP Port 7844 (QUIC-Protokoll) wird vom NAT-Router oder einer Firewall gedroppt. cloudflared wählt standardmäßig QUIC, scheitert nach kurzer Idle-Zeit, reconnectet dauerhaft — 530-Fehler für Endnutzer.\n\nFix: **steps:**\n - 1. SSH auf cloudflared-Host\n - 2. /etc/systemd/system/cloudflared.service öffnen\n - 3. In ExecStart: '--protocol http2' vor 'tunnel run' einfügen\n - 4. systemctl daemon-reload && systemctl restart cloudflared\n - 5. Verify: journalctl -u cloudflared -n 5 | grep 'Registered' → alle connIndex zeigen protocol=http2\n\nPrevention: Bei jeder neuen cloudflared-Installation in NAT/Home-Lab-Umgebung sofort --protocol http2 setzen.", "rejected": "Starte den Service neu mit systemctl restart. Wenn das nicht hilft, reboote den Server."} {"prompt": "System: proxmox | Component: pvestatd\n\nSymptome:\n- Proxmox GUI: alle Graphs leer (CPU, Memory, Network, Disk IO)\n- CT/LXC/VM-Status-Icons fehlen oder zeigen falsche Farbe\n- API /nodes/pve/lxc/{id}/rrddata gibt nur 'time' zurück, keine Metriken\n- 'systemctl restart pvestatd' schlägt fehl mit: 'can't acquire lock'\n- Prozesszustand 'Ds' (D=uninterruptible sleep)\n- SIGKILL hat keine Wirkung\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: pvestatd-Prozess gerät in D-State beim Kernel-Aufruf free_pgtables. Tritt auf bei hoher I/O-Last (z.B. während Backup). SIGKILL kann D-State-Prozesse nicht beenden.\n\nFix: **steps:**\n - 1. Stuck PID finden: pid=$(pgrep pvestatd | head -1)\n - 2. Prozess aus Cgroup verschieben: echo $pid > /sys/fs/cgroup/cgroup.procs\n - 3. Lock-Files entfernen: rm -f /var/run/pvestatd.pid.lock /var/run/pvestatd.pid\n - 4. Service reset + start: systemctl reset-failed pvestatd && systemctl start pvestatd\n**note:** Echter Fix nur via Reboot. Cgroup-Trick ermöglicht neuen pvestatd-Start ohne Reboot.\n\nPrevention: Reboot des Proxmox-Hosts nach schweren Backup-Windows empfohlen.", "rejected": "Starte den Service neu mit systemctl restart. Wenn das nicht hilft, reboote den Server."} {"prompt": "System: proxmox | Component: opnsense-disk\n\nSymptome:\n- Disk-Nutzung nahe dem Limit\n- OPNsense Web UI zeigt Warnung über Speicherplatz\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: OPNsense akkumuliert Suricata JSON-Logs, filterlog, dnsmasq-Logs, pkg-Cache und temporäre Dateien.\n\nFix: **steps:**\n - 1. Alte Logs: find /var/log -name '*.log' -mtime +7 -delete\n - 2. Suricata: find /var/log/suricata -name '*.json' -mtime +3 -delete\n - 3. Temp: find /tmp /var/tmp -mtime +1 -delete\n - 4. Pkg-Cache: pkg clean -y\n\nPrevention: Automatisches Cleanup-Script als cron einrichten wenn Disk >75%.", "rejected": "Das ist vermutlich ein temporäres Problem. Ignoriere es erstmal."} {"prompt": "System: proxmox | Component: swap\n\nSymptome:\n- SWAP usage 77% bei nur 28% RAM-Nutzung\n- Prozesse wurden bei früherer Last ausgelagert und nicht zurückgeholt\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Linux Standard-Swappiness von 60 lagert Pages aus auch wenn RAM verfügbar. Bei 62GB RAM zu aggressiv.\n\nFix: **immediate:** swapoff -a && swapon -a (nur wenn RAM < 50%)\n**permanent:** echo 'vm.swappiness=10' >> /etc/sysctl.conf && sysctl vm.swappiness=10\n\nPrevention: vm.swappiness=10 auf allen Servern mit >16GB RAM setzen.", "rejected": "Das ist vermutlich ein temporäres Problem. Ignoriere es erstmal."} {"prompt": "System: proxmox | Component: backup-load\n\nSymptome:\n- Load Average 60+ auf 22-CPU System\n- SSH extrem langsam\n- pvestatd und andere Services gehen in D-State\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: vzdump ohne I/O-Limit liest/schreibt massiv auf Disk. Kaskadiert mit Tunnel-Reconnect und D-State-Prozessen.\n\nFix: **permanent:**\n - bwlimit: 50000 in /etc/vzdump.conf\n - ionice: 7 (idle I/O priority)\n - Kompression: lzo statt gzip\n - Backup-Zeiten auf Nacht verschieben\n\nPrevention: vzdump.conf: ionice: 7 und bwlimit setzen. Backups in Maintenance-Fenster.", "rejected": "Keine Aktion nötig."} {"prompt": "System: ctxevent | Component: database-auth\n\nSymptome:\n- Admin und Participant login: Internal server error\n- Fehler: SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: DATABASE_URL enthielt falschen PostgreSQL-User (renefichtmueller statt ctxmeet). PrismaPg/SCRAM-SHA-256 erfordert zwingend Passwort-String.\n\nFix: **steps:**\n - 1. PostgreSQL-Rollen prüfen: sudo -u postgres psql -c '\\du'\n - 2. Korrekten User mit Passwort in DATABASE_URL: postgresql://ctxmeet:@localhost:5432/ctxmeet\n - 3. PM2 restart mit --update-env Flag\n\nPrevention: DATABASE_URL IMMER mit Passwort setzen. Korrekte DB-User dokumentieren.", "rejected": "Starte den Service neu mit systemctl restart. Wenn das nicht hilft, reboote den Server."} {"prompt": "System: ctxevent | Component: prisma-schema\n\nSymptome:\n- 'prisma migrate status' zeigt 'up to date'\n- Spalten fehlen: twoFactorFailCount, twoFactorLockedUntil, recoveryCodesHash\n- Fehler: P2022: The column does not exist\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Migrationen als 'applied' markiert, aber SQL nie korrekt ausgeführt. prisma migrate status lügt.\n\nFix: **steps:**\n - 1. Echten DB-Stand prüfen: \\d 'TableName' in psql\n - 2. Force-Push Schema: npx prisma db push\n - 3. Clean rebuild: rm -rf .next && npx prisma generate && npm run build\n\nPrevention: IMMER echten DB-Stand mit \\d verifizieren, nicht nur prisma migrate status.", "rejected": "Starte den Service neu mit systemctl restart. Wenn das nicht hilft, reboote den Server."} {"prompt": "System: ctxevent | Component: table-ownership\n\nSymptome:\n- prisma db push: permission denied for table\n- Tabellen gehören 'postgres' statt App-User\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Tabellen von postgres Superuser erstellt. App-User hat keine ALTER-Rechte.\n\nFix: **sql:** DO $$ DECLARE r RECORD; BEGIN FOR r IN SELECT tablename FROM pg_tables WHERE schemaname='public' AND tableowner != 'ctxmeet' LOOP EXECUTE format('ALTER TABLE %I OWNER TO ctxmeet', r.tablename); END LOOP; END $$;\n\nPrevention: Alle DB-Operationen immer als App-User, nie als postgres.", "rejected": "Prüfe die Logs und starte den Dienst neu. Das Problem sollte sich von selbst lösen."} {"prompt": "System: ctxevent | Component: pm2-env\n\nSymptome:\n- Neuer .env Wert wird ignoriert\n- App-Verhalten passt nicht zu .env\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: PM2 cached Umgebungsvariablen beim ersten Start. Ohne --update-env werden Änderungen ignoriert.\n\nFix: **command:** pm2 restart --update-env\n\nPrevention: IMMER --update-env bei pm2 restart verwenden.", "rejected": "Prüfe die Logs und starte den Dienst neu. Das Problem sollte sich von selbst lösen."} {"prompt": "System: erik-server | Component: sshd\n\nSymptome:\n- SSH Port 22: Connection refused\n- sshd -t: 'no argument after keyword'\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Fehlerhafte Zeile in sshd_config (Copy-Paste Unfall) + fehlender /run/sshd Ordner.\n\nFix: **steps:**\n - 1. IONOS VNC Console nutzen (direkte noVNC URL, nicht iframe)\n - 2. Fehlerhafte Zeile entfernen: sed -i 'Nd' /etc/ssh/sshd_config\n - 3. mkdir -p /run/sshd\n - 4. sshd -t (Config testen)\n - 5. systemctl start ssh\n - 6. Permanent: echo 'd /run/sshd 0755 root root -' > /etc/tmpfiles.d/sshd.conf\n\nPrevention: IMMER sshd -t vor restart. /run/sshd in tmpfiles.d. Min. 2 SSH-Pfade zu jedem Server.", "rejected": "Starte den Service neu mit systemctl restart. Wenn das nicht hilft, reboote den Server."} {"prompt": "System: network | Component: cisco-stp\n\nSymptome:\n- GE2 cycling LOOPBACKDET alle 30s\n- MAC-Tabelle flusht\n- 171ms interne Latenz\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: FritzBox reflektiert BPDUs → Switch erkennt eigene BPDUs als Loop → Port deaktiviert → MAC flush.\n\nFix: **action:** spanning-tree disable auf GE2 (FritzBox Uplink)\n\nPrevention: Bei Consumer-Router-Uplinks STP IMMER deaktivieren.", "rejected": "Prüfe die Logs und starte den Dienst neu. Das Problem sollte sich von selbst lösen."} {"prompt": "System: network | Component: vlan-starlink\n\nSymptome:\n- 100.64.x.x Adressen im LAN\n- DHCP-Konflikte\n- Falsche Default Routes\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Starlink ohne VLAN sendet CGNAT DHCP ins Management-LAN.\n\nFix: **steps:**\n - 1. VLAN anlegen: vlan 30 name Starlink-WAN (eine Zeile!)\n - 2. GE12 als Access auf VLAN 30\n - 3. STP auf GE12 deaktivieren\n**note:** Cisco SG350 VLAN Syntax: 'vlan X name Y' in EINER Zeile\n\nPrevention: Starlink IMMER in dediziertes VLAN.", "rejected": "Prüfe die Logs und starte den Dienst neu. Das Problem sollte sich von selbst lösen."} {"prompt": "System: network | Component: aruba-reset\n\nSymptome:\n- Kein Ping, HTTP, SSH nach Factory Reset\n- L2-Forwarding funktioniert aber Management nicht\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Factory Reset setzt Aruba in Cloud-Provisioning-Modus. Lokales Management erst nach Cloud-Registrierung.\n\nFix: **action:** Cloud Portal → portal.instant-on.hpe.com → Add Device → Serial\n**warning:** NIE Factory Reset zur Lösung von Login-Problemen\n\nPrevention: Aruba nie per Factory Reset troubleshooten.", "rejected": "Das ist vermutlich ein temporäres Problem. Ignoriere es erstmal."} {"prompt": "System: opnsense | Component: config-restore\n\nSymptome:\n- WAN auf falschem vtnet Interface\n- DHCP auf falschem Subnet\n- Kein Internet\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Blinder Revert auf alte Config hat falsche Interface-Zuordnung und falsches Subnet.\n\nFix: **steps:**\n - 1. VM stoppen\n - 2. LVM-Disk mounten (UFS2)\n - 3. config.xml.bak (letzte gute Config) als config.xml verwenden\n - 4. Interface-Zuordnungen verifizieren (vtnet0=LAN, vtnet1=WAN)\n - 5. Unmount + VM starten\n\nPrevention: VOR jedem Revert die .bak Datei inspizieren. Interfaces verifizieren.", "rejected": "Starte den Service neu mit systemctl restart. Wenn das nicht hilft, reboote den Server."} {"prompt": "System: opnsense | Component: boot-issues\n\nSymptome:\n- LAN-Zugang fehlt nach Boot\n- SSH nicht erreichbar\n- Web UI geblockt\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Drei Boot-Probleme: LAN-Route fehlt, SSH noauto=1, pf blockiert.\n\nFix: **steps:**\n - 1. configctl interface reconfigure lan\n - 2. SSH: noauto=0 in config.xml\n - 3. pf: pfctl -d && configctl filter reload\n\nPrevention: SSH autostart auf noauto=0. LAN-Route in Monitoring.", "rejected": "Prüfe die Logs und starte den Dienst neu. Das Problem sollte sich von selbst lösen."} {"prompt": "System: peercortex | Component: cache-null\n\nSymptome:\n- ASN-Lookup zeigt 0 Neighbours/Prefixes\n- Werte bleiben 15min auf 0\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Fehlgeschlagene RIPE Stat Responses (null) wurden gecacht.\n\nFix: **rule:** NIEMALS null-Responses cachen: if (result !== null) cache.set(key, result)\n\nPrevention: Cache-Implementierung muss null/error explizit ausschließen.", "rejected": "Prüfe die Logs und starte den Dienst neu. Das Problem sollte sich von selbst lösen."} {"prompt": "System: peercortex | Component: api-timeout\n\nSymptome:\n- Lookups für AS174 (Cogent) etc. geben leere Ergebnisse\n- Timeout nach 30s\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: 30s Timeout zu kurz für Tier-1 mit 5000+ Neighbours.\n\nFix: **change:** Timeout von 30s auf 45s erhöhen\n\nPrevention: API-Timeouts nach Worst-Case kalibrieren.", "rejected": "Prüfe die Logs und starte den Dienst neu. Das Problem sollte sich von selbst lösen."} {"prompt": "System: peercortex | Component: api-ratelimit\n\nSymptome:\n- HTTP 429 Too Many Requests\n- Hunderte parallele Requests\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: Kein Concurrency-Limit auf externe API-Calls.\n\nFix: **steps:**\n - Semaphore PeeringDB: max 5 concurrent\n - Semaphore RIPE Stat: max 15 concurrent\n - Retry mit Backoff bei 429\n\nPrevention: IMMER Semaphore auf externe API-Calls. Standard: 5-15.", "rejected": "Prüfe die Logs und starte den Dienst neu. Das Problem sollte sich von selbst lösen."} {"prompt": "System: peercortex | Component: css-injection\n\nSymptome:\n- SyntaxError im CSS-Parser\n- Styles nicht korrekt\n\nWas ist die Root Cause und wie fixe ich das?", "chosen": "Root Cause: CSS als JS-String statt in