diff --git a/diagnostic/server.js b/diagnostic/server.js index 14d2f5b..88b8638 100644 --- a/diagnostic/server.js +++ b/diagnostic/server.js @@ -17,6 +17,7 @@ const { WebSocket, WebSocketServer } = require("ws"); const crypto = require("crypto"); const fs = require("fs"); const path = require("path"); +const os = require("os"); const vpn = require("./vpn"); // ── Konfiguration ─────────────────────────────────────── @@ -2630,6 +2631,33 @@ setInterval(checkDiskSpace, 30000); // Watchdog entfernt — war auf aria-core/OpenClaw zugeschnitten (doctor --fix, // docker restart aria-core). Der Brain-Loop bekommt seinen eigenen Health-Check. +// ── Netz-Waechter ─────────────────────────────────────── +// Die Diagnostic teilt das Netz der Bridge (network_mode: service:bridge). +// Startet die Bridge neu (z.B. Liveness-Self-Kill bei RVS-Ausfall), bleibt hier +// der alte Namensraum zurueck: nur noch lo, Port 3001 tot, der Container gilt +// aber weiter als "Up". Dann beenden wir uns; restart: unless-stopped startet +// uns neu, und Docker haengt uns ins aktuelle Netz der Bridge. +const NETZ_CHECK_MS = parseInt(process.env.DIAG_NETZ_CHECK_MS || "10000", 10); +const NETZ_MAX_FEHLT = 3; // mehrmals in Folge, damit die Bridge Zeit zum Hochkommen hat +function hatNetz() { + return Object.values(os.networkInterfaces()).flat().some((a) => !a.internal); +} +let netzGesehen = false; // ohne je Netz gehabt zu haben kein Beenden (z.B. lokal ohne Docker) +let netzFehlt = 0; +setInterval(() => { + if (hatNetz()) { + netzGesehen = true; + netzFehlt = 0; + return; + } + if (!netzGesehen) return; + netzFehlt++; + if (netzFehlt >= NETZ_MAX_FEHLT) { + log("error", "server", "Netz der Bridge verloren — beende mich, Docker startet mich neu"); + process.exit(1); + } +}, NETZ_CHECK_MS); + // ── HTTP Server + WebSocket fuer Browser ──────────────── // ── Modell-Downloads auf LLM-Boxen ──────────────────────────────────