mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-02 10:52:22 +00:00
docs: review Monitor documentation in all seven translations
This commit is contained in:
@@ -0,0 +1,396 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox-Dashboard-Authentifizierung — 2FA, API-Tokens, Benutzerprofil, Reverse-Proxy | ProxMenux Monitor",
|
||||
"description": "Zugriff und Schutz für ProxMenux Monitor: Ersteinrichtung, Passwort mit Anzeigename und Avatar, Profilseite, TOTP-2FA, langlebige API-Tokens, HTTPS, Beispiele für Nginx/Caddy/Traefik, Audit-Protokoll und optionale Fail2Ban-Jail.",
|
||||
"ogTitle": "Proxmox-Dashboard-Authentifizierung — 2FA, API-Tokens, Reverse-Proxy",
|
||||
"ogDescription": "ProxMenux Monitor mit Passwort, TOTP-2FA, langlebigen API-Tokens, HTTPS, Reverse-Proxy-Beispielen und optionaler Fail2Ban-Jail schützen.",
|
||||
"twitterTitle": "Proxmox Dashboard-Authentifizierung | ProxMenux Monitor",
|
||||
"twitterDescription": "Passwort + TOTP 2FA, API Token, HTTPS, Nginx/Caddy/Traefik Snippets und Audit Log."
|
||||
},
|
||||
"header": {
|
||||
"title": "Zugriff und Authentifizierung",
|
||||
"description": "Dashboard-Zugriff, Ersteinrichtung und Schutzschichten: Passwort und TOTP, JWT-Sitzungen, langlebige API-Tokens, HTTPS, Reverse-Proxys, Secure Gateway und optionale Fail2Ban-Jail.",
|
||||
"section": "ProxMenux-Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Authentifizierung ist optional",
|
||||
"body": "Beim ersten Start zeigt das Dashboard den Dialog <em>„Dashboard schützen?“</em> mit den Schaltflächen <strong>Ja, Passwort einrichten</strong> und <strong>Nein, ohne Schutz fortfahren</strong>. Bei der zweiten Option bleiben die API-Endpunkte über TCP 8008 offen. Das kann für ein isoliertes Labor-LAN ausreichen, ist in anderen Umgebungen jedoch gefährlich. Die Zwei-Faktor-Authentifizierung (2FA) ist <strong>nicht</strong> Teil dieser ersten Auswahl; sie wird nach dem Einrichten eines Passworts unter <strong>Sicherheit</strong> konfiguriert."
|
||||
},
|
||||
"reaching": {
|
||||
"heading": "Dashboard öffnen",
|
||||
"intro": "ProxMenux Monitor lauscht auf <code>0.0.0.0:8008</code>. Drei übliche Zugriffswege:",
|
||||
"outro": "Direktzugriff entspricht der Standard-systemd-Unit. Reverse-Proxy und Secure Gateway werden unten beschrieben. Client-IPs aus <code>X-Forwarded-For</code> werden nur mit PROXMENUX_TRUST_PROXY=1 und einem von Ihnen kontrollierten Proxy verwendet. <code>X-Forwarded-Proto</code> oder <code>X-Forwarded-Host</code> allein aktivieren dieses Vertrauen nicht; das Frontend erstellt API-URLs aus dem Ursprung des Browsers."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Ablauf beim ersten Start",
|
||||
"intro": "Beim ersten Öffnen ruft das Frontend <code>GET /api/auth/status</code> auf. Wurde die Authentifizierung noch nie eingerichtet (<code>configured: false</code>), erscheint <em>„Dashboard schützen?“</em> mit zwei Optionen:",
|
||||
"imageAlt": "Ersteinrichtungsdialog „Dashboard schützen?“ mit „Ja, Passwort einrichten“ und „Nein, ohne Schutz fortfahren“",
|
||||
"imageCaption": "Authentifizierung beim ersten Start: Passwortschutz einrichten oder überspringen. Erscheint nach einer Neuinstallation oder nach „Authentifizierung deaktivieren“ in den Einstellungen erneut.",
|
||||
"headerButton": "Schaltfläche",
|
||||
"headerWhat": "Was passiert",
|
||||
"headerApi": "API-Aufruf",
|
||||
"rows": [
|
||||
{
|
||||
"button": "Ja, Passwort einrichten",
|
||||
"what": "Öffnet ein Formular mit verpflichtendem Benutzernamen und Passwort sowie optionalem <em>Anzeigenamen</em> und <em>Avatarbild</em>. Aktiviert die Authentifizierung in <code>auth.json</code> mit <code>enabled: true</code> und gibt ein JWT zur Anmeldung zurück. Optionale Profilfelder werden durch weitere Aufrufe gespeichert, wie unten beschrieben.",
|
||||
"api": "POST /api/auth/setup"
|
||||
},
|
||||
{
|
||||
"button": "Nein, fahren Sie ohne Schutz fort",
|
||||
"what": "Markiert <code>declined: true</code> in <code>auth.json</code>. Jeder API-Endpunkt ist öffentlich zugänglich, bis Sie Ihre Meinung über Einstellungen ändern.",
|
||||
"api": "POST /api/auth/skip"
|
||||
}
|
||||
],
|
||||
"twofaCalloutTitle": "2FA wird später konfiguriert, nicht hier",
|
||||
"twofaCalloutBody": "Der erste Dialog entscheidet nur über den Passwortschutz. <strong>Zwei-Faktor-Authentifizierung (TOTP)</strong> richten Sie danach unter <strong>Sicherheit</strong> ein, sobald Sie mit Passwort angemeldet sind. Die vollständige Anleitung folgt weiter unten.",
|
||||
"createTitle": "Erstellen des ersten Benutzers",
|
||||
"createIntro": "Mit <em>Ja, Passwort einrichten</em> öffnen Sie ein Formular für Konto und optionales Profil. So erscheint der Avatar direkt nach dem Speichern im Kopfbereich. Die Felder:",
|
||||
"headerField": "Feld",
|
||||
"headerRequired": "Erforderlich",
|
||||
"headerNotes": "Notizen",
|
||||
"fieldRows": [
|
||||
{
|
||||
"field": "Benutzername",
|
||||
"required": "Ja",
|
||||
"notes": "Kennung zur Anmeldung. Später nicht über die Oberfläche änderbar; dafür muss <code>auth.json</code> direkt bearbeitet werden."
|
||||
},
|
||||
{
|
||||
"field": "Passwort",
|
||||
"required": "Ja",
|
||||
"notes": "Mindestens 10 Zeichen aus mindestens 3 von 4 Kategorien: Kleinbuchstaben, Großbuchstaben, Ziffern und Symbole. Offensichtliche Passwörter wie <code>password</code>, <code>12345678</code> oder <code>proxmenux</code> werden abgelehnt. Dieselben Regeln gelten serverseitig und lassen sich nicht per curl umgehen."
|
||||
},
|
||||
{
|
||||
"field": "Anzeigename",
|
||||
"required": "Nein",
|
||||
"notes": "Name im Menü des Kopfbereichs und auf der Profilseite. Ohne Angabe wird der Benutzername verwendet. Später über <strong>Avatar → Profil ansehen</strong> änderbar."
|
||||
},
|
||||
{
|
||||
"field": "Avatarbild",
|
||||
"required": "Nein",
|
||||
"notes": "PNG, JPEG, WebP oder GIF bis 2 MB. Erscheint als Kreis im Kopfbereich und im Profil. Ohne Bild wird der erste Buchstabe des Anzeigenamens oder Benutzernamens auf farbigem Hintergrund gezeigt. Im Profil können Sie das Bild später hochladen, ersetzen oder entfernen."
|
||||
}
|
||||
],
|
||||
"createImageAlt": "Formular mit verpflichtendem Benutzernamen und Passwort sowie optionalem Anzeigenamen und Avatar-Upload",
|
||||
"createImageCaption": "Formular zur Ersteinrichtung. Anzeigename und Avatar sind optional. Ohne Angaben wird das Konto angelegt und im Kopfbereich ein Kreis mit einem Buchstaben angezeigt.",
|
||||
"saveCalloutTitle": "Einmal speichern, bis zu drei API-Aufrufe",
|
||||
"saveCalloutBody": "Zuerst sendet das Formular <code>POST /api/auth/setup</code> mit Benutzername und Passwort. Mit dem neuen JWT folgen gegebenenfalls <code>PUT /api/auth/profile</code> für den Anzeigenamen und <code>POST /api/auth/profile/avatar</code> für das Bild. Fehler beim Profil verhindern die Kontoerstellung nicht; das Profil lässt sich später ergänzen.",
|
||||
"avatarTitle": "Avatar-Menü und Profilseite",
|
||||
"avatarBody1": "Nach der Einrichtung erscheint oben rechts neben dem Designschalter ein Avatar. Sein Menü führt zum Profil und zur Sicherheit und bietet <strong>Abmelden</strong>. Eine Abmeldung ist auch unter Sicherheit möglich.",
|
||||
"avatarBody2": "Die Profilseite zeigt eine Avatarvorschau, den schreibgeschützten Benutzernamen und den bearbeitbaren Anzeigenamen. Avatar-Uploads, Ersetzungen und Löschungen erfolgen atomar; der Avatar im Kopfbereich aktualisiert sich nach Erfolg ohne Neuladen. Ersteinrichtung und Profilseite verwenden die nachfolgend beschriebenen Endpunkte.",
|
||||
"profileImageAlt": "Profilseite mit Avatarvorschau, Schaltflächen zum Hochladen, Ersetzen und Entfernen, schreibgeschütztem Benutzernamen und bearbeitbarem Anzeigenamen",
|
||||
"profileImageCaption": "Die dedizierte Profilseite. Benutzername ist schreibgeschützt; Anzeigename und Avatar können von hier aus bearbeitet werden, ohne die Registerkarte Sicherheit zu berühren.",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerEpWhat": "Was es tut",
|
||||
"endpointRows": [
|
||||
{
|
||||
"endpoint": "GET /api/auth/profile",
|
||||
"what": "Gibt den aktuellen Benutzernamen, den Anzeigenamen und ob ein Avatar gesetzt ist (<code>has_avatar</code>, <code>avatar_mtime</code>) zurück."
|
||||
},
|
||||
{
|
||||
"endpoint": "PUT /api/auth/profile",
|
||||
"what": "Aktualisiert den Anzeigenamen. Anfrageinhalt: <code>'{' \"display_name\": \"...\" '}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "GET /api/auth/profile/avatar",
|
||||
"what": "Gibt das Avatarbild als PNG / JPEG / WebP / GIF mit passendem Inhaltstyp zurück. Benötigt den Bearer-Header; das Frontend lädt einen Blob und erzeugt daraus eine lokale Objekt-URL."
|
||||
},
|
||||
{
|
||||
"endpoint": "POST /api/auth/profile/avatar",
|
||||
"what": "Ladet einen neuen Avatar hoch (max 2 MB). Der Inhaltstyp muss der Datei entsprechen. Der alte Avatar wird atomar ersetzt."
|
||||
},
|
||||
{
|
||||
"endpoint": "DELETE /api/auth/profile/avatar",
|
||||
"what": "Entfernt den Avatar. Im Kopfbereich erscheint wieder eine Initiale in einem farbigen Kreis."
|
||||
}
|
||||
],
|
||||
"reversibleTitle": "Der Verzicht auf Schutz lässt sich später ändern",
|
||||
"reversibleBody": "Nach <em>Nein, ohne Schutz fortfahren</em> erscheint der Dialog nicht erneut. Aktivieren Sie die Authentifizierung unter <strong>Sicherheit</strong> oder bearbeiten Sie <code>/root/.config/proxmenux-monitor/auth.json</code>, entfernen Sie das Flag <code>declined</code> und starten Sie den Dienst neu."
|
||||
},
|
||||
"password": {
|
||||
"heading": "Passwort-Authentifizierung",
|
||||
"intro": "Nach der Einrichtung benötigen geschützte API-Aufrufe ein JWT in <code>Authorization: Bearer <token></code>:",
|
||||
"items": [
|
||||
"<strong>Sitzungstoken zur Anmeldung:</strong> 24 Stunden gültig. Ausgestellt über <code>POST /api/auth/login</code>.",
|
||||
"<strong>API-Token für Integrationen:</strong> 365 Tage gültig. Ausgestellt über <code>POST /api/auth/generate-api-token</code>. Weitere Informationen im nächsten Abschnitt."
|
||||
],
|
||||
"loginImageAlt": "Anmeldebildschirm nach der Konfiguration der Authentifizierung angezeigt - Benutzername und Passwortfelder",
|
||||
"loginImageCaption": "Sobald die Authentifizierung konfiguriert ist, beginnt hier jeder Besuch des Dashboards. Wenn 2FA aktiviert ist, fragt der Bildschirm in einem zweiten Schritt nach dem akzeptierten Passwort nach dem 6-stelligen Code.",
|
||||
"loginFlowTitle": "Loginfluss",
|
||||
"twofaIntro": "Mit 2FA antwortet derselbe Aufruf zunächst mit <code>requires_totp: true</code>. Senden Sie ihn erneut mit dem sechsstelligen Code:",
|
||||
"publicTitle": "Öffentlicher Zugriff und geschützte Prüfungen",
|
||||
"publicIntro": "Anmeldung und Authentifizierungsstatus sind öffentlich. Die Ersteinrichtung ist möglich, solange Benutzername und Passwort fehlen, auch nach abgelehntem Schutz. Systemdaten benötigen bei aktiviertem Schutz eine Authentifizierung:",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code> und <code>/api/auth/status</code> sind öffentlich. <code>/api/auth/setup</code> erstellt das erste Konto und lehnt das Überschreiben vorhandener Zugangsdaten ab.",
|
||||
"<code>/api/system-info</code> ist ein öffentlicher Endpunkt für grundlegende Systemdaten einschließlich <code>health.status</code>. Er verlangt kein Token. Auch /api/auth/status ist öffentlich und eignet sich für eine Erreichbarkeitsprüfung."
|
||||
],
|
||||
"cryptoTitle": "Kryptographie und Speicherung",
|
||||
"cryptoIntro": "ProxMenux Monitor ist Open Source – nichts davon ist geheim. Die Dokumentation des Stacks hier ist eine bewusste Entscheidung: Betreiber, die Anmeldeinformationen auf ihrem Host speichern, verdienen es zu wissen, wie diese Anmeldeinformationen geschützt sind, bevor sie sich entscheiden, ihnen zu vertrauen. Die folgenden Algorithmen sind die gleichen, die der Code in <code>scripts/auth_manager.py</code> verwendet; dieser Abschnitt ist ein Vertrag, kein Marketingversprechen.",
|
||||
"headerAsset": "Datenelement",
|
||||
"headerAlgo": "Algorithmus",
|
||||
"headerWhere": "Speicherort",
|
||||
"cryptoRows": [
|
||||
{
|
||||
"asset": "Passwort",
|
||||
"algorithm": "PBKDF2-HMAC-SHA256 mit einem Zufallssalz pro Passwort und einer hohen Iterationszahl (OWASP 2023+ Baseline). Speichert als <code>pbkdf2_sha256$<iters>$<salt>$<hash></code>.",
|
||||
"where": "<code>auth.json</code> → <code>password_hash</code>"
|
||||
},
|
||||
{
|
||||
"asset": "Sitzung / API JWT",
|
||||
"algorithm": "HS256 mit einem pro Installation beim ersten Start erzeugten Geheimnis (<code>secrets.token_urlsafe</code>, ≥48 Byte). Tokens enthalten die Angaben <code>iss=proxmenux-monitor</code> und <code>aud=api</code>; die Signatur wird bei jeder Anfrage mit dem aktuellen Geheimnis geprüft.",
|
||||
"where": "Geheimnis: <code>auth.json</code> → <code>jwt_secret</code>. JWT selbst: nur auf dem Client."
|
||||
},
|
||||
{
|
||||
"asset": "API Token Metadaten",
|
||||
"algorithm": "Der SHA-256-Hash des JWT wird mit dem Fingerabdruck <code>signed_with</code> des verwendeten <code>jwt_secret</code> gespeichert. Damit lassen sich Token-Metadaten anzeigen und Tokens nach einem Wechsel des Signaturgeheimnisses erkennen.",
|
||||
"where": "<code>auth.json</code> → <code>api_tokens[]</code>"
|
||||
},
|
||||
{
|
||||
"asset": "2FA-TOTP-Geheimnis",
|
||||
"algorithm": "Standard-TOTP (RFC 6238) mit Base32-kodiertem Geheimnis. Die acht Wiederherstellungscodes sind einmalig und werden als SHA-256-Hashes gespeichert.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
"asset": "Widerrufe",
|
||||
"algorithm": "Bei Widerruf eines Tokens oder einer Sitzung wird dessen SHA-256-Hash in eine Sperrliste aufgenommen, die bei jeder Prüfung berücksichtigt wird. Eine etwa 30 Sekunden gültige Speicherkopie vermeidet häufige Datenträgerzugriffe.",
|
||||
"where": "<code>auth.json</code> → <code>revoked_tokens[]</code>"
|
||||
}
|
||||
],
|
||||
"authJsonTitle": "auth.json - was es enthält und wie es geschützt ist",
|
||||
"authJsonBody": "Die Authentifizierungsdaten liegen in <code>/root/.config/proxmenux-monitor/auth.json</code>, mit Modus <code>0600</code> und Eigentümer <code>root</code>. Die Datei enthält <em>Hashes</em> (PBKDF2) und <em>geheimes Schlüsselmaterial</em> (<code>jwt_secret</code>, <code>totp_secret</code>), niemals das Klartextpasswort. Sichern oder replizieren Sie den Host nur auf ein verschlüsseltes Ziel und nehmen Sie diese Datei niemals in die Versionsverwaltung auf.",
|
||||
"rotateTitle": "Ein Wechsel von jwt_secret macht bestehende JWTs ungültig",
|
||||
"rotateBody": "Wird <code>auth.json</code> neu erstellt oder mit einem anderen Geheimnis wiederhergestellt, ändert sich <code>jwt_secret</code>. Bisherige Sitzungs- und API-Tokens scheitern dann mit „Invalid or expired token“. Die Oberfläche kennzeichnet betroffene Tokens mit <strong>Ungültig — neu erstellen</strong>. Widerrufen und ersetzen Sie sie auch in Home Assistant, Skripten und anderen Clients.",
|
||||
"recoverTitle": "Wiederherstellen eines verlorenen Passworts",
|
||||
"recoverIntro": "Es gibt keinen Online-Fluss für \"Passwort vergessen\" - von Grund auf, da das Dashboard auf dem eigenen Host des Betreibers läuft und der Wiederherstellungspfad Shell-Zugriff auf diesen Host ist. ProxMenux liefert einen geführten Reset im Konfigurationsmenü, sodass Sie <code>auth.json</code> nicht von Hand bearbeiten müssen:",
|
||||
"survivesTitle": "Was den Reset überlebt",
|
||||
"survivesBody": "Die interaktive Anmeldung wird gelöscht, <code>jwt_secret</code> und registrierte <code>api_tokens</code> bleiben erhalten. Home Assistant und andere Integrationen können ihre Tokens weiterverwenden. Für einen vollständigen Neustart samt neuem Signaturgeheimnis <code>auth.json</code> manuell löschen und den Dienst neu starten. Dann sind alle alten Tokens ungültig.",
|
||||
"physicalTitle": "Voraussetzung für den physischen Zugang",
|
||||
"physicalBody": "Erfordert eine <strong>Root-Shell auf dem Host</strong>. Wer <code>menu</code> als root ausführen kann, besitzt bereits vollständige Kontrolle; die Passwortzurücksetzung erweitert seine Rechte nicht. Ein Monitor-Passwort schützt den Host daher nicht vor Personen mit unberechtigtem Root-Zugang."
|
||||
},
|
||||
"twofa": {
|
||||
"heading": "Zwei-Faktor-Authentifizierung (TOTP)",
|
||||
"intro": "2FA fügt Ihrem Passwort einen zweiten Faktor hinzu: einen 6-stelligen Code, der alle 30 Sekunden rotiert und auf einem von Ihnen kontrollierten Telefon- oder Passwortmanager generiert wird. Selbst wenn jemand das Passwort erhält, kann er sich immer noch nicht ohne den Code von Ihrem Gerät anmelden. ProxMenux Monitor implementiert das Standard-Protokoll <strong>TOTP</strong> (RFC 6238), so dass jede Authentifizierungs-App funktioniert.",
|
||||
"pickTitle": "Wählen Sie eine Authenticator App",
|
||||
"pickIntro": "Eine vorhandene TOTP-App können Sie weiterverwenden. Die Tabelle nennt übliche Optionen: einige kostenlos, andere mit Abonnement. Plattformen und Sicherungsverfahren unterscheiden sich ebenfalls.",
|
||||
"headerApp": "App",
|
||||
"headerPlatforms": "Plattformen",
|
||||
"headerAppNotes": "Notizen",
|
||||
"apps": [
|
||||
{
|
||||
"name": "Google Authenticator",
|
||||
"href": "https://safety.google/authentication/",
|
||||
"platforms": "iOS, Android",
|
||||
"notes": "Der Standard für viele Benutzer. Optionales Google-Konto Cloud-Backup."
|
||||
},
|
||||
{
|
||||
"name": "Microsoft Authenticator",
|
||||
"href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app",
|
||||
"platforms": "iOS, Android",
|
||||
"notes": "Microsoft-Account Backup. Behandelt auch MS-Push-Benachrichtigungen, wenn Sie sie bei der Arbeit verwenden."
|
||||
},
|
||||
{
|
||||
"name": "Authy",
|
||||
"href": "https://authy.com/",
|
||||
"platforms": "iOS, Android",
|
||||
"notes": "Verschlüsselte Synchronisierung zwischen Geräten. Die Desktop-App wird seit dem 19. März 2024 nicht mehr unterstützt."
|
||||
},
|
||||
{
|
||||
"name": "Apple Passwords",
|
||||
"href": "https://support.apple.com/guide/passwords/welcome/mac",
|
||||
"platforms": "iOS, iPadOS, macOS, visionOS, Windows (über iCloud)",
|
||||
"notes": "In Apple-Betriebssystemen enthalten; eigenständige Passwords-App seit iOS 18 / macOS Sequoia. Speichert TOTP neben dem Passwort und synchronisiert über den iCloud-Schlüsselbund."
|
||||
},
|
||||
{
|
||||
"name": "Bitwarden",
|
||||
"href": "https://bitwarden.com/",
|
||||
"platforms": "iOS, Android, Desktop, Browser",
|
||||
"notes": "Open Source. TOTP kann im Passworttresor neben Passwörtern gespeichert werden. Das ist praktisch, bietet aber keine Trennung auf ein zweites Gerät."
|
||||
},
|
||||
{
|
||||
"name": "1Password",
|
||||
"href": "https://1password.com/",
|
||||
"platforms": "iOS, Android, Desktop, Browser",
|
||||
"notes": "Wie Bitwarden: TOTP im Passworttresor. Kostenpflichtiges Abonnement."
|
||||
},
|
||||
{
|
||||
"name": "Aegis Authenticator",
|
||||
"href": "https://getaegis.app/",
|
||||
"platforms": "Android",
|
||||
"notes": "Open Source. Verschlüsselte Backup-Datei auf dem Gerät, die Sie kontrollieren. Keine Cloud, kein Account erforderlich."
|
||||
},
|
||||
{
|
||||
"name": "Raivo OTP",
|
||||
"href": "https://raivo-otp.com/",
|
||||
"platforms": "iOS, macOS",
|
||||
"notes": "Open Source. Optionale iCloud Sync. Das Apple-Ökosystem Pendant zu Aegis."
|
||||
},
|
||||
{
|
||||
"name": "Ente Auth",
|
||||
"href": "https://ente.io/auth/",
|
||||
"platforms": "iOS, Android, Desktop, Web",
|
||||
"notes": "Open Source. Ende-zu-Ende verschlüsselte Cloud-Synchronisierung über Geräte hinweg."
|
||||
},
|
||||
{
|
||||
"name": "2FAS",
|
||||
"href": "https://2fas.com/",
|
||||
"platforms": "iOS, Android, Browsererweiterung",
|
||||
"notes": "Open Source. Optionales verschlüsseltes Cloud-Backup; Browsererweiterung kann automatisch Codes ausfüllen."
|
||||
},
|
||||
{
|
||||
"name": "FreeOTP+",
|
||||
"href": "https://github.com/helloworld1/FreeOTPPlus",
|
||||
"platforms": "Android",
|
||||
"notes": "Open-Source-Abspaltung von FreeOTP für Android mit Import und Export. Kein Konto erforderlich."
|
||||
}
|
||||
],
|
||||
"backupTitle": "Warum Sicherungen wichtig sind",
|
||||
"backupBody": "Bei Verlust des Authenticator-Geräts einen gesicherten Wiederherstellungscode verwenden oder eine zuvor eingerichtete App-Sicherung wiederherstellen. Cloud-Synchronisierung und lokale Exporte unterscheiden sich je nach App; prüfen Sie, ob die TOTP-Geheimnisse tatsächlich wiederhergestellt werden. Mit Root-Zugang zum Host ist die unten beschriebene Wiederherstellung ebenfalls möglich. Bewahren Sie eine separate, sichere Kopie auf.",
|
||||
"setupTitle": "Schritt-für-Schritt-Setup aus dem Dashboard",
|
||||
"setupImageAlt": "Einrichtungsbildschirm 2FA mit QR-Code und Backup-Codes",
|
||||
"setupImageCaption": "Der 2FA-Dialog zeigt QR-Code, Base32-Geheimnis zur manuellen Eingabe und acht einmalige Wiederherstellungscodes. Vor dem Schließen kopieren; sie werden nicht erneut angezeigt.",
|
||||
"setupSteps": [
|
||||
"<strong>Installieren Sie die Authenticator-App auf Ihrem Telefon</strong> (oder öffnen Sie Ihren Passwort-Manager). Eine der Apps aus der Tabelle oben. Sie müssen dies nur einmal tun - die gleiche app enthält codes für jeden dienst, den sie schützen.",
|
||||
"<strong>Am Dashboard anmelden</strong> mit Benutzername und Passwort.",
|
||||
"<strong>Sicherheit öffnen</strong> und <strong>2FA aktivieren</strong> wählen. Der Dialog zeigt QR-Code, Base32-Geheimnis und acht Wiederherstellungscodes.",
|
||||
"<strong>Fügen Sie den Eintrag zur Authenticator-App hinzu:</strong>",
|
||||
"<strong>Wiederherstellungscodes sichern.</strong> Alle acht in einem Passwortmanager, einer verschlüsselten Notiz oder einem sicheren Ausdruck aufbewahren. Jeder funktioniert einmal, wenn der Authenticator fehlt.",
|
||||
"<strong>Bestätigen Sie, indem Sie den aktuellen 6-stelligen Code</strong> aus der App in das Feld \"Verifizierungscode\" des Setup-Dialogs eingeben und senden. Codes aktualisieren alle 30 Sekunden, wenn es also abläuft, während Sie tippen, geben Sie einfach den nächsten ein.",
|
||||
"<strong>Fertig.</strong> 2FA ist aktiv. Bei der nächsten Anmeldung wird zuerst das Passwort und danach der aktuelle sechsstellige Code abgefragt."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
"<em>Einfaches Verfahren:</em> In der App <em>Konto hinzufügen</em> → <em>QR-Code scannen</em> wählen und die Kamera auf den QR-Code richten. Die App benennt den Eintrag automatisch, etwa <code>ProxMenux Monitor (your-username)</code>, und zeigt alle 30 Sekunden einen neuen sechsstelligen Code.",
|
||||
"<em>Manuelle Alternative</em>, falls Scannen nicht möglich ist, etwa auf demselben Telefon: <em>Konto hinzufügen</em> → <em>Einrichtungsschlüssel eingeben</em>. Einen Namen wie <em>Proxmox Monitor</em> wählen, Base32-Geheimnis einfügen, <em>Typ</em> auf <em>Zeitbasiert</em> belassen und speichern."
|
||||
],
|
||||
"testTitle": "Test vor dem Abmelden",
|
||||
"testBody": "Die bestehende Sitzung geöffnet lassen und <em>sofort</em> in einem privaten Fenster eine neue Anmeldung testen. Bei abgelehntem Code zuerst Server- und Telefonuhr prüfen, bevor Sie die funktionierende Sitzung schließen. Bei bereits verlorenem Zugang Wiederherstellungscode verwenden oder <code>auth.json</code> in der Host-Shell bearbeiten.",
|
||||
"lostTitle": "Verlorener Authentifikator",
|
||||
"lostIntro": "Drei Wiederherstellungswege, von geringem bis stärkerem Eingriff:",
|
||||
"lostItems": [
|
||||
"<strong>Wiederherstellungscode verwenden.</strong> Einen der acht gesicherten Codes im TOTP-Feld eingeben. Jeder funktioniert einmal; unbenutzte bleiben gültig. Danach 2FA in den Einstellungen neu einrichten, um acht neue Codes zu erhalten.",
|
||||
"<strong>Authenticator aus Cloud oder Sicherung wiederherstellen.</strong> Bei eingerichteter Cloud-Synchronisierung die App auf dem neuen Gerät installieren und anmelden, etwa Google, Microsoft, Authy, Apple Passwords über iCloud-Schlüsselbund, Ente oder 2FAS. Bei einer Exportdatei, etwa aus Aegis, Raivo oder FreeOTP+, die App installieren und die Datei importieren.",
|
||||
"<strong>Deaktivieren Sie 2FA von der Host-Shell.</strong> Wenn die vorherigen Optionen nicht verfügbar sind, bearbeiten Sie <code>/root/.config/proxmenux-monitor/auth.json</code> auf dem Proxmox-Host (Sie benötigen SSH oder Konsolenzugriff), setzen Sie <code>totp_enabled</code> auf <code>false</code>, speichern und starten Sie den Dienst neu:"
|
||||
],
|
||||
"lostShellOutro": "Sie können sich nur mit Benutzername + Passwort anmelden und dann 2FA aus Einstellungen wieder aktivieren.",
|
||||
"disableTitle": "Deaktivieren Sie 2FA",
|
||||
"disableBody": "<strong>Sicherheit</strong> öffnen und <strong>2FA deaktivieren</strong> wählen. <code>POST /api/auth/totp/disable</code> benötigt Passwort und gültigen TOTP- oder Wiederherstellungscode. Danach werden Geheimnis und Wiederherstellungscodes gelöscht. Alten Eintrag auch in der App entfernen.",
|
||||
"rejectedTitle": "Der 6-stellige Code wird immer abgelehnt",
|
||||
"rejectedIntro": "TOTP ist zeitbasiert. Server- und Telefonuhr dürfen nur etwa 30 Sekunden voneinander abweichen. Zwei Prüfungen:",
|
||||
"rejectedItems": [
|
||||
"<strong>Telefon:</strong> Einstellungen → Datum und Uhrzeit → automatische / Netzwerksynchronisierung aktivieren.",
|
||||
"<strong>Proxmox-Host:</strong> <code>timedatectl status</code> sollte „System clock synchronized: yes“ anzeigen. Andernfalls <code>timedatectl set-ntp true</code> ausführen und eine Minute warten."
|
||||
],
|
||||
"rejectedOutro": "Sobald beide Uhren übereinstimmen, wird der Code innerhalb des nächsten 30-Sekundenfensters akzeptiert."
|
||||
},
|
||||
"apiTokens": {
|
||||
"heading": "API-Token (langlebig)",
|
||||
"intro": "Browsersitzungen laufen nach 24 Stunden ab. Für Homepage-Widgets, Home Assistant, Grafana oder Uptime Kuma erstellen Sie ein separates <strong>API-Token</strong> mit 365 Tagen Laufzeit. Es verwendet dasselbe Signaturgeheimnis; die Angabe <code>token_name</code> erlaubt die Zuordnung und den einzelnen Widerruf.",
|
||||
"imageAlt": "API-Token-Panel zeigt die Token-Liste mit Name, Präfix, erstelltem Datum und Ablauf",
|
||||
"imageCaption": "Die API-Tokenliste unter Einstellungen — Name, Präfix (die letzten 4-Zeichen werden zur Identifizierung angezeigt), erstellt und Ablaufdatum, Widerrufsaktion.",
|
||||
"generateTitle": "Generieren Sie ein Token",
|
||||
"generateIntro": "Aus dem Dashboard:",
|
||||
"generateSteps": [
|
||||
"Unter <strong>Sicherheit → API-Zugriffstokens</strong> öffnen.",
|
||||
"Beschreibenden Namen angeben, <em>z. B. „Home Assistant“</em>.",
|
||||
"Geben Sie Ihr Passwort erneut ein. Wenn 2FA eingeschaltet ist, auch der aktuelle 6-stellige Code.",
|
||||
"<strong>Token erstellen</strong> wählen. Es erscheint <strong>nur einmal</strong>; sofort kopieren."
|
||||
],
|
||||
"generateCli": "Aus der Kommandozeile:",
|
||||
"useTitle": "Verwenden Sie ein Token",
|
||||
"revokeTitle": "Einen Token widerrufen",
|
||||
"revokeBody": "Jede Zeile bietet <strong>Widerrufen</strong>. Dadurch wird der Token-Hash unter <code>revoked_tokens</code> in <code>auth.json</code> gespeichert. Ab der nächsten Anfrage wird das Token abgelehnt.",
|
||||
"cheatTitle": "Kurzübersicht zur Token-Sicherheit",
|
||||
"cheatItems": [
|
||||
"Tokens im Geheimnisspeicher der Integration ablegen: Homepage <code>secrets.yaml</code>, Home Assistant <code>!secret</code> oder Umgebungsvariablen. Niemals in Git aufnehmen.",
|
||||
"Ein nach der jeweiligen Integration benanntes Token verwenden. Beim Entfernen der Integration dieses Token einzeln widerrufen.",
|
||||
"Rotieren Sie alle 6–12 Monate. Der Ablauf ist eine harte Grenze, keine Empfehlung."
|
||||
],
|
||||
"outro": "Hinweise zur sicheren Speicherung und Integrationsbeispiele: <apiLink>API-Referenz → Token-Verwaltung</apiLink> und <intLink>Integrationen</intLink>."
|
||||
},
|
||||
"https": {
|
||||
"heading": "HTTPS",
|
||||
"intro": "Zwei Wege zu TLS:",
|
||||
"items": [
|
||||
"<strong>Reverse-Proxy (empfohlen).</strong> Beenden Sie TLS auf Nginx / Caddy / Traefik und leiten Sie HTTP auf Port 8008 zum Flask-Prozess weiter. Snippets unten.",
|
||||
"<strong>Direktes HTTPS in der AppImage.</strong> Zertifikat über <code>POST /api/ssl/configure</code> einrichten (Oberfläche: <strong>Einstellungen → SSL</strong>). HTTPS verwendet <code>gevent.pywsgi</code> mit dem Standardhandler; flask-sock übernimmt WebSocket-Verbindungen für WSS. Zertifikatspfade stehen in der SSL-Konfiguration."
|
||||
],
|
||||
"calloutTitle": "Direkte HTTPS-Beschränkungen",
|
||||
"calloutBody": "Der Monitor kann ein von Proxmox verwaltetes Zertifikat oder eigene Zertifikatsdateien verwenden. Er stellt selbst keine ACME-Zertifikate aus. Für automatische Ausstellung und Erneuerung Proxmox ACME oder einen Reverse-Proxy wie Caddy, Traefik oder Nginx verwenden; erneuerte Zertifikate müssen geladen werden."
|
||||
},
|
||||
"gateway": {
|
||||
"heading": "Sicheres Gateway (Tailscale)",
|
||||
"intro": "Ein Reverse-Proxy ermöglicht Fernzugriff. <strong>Secure Gateway</strong> bietet Zugriff ohne Veröffentlichung von TCP 8008: Ein Alpine-LXC führt <a>Tailscale</a> als Subnetz-Router aus. Die LAN-IP des Hosts ist über genehmigte Subnetzrouten und Tailnet-Zugriffsregeln erreichbar.",
|
||||
"calloutTitle": "Warum dies bequem ist",
|
||||
"calloutBody": "Die LAN-URL <code>http://<proxmox-lan-ip>:8008</code> über die genehmigte Route verwenden. Tailscale-Subnetz-Router nutzen standardmäßig SNAT. Der Monitor sieht daher üblicherweise die LAN-IP des Gateways statt der Clientadresse <code>100.x.y.z</code>. Protokoll und Fail2Ban erkennen die tatsächlich am Host ankommende Quelladresse.",
|
||||
"deployBody": "Auf einer Seite LXC-Speicher wählen, einen unter <a>login.tailscale.com/admin/settings/keys</a> erzeugten Tailscale-Schlüssel einfügen, Subnetze wählen und bereitstellen. Der LXC wird in etwa 30 Sekunden eingerichtet und im Tailnet registriert.",
|
||||
"outro": "Bereitstellung, Subnetzrouten, Tailscale-ACLs und Exit-Node-Modus stehen unter <link>Dashboard → Sicherheit → Secure Gateway</link>. Dort befindet sich auch der Assistent. Diese Seite beschreibt den Zugriff."
|
||||
},
|
||||
"proxy": {
|
||||
"heading": "Konfigurationsbeispiele für Reverse-Proxys",
|
||||
"intro": "Einen <strong>eigenen Hostnamen</strong> wie <code>monitor.example.com</code> auf Port 8008 des Proxmox-Hosts weiterleiten. Die Beispiele nutzen dieses Schema. Ein Unterpfad wie <code>example.com/proxmenux-monitor/</code> braucht weitere Frontend- und Proxy-Anpassungen; Entfernen des Präfixes allein reicht nicht.",
|
||||
"nginxTitle": "Nginx",
|
||||
"caddyTitle": "Caddy",
|
||||
"traefikTitle": "Traefik (Labels — Docker / Kubernetes)",
|
||||
"subPathTitle": "Erweitert: Bereitstellung unter einem Unterpfad",
|
||||
"subPathBody": "Das aktuelle Frontend hat keine konfigurierte Unterpfad-Basis und erstellt API-Aufrufe mit rootrelativen <code>/api/*</code>-URLs. Ein Präfix wie <code>example.com/proxmenux-monitor/</code> zu entfernen reicht weder für diese API-Aufrufe noch für alle Frontend-Dateien aus. Verwenden Sie einen eigenen Hostnamen. Ein Unterpfad erfordert abgestimmte Frontend-/Proxy-Anpassungen und eigene Tests."
|
||||
},
|
||||
"audit": {
|
||||
"heading": "Prüfprotokoll",
|
||||
"intro": "Fehlgeschlagene Anmeldungen und Warnungen des Anmeldelimits werden zeilenweise in <code>/var/log/proxmenux-auth.log</code> geschrieben. Erfolgreiche Anmeldungen protokolliert dieser Logger nicht:",
|
||||
"outro": "Mit <code>tail -F /var/log/proxmenux-auth.log</code> verfolgen. Eine zusätzliche Konfiguration für <code>logrotate</code> ermöglicht die Rotation; der Monitor führt sie nicht selbst durch."
|
||||
},
|
||||
"fail2ban": {
|
||||
"heading": "Optional: Fail2Ban-Jail",
|
||||
"calloutTitle": "Fail2Ban ist nicht mit dem Monitor gebündelt",
|
||||
"calloutBody": "Fail2Ban wird <strong>nicht</strong> von ProxMenux Monitor selbst installiert. Installieren Sie es über <link>Sicherheit → Fail2Ban</link> im Menü ProxMenux (oder mit dem Standard-Debian-Paket). Ohne sie schreibt der Monitor immer noch das obige Überwachungsprotokoll – Wiederholungstäter werden einfach nicht automatisch gesperrt.",
|
||||
"intro": "Wenn Fail2Ban installiert ist, liefert die ProxMenux-Integration einen <code>[proxmenux]</code> jail mit, der:",
|
||||
"items": [
|
||||
"Liest <code>/var/log/proxmenux-auth.log</code>.",
|
||||
"Erkennt das Muster <code>authentication failure; rhost=<ip></code> mit einem eigenen Filter.",
|
||||
"Sperrt die beanstandete IP standardmäßig auf Kernel-Firewall-Ebene.",
|
||||
"Der Flask-Hook <code>before_request</code> prüft Anfragen anhand der für 30 Sekunden zwischengespeicherten Sperrliste. Hinter einem Reverse-Proxy sind PROXMENUX_TRUST_PROXY=1 und ein kontrollierter Proxy mit vertrauenswürdigen Weiterleitungsheadern erforderlich."
|
||||
],
|
||||
"outro": "Konfiguration, Sperrdauer und Entsperren: <link>Sicherheit → Fail2Ban</link>."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Fehlerbehebung",
|
||||
"noScreenTitle": "Der erste Launch-Bildschirm erscheint nie",
|
||||
"noScreenBody": "Die Authentifizierung ist bereits eingerichtet (<code>configured: true</code>) oder wurde übersprungen. Für eine neue Einrichtung:",
|
||||
"noScreenOutro": "Löscht den Authentifizierungszustand einschließlich TOTP-Geheimnissen und API-Tokens. Zuerst <code>auth.json</code> sichern, falls Sie Tokens behalten möchten.",
|
||||
"tokenTitle": "HTTP 401 bei jeder Anfrage von einem funktionierenden API-Token",
|
||||
"tokenBody": "Token abgelaufen (365 Tage) oder in <code>revoked_tokens</code> eingetragen. Neues Token in den Einstellungen erstellen und die Integration aktualisieren. Prüfen mit:",
|
||||
"tokenOutro": "Abgelaufene oder widerrufene Token geben <code>'{'\"error\":\"Invalid or expired token\"'}'</code> zurück.",
|
||||
"no2faTitle": "Kann sich nicht anmelden, nachdem 2FA aktiviert wurde, kein Authentifikator zur Hand",
|
||||
"no2faBody": "Verwenden Sie einen Backup-Code im TOTP-Feld. Wenn diese nicht mehr vorhanden sind, bearbeiten Sie <code>/root/.config/proxmenux-monitor/auth.json</code> von einer Host-Shell, setzen <code>totp_enabled</code> auf <code>false</code>, starten Sie den Dienst neu.",
|
||||
"wsTitle": "Reverse Proxy funktioniert, aber der Terminal-Tab trennt sich jede Minute",
|
||||
"wsBody": "Möglicher Grund ist das WebSocket-Leerlaufzeitlimit des Proxys. Lesezeitlimit erhöhen (Nginx: <code>proxy_read_timeout 86400s</code>; Traefik: <code>idleTimeout</code> im Einstiegspunkt oder der Middleware). In Nginx <code>proxy_set_header Upgrade $http_upgrade</code> und <code>Connection \"upgrade\"</code> prüfen."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "API-Referenz → Token-Verwaltung",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — API-Tokens erstellen, auflisten und widerrufen; sichere Speicherung und Sicherheitsregeln."
|
||||
},
|
||||
{
|
||||
"label": "Integrationen",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma und allgemeine cURL-Beispiele."
|
||||
},
|
||||
{
|
||||
"label": "Übersicht → Sicherheit → Sicheres Gateway",
|
||||
"href": "/docs/monitor/dashboard/security",
|
||||
"tail": " — Tailscale-Gateway-LXC schrittweise bereitstellen: Subnetzrouten, ACLs und Exit-Node-Modus."
|
||||
},
|
||||
{
|
||||
"label": "Sicherheit: Fail2Ban",
|
||||
"href": "/docs/security/fail2ban",
|
||||
"tail": " — optionale Jail installieren und konfigurieren."
|
||||
},
|
||||
{
|
||||
"label": "Einstellungen → ProxMenux Monitor",
|
||||
"href": "/docs/settings/proxmenux-monitor",
|
||||
"tail": " — systemd-Dienst über die ProxMenux-TUI starten und stoppen."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,342 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox-KI-Assistent — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor",
|
||||
"description": "Der optionale KI-Assistent formuliert Proxmox-VE-Benachrichtigungen verständlich um. Sechs Anbieter: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter und Ollama. Die Oberfläche bietet dreizehn Sprachen, drei Detailstufen pro Kanal, eigene Prompts mit Community-Bibliothek sowie Ereigniskontext mit Laufzeit, Wiederholungen und SMART-Daten.",
|
||||
"ogTitle": "Proxmox-KI-Assistent — OpenAI, Claude, Gemini, Groq, Ollama",
|
||||
"ogDescription": "Beschreiben Sie Proxmox VE-Benachrichtigungen in einfacher Sprache mit OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter oder lokalem Ollama.",
|
||||
"twitterTitle": "Proxmox-KI-Assistent | ProxMenux Monitor",
|
||||
"twitterDescription": "Beschreiben Sie Proxmox VE-Benachrichtigungen in einfacher Sprache mit OpenAI, Anthropic, Gemini, Groq, OpenRouter oder lokalem Ollama."
|
||||
},
|
||||
"header": {
|
||||
"title": "KI-Assistent",
|
||||
"description": "Die optionale KI formuliert geeignete Benachrichtigungsvorlagen verständlich um: mit Detailstufen pro Kanal, dreizehn Oberflächensprachen, eigenen Prompts, öffentlicher Community-Bibliothek und zusätzlichem Kontext. Die Backup-Berichte <code>backup_complete</code> und <code>backup_fail</code> umgehen die KI vollständig.",
|
||||
"section": "ProxMenux-Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Standardmäßig aus, mit einem Schalter aktivieren",
|
||||
"body": "Die KI-Umschreibung ist standardmäßig aus. Aktivieren Sie sie unter <em>Einstellungen → Benachrichtigungen → Erweitert: KI-Verbesserung</em>. Schlagen Kontextanreicherung oder Umschreibung fehl, wird die ursprüngliche Vorlage gesendet. Nach spätestens 25 Sekunden Wartezeit pro Umschreibung wird auf die Vorlage zurückgegriffen."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Wie es funktioniert",
|
||||
"intro": "Die versendeten Monitor-Ereignisse durchlaufen denselben Ablauf. Die KI-Umschreibung ist ein optionaler Schritt zwischen Vorlagentext und Kanalversand. Ein Ereignis durchläuft vier Schritte:",
|
||||
"steps": [
|
||||
"<strong>Ereignis und Vorlage.</strong> Ein Ereignis kommt von einem der sechs Datensammler. <code>notification_templates.py</code> formatiert es als strukturierten Klartext. Diesen Text würde der Kanal ohne KI-Umschreibung senden.",
|
||||
"<strong>Kontext-Anreicherung.</strong> Der Dispatcher inspiziert das Ereignis und fügt die relevanten zusätzlichen Signale bedingt an: System-Uptime (nur für kritische Systemausfälle), Ereignis-Frequenz, SMART-Daten (nur für Festplatten-Ereignisse), Bekannte Fehler-Datenbankübereinstimmungen und Journal-Logleitungen.",
|
||||
"<strong>Prompt-Erstellung.</strong> Der Systemprompt setzt sich aus Vorlage und Kanaleinstellungen zusammen: Zielsprache, Detailstufe, Emoji-Regeln aus <em>Formatierte Nachrichten</em> und optionalen KI-Vorschlägen. Ein eigener Prompt ersetzt den Systemprompt vollständig. Die Benutzernachricht enthält Vorlagentext und ergänzte Kontextblöcke.",
|
||||
"<strong>Anbieteraufruf.</strong> Groq, OpenAI, Anthropic, Gemini, Ollama oder OpenRouter liefert umformulierten Titel und Nachrichtentext. Der Dispatcher verarbeitet die Antwort, ersetzt diese Inhalte für den Kanal und übergibt sie an dessen Versandadapter."
|
||||
],
|
||||
"notesIntro": "Drei Details, an denen es sich zu halten lohnt, bevor Sie den Rest dieser Seite lesen:",
|
||||
"notes": [
|
||||
"<strong>Die KI erzeugt keine Ereignisse.</strong> Jedes Ereignis stammt aus einem echten Signal wie Zustandsprüfung, Journalzeile oder PVE-Webhook. Vor der KI-Verarbeitung wird es als Vorlagentext formatiert. Die KI übersetzt und formatiert, sie überwacht das System nicht.",
|
||||
"<strong>Die AI läuft per-channel.</strong> Telegram und Discord können eine kurze Umschreibung verwenden, während E-Mail einen detaillierten Bericht erhält - dasselbe Ereignis, unterschiedliche Form, alles von einem Anbieteranruf pro Kanal.",
|
||||
"<strong>Fehler führen zur Vorlage zurück.</strong> Bei HTTP-5xx-Fehlern, Zeitüberschreitung, ungültiger Ausgabe oder abgelehnter Anfrage protokolliert der Dispatcher den Fehler und sendet den ursprünglichen Vorlagentext für den Kanal. Ein KI-Fehler verhindert die Benachrichtigung nicht."
|
||||
]
|
||||
},
|
||||
"enabling": {
|
||||
"heading": "Panel aktivieren",
|
||||
"intro": "Die AI-Konfiguration befindet sich am unteren Rand des Benachrichtigungsfeldes innerhalb der Registerkarte Einstellungen als zusammenklappbarer <em>Advanced: AI Enhancement</em>-Block. Klicken Sie auf den Header, um zu erweitern:",
|
||||
"collapsedAlt": "Eingeklappter Bereich für erweiterte KI-Einstellungen mit Pfeilsymbol",
|
||||
"collapsedCaption": "Standardmäßig eingeklappt; ein Klick öffnet das Panel.",
|
||||
"panelAlt": "Geöffnetes KI-Panel mit Hauptschalter, Anbieter Google Gemini, verdecktem API-Schlüssel, Modell gemini-2.5-flash, Standardprompt, Sprache Englisch, Detailstufe für Telegram, Discord, Gotify und E-Mail, KI-Vorschlägen und Verbindungstest",
|
||||
"panelCaption": "Das vollständige AI Enhancement-Panel - jedes auf dieser Seite dokumentierte Steuerelement wird einem der oben genannten Felder zugeordnet.",
|
||||
"outro": "Von oben nach unten zeigt das Panel: den <em>AI-Enhanced Messages</em> Master-Toggle, den Provider-Selektor mit einem Informationsmodal daneben, den API-Schlüsseleingang (oder die Ollama-URL für den lokalen Modus), den Modell-Dropdown (vom Provider nach Eingabe des Schlüssels geladen), den prompten Modus (<em>Default</em> / <em>Custom</em>), die Ausgabesprache, die Pro-Kanal-Detailebene, die <em>AI Suggestions</em> Opt-in und eine <em>Test Connection</em>-Taste, die eine Probenachricht an den Provider sendet, um die Anmeldeinformationen zu validieren."
|
||||
},
|
||||
"context": {
|
||||
"heading": "Welchen Kontext die KI erhält",
|
||||
"intro": "Bevor die Eingabeaufforderung erstellt wird, führt der Dispatcher eine Kontextanreicherungsroutine durch, die entscheidet, welche zusätzlichen Signale für das jeweilige Ereignis relevant sind. Ziel ist es, dem LLM genügend Informationen zu geben, um eine nützliche Nachricht zu erstellen, ohne sie (und Ihren Geldbeutel) mit Lärm zu überschwemmen, der nicht zutrifft. Fünf Kontextblöcke können der Benutzernachricht hinzugefügt werden:",
|
||||
"headerBlock": "Block",
|
||||
"headerWhen": "Wenn es injiziert wird",
|
||||
"headerWhat": "Was es trägt",
|
||||
"rows": [
|
||||
{
|
||||
"block": "Systemlaufzeit",
|
||||
"when": "Nur bei kritischen Systemfehlern: <code>crash</code>, <code>panic</code>, <code>oom</code>, <code>kernel</code>, <code>split_brain</code>, <code>quorum_lost</code>, <code>node_offline</code>, <code>node_fail</code>, <code>system_fail</code>, <code>boot_fail</code>. Bei Laufwerksfehlern, Warnungen und Routinevorgängen wird dieser Kontext für einen knappen Prompt ausgelassen.",
|
||||
"what": "Eine Linie wie <code>System uptime: 14 days (stable system)</code>. LLM unterscheidet Startprobleme von lang andauernden Fehlern."
|
||||
},
|
||||
{
|
||||
"block": "Ereignishäufigkeit",
|
||||
"when": "Immer, wenn der Monitor den gleichen Fingerabdruck schon einmal gesehen hat.",
|
||||
"what": "Häufigkeit, erstgesehener Zeitstempel, optionale Musterbezeichnung (wiederkehrend / einmalig / Spike). Das LLM verwendet dies, um \"wiederkehrendes Problem\" vs \"erstes Mal gesehen\" zu formulieren."
|
||||
},
|
||||
{
|
||||
"block": "SMART-Daten",
|
||||
"when": "Nur für plattenbezogene Ereignisse (der Ereignistyp enthält <code>disk</code>, <code>smart</code>, <code>storage</code>, <code>io_error</code> oder der Körper erwähnt <code>/dev/sd</code>, <code>ata</code>, <code>i/o error</code>).",
|
||||
"what": "Ausgabe von <code>smartctl</code> für das betroffene Gerät — Gesamtzustand (PASSED / FAILED) zuzüglich der relevanten Attribute für den Fehlermodus."
|
||||
},
|
||||
{
|
||||
"block": "Bekannte Fehler DB",
|
||||
"when": "Wenn der Body- oder Journalkontext mit einem Proxmox-spezifischen Fehlermuster übereinstimmt, das mit dem Monitor ausgeliefert wird.",
|
||||
"what": "Ein <code>KNOWN PROXMOX ERROR DETECTED</code> Block mit der passenden Ursache und einer konkreten Lösung. Die Aufforderung weist das LLM an, dieses wörtlich zu übersetzen - keine Paraphrasierung des empfohlenen Fixes."
|
||||
},
|
||||
{
|
||||
"block": "Journalprotokolle",
|
||||
"when": "Wenn der ursprüngliche Datensammler Journalzeilen zum Ereignis erfasst hat, vor allem die Journal- und Aufgabenüberwachung.",
|
||||
"what": "Rohe <code>journalctl</code>-Auszüge. Die Aufforderung sagt dem LLM, IDs, Zeitstempel und Root-Cause-Hinweise zu extrahieren und nicht verwandte Einträge zu ignorieren."
|
||||
}
|
||||
],
|
||||
"afterBlocks": "Sobald diese Blöcke verbunden sind, hat die an den LLM gesendete Benutzernachricht diese Form:",
|
||||
"calloutTitle": "Keine Telemetrie über das Ereignis selbst hinaus",
|
||||
"calloutBody": "Der Monitor sendet nur das, was er für das aktuelle Ereignis zur Hand hat - keine systemweite Telemetrie, keine historischen metrischen Serien, keine Inventar-Dumps. Die fünf Blöcke oben sind die obere Grenze dessen, was den Host bei einer einzelnen KI-Umschreibung verlässt."
|
||||
},
|
||||
"tokens": {
|
||||
"heading": "Tokens - was sie sind und wie sie konsumiert werden",
|
||||
"intro1": "Kommerzielle Anbieter rechnen nach <em>Token</em> ab. Ein Token entspricht grob vier englischen Zeichen oder drei Vierteln eines Wortes. Der englische Satz <em>\"Backup completed on storage local-bak\"</em> hat ungefähr acht Token. Zehn Journalzeilen können je nach technischem Inhalt 200–400 Token umfassen.",
|
||||
"intro2": "Zwei Dinge werden bei jedem Anruf in Rechnung gestellt:",
|
||||
"items": [
|
||||
"<strong>Eingabe-Token</strong> umfassen Systemprompt und Benutzernachricht: Schweregrad, Titel, Vorlagentext und Kontext. Die Anzahl hängt vom tatsächlichen Prompt und Ereignis ab. Jeder umgeschriebene Kanal kann eigene Eingabe-Token verbrauchen; Backup-Abschluss- und Fehlerberichte umgehen die KI.",
|
||||
"<strong>Ausgabe-Token</strong> sind die Modellantwort. Monitor begrenzt sie mit <code>max_tokens</code>. Die Grenze ist ein <em>Höchstwert</em>, kein fester Verbrauch: Erzeugt das Modell 250 Token bei einem Limit von 1500, werden 250 berechnet."
|
||||
],
|
||||
"capsIntro": "Dies sind die tatsächlichen Obergrenzen, die der Dispatcher anwendet, direkt aus <code>AI_DETAIL_TOKENS</code> in <code>notification_templates.py</code> entnommen:",
|
||||
"headerLevel": "Detailebene",
|
||||
"headerCap": "Ausgabegrenze (Token)",
|
||||
"headerConsumption": "Typischer realer Verbrauch",
|
||||
"capRows": [
|
||||
{
|
||||
"level": "kurz",
|
||||
"cap": "500",
|
||||
"consumption": "50–200 Ausgabe-Token für kurze Ereignisse."
|
||||
},
|
||||
{
|
||||
"level": "Standard",
|
||||
"cap": "1500",
|
||||
"consumption": "200–700 Ausgabe-Token für typische Ereignisse mit wenig Kontext."
|
||||
},
|
||||
{
|
||||
"level": "ausführlich",
|
||||
"cap": "3000",
|
||||
"consumption": "500–2000 Ausgabe-Token für vollständige E-Mail-Berichte mit Protokollen und SMART-Tabellen."
|
||||
}
|
||||
],
|
||||
"customNote": "Der benutzerdefinierte Eingabeaufforderungsmodus verwendet eine feste Obergrenze von 500-Ausgabetoken unabhängig von der Detailstufe - die benutzerdefinierte Eingabeaufforderung ist in Ihrer Kontrolle und die Obergrenze schützt vor außer Kontrolle geratenen Antworten.",
|
||||
"sizingTitle": "Praktische Dimensionierung",
|
||||
"sizingBody": "Schätzen Sie den Verbrauch als umgeschriebene Ereignisse × KI-Kanäle × Eingabe- und Ausgabe-Token je Aufruf. Beispiel: 50 Ereignisse × ein Kanal × (500 Eingabe + 300 Ausgabe) ergeben 40.000 Token täglich. Verbrauch und Kosten hängen von Modell, Kontext, Cache und Anbieterlimits ab. <link>Detailstufe pro Kanal</link> erklärt <code>brief</code> für Chats statt <code>standard</code>, bei weiterhin ausführlichen E-Mails."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "KI-Anbieter",
|
||||
"intro": "Sechs Anbieter sind mit dem Monitor verbunden. Die Anbieter-Dropdown in der Benutzeroberfläche zeigt sie alle; ein Informationsbutton daneben öffnet ein Modal mit einer einzeiligen Beschreibung für jeden. Unten finden Sie die vollständige Referenz mit der URL zum Erhalten eines API-Schlüssels, der Beschreibung in der Benutzeroberfläche und den entsprechenden Notizen aus der Codebasis.",
|
||||
"imageAlt": "AI Providers Informationen modal Auflistung der sechs unterstützten Anbieter - Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama, OpenRouter - jeder mit seinem Symbol und einzeilige Beschreibung und eine spezielle OpenAI-Kompatible APIs Hinweis für OpenAI",
|
||||
"imageCaption": "Informationsfenster mit sechs Karten, einer je Anbieter, und den unten beschriebenen Angaben.",
|
||||
"groq": {
|
||||
"heading": "Groq",
|
||||
"tagline": "Sehr schnelle, großzügige freie Stufe (30 req/min). Ideal zum Starten.",
|
||||
"items": [
|
||||
"API-Schlüssel: <a>console.groq.com/keys</a>",
|
||||
"Beispiele aus der mitgelieferten Modellliste: <code>allam-2-7b</code>, <code>qwen/qwen3.8-27b</code>, <code>openai/gpt-oss-20b</code>, <code>groq/compound-mini</code>.",
|
||||
"Mitgelieferte Empfehlung: <strong><code>openai/gpt-oss-20b</code></strong>. Prüfen Sie die Verfügbarkeit für Ihr Konto über die Anbieterauswahl und den Verbindungstest."
|
||||
]
|
||||
},
|
||||
"openai": {
|
||||
"heading": "OpenAI",
|
||||
"tagline": "Industriestandard. Sehr genau und weit verbreitet.",
|
||||
"items": [
|
||||
"API-Schlüssel: <a>platform.openai.com/api-keys</a>",
|
||||
"Beispiele aus der mitgelieferten Modellliste: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
|
||||
"Mitgelieferte Empfehlung: <strong><code>gpt-4.1-nano</code></strong>. Der Adapter unterstützt auch besondere Anforderungen von Reasoning-Modellen; die Liste enthält gpt-5-nano. Diese Modelle sind daher nicht pauschal ausgeschlossen."
|
||||
],
|
||||
"baseUrlTitle": "OpenAI-kompatible Basis URL",
|
||||
"baseUrlBody": "Der OpenAI-Anbieter akzeptiert eine eigene <em>Basis-URL</em> für OpenAI-kompatible Endpunkte, etwa <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong> und <strong>Fireworks AI</strong>, die das Format <code>/v1/chat/completions</code> unterstützen. Tragen Sie die URL im OpenAI-Bereich neben dem API-Schlüssel ein."
|
||||
},
|
||||
"anthropic": {
|
||||
"heading": "Anthropic (Claude)",
|
||||
"tagline": "Hervorragend zum Schreiben und Übersetzen. Schnell und wirtschaftlich.",
|
||||
"items": [
|
||||
"API-Schlüssel: <a>console.anthropic.com/settings/keys</a>",
|
||||
"Beispiele aus der mitgelieferten Modellliste: <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
|
||||
"Mitgelieferte Empfehlung: <strong><code>claude-haiku-4-5-20251001</code></strong>. Dieser genaue Snapshot ist als Empfehlung konfiguriert; die älteren Claude-3.5-Einträge stehen nicht mehr in der mitgelieferten Liste."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
"heading": "Google Gemini",
|
||||
"tagline": "Kostenloses Kontingent verfügbar, gutes Verhältnis von Qualität und Preis.",
|
||||
"items": [
|
||||
"API-Schlüssel: <a>aistudio.google.com/app/apikey</a>",
|
||||
"Beispiele aus der mitgelieferten Modellliste: <code>gemini-2.5-flash-lite</code>, <code>gemini-2.5-flash</code>, <code>gemini-3-flash-preview</code>.",
|
||||
"Empfohlen: <strong><code>gemini-2.5-flash-lite</code></strong> - Flash und Flash-Lite passieren den Verifier konsequent. Die Pro-Varianten lehnen die <code>thinkingBudget=0</code>-Einstellung ab, die der Monitor verwendet, und sind für diese Workload übertrieben."
|
||||
]
|
||||
},
|
||||
"openrouter": {
|
||||
"heading": "OpenRouter",
|
||||
"tagline": "Aggregator mit Zugriff auf 100+ Modelle mit einem einzigen API-Schlüssel. Maximale Flexibilität.",
|
||||
"items": [
|
||||
"API-Schlüssel: <a>openrouter.ai/keys</a>",
|
||||
"Beispiele aus der mitgelieferten Modellliste: <code>meta-llama/llama-3.3-70b-instruct</code>, <code>meta-llama/llama-3.1-70b-instruct</code>, <code>meta-llama/llama-3.1-8b-instruct</code>, <code>anthropic/claude-haiku-4.5</code>, <code>google/gemini-2.5-flash-lite</code>, <code>openai/gpt-4o-mini</code>, <code>mistralai/mistral-medium-3</code>.",
|
||||
"Empfohlen: <strong><code>meta-llama/llama-3.3-70b-instruct</code></strong> - dasselbe Modell wie der Groq-Eintrag, aber über OpenRouter geroutet, was einen einzigen Schlüssel für alle aufgeführten Modelle bedeutet."
|
||||
]
|
||||
},
|
||||
"ollama": {
|
||||
"heading": "Ollama (lokal)",
|
||||
"tagline": "Nutzt die Modelle Ihres konfigurierten Ollama-Servers. Lokale Modelle laufen dort; Ollama-Cloud-Modelle leiten Anfragen an einen Cloud-Anbieter weiter. Lokale Ausführung vermeidet gehostete API-Gebühren, verbraucht aber eigene Hardware und Strom.",
|
||||
"items": [
|
||||
"Kein API-Schlüssel. Setzen Sie das <em>Ollama URL</em>-Feld auf Ihren Server (Standard <code>http://localhost:11434</code> oder welcher Host Ihre Ollama-Instanz ausführt).",
|
||||
"Modelle: <strong>nicht gefiltert.</strong> Der Monitor liest die Modelle, die Sie auf der Ollama-Seite über <code>ollama pull <model></code> gezogen haben. Der Dropdown wird von <code>GET /api/tags</code> auf Ihrem Ollama-Server ausgefüllt.",
|
||||
"Installieren: <a>ollama.com/download</a> – läuft unter Linux, macOS, Windows. Für beste Ergebnisse wählen Sie ein Modell, das in RAM mit einem ausreichend großen Kontextfenster für die Journalblöcke passt, die der Dispatcher injiziert."
|
||||
]
|
||||
}
|
||||
},
|
||||
"models": {
|
||||
"heading": "Warum diese spezifischen Modelle",
|
||||
"intro": "Die Modellauswahl nutzt den mitgelieferten Katalog <code>verified_ai_models.json</code> und Verfügbarkeitsprüfungen der Anbieteradapter. Diese setzen die interne Anfrage <code>system_prompt + user_message + max_tokens</code> in das jeweilige API-Format um. Der Katalog enthält getestete und manuell ergänzte Einträge; er garantiert weder aktuellen Kontozugriff noch denselben Verifikationstest für jedes Modell.",
|
||||
"consequencesIntro": "Zwei Konsequenzen, die es wert sind, beachtet zu werden:",
|
||||
"consequences": [
|
||||
"<strong>Die mitgelieferte Empfehlung</strong> ist ein Ausgangspunkt für Benachrichtigungen. Bewerten Sie Sprachqualität, Latenz und Kosten mit Ihren Ereignissen und Ihrem Konto; sie ist keine allgemeine Modellrangliste.",
|
||||
"<strong>Sie können ein anderes aufgeführtes Modell wählen</strong>, passend zu Kontingent und Vorlieben. Prüfen Sie die Verfügbarkeit mit dem Verbindungstest; ein Listeneintrag garantiert keinen aktuellen Kontozugriff."
|
||||
],
|
||||
"ollamaTitle": "Ollama ist die Ausnahme",
|
||||
"ollamaBody": "Die Ollama-Auswahl wird nicht vom kommerziellen Katalog gefiltert; sie zeigt die Modelle des Ollama-Servers. Wählen Sie für lokale Ausführung ein lokales Modell mit ausreichend RAM und Kontext für Journalblöcke. Cloud-Modelle bleiben auch über einen lokalen Ollama-Server remote."
|
||||
},
|
||||
"defaultPrompt": {
|
||||
"heading": "Standard-Eingabeaufforderung",
|
||||
"intro": "Im Modus <em>Standard</em> nutzt Monitor den unten gezeigten Systemprompt. Vor dem Aufruf werden die Platzhalter ersetzt: <code>'{'language'}'</code>, <code>'{'detail_level'}'</code>, <code>'{'emoji_instructions'}'</code>, <code>'{'suggestions_addon'}'</code>. Danach folgen Varianten für formatierte und einfache Kanäle sowie der Zusatz für KI-Vorschläge.",
|
||||
"showFullSummary": "Vollständige Standardsystemaufforderung anzeigen",
|
||||
"passagesIntro": "Zwei Textvarianten werden entsprechend dem Schalter <em>Formatierte Nachrichten</em> des jeweiligen Kanals eingesetzt:",
|
||||
"passages": [
|
||||
"<strong>Rich on</strong> → ein Emoji-Block wird eingeschleust, der die Symbole auflistet, die der LLM verwenden kann, sowie eine Hostnamenregel (der LLM muss das Hostnamenpräfix aus dem Titel wörtlich beibehalten) und eine Handvoll formatierter Beispiele (Backup-Start, Backup vollständig, Updates, VM Start, Gesundheit beeinträchtigt). Dies erzeugt die emoji-präfixierten Nachrichten auf Telegram und Discord.",
|
||||
"<strong>Rich off</strong> → Ein einzeiliger Block weist den LLM an, nur einfache ASCII zu verwenden - keine Emojis, keine Unicode-Symbole. Wird für E-Mails und jeden Kanal verwendet, bei dem Formatierungsgeräusche die Posteingangsregeln oder die Lesbarkeit verletzen."
|
||||
],
|
||||
"suggestionsPlaceholder": "Und der <code>'{'suggestions_addon'}'</code> Platzhalter ist leer, es sei denn, Sie aktivieren AI Suggestions (nächster Abschnitt), in welchem Fall dieser Block injiziert wird:",
|
||||
"showAddonSummary": "AI Suggestions Addon anzeigen"
|
||||
},
|
||||
"customPrompt": {
|
||||
"heading": "Benutzerdefinierter Eingabeaufforderungsmodus",
|
||||
"intro": "Der Modus <em>Benutzerdefiniert</em> ersetzt den gesamten Standard-Systemprompt durch Ihren eigenen Text. Er wird in den SQLite-Einstellungen gespeichert und bei jedem KI-Aufruf unverändert gesendet. So können Sie Ton, Aufbau und Schwerpunkt frei festlegen.",
|
||||
"imageAlt": "Eigener Prompt mit Textfeld für Übersetzungsregeln, Export- und Import-Schaltflächen sowie Link zu Community-Prompts",
|
||||
"imageCaption": "Benutzerdefinierte Eingabeaufforderung — großer Textbereich mit der Eingabeaufforderung des Benutzers sowie <em>Export</em>, <em>Import</em> und ein Link zur Community-Galerie auf GitHub.",
|
||||
"changesTitle": "Was sich ändert, wenn Custom eingeschaltet ist",
|
||||
"changes": [
|
||||
"<strong>Die Standardaufforderung wird vollständig ersetzt.</strong> Die Proxmox-Mappings, die Kontext-Handling-Regeln und die Emoji-Anweisungen sind alle verschwunden. Wenn Sie eine davon behalten möchten, fügen Sie sie in Ihre Eingabeaufforderung ein - die unten gezeigte gebündelte <code>EXAMPLE_CUSTOM_PROMPT</code> ist ein Ausgangspunkt.",
|
||||
"<strong>Die Sprachauswahl wird ignoriert.</strong> Die Standard-Eingabeaufforderung hat einen <code>'{'language'}'</code>-Platzhalter; die benutzerdefinierte Eingabeaufforderung nicht. Wenn Sie eine Ausgabe in einer bestimmten Sprache wünschen, deklarieren Sie sie in Ihrer Eingabeaufforderung (\"Ins Spanische übersetzen\", \"Alles auf Französisch ausgeben\").",
|
||||
"<strong>Der eigene Prompt hat ein festes Limit von 500 Token</strong>, unabhängig von der gespeicherten Detailstufe. Der Standardmodus nutzt 500 / 1500 / 3000. Prompt-Änderungen erhöhen das Limit nicht; fordern Sie kürzere Antworten an oder wählen Sie eine passende Standardstufe.",
|
||||
"<strong>Die Ausgabemarker bleiben erforderlich.</strong> Geben Sie <code>[TITLE]</code> und <code>[BODY]</code> im Antwortformat vor. Der Parser liest deren Inhalt; fehlt ein Marker, wird die ursprüngliche Vorlage verwendet.",
|
||||
"<strong>Emoji-Regeln formatierter Nachrichten werden nicht automatisch ergänzt.</strong> Fordern Sie Emojis im eigenen Prompt ausdrücklich an oder untersagen Sie sie für Klartext. Der Schalter steuert nur die Standardblöcke, nicht Ihren eigenen Text."
|
||||
],
|
||||
"starterTitle": "Startaufforderung",
|
||||
"starterIntro": "Der Textbereich <em>Benutzerdefinierte Eingabeaufforderung</em> wird mit einem minimalen Beispiel ausgeliefert, das Sie anpassen können:",
|
||||
"showStarterSummary": "Benutzerdefinierten Beispielprompt anzeigen",
|
||||
"shareTitle": "Aufforderungen mit der Community teilen",
|
||||
"shareIntro": "Die Schaltfläche <em>Export</em> schreibt Ihre aktuelle benutzerdefinierte Eingabeaufforderung in eine Datei (<code>.txt</code> / <code>.md</code>), die Sie als Backup oder Hand an eine andere Person speichern können. <em>Import</em> zieht einen zurück. Der dritte Button neben ihnen verlinkt zu einer öffentlichen Community-Galerie auf GitHub:",
|
||||
"shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Eigene Prompts für KI-Benachrichtigungen teilen",
|
||||
"shareOutro": "Durchsuchen sie die diskussion, um zu sehen, was andere betreiber erstellt haben - knappe pager-alarme, ausführliche technische berichte, sprachspezifische varianten. Wenn Sie Ihre optimieren und das Ergebnis mögen, posten Sie es dort: Selbst eine Beschreibung mit einem Absatz, für die Ihre Eingabeaufforderung optimiert wird, hilft den Menschen, einen guten Ausgangspunkt zu finden. Feedback darüber, was funktioniert und was nicht, ist ebenso willkommen."
|
||||
},
|
||||
"suggestions": {
|
||||
"heading": "KI-Vorschläge (BETA)",
|
||||
"intro": "KI-Vorschläge sind ein optionaler Zusatz für <strong>einen</strong> kurzen, umsetzbaren Tipp am Ende der Nachricht. Dafür müssen Modus <em>Standard</em>, der KI-Hauptschalter und <em>KI-Vorschläge</em> aktiv sein. Der Prompt verlangt, den Tipp bei unklarer Ursache oder Lösung auszulassen.",
|
||||
"formatIntro": "Wenn ein Tipp hinzugefügt wird, folgt er genau diesem Format:",
|
||||
"rulesIntro": "Die Regeln im Addon (sichtbar im zusammenklappbaren Block unter der Standard-Eingabeaufforderung oben):",
|
||||
"rules": [
|
||||
"Der Tipp ist <em>nur</em> enthalten, wenn der Journalkontext oder die Datenbank mit bekannten Fehlern eindeutig auf einen bestimmten Fix hinweist.",
|
||||
"Der Prompt verlangt einen Tipp unter 100 Zeichen; der Parser prüft diese Länge nicht unabhängig.",
|
||||
"Der Prompt verlangt einen konkreten Befehl oder Pfad und weist das Modell an, allgemeine Ratschläge zu vermeiden.",
|
||||
"Wenn ein bekannter Fehler eine Lösung bietet, muss der LLM diese Lösung verwenden und keine neue erfinden.",
|
||||
"Der Prompt weist das Modell an, den Tipp wegzulassen, wenn die Eingabe keine konkrete Lösung belegt."
|
||||
],
|
||||
"betaTitle": "Warum Beta",
|
||||
"betaBody": "Die Tip-Qualität hängt von zwei Dingen ab, die außerhalb von ProxMenux liegen: das ausgewählte Modell und wie reich der Journal-Kontext für die Veranstaltung war. Mit einem starken Modell (Claude 3.5 Haiku, GPT-4.1 Mini, Llama 3.3 70B) und einem Festplattenfehler, der mit smartctl + Zeitschriftenzeilen geliefert wird, ist der Tipp durchweg nützlich. Mit einem winzigen lokalen Ollama-Modell und einem einzeiligen Ereignis kann die Spitze flach fallen oder ganz übersprungen werden. Deaktivieren Sie den Schalter, wenn Sie die Tipps laut finden, und aktivieren Sie ihn wieder, wenn Sie ihn zurückhaben möchten."
|
||||
},
|
||||
"detailLevel": {
|
||||
"heading": "Detailebene pro Kanal",
|
||||
"intro": "Telegram, Discord, Gotify und E-Mail haben jeweils eine eigene Auswahl der Detailstufe. Drei Werte steuern im Standardprompt sowohl das Ausgabe-Token-Limit als auch die Detailvorgaben:",
|
||||
"headerLevel": "Ebene",
|
||||
"headerLabel": "UI-Kennzeichnung",
|
||||
"headerCap": "Ausgabegrenze",
|
||||
"headerProduce": "Was der Prompt vom LLM verlangt",
|
||||
"rows": [
|
||||
{
|
||||
"level": "kurz",
|
||||
"label": "2–3 Zeilen, nur das Wesentliche",
|
||||
"cap": "500-Token",
|
||||
"produce": "\"Was passiert ist + wo\". Nichts anderes."
|
||||
},
|
||||
{
|
||||
"level": "Standard",
|
||||
"label": "Knapp mit grundlegendem Kontext",
|
||||
"cap": "1500-Token",
|
||||
"produce": "3–6 Zeilen: was, wo, Ursache, betroffene Geräte."
|
||||
},
|
||||
{
|
||||
"level": "ausführlich",
|
||||
"label": "Vollständige technische Angaben",
|
||||
"cap": "3000-Token",
|
||||
"produce": "Vollständiger Bericht: was, wo, Ursache, Betroffene, Protokolle, SMART-Daten und Verlauf."
|
||||
}
|
||||
],
|
||||
"defaultsIntro": "Standardwerte bei der ersten Installation:",
|
||||
"defaults": [
|
||||
"<strong>Telegram, Discord, Gotify</strong> — <code>standard</code>.",
|
||||
"<strong>Email</strong> — <code>detailed</code>. E-Mail ist der Kanal, in dem Sie normalerweise das vollständige Bild für die Archivierung wünschen."
|
||||
],
|
||||
"emailTitle": "E-Mail-Detailebene fügt das Original hinzu",
|
||||
"emailBody": "Liefert der KI-Formatter ein Ergebnis für E-Mail mit <code>detailed</code> und hat der Ursprungstext mehr als 50 Zeichen, hängt er ihn nach 40 Bindestrichen und <code>Original message:</code> an. Das bewahrt Details für spätere Suchen. Bei KI-Umgehung oder Fehlern kann nur die ursprüngliche Vorlage versendet werden."
|
||||
},
|
||||
"language": {
|
||||
"heading": "Sprache",
|
||||
"intro": "Die Oberflächenauswahl bietet dreizehn Sprachen. Sie speichert <code>ai_language</code>, das der Standardprompt in <em>\"translate alerts into '{'language'}'\"</em> verwendet. Die Liste:",
|
||||
"list": "Englisch (<code>en</code>), Slowakisch (<code>sk</code>), Spanisch (<code>es</code>), Französisch (<code>fr</code>), Deutsch (<code>de</code>), Portugiesisch (<code>pt</code>), Italienisch (<code>it</code>), Russisch (<code>ru</code>), Schwedisch (<code>sv</code>), Norwegisch (<code>no</code>), Japanisch (<code>ja</code>), Chinesisch (<code>zh</code>), Niederländisch (<code>nl</code>).",
|
||||
"rulesIntro": "Zwei wichtige Regeln direkt aus der Aufforderung:",
|
||||
"rules": [
|
||||
"<strong>Übersetzen</strong>: Beschriftungen, Beschreibungen, Statuswörter und Einheiten, etwa GB → Go auf Französisch.",
|
||||
"<strong>Nicht übersetzen</strong>: Hostnamen, IPs, Pfade, VM/CT IDs, Gerätenamen wie <code>/dev/sdX</code>, technische Identifikatoren. Diese bleiben wortwörtlich unabhängig von der Sprache."
|
||||
],
|
||||
"customNote": "Der eigene Prompt <strong>verwendet die Sprachauswahl nicht</strong>. Geben Sie die gewünschte Ausgabesprache direkt im Prompt an."
|
||||
},
|
||||
"templates": {
|
||||
"heading": "Ein Hinweis auf Vorlagen",
|
||||
"body1": "Die KI erhält formatierten Vorlagentext statt roher Ereignisdaten. Typen wie <code>vm_start</code>, <code>auth_fail</code> und <code>health_degraded</code> haben Vorlagen in <code>notification_templates.py</code>. Die KI formuliert geeignete Texte um; <code>backup_complete</code> und <code>backup_fail</code> behalten deterministische Berichte und umgehen die KI.",
|
||||
"body2": "Zwei praktische Implikationen: Die KI sieht nie einen Hostnamen oder VMID, den sie erfinden muss - diese Felder werden von der Vorlage vor dem Umschreiben platziert. Und wenn AI deaktiviert ist, wird der vorgefertigte Körper direkt versandt. Die <link>Notifications</link>-Seite dokumentiert die Versandpipeline vollständig und ist der richtige Querverweis für alles, was mit einem Ereignis passiert, bevor es diese Ebene erreicht."
|
||||
},
|
||||
"privacy": {
|
||||
"heading": "Datenschutz & Datenfluss",
|
||||
"intro": "Bei aktivierter KI-Umschreibung sendet Monitor den Vorlagentext samt Kontextblöcken an den Anbieter. Dazu können Hostnamen, IP-Adressen, Benutzernamen, Gerätepfade, Journalzeilen und SMART-Attribute des betroffenen Geräts gehören. Ob diese Daten den Host verlassen, hängt vom Anbieter ab:",
|
||||
"headerProvider": "Anbieter",
|
||||
"headerDestination": "Datenziel",
|
||||
"rows": [
|
||||
{
|
||||
"provider": "Ollama",
|
||||
"destination": "Lokale Modelle laufen auf dem konfigurierten Ollama-Host. Ist dies der Proxmox-Knoten selbst, bleiben ihre Anfragen dort. Ollama-Cloud-Modelle senden Anfragen nach außen, auch über einen lokalen Ollama-Server."
|
||||
},
|
||||
{
|
||||
"provider": "OpenAI",
|
||||
"destination": "Standardmäßig <code>api.openai.com</code> oder die konfigurierte eigene Basis-URL. Es gelten die Datenverarbeitungsregeln des tatsächlichen Endpunktbetreibers."
|
||||
},
|
||||
{
|
||||
"provider": "Anthropic",
|
||||
"destination": "<code>api.anthropic.com</code>."
|
||||
},
|
||||
{
|
||||
"provider": "Google Gemini",
|
||||
"destination": "<code>generativelanguage.googleapis.com</code>."
|
||||
},
|
||||
{
|
||||
"provider": "Groq",
|
||||
"destination": "<code>api.groq.com</code>."
|
||||
},
|
||||
{
|
||||
"provider": "OpenRouter",
|
||||
"destination": "<code>openrouter.ai</code> leitet an den im Feld <code>model</code> gewählten Modellanbieter weiter. Zwei Verarbeitungsstationen statt einer."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "Wenn Ereignisinhalte das Netzwerk nicht verlassen können",
|
||||
"calloutBody": "Nutzen Sie einen lokal gehosteten Endpunkt mit lokalem Modell, etwa Ollama oder einen OpenAI-kompatiblen Server, oder deaktivieren Sie die KI. Ollama-Cloud-Modelle verarbeiten Daten nicht lokal. Der Dispatcher anonymisiert keine Hostnamen oder IP-Adressen; er nutzt den tatsächlichen Ereignisinhalt."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Benachrichtigungen",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": "— die Versandpipeline, Kanäle, Per-Event-Toggles und die PVE webhook-Integration, die diese Schicht umgibt."
|
||||
},
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": "— der größte Einzelproduzent von Ereignissen, den die KI am Ende umschreibt, mit eigenen Unterdrückungsdauern pro Kategorie."
|
||||
},
|
||||
{
|
||||
"label": "Architektur",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": "- wo der AI Enhancer in den breiteren Monitor-Prozess passt (es ist ein Modul, kein separater Dienst)."
|
||||
}
|
||||
],
|
||||
"communityLabel": "Community prompts auf GitHub",
|
||||
"communityTail": "- durchsuchen, teilen, fragen."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,760 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox-Monitor-API — Integrationsreferenz | ProxMenux",
|
||||
"description": "HTTP-Endpunkte von ProxMenux Monitor für Home Assistant, Homepage, Grafana, Prometheus, n8n und eigene Dashboards. Zustand abfragen und dokumentierte Änderungen anstoßen: VM-Steuerung, Sicherungen, Benachrichtigungen und Warnungsbestätigung.",
|
||||
"ogTitle": "Proxmox-Monitor-API — Integrationsreferenz",
|
||||
"ogDescription": "ProxMenux-Monitor-Endpunkte für Home Assistant, Homepage, Grafana, Prometheus, n8n und eigene Dashboards.",
|
||||
"twitterTitle": "Proxmox-Monitor-API | ProxMenux",
|
||||
"twitterDescription": "Endpunkte für Home Assistant, Homepage, Grafana, Prometheus, n8n und eigene Dashboards."
|
||||
},
|
||||
"header": {
|
||||
"title": "API-Referenz",
|
||||
"description": "HTTP-Endpunkte zum Lesen des Zustands und Aufrufen dokumentierter Aktionen: Home-Assistant-Sensoren, Homepage-Karten, Grafana-Dashboards, Prometheus-Erfassung, n8n-Abläufe und eigene Skripte. Mit Kategorien, exportierten Metriken und curl-Beispielen.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Wofür diese Seite ist",
|
||||
"body": "Diese Seite enthält Endpunkte für externe Integrationen: Datenabruf und Aktionen wie Sicherungen, eigene Meldungen und Warnungsbestätigung. Die API läuft im Flask-Prozess des Dashboards auf TCP <strong>8008</strong>. Bindeadresse und TLS beschreibt <link>Zugriff und Authentifizierung</link>."
|
||||
},
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerMethod": "Methode",
|
||||
"headerUse": "Verwendung",
|
||||
"auth": {
|
||||
"heading": "Authentifizierung",
|
||||
"intro": "Bei aktiver Authentifizierung erwarten geschützte Endpunkte ein JWT-Bearer-Token im Anfrageheader:",
|
||||
"tokensIntro": "Zwei Möglichkeiten, das Token zu erhalten:",
|
||||
"items": [
|
||||
"<strong>API-Token, für Integrationen empfohlen.</strong> Sie gelten 365 Tage und entstehen unter <strong>Sicherheit → API-Token</strong>. Sie haben Namen und sind einzeln widerrufbar. read_only dient dem Datenabruf; full_admin wählen Sie nur für benötigte Verwaltungsaktionen.",
|
||||
"<strong>Anmeldung, JWT für 24 Stunden.</strong> <code>POST /api/auth/login</code> mit Benutzername, Passwort und TOTP, falls 2FA dies verlangt. Das JWT läuft nach 24 Stunden ab; Skripte müssen sich danach erneut anmelden."
|
||||
],
|
||||
"flowLink": "Anmeldung, Passwörter, 2FA, Auditprotokoll und TLS erklärt <link>Zugriff und Authentifizierung</link>.",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/auth/login",
|
||||
"method": "POST",
|
||||
"use": "Anfragefelder (Schema): <code>'{'\"username\",\"password\",\"totp_token?\"'}'</code>. Liefert ein JWT für 24 Stunden."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/auth/api-tokens",
|
||||
"method": "GET",
|
||||
"use": "Listen Sie API-Token auf (nur Metadaten - Namen, Präfixe, Daten; niemals das eigentliche Geheimnis)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/auth/generate-api-token",
|
||||
"method": "POST",
|
||||
"use": "Erstellt mit einer angemeldeten Sitzung ein API-Token für 365 Tage. Felder: <code>password, token_name?, totp_token?, scope?</code>. Passwort und erforderliches TOTP werden erneut geprüft. scope ist standardmäßig read_only; full_admin muss ausdrücklich gewählt werden. Der geheime Wert erscheint nur einmal."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/auth/api-tokens/<id>",
|
||||
"method": "DELETE",
|
||||
"use": "Widerruf eines bestimmten API-Tokens durch seine ID."
|
||||
}
|
||||
]
|
||||
},
|
||||
"conventions": {
|
||||
"heading": "Konventionen",
|
||||
"items": [
|
||||
"Die meisten Endpunkte verwenden JSON. Downloads können Klartext liefern; <code>/api/prometheus</code> liefert das Prometheus-Textformat 0.0.4 statt OpenMetrics. Prüfen Sie den Antworttyp der jeweiligen Route.",
|
||||
"Viele Schreiboperationen liefern <code>'{'\"success\": true, ...'}'</code>. Fehlerformate variieren; häufig ist <code>'{'\"success\": false, \"error\": \"'<'reason'>'\"'}'</code>. Prüfen Sie HTTP-Status und Felder: manche Authentifizierungsanforderungen liefern HTTP 200 mit success false.",
|
||||
"Abfrageparameter hängen vom Endpunkt ab. Verwenden Sie <code>limit</code>, <code>offset</code>, <code>since</code> und Kategoriefilter nur, wenn die Route sie unterstützt.",
|
||||
"Zeitformate variieren: Unix-Zeitstempel, ISO-8601-Zeichenfolgen und systemd-Datumsformate kommen vor. Nicht jedes Feld hat dieselbe Einheit oder eine ausdrückliche Zeitzone."
|
||||
]
|
||||
},
|
||||
"system": {
|
||||
"heading": "System und Hardware",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/system",
|
||||
"method": "GET",
|
||||
"use": "Aktuelle Werte für CPU, RAM, Swap, Betriebszeit und Last."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/info",
|
||||
"method": "GET",
|
||||
"use": "Statische Host-Infos: Hostname, Kernel, PVE-Version, CPU-Modell, Distribution."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/system-info",
|
||||
"method": "GET",
|
||||
"use": "Erweiterte Systemdaten der Dashboard-Kopfzeile: Gesamtmetriken und Startzeitpunkt."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/hardware",
|
||||
"method": "GET",
|
||||
"use": "Detaillierter Hardwarebestand: PCI-Geräte, GPUs und Sensorzuordnung."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/hardware/live",
|
||||
"method": "GET",
|
||||
"use": "Aktuelle Werte schnell veränderlicher Sensoren."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/temperature/history",
|
||||
"method": "GET",
|
||||
"use": "Zeitreihen der CPU- und Package-Temperaturen."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/gpu/<slot>/realtime",
|
||||
"method": "GET",
|
||||
"use": "Aktuelle GPU-Metriken von NVIDIA, Intel und AMD je PCI-Slot."
|
||||
}
|
||||
]
|
||||
},
|
||||
"actions": {
|
||||
"heading": "Systemaktionen",
|
||||
"intro": "Diese asynchronen Systemaktionen laufen in temporären systemd-Units. Bei aktiver Authentifizierung verlangen ihre Schreibzugriffe <code>full_admin</code>; <code>read_only</code> darf <code>.../status</code> abfragen. Angenommene Starts liefern HTTP 202 mit Zustand; <code>.../status</code> zeigt den Fortschritt. Gaststeuerung und Sicherungen haben andere Antworten, siehe unten.",
|
||||
"shapeTitle": "Gemeinsames Antwortformat",
|
||||
"shapeIntro": "Asynchrone Systemaktionen teilen das folgende JSON-Zustandsobjekt. Gaststeuerung und Sicherungen antworten in anderen Formaten:",
|
||||
"shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}",
|
||||
"concurrencyTitle": "Parallele Ausführung und Abbruch",
|
||||
"concurrencyBody": "Ein zweiter Start derselben laufenden Aktion liefert HTTP 409. Abbruch gibt es nur mit dokumentierter DELETE-Route, etwa beim PVE-Update. Der Zustand wird <code>cancelled</code>, Zeitstempel bleiben erhalten. Endzustände liegen im Prozessspeicher und können beim Monitor-Neustart verloren gehen.",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/system/power/reboot",
|
||||
"method": "POST",
|
||||
"use": "Startet den Neustart des Proxmox-Hosts. Die HTTP-Verbindung kann beim Beginn der Abschaltung durch systemd abbrechen."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/system/power/reboot/status",
|
||||
"method": "GET",
|
||||
"use": "Zustand des aktuellen oder letzten Neustarts."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/system/power/shutdown",
|
||||
"method": "POST",
|
||||
"use": "Schaltet den Proxmox-Host aus, etwa als Reaktion auf ein USV-Abschaltsignal."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/system/power/shutdown/status",
|
||||
"method": "GET",
|
||||
"use": "Zustand der aktuellen oder letzten Abschaltung."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/system/pve-update/run",
|
||||
"method": "POST",
|
||||
"use": "Startet denselben PVE-Updateablauf wie Jetzt aktualisieren im Health Monitor und das Shell-Menü; delegiert an update-pve-safe.sh."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/system/pve-update/status",
|
||||
"method": "GET",
|
||||
"use": "Zustand des aktuellen oder letzten PVE-Updates."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/system/pve-update",
|
||||
"method": "DELETE",
|
||||
"use": "Bricht ein laufendes PVE-Update mit SIGTERM ab."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/proxmenux/self-update/run",
|
||||
"method": "POST",
|
||||
"use": "Aktualisiert ProxMenux mit dem Installer des eingestellten Stable- oder Beta-Kanals. Eine eigene systemd-Unit lässt den Auftrag den vom Installer ausgelösten proxmenux-monitor-Neustart überstehen."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/proxmenux/self-update/status",
|
||||
"method": "GET",
|
||||
"use": "Zustand der aktuellen oder letzten ProxMenux-Selbstaktualisierung."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/control",
|
||||
"method": "POST",
|
||||
"use": "Übermittelt die Steuerung einer VM oder eines LXC. <code>action</code> erlaubt <code>start</code>, <code>stop</code>, <code>shutdown</code> oder <code>reboot</code>. Eine erfolgreiche Antwort enthält einen bestätigten PVE-Task und bedeutet nicht dessen Abschluss. Fragen Sie den control-task-Endpunkt des Gastes für das Ergebnis ab."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Erstellt eine vzdump-Sicherung einer VM oder eines LXC. Optionale, an den Speicher anzupassende Felder: <code>storage</code> (PVE-Ziel), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> oder <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> oder <code>none</code>), <code>protected</code> (<code>true</code> oder <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> oder <code>never</code>) und <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> oder <code>data</code>). Liefert die UPID des PVE-Tasks."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
"method": "GET",
|
||||
"use": "Listet bisherige Sicherungen einer VM oder eines LXC auf allen erreichbaren Speichern auf."
|
||||
}
|
||||
],
|
||||
"syncVsAsyncTitle": "Zwei Arten von Aktionen",
|
||||
"syncVsAsyncBody": "Host-Stromsteuerung und Updates laufen in temporären systemd-Units mit <code>.../status</code>. Nur das PVE-Update hat hier eine <code>DELETE</code>-Abbruchroute. VM/LXC-Steuerung liefert einen abzufragenden Task, Sicherung eine UPID für einen Hintergrundauftrag. Annahme bedeutet nicht Abschluss. Authentifizierung und Rechte hängen von der Route ab.",
|
||||
"curlTitle": "curl-Beispiel",
|
||||
"curlBody": "Startet ein PVE-Update und fragt bis zum Abschluss ab, wie eine Home-Assistant-Automation oder ein Ansible-Playbook.",
|
||||
"curlCode": "TOKEN=<your full_admin token>\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://<host>:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://<host>:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"",
|
||||
"haTitle": "Home-Assistant-Beispiel",
|
||||
"haBody": "Ein <code>rest</code>-Sensor fragt den Zustand ab; <code>rest_command</code> startet das Update. Binden Sie beide in Dashboard-Schaltflächen und Automationen ein:",
|
||||
"haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\""
|
||||
},
|
||||
"health": {
|
||||
"heading": "Gesundheitsmonitor",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Kleine Zustandsprüfung mit JSON-Feldern <code>status</code>, <code>timestamp</code> und <code>version</code>. Für Uptime-Kuma-Schlüsselwortprüfungen geeignet; bei aktiver Authentifizierung muss der Client den Bearer-Header senden."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
"method": "GET",
|
||||
"use": "Gesamtzustand: ein Schweregrad und eine Zusammenfassung."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/details",
|
||||
"method": "GET",
|
||||
"use": "Alle zehn Kategorien mit Zustand und strukturierten Daten der jeweiligen Prüfung."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/full",
|
||||
"method": "GET",
|
||||
"use": "Vollständige Daten: Kategorien, aktive Fehler, unterdrückte Warnungen und Einstellungen. Hintergrunddaten werden genutzt, wenn sie jünger als sechs Minuten sind; sonst oder bei erzwungener Aktualisierung läuft eine neue Prüfung."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/active-errors",
|
||||
"method": "GET",
|
||||
"use": "Aktive Liste, filterbar durch <code>?category=<name></code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/dismissed",
|
||||
"method": "GET",
|
||||
"use": "Unterdrückte Warnungen mit verbleibenden Stunden."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/settings",
|
||||
"method": "GET",
|
||||
"use": "Eingestellte Unterdrückungsdauer je Kategorie."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/remote-storages",
|
||||
"method": "GET",
|
||||
"use": "Inventar von Proxmox-definierten Fernspeichern mit Online-Status."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/interfaces",
|
||||
"method": "GET",
|
||||
"use": "Netzwerkschnittstellen mit Typ (Bridge / Bond / physisch), IP und Verbindungsgeschwindigkeit."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/acknowledge",
|
||||
"method": "POST",
|
||||
"use": "Anfrageinhalt: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Unterdrückt eine Warnung für die eingestellte Dauer ihrer Kategorie."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/cleanup-orphans",
|
||||
"method": "POST",
|
||||
"use": "Manuelle Bereinigung von Fehlern, deren zugrunde liegendes Gerät oder VM verschwunden ist. Idempotent."
|
||||
}
|
||||
],
|
||||
"outro": "Antwortformate und Kategorien erklärt <link>Health Monitor</link>."
|
||||
},
|
||||
"storage": {
|
||||
"heading": "Speicher",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/storage",
|
||||
"method": "GET",
|
||||
"use": "Für den Host sichtbare Datenträger: Blockgeräte, ZFS-Pools und LVM."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/summary",
|
||||
"method": "GET",
|
||||
"use": "Kompakte Zusammenfassung, die von Dashboardkarten verwendet wird."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/proxmox-storage",
|
||||
"method": "GET",
|
||||
"use": "Proxmox-definierte Speicher von <code>/etc/pve/storage.cfg</code> mit Online-Zustand und freiem Speicherplatz."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/observations",
|
||||
"method": "GET",
|
||||
"use": "Dauerhaft gespeicherte Beobachtungen: SMART-Warnungen, E/A-Fehler und ZFS-Ereignisse. Bleiben nach automatischer Fehlerauflösung erhalten."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>",
|
||||
"method": "GET",
|
||||
"use": "Aktuelle SMART Attribute für eine Festplatte."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/latest",
|
||||
"method": "GET",
|
||||
"use": "Aktueller SMART Selbsttest für die Festplatte."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/history",
|
||||
"method": "GET",
|
||||
"use": "Liste der gespeicherten SMART-Berichte für die Festplatte."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/history/<file>",
|
||||
"method": "GET",
|
||||
"use": "Lesen Sie einen spezifischen gespeicherten SMART-Bericht."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Startet einen SMART-Selbsttest. Anfrageschema: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
"method": "GET",
|
||||
"use": "Listen Sie die derzeit geplanten SMART-Tests auf."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/tools",
|
||||
"method": "GET",
|
||||
"use": "Prüft, ob <code>smartctl</code> und zugehörige Werkzeuge installiert sind."
|
||||
}
|
||||
]
|
||||
},
|
||||
"network": {
|
||||
"heading": "Netzwerk",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/network",
|
||||
"method": "GET",
|
||||
"use": "Alle Schnittstellen mit Linkzustand und Adressen."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/network/summary",
|
||||
"method": "GET",
|
||||
"use": "Kompakte Ansicht, die vom Dashboard verwendet wird."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/network/<iface>/metrics",
|
||||
"method": "GET",
|
||||
"use": "RX/TX je Schnittstelle, Fehlerzähler und RRD-Zeitreihen."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/network/latency/current",
|
||||
"method": "GET",
|
||||
"use": "Letzte Latenzmessung zum Gateway."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/network/latency/history",
|
||||
"method": "GET",
|
||||
"use": "Zeitreihe der Gateway-Latenz."
|
||||
}
|
||||
]
|
||||
},
|
||||
"vms": {
|
||||
"heading": "VMs und Container",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/vms",
|
||||
"method": "GET",
|
||||
"use": "VMs und CTs des lokalen Knotens mit Zustand, vmid und Name."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>",
|
||||
"method": "GET",
|
||||
"use": "Vollständige Details für einen Gast (Konfiguration, Netzwerk, Festplatten)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/metrics",
|
||||
"method": "GET",
|
||||
"use": "CPU / Speicher / Festplatte I/O Zeitreihe für einen Gast (RRD)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"method": "GET",
|
||||
"use": "Aktuelle Task-Protokolle dieses Gastes."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
"method": "GET",
|
||||
"use": "Für diesen Gast gespeicherte Sicherungen."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/control",
|
||||
"method": "POST",
|
||||
"use": "Wählen Sie eine Aktion aus dem Schema: <code>'{'\"action\":\"start|stop|reboot|shutdown\"'}'</code>. Steuert den Betriebszustand des Gastes."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Startet <code>vzdump</code> für den Gast. Die Anfrage legt Speicher und Modus fest (<code>snapshot</code> / <code>suspend</code> / <code>stop</code>)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/config",
|
||||
"method": "PUT",
|
||||
"use": "Aktualisieren Sie das Beschreibungsfeld (Notizen) eines VM / CT. Andere Konfigurationsschlüssel sind von diesem Endpunkt aus nicht veränderbar."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/node/metrics",
|
||||
"method": "GET",
|
||||
"use": "Zusammengefasste Knotenmetriken als RRD-Zeitreihen."
|
||||
}
|
||||
]
|
||||
},
|
||||
"backups": {
|
||||
"heading": "Sicherungen",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/backups",
|
||||
"method": "GET",
|
||||
"use": "Sicherungen auf dir-, NFS-, CIFS- und PBS-Speichern, die über den lokalen Knoten abgefragt werden. Keine vollständige Prüfung aller Clusterknoten."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/backup-storages",
|
||||
"method": "GET",
|
||||
"use": "Als Sicherungsziele gekennzeichnete Speicher mit freiem Platz."
|
||||
}
|
||||
]
|
||||
},
|
||||
"logs": {
|
||||
"heading": "Protokolle, Aufgaben, Ereignisse",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/logs",
|
||||
"method": "GET",
|
||||
"use": "Gefilterte Journaleinträge. Anfrage: <code>?level=&service=&limit=</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/logs/download",
|
||||
"method": "GET",
|
||||
"use": "Exportiert den gefilterten Bereich als Klartext."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/events",
|
||||
"method": "GET",
|
||||
"use": "Interner Ereignisstrom - derselbe, der Benachrichtigungen füttert."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/task-log/<upid>",
|
||||
"method": "GET",
|
||||
"use": "Vollständiges Klartextprotokoll eines Proxmox-Tasks anhand seiner UPID."
|
||||
}
|
||||
]
|
||||
},
|
||||
"notifications": {
|
||||
"heading": "Benachrichtigungen und KI",
|
||||
"intro": "Versand, Kanaleinrichtung und KI-Umformulierung erklären <notifLink>Benachrichtigungen</notifLink> und <aiLink>KI-Assistent</aiLink>.",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/notifications",
|
||||
"method": "GET",
|
||||
"use": "Im Dashboard angezeigte aktuelle Benachrichtigungen."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/download",
|
||||
"method": "GET",
|
||||
"use": "Exportiert Benachrichtigungen als Text."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/status",
|
||||
"method": "GET",
|
||||
"use": "Versandzustand: aktiver Hintergrundprozess, Warteschlangenlänge und letzter Versand."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/settings",
|
||||
"method": "GET",
|
||||
"use": "Liest die Benachrichtigungseinstellungen: Kanäle, Ereignisschalter, KI-Umformulierung und Anzeigename."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/history",
|
||||
"method": "GET",
|
||||
"use": "Versandverlauf. Parameter: <code>?limit=&offset=&severity=&channel=</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/history",
|
||||
"method": "DELETE",
|
||||
"use": "Leert die Tabelle des Versandverlaufs."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/test",
|
||||
"method": "POST",
|
||||
"use": "Sendet eine Testnachricht an einen Kanal. Anfrageinhalt: <code>'{'\"channel\":\"telegram\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/send",
|
||||
"method": "POST",
|
||||
"use": "Erzeugt ein eigenes Ereignis. Anfrageinhalt: <code>'{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/test-ai",
|
||||
"method": "POST",
|
||||
"use": "Prüft die Verbindung zum KI-Anbieter. Anfragefelder (Schema): <code>'{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/provider-models",
|
||||
"method": "POST",
|
||||
"use": "Listen Sie verfügbare Modelle für den ausgewählten AI-Anbieter auf."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/setup-webhook",
|
||||
"method": "POST",
|
||||
"use": "Registrieren Sie den Monitor als webhook-Ziel in <code>/etc/pve/notifications.cfg</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/cleanup-webhook",
|
||||
"method": "POST",
|
||||
"use": "Entfernen Sie das Monitor-Ziel aus der Benachrichtigungskonfiguration von PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/read-cfg",
|
||||
"method": "GET",
|
||||
"use": "Lesen Sie den aktuellen <code>notifications.cfg</code> von PVE, wie PVE ihn sieht."
|
||||
}
|
||||
]
|
||||
},
|
||||
"security": {
|
||||
"heading": "Sicherheit (lesen)",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/security/firewall/status",
|
||||
"method": "GET",
|
||||
"use": "PVE Firewall Status und aktive Regeln."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/fail2ban/details",
|
||||
"method": "GET",
|
||||
"use": "Zustand des Fail2Ban-Jails; setzt diese optionale Installation voraus."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/fail2ban/activity",
|
||||
"method": "GET",
|
||||
"use": "Aktuelle Fail2Ban-Ereignisse: Sperren, Entsperren und Jail-Starts."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/lynis/status",
|
||||
"method": "GET",
|
||||
"use": "Lynis-Zustand: Installation und Zeitpunkt der letzten Prüfung."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/lynis/report",
|
||||
"method": "GET",
|
||||
"use": "Letzter Lynis-Auditbericht: Warnungen, Vorschläge und Hardening-Index."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/tools",
|
||||
"method": "GET",
|
||||
"use": "Erkennen Sie, welche optionalen Sicherheitstools (Fail2Ban, Lynis) installiert sind."
|
||||
}
|
||||
]
|
||||
},
|
||||
"proxmenuxIntegration": {
|
||||
"heading": "ProxMenux Integration",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/proxmenux/update-status",
|
||||
"method": "GET",
|
||||
"use": "Verfügbarkeit eines ProxMenux-Monitor-Updates sowie installierte und neueste Version."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/proxmenux/installed-tools",
|
||||
"method": "GET",
|
||||
"use": "Liste jeder ProxMenux-Postinstallationsoptimierung, die derzeit auf dem Host registriert ist (ab <code>/usr/local/share/proxmenux/installed_tools.json</code>)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/proxmenux/tool-source/<key>",
|
||||
"method": "GET",
|
||||
"use": "Quellcode der zugeordneten Nachinstallationsfunktion aus aktuellen Host-Skripten oder erhaltenem älterem Code. Kein garantiertes Abbild des ursprünglich ausgeführten Codes."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prometheus": {
|
||||
"heading": "Prometheus-Metriken",
|
||||
"intro": "Der authentifizierte Endpunkt <code>GET /api/prometheus</code> liefert das Prometheus-Textformat 0.0.4. Jede Metrik enthält <code>node=\"<hostname>\"</code> und einen Zeitstempel. Erfassen Sie sie mit Prometheus oder einer kompatiblen Zeitreihendatenbank.",
|
||||
"exportedTitle": "Exportierte Metriken",
|
||||
"headerGroup": "Gruppe",
|
||||
"headerMetric": "Metrik",
|
||||
"headerDesc": "Beschreibung",
|
||||
"groups": [
|
||||
{
|
||||
"group": "System",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_cpu_usage",
|
||||
"desc": "CPU-Auslastung in Prozent, Typ Gauge."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_memory_total_bytes",
|
||||
"desc": "Physikalischer Gesamtspeicher in Bytes."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_memory_used_bytes",
|
||||
"desc": "Belegter Arbeitsspeicher in Bytes."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_memory_usage_percent",
|
||||
"desc": "Prozentsatz des Speicherverbrauchs."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_load_average",
|
||||
"desc": "Systemlastdurchschnitt. Kennzeichnung <code>period=\"1m\" | \"5m\" | \"15m\"</code>."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Betriebszeit",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_uptime_seconds",
|
||||
"desc": "Sekunden seit dem letzten Systemstart."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Hardware",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_cpu_temperature_celsius",
|
||||
"desc": "CPU-Package-Temperatur."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_disk_temperature_celsius",
|
||||
"desc": "Temperatur je Datenträger. Label <code>disk</code>."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_fan_speed_rpm",
|
||||
"desc": "Lüfterdrehzahlen. Label <code>fan</code>."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Speicherplatz",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_disk_total_bytes",
|
||||
"desc": "Gesamtkapazität je exportiertem Datenträgereintrag. Label <code>disk</code>."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_disk_used_bytes",
|
||||
"desc": "Belegte Kapazität je exportiertem Datenträgereintrag."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_disk_usage_percent",
|
||||
"desc": "Prozentual belegte Kapazität je exportiertem Datenträgereintrag."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Netzwerk",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_network_bytes_sent_total",
|
||||
"desc": "Gesendete Bytes insgesamt, Typ Counter."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_network_bytes_received_total",
|
||||
"desc": "Empfangene Bytes insgesamt, Typ Counter."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_interface_bytes_sent_total",
|
||||
"desc": "Gesendete Bytes je Schnittstelle. Label <code>interface</code>."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_interface_bytes_received_total",
|
||||
"desc": "Empfangene Bytes je Schnittstelle."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "VMs / CTs",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_vms_total",
|
||||
"desc": "Gesamtzahl VMs und LXCs."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vms_running",
|
||||
"desc": "Anzahl laufender Gäste."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vms_stopped",
|
||||
"desc": "Anzahl der gestoppten Gäste."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vm_status",
|
||||
"desc": "Zustand je VM/CT: 1 läuft, 0 sonst. Labels <code>node</code>, <code>vmid</code> und <code>name</code>."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vm_cpu_usage",
|
||||
"desc": "CPU-Auslastung je VM/CT mit denselben Labels."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vm_memory_used_bytes / _max_bytes",
|
||||
"desc": "Belegter RAM und konfiguriertes Maximum je VM/CT."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "GPU",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_gpu_temperature_celsius",
|
||||
"desc": "GPU-Temperatur. Labels <code>slot</code> und <code>vendor</code>; gpu enthält zusätzlich den GPU-Namen."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_utilization_percent",
|
||||
"desc": "GPU-Auslastung in Prozent."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_memory_total_bytes",
|
||||
"desc": "Gesamter GPU-Speicher."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_power_draw_watts",
|
||||
"desc": "GPU-Leistungsaufnahme in Watt."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_clock_speed_mhz",
|
||||
"desc": "GPU-Kerntakt."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_memory_clock_mhz",
|
||||
"desc": "GPU-Speichertakt."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "UPS",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_ups_battery_charge_percent",
|
||||
"desc": "Batterieladung in Prozent."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_ups_load_percent",
|
||||
"desc": "Aktuelle Belastung der USV."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_ups_runtime_seconds",
|
||||
"desc": "Geschätzte Laufzeit im Batteriebetrieb."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_ups_input_voltage_volts",
|
||||
"desc": "Eingangsspannung."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"scrapeTitle": "Prometheus-Scrape-Konfiguration",
|
||||
"scrapeIntro": "Bei aktiver Authentifizierung tragen Sie ein API-Token als Bearer-Header in die Prometheus-Erfassungskonfiguration ein:",
|
||||
"perHostTitle": "Erfassung je Host",
|
||||
"perHostBody": "Jede Instanz exportiert Metriken ihres eigenen Hosts. Lassen Sie Prometheus im Cluster jeden Knoten abfragen. Das Label <code>node</code> unterscheidet die Reihen in Grafana (<code>proxmox_vms_running'{'node=\"pve01\"'}'</code>)."
|
||||
},
|
||||
"puttingItTogether": {
|
||||
"heading": "Integrationen zusammenführen",
|
||||
"body": "<link>Integrationen</link> erklärt die Anbindung an Home-Assistant-Sensoren, Homepage-Karten, Grafana-Dashboards, n8n-Abläufe und weitere Werkzeuge. Dort finden Sie typische Konfigurationen zum Kopieren. Diese Seite enthält den Endpunktkatalog."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Weitere Schritte",
|
||||
"items": [
|
||||
{
|
||||
"label": "Zugriff und Authentifizierung",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — Token-Erstellung, Auditprotokoll, optionales Fail2Ban-Jail und TLS."
|
||||
},
|
||||
{
|
||||
"label": "Benachrichtigungen",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tailRich": " — Inhalt von <code>data</code> je Ereignistyp beim Aufruf von <code>/api/notifications/send</code>."
|
||||
},
|
||||
{
|
||||
"label": "KI-Assistent",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tailRich": " — Funktionsweise von <code>/api/notifications/test-ai</code> und <code>/api/notifications/provider-models</code>."
|
||||
},
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tailRich": " — Antwortformat von <code>/api/health/*</code> und Bedeutung der zehn Kategorien."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,303 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Architektur von ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux",
|
||||
"description": "Aufbau von ProxMenux Monitor: AppImage-Struktur, Flask-Blueprints, Hintergrundaufgaben, Daten aus psutil, pvesh, smartctl und journalctl, SQLite-Speicherung, WebSocket-Terminal, KI-Anbieter, Benachrichtigungskanäle, Reverse-Proxy und optionales Fail2Ban.",
|
||||
"ogTitle": "ProxMenux Monitor Architektur",
|
||||
"ogDescription": "ProxMenux Monitor intern: AppImage, Flask-Blueprints, Hintergrundaufgaben, SQLite, WebSocket, KI-Anbieter und Benachrichtigungskanäle.",
|
||||
"twitterTitle": "ProxMenux Monitor Architektur",
|
||||
"twitterDescription": "AppImage, Flask, SQLite, WebSocket, KI-Anbieter und Benachrichtigungskanäle — innerhalb des Monitors."
|
||||
},
|
||||
"header": {
|
||||
"title": "Architektur",
|
||||
"description": "Wie ProxMenux Monitor ausgeliefert wird, was das AppImage enthält und wie Browseranfragen über Flask zu Host-Werkzeugen und SQLite gelangen.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Ein Prozess, viele Verantwortlichkeiten",
|
||||
"body": "Ein Python-Prozess lauscht auf TCP 8008. Er liefert den statischen Next.js-Build aus, stellt die REST-API bereit, verwaltet das WebSocket-Terminal, führt den Health Monitor aus und versendet Meldungen. Ein separater Webserver, Nachrichtenbroker oder externer Datenbankserver ist nicht erforderlich."
|
||||
},
|
||||
"requestFlow": {
|
||||
"heading": "Ablauf einer Anfrage",
|
||||
"intro": "Eine typische Datenanfrage folgt diesem Weg; reine Browsereinstellungen können lokal bleiben:",
|
||||
"diagramCaption": "Geschützte Routen prüfen JWT bei aktiver Authentifizierung. Kernrouten und Blueprints liefern zwischengespeicherte oder neu erfasste Host-Daten. Der optionale Fail2Ban-Hook prüft seine zwischengespeicherte Sperrliste. Weitergeleitete IP-Header gelten nur mit PROXMENUX_TRUST_PROXY=1; sonst zählt die Gegenstellenadresse. Dauerhafter Zustand liegt in SQLite und JSON-Dateien wie auth.json.",
|
||||
"diagramArrowLabel": "HTTP / WS",
|
||||
"nodes": {
|
||||
"clientLabel": "Client",
|
||||
"clientDetail": "Browser oder PWA\n+ optionaler Proxy\nNginx / Caddy /\nTraefik",
|
||||
"flaskLabel": "Flask :8008",
|
||||
"flaskDetail": "Blueprints\nJWT-Middleware\nFail2Ban-Hook\n(falls installiert)",
|
||||
"hostLabel": "Host-Tools",
|
||||
"hostDetail": "psutil\npvesh\nsmartctl\njournalctl",
|
||||
"stateLabel": "Lokaler Zustand",
|
||||
"stateDetail": "SQLite DB\n+ auth.json"
|
||||
},
|
||||
"threadsIntro": "Der Prozess führt auch <strong>Hintergrundthreads</strong> aus. Diese Beispiele erfassen Daten, aktualisieren Caches und SQLite und versenden Meldungen. Weitere Aufgaben existieren; der Versand hängt von seiner Aktivierung ab:",
|
||||
"headerThread": "Thread",
|
||||
"headerCadence": "Intervall",
|
||||
"headerJob": "Auftrag",
|
||||
"rows": [
|
||||
{
|
||||
"thread": "_temperature_collector_loop",
|
||||
"cadence": "60 s",
|
||||
"job": "Speichert CPU-Temperatur und Latenzproben in der Verlaufsdatenbank, damit Diagramme auch ohne verbundenen Browser Daten haben."
|
||||
},
|
||||
{
|
||||
"thread": "_health_collector_loop",
|
||||
"cadence": "5 min",
|
||||
"job": "Führt den Health-Monitor-Zyklus mit zehn Kategorien aus, speichert Fehler und Datenträgerbeobachtungen, berücksichtigt Unterdrückungen und übergibt neue Ereignisse an den Benachrichtigungsdienst."
|
||||
},
|
||||
{
|
||||
"thread": "_vital_signs_sampler",
|
||||
"cadence": "CPU 5 s; Temperatur 15 s; RAM 30 s",
|
||||
"job": "Erfasst CPU-Auslastung, RAM und CPU-Temperatur für aktuelle Anzeigen und anhaltende Zustände, unabhängig von der fünfminütigen Gesamtprüfung."
|
||||
},
|
||||
{
|
||||
"thread": "notification_manager.start()",
|
||||
"cadence": "Ereignisgesteuert",
|
||||
"job": "Startet Beobachter für Journal, Tasks und Hooks (<code>JournalWatcher</code>, <code>TaskWatcher</code>, <code>ProxmoxHookWatcher</code>) und sendet an eingerichtete Kanäle, optional mit KI-Umformulierung."
|
||||
}
|
||||
]
|
||||
},
|
||||
"systemd": {
|
||||
"heading": "systemd-Einheit",
|
||||
"intro": "Der Installer erstellt die Unit <code>/etc/systemd/system/proxmenux-monitor.service</code>. Standardkonfiguration:",
|
||||
"items": [
|
||||
"<strong><code>User=root</code></strong>: Der Dienst verwendet Root-Rechte für Host-Operationen wie SMART, <code>pvesh</code> und ZFS-Verwaltung. Die Webterminal-Prozesse erben diese Rechte.",
|
||||
"<strong><code>Restart=on-failure</code></strong> mit zehn Sekunden Wartezeit: Nach fehlerhaftem Ende startet der Dienst automatisch neu.",
|
||||
"<strong><code>After=network.target</code></strong>: ordnet den Start nach diesem Ziel ein; garantiert keine IP-Adresse, DNS oder externe Verbindung."
|
||||
],
|
||||
"inspectTitle": "Aktuelle Unit prüfen"
|
||||
},
|
||||
"appimage": {
|
||||
"heading": "Was das AppImage enthält",
|
||||
"intro": "Das AppImage enthält ein beim Start eingehängtes Dateisystem. <code>AppRun</code> im Wurzelverzeichnis bereitet die Umgebung vor und startet <code>flask_server.py</code>:",
|
||||
"consequencesIntro": "Zwei Konsequenzen dieses Layouts:",
|
||||
"consequences": [
|
||||
"<strong>Mitgelieferte Python-Umgebung.</strong> Interpreter und Pakete liegen im AppImage; eine Installation in das System-Python entfällt. Die Anwendung nutzt weiterhin Kernel-Schnittstellen und externe Host-Werkzeuge.",
|
||||
"<strong>Hardware-Clients sind enthalten.</strong> Mitgeliefert werden <code>ipmitool</code>, <code>lm-sensors</code> und <code>upsc</code>. Messwerte erfordern unterstützte Hardware, Sensorzugriff und für USV-Daten einen eingerichteten NUT-Server."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Struktur der Flask-Anwendung",
|
||||
"intro": "<code>flask_server.py</code> erstellt eine <code>Flask(__name__)</code>-Instanz mit begrenztem CORS, registriert neun Blueprints direkt und initialisiert Terminalrouten. Die Tabelle zeigt Hauptmodule; Audit, VM-Sicherung und PBS sind ebenfalls registriert. PVE-Vorwärmer laufen nur auf PVE-Hosts.",
|
||||
"headerBlueprint": "Blueprint / Modul",
|
||||
"headerPrefix": "Routenpräfix",
|
||||
"headerOwns": "Zuständigkeit",
|
||||
"rows": [
|
||||
{
|
||||
"blueprint": "flask_server.py",
|
||||
"prefix": [
|
||||
"/api/system",
|
||||
"/api/storage",
|
||||
"/api/network",
|
||||
"/api/vms",
|
||||
"/api/hardware",
|
||||
"/api/logs",
|
||||
"/api/prometheus"
|
||||
],
|
||||
"owns": "Kernendpunkte, statische Weboberfläche und optionale Fail2Ban-Prüfung bei vorhandenem Jail <code>proxmenux</code> auf dem Host."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_auth_routes.py",
|
||||
"prefix": [
|
||||
"/api/auth/*"
|
||||
],
|
||||
"owns": "Anmeldung, JWT-Ausgabe, TOTP-Einrichtung und -Prüfung, Passwortänderung und API-Token."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_health_routes.py",
|
||||
"prefix": [
|
||||
"/api/health/*"
|
||||
],
|
||||
"owns": "Zustandsprüfungen, Detailstatus, aktive und unterdrückte Fehler sowie Unterdrückungseinstellungen. Geschützte Routen verlangen Authentifizierung, wenn aktiviert."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_terminal_routes.py",
|
||||
"prefix": [
|
||||
"/api/terminal/* + WS"
|
||||
],
|
||||
"owns": "Stellt je Sitzung ein PTY bereit und verbindet es über WebSocket mit <code>xterm.js</code> im Browser."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_notification_routes.py",
|
||||
"prefix": [
|
||||
"/api/notifications/*"
|
||||
],
|
||||
"owns": "Kanäle anlegen, lesen, ändern und löschen; Testversand, KI, Verlauf und manuelle Meldungen."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_security_routes.py",
|
||||
"prefix": [
|
||||
"/api/security/*"
|
||||
],
|
||||
"owns": "Anmeldefehler und bei installiertem Fail2Ban Jail-Zustand, Sperrereignisse und manuelles Entsperren."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_proxmenux_routes.py",
|
||||
"prefix": [
|
||||
"/api/proxmenux/*"
|
||||
],
|
||||
"owns": "Liest die im Host-Bestand registrierten ProxMenux-Optimierungen."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_oci_routes.py",
|
||||
"prefix": [
|
||||
"/api/oci/*"
|
||||
],
|
||||
"owns": "Hilfen zur Bereitstellung von OCI- und Container-Apps auf Proxmox VE 9.1+."
|
||||
}
|
||||
],
|
||||
"endpointsLink": "Integrationsendpunkte und ihre Formate erklärt <link>API-Referenz</link>."
|
||||
},
|
||||
"dataSources": {
|
||||
"heading": "Datenquellen",
|
||||
"intro": "Host-Daten stammen überwiegend aus Standardbibliotheken, Dateien und Verwaltungsbefehlen. Einige Gastdaten benötigen zusätzlich den QEMU Guest Agent oder Befehle innerhalb eines CT:",
|
||||
"headerSource": "Quelle",
|
||||
"headerUsedFor": "Verwendet für",
|
||||
"rows": [
|
||||
{
|
||||
"source": "psutil",
|
||||
"usedFor": "CPU-Last, RAM, Swap, Belegung von Einhängepunkten, Netzwerkzähler und Prozesse."
|
||||
},
|
||||
{
|
||||
"source": "pvesh / qm / pct",
|
||||
"usedFor": "Proxmox-Knoteninformationen, VM-/CT-Bestand und Konfiguration, Speicher sowie Task-Verlauf."
|
||||
},
|
||||
{
|
||||
"source": "smartctl",
|
||||
"usedFor": "SATA-/NVMe-Attribute, SMART-Zustand, Verschleiß, Lebensdauer, Modell und Seriennummer."
|
||||
},
|
||||
{
|
||||
"source": "zpool / zfs",
|
||||
"usedFor": "Poolzustand (ONLINE / DEGRADED / FAULTED / UNAVAIL), Scrub-Fortschritt und Dataset-Belegung."
|
||||
},
|
||||
{
|
||||
"source": "journalctl",
|
||||
"usedFor": "Systemprotokolle, OOM-Abbrüche, ATA-/NVMe-/dm-Fehler, Sicherheitsereignisse und eigene Service-Units."
|
||||
},
|
||||
{
|
||||
"source": "ip / iproute2",
|
||||
"usedFor": "Schnittstellen, Adressen, Bridges, Bonds und OVS-verwaltete Geräte."
|
||||
},
|
||||
{
|
||||
"source": "nvidia-smi · intel_gpu_top",
|
||||
"usedFor": "Verfügbare GPU-Daten zu Auslastung, VRAM, Temperatur und Encoder/Decoder. Felder hängen von Hersteller, Werkzeug und Treiber ab."
|
||||
},
|
||||
{
|
||||
"source": "lspci · lscpu · dmidecode",
|
||||
"usedFor": "PCIe-Topologie, CPU-Modell und -Topologie sowie Mainboard- und BIOS-Daten."
|
||||
},
|
||||
{
|
||||
"source": "ipmitool · sensors",
|
||||
"usedFor": "Out-of-Band-Sensoren, Lüfterdrehzahlen und Mainboard-Temperaturen bei unterstützter Hardware."
|
||||
},
|
||||
{
|
||||
"source": "upsc (NUT)",
|
||||
"usedFor": "Batteriezustand, Last und Restlaufzeit der USV bei eingerichtetem NUT-Server."
|
||||
}
|
||||
],
|
||||
"cacheTitle": "Caches reduzieren Host-Abfragen",
|
||||
"cacheBody": "Aufwendige Ergebnisse von <code>smartctl -a</code> und <code>pvesh get</code> werden im Flask-Prozess zeitweise gespeichert, um Datenträger und Cluster-API seltener abzufragen. Die Dauer hängt von der Quelle ab: Sekunden für aktuelle Metriken, Minuten für SMART."
|
||||
},
|
||||
"persistence": {
|
||||
"heading": "Persistenz",
|
||||
"intro": "Mehrere Zustandsdateien haben unterschiedliche Inhalte und Zugriffsanforderungen:",
|
||||
"headerPath": "Path",
|
||||
"headerOwner": "Eigentümer",
|
||||
"headerContents": "Inhalt",
|
||||
"rows": [
|
||||
{
|
||||
"path": "/usr/local/share/proxmenux/health_monitor.db",
|
||||
"owner": "root:root",
|
||||
"contents": "SQLite-Datenbank. Tabellen: <code>errors</code>, <code>events</code>, <code>disk_registry</code>, <code>disk_observations</code>, <code>user_settings</code>, <code>notification_history</code>, <code>excluded_storages</code>, <code>excluded_interfaces</code>. WAL-Journalmodus."
|
||||
},
|
||||
{
|
||||
"path": "/usr/local/share/proxmenux/.notification_key",
|
||||
"owner": "root <code>0600</code>",
|
||||
"contents": "32-Byte-Hauptschlüssel für Benachrichtigungsgeheimnisse im ENC2-Format. Verwendet zufälliges Salt je Wert, abgeleitete Schlüssel und MAC. Alte XOR-Werte werden zur Migration unterstützt."
|
||||
},
|
||||
{
|
||||
"path": "/root/.config/proxmenux-monitor/auth.json",
|
||||
"owner": "root:root",
|
||||
"contents": "Authentifizierungskonfiguration: Aktivierung, Benutzername, gesalzener PBKDF2-HMAC-SHA256-Passworthash, TOTP-Geheimnis, Wiederherstellungscodes, installationsbezogener JWT-Schlüssel, API-Token-Metadaten und Widerrufshashes. Alte SHA-256-Hashes werden nach erfolgreicher Anmeldung migriert."
|
||||
},
|
||||
{
|
||||
"path": "/var/log/proxmenux-auth.log",
|
||||
"owner": "root:root",
|
||||
"contents": "Klartextprotokoll der Authentifizierung, unabhängig von Fail2Ban. Ist das Jail <code>[proxmenux]</code> installiert und aktiv, liest es das Protokoll zur Erkennung wiederholter Anmeldefehler. Ohne Jail bleibt das Protokoll zur Prüfung verfügbar."
|
||||
}
|
||||
],
|
||||
"backupTitle": "auth.json vor der Neuinstallation sichern",
|
||||
"backupBody": "Ein AppImage-Austausch bewahrt normalerweise <code>/root/.config/proxmenux-monitor/auth.json</code> und <code>/usr/local/share/proxmenux/health_monitor.db</code>. Bewahren Sie <code>auth.json</code> samt jwt_secret für gültige Token und Metadaten. Die Datenbank enthält unabhängig Zustands- und Meldungsdaten. Sichern Sie <code>.notification_key</code> mit ihr für verschlüsselte Kanaleinstellungen; die Datenbank allein stellt API-Authentifizierung nicht wieder her."
|
||||
},
|
||||
"health": {
|
||||
"heading": "Health-Monitor-Zyklus",
|
||||
"intro": "Etwa alle fünf Minuten ruft der Hintergrundkollektor <code>health_monitor.py</code> für die Prüfungen der zehn Dashboard-Kategorien auf:",
|
||||
"items": [
|
||||
"Kritische PVE-Dienste (<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>).",
|
||||
"Proxmox-Speicher: <code>pvesh get /storage</code> und Verfügbarkeit je Speicher.",
|
||||
"Datenträger und Dateisysteme: SMART, E/A-Fehler in dmesg, ZFS-Zustand und Belegung von Einhängepunkten.",
|
||||
"VMs und CTs: Startfehler, Abstürze, QMP-Fehler und Probleme beim Herunterfahren.",
|
||||
"Netzwerk: Bridge- und Bond-Zustand, Verbindungsstatus und Gateway-Latenz.",
|
||||
"Updates: ausstehende Paketaktualisierungen und Sicherheitspatches.",
|
||||
"Protokolle: anhaltende Muster, Spitzen und Kaskaden im Systemjournal.",
|
||||
"Arbeitsspeicher: OOM-Killer-Aktivität und anhaltender Speicherdruck.",
|
||||
"Temperatur: CPU- und Datenträgerwerte im Vergleich zu Überwachungsschwellen; verfügbare Sensoren hängen von der Hardware ab.",
|
||||
"Sicherheit: Anmeldefehler, Sperrereignisse und Fail2Ban-Jail-Zustand."
|
||||
],
|
||||
"afterIntro": "Befunde verwenden stabile <code>error_key</code>, Kategorie und Schweregrad. Vorhandene Zeilen in <code>errors</code> erhalten <code>last_seen</code> und Zähleraktualisierungen statt Duplikaten. Der Benachrichtigungsversand hat eigene Fingerabdrücke und Wartezeiten.",
|
||||
"cycleEnd": "Die Bereinigung kann alte Fehler anhand der <em>Unterdrückungsdauer</em> je Kategorie und Zustandsregeln auflösen, verwaiste Einträge entfernter Ressourcen entfernen und <code>events</code> über 30 Tage löschen. Kategorien erklärt <link>Dashboard → Health Monitor</link>."
|
||||
},
|
||||
"notifications": {
|
||||
"heading": "Benachrichtigungsmotor",
|
||||
"intro": "<code>notification_manager.py</code> koordiniert den Versand: lädt Kanäle, verwaltet die Warteschlange und bietet eine Python-API für Flask und Health Monitor sowie einen CLI-Einstieg für ProxMenux-Hooks in <code>.sh</code>.",
|
||||
"items": [
|
||||
"<strong>Beobachter</strong> erzeugen Ereignisse: <code>JournalWatcher</code> verfolgt das Journal, <code>TaskWatcher</code> fragt Proxmox-Tasks ab, <code>ProxmoxHookWatcher</code> empfängt Sicherungs-, Replikations- und Snapshot-Hooks und <code>PollingCollector</code> verarbeitet langsame Quellen.",
|
||||
"<strong>Vorlagen</strong> erzeugen Titel und Nachricht aus Ereignissen. Der konfigurierte KI-Anbieter (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) kann sie verständlich umformulieren. Beide Fassungen werden in <code>notification_history</code> gespeichert.",
|
||||
"<strong>Kanäle</strong> versenden über Dienste wie Telegram, Discord, E-Mail, Gotify, Pushover und Apprise. Implementierungen in <code>notification_channels.py</code> teilen die Schnittstelle <code>create_channel()</code> / <code>send()</code>.",
|
||||
"<strong>Verschlüsselung.</strong> Vertrauliche Einstellungen (<code>telegram.bot_token</code>, <code>discord.webhook_url</code>, <code>pushover.user_key</code>, <code>pushover.api_token</code>, <code>ai_api_key_*</code>, <code>email.password</code>) werden vor dem Speichern mit dem Schlüssel aus <code>.notification_key</code> verschlüsselt und in der Oberfläche maskiert."
|
||||
],
|
||||
"linksFooter": "Ereignisschalter, kanalspezifische Einstellungen und KI erklären <notifLink>Einstellungen → Benachrichtigungen</notifLink> und <aiLink>Einstellungen → KI-Assistent</aiLink>."
|
||||
},
|
||||
"websocket": {
|
||||
"heading": "WebSocket Terminal",
|
||||
"intro": "Die Registerkarte <em>Terminal</em> verbindet einen schlanken <code>xterm.js</code>-Client über WebSocket mit einem serverseitigen PTY. Es gibt zwei Betriebsarten:",
|
||||
"items": [
|
||||
"<strong>HTTP-Modus, Standard:</strong> Der integrierte Flask-Server verarbeitet mit <code>flask-sock</code> WebSocket-Upgrade-Anfragen.",
|
||||
"<strong>HTTPS-/WSS-Modus:</strong> Verwendet <code>gevent.pywsgi.WSGIServer</code> mit <code>geventwebsocket.handler.WebSocketHandler</code> für WebSocket über TLS."
|
||||
],
|
||||
"outro": "Terminalprozesse erben <code>User=root</code>. Bei aktiver Authentifizierung braucht WebSocket ein kurzlebiges Einmalticket vom authentifizierten Ticket-Endpunkt mit Verwaltungsrechten. Ist Authentifizierung deaktiviert oder abgelehnt, folgt der Verbindungsaufbau diesem unauthentifizierten Modus.",
|
||||
"proxyNote": "Beim Reverse-Proxy muss WebSocket-Weiterleitung mit den Headern <code>Upgrade</code> und <code>Connection</code> funktionieren. Das Terminal benötigt diese Weiterleitung."
|
||||
},
|
||||
"proxy": {
|
||||
"heading": "Reverse-Proxy und Fail2Ban",
|
||||
"intro": "Client-IP-Auswahl und optionale Sperrung in der Anwendung hängen von diesen Einstellungen und Komponenten ab:",
|
||||
"items": [
|
||||
"<strong>Client-IP-Auswahl.</strong> Die Sperrprüfung in <code>before_request</code> und das Auth-Protokoll vertrauen <code>X-Forwarded-For</code>, danach <code>X-Real-IP</code>, nur mit PROXMENUX_TRUST_PROXY=1. Sonst gilt <code>request.remote_addr</code>. Weitergeleitete Header werden nicht automatisch akzeptiert.",
|
||||
"<strong>Optionales Fail2Ban in der Anwendung.</strong> Bei Proxyverbindungen kann die Proxy-IP als TCP-Gegenstelle erscheinen. Sind die vertrauenswürdige Client-IP und das aktive Jail <code>proxmenux</code> verfügbar, weist Flask gesperrte IPs mit HTTP 403 zurück. Die Liste wird 30 Sekunden gespeichert und bei späteren Anfragen erneuert, nicht durch einen eigenen Timer."
|
||||
],
|
||||
"calloutTitle": "Fail2Ban ist nicht enthalten",
|
||||
"calloutBody": "Fail2Ban ist <strong>nicht</strong> enthalten und wird nicht automatisch installiert. Die Installation ist über Monitor-Sicherheit oder <link>Sicherheit → Fail2Ban</link> in ProxMenux Scripts möglich. Fehlen <code>fail2ban-client</code> oder das Jail <code>proxmenux</code>, blockiert dieser Hook keine Anfragen. Die eingestellte Authentifizierung gilt weiter.",
|
||||
"outro": "Beispiele für Nginx, Caddy und Traefik sowie die Jail-Anleitung stehen unter <accessLink>Zugriff und Authentifizierung</accessLink> und <fail2banLink>Sicherheit → Fail2Ban</fail2banLink>."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Weitere Schritte",
|
||||
"items": [
|
||||
{
|
||||
"label": "Zugriff und Authentifizierung",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — Ersteinrichtung, Passwort und TOTP-2FA, Reverse-Proxy-Beispiele und Fail2Ban-Jail."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — Integrationsendpunkte, Token-Verwaltung und Authentifizierungskonventionen."
|
||||
},
|
||||
{
|
||||
"label": "Einstellungen → ProxMenux Monitor",
|
||||
"href": "/docs/settings/proxmenux-monitor",
|
||||
"tail": " — Dienststeuerung und Zustandsprüfung im ProxMenux-Textmenü."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Bewertung und Bestandsaufnahme | Prüfung und Bericht",
|
||||
"description": "Bewertung in Prüfung und Bericht: Berichtsprofile, Einstufung der Ergebnisse, akzeptierte Risiken, nicht lesbare Quellen, Lynis und Bestandsaufnahme des Knotens."
|
||||
},
|
||||
"header": {
|
||||
"title": "Bewertung und Bestandsaufnahme",
|
||||
"description": "Die Bewertung überprüft den Knoten, behält seine Ergebnisse und beantwortet je nach Berichtsprofil verschiedene Fragen.",
|
||||
"section": "Prüfung und Bericht"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "read-only",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Eine Bewertung prüft; sie ändert keine Konfiguration",
|
||||
"body": "Es liest die Konfiguration und den Zustand des Hosts. Es schreibt seine Ergebnisse, Berichte und Protokolle, und die Boot-Checks können EFI-Systempartitionen für einen Moment montieren. Die von ihm bewertete Konfiguration wird nicht geändert."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "<strong>Bewertung ausführen</strong> startet einen Durchlauf mit dem unter <strong>Bericht</strong> gewählten Profil. Die Ansicht zeigt das Datum des letzten Durchlaufs und die seitdem vergangene Zeit."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "profiles",
|
||||
"title": "Berichtsprofile",
|
||||
"intro": "Jedes Profil beantwortet eine andere Frage. Die Prüfungen und Abschnitte werden ausgewählt, bevor das Dokument erstellt wird.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Profil",
|
||||
"Was es abdeckt"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Vollständiges Audit",
|
||||
"Alle Prüfungen und die gesamte verfügbare Struktur."
|
||||
],
|
||||
[
|
||||
"Schnelldiagnose",
|
||||
"Jede Überprüfung; das Ergebnis beginnt mit den kritischen Ergebnissen, den Warnungen und den Messwerten, die nicht verifiziert werden konnten."
|
||||
],
|
||||
[
|
||||
"Inventar",
|
||||
"Eine Beschreibung des Knotens, ohne Überprüfungen und ohne Klassifizierung."
|
||||
],
|
||||
[
|
||||
"Sicherheitsüberprüfung",
|
||||
"Exposition, Zugriff, Privilegien, Zertifikate, Updates, Repositories und Lynis."
|
||||
],
|
||||
[
|
||||
"Überprüfung der Sicherungen",
|
||||
"Abdeckung, Alter, Ergebnisse, Verifizierung, Aufbewahrung und Wiederherstellung der Backups."
|
||||
],
|
||||
[
|
||||
"Kapazität und Verschleiß",
|
||||
"Wachstumsmarge, Speicher, Platzverbrauch und Lebensdauer der Festplatten."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Der Inhalt jedes Dokuments wird unter <reportsLink>Berichte und Vergleiche</reportsLink> beschrieben."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "results",
|
||||
"title": "Wie die Ergebnisse klassifiziert werden",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Einstufung",
|
||||
"Bedeutung"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Kritisch",
|
||||
"Ein gescheiterter Zustand, der Priorität hat."
|
||||
],
|
||||
[
|
||||
"Warnung",
|
||||
"Eine Bedingung, die anhand der Nachweise oder der Richtlinie überprüft werden muss."
|
||||
],
|
||||
[
|
||||
"Beobachtung",
|
||||
"Informationen über den Knoten, der nicht als Fehler gemeldet wird."
|
||||
],
|
||||
[
|
||||
"Nicht verifiziert",
|
||||
"Die für die Prüfung benötigte Quelle konnte nicht gelesen werden. Das bedeutet nicht, dass kein Problem vorliegt."
|
||||
],
|
||||
[
|
||||
"Konform",
|
||||
"Die Bedingung erfüllt das angewandte Kriterium."
|
||||
],
|
||||
[
|
||||
"Nicht zutreffend",
|
||||
"Es gilt nichts im Rahmen der Prüfung."
|
||||
],
|
||||
[
|
||||
"Akzeptiertes Risiko",
|
||||
"Der Befund existiert und eine Entscheidung darüber wurde aufgezeichnet."
|
||||
],
|
||||
[
|
||||
"Per Richtlinie ausgenommen",
|
||||
"Die Richtlinie legt fest, dass dieses Element nicht mitgezählt wird."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Befunde lassen sich nach Bereich filtern: System, Speicher, Netzwerk, Sicherheit, Sicherung, Gastsysteme und Hardware. Jeder Befund enthält seine Nachweise und deren Quelle."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "unverified",
|
||||
"title": "Wenn eine Quelle nicht gelesen werden kann",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Fall",
|
||||
"Verhalten"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Nicht verifiziert",
|
||||
"Die Prüfung behält ihre Kennung bei, nennt in den Nachweisen die fehlerhafte Quelle und bewertet fehlende Daten nicht als konformes Ergebnis."
|
||||
],
|
||||
[
|
||||
"Unvollständige Nachweise",
|
||||
"Der Bericht nennt Quelle und Erfassungszeitpunkt, um ein tatsächliches Problem von einer unzureichenden Erfassung zu unterscheiden."
|
||||
],
|
||||
[
|
||||
"Ein neuer Durchlauf",
|
||||
"Sobald der Zugriff, das Paket oder der Dienst korrigiert wurde, läuft das gleiche Profil erneut und der Vergleich zeigt, ob das Ergebnis verifiziert werden konnte."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "lynis",
|
||||
"title": "Lynis",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Die Sicherheitsprüfung nutzt den Lynis-Bericht des Hosts. Wurde Lynis noch nicht ausgeführt oder ist der Bericht älter als die Richtlinie erlaubt, bietet ein Dialog <strong>Mit Lynis ausführen</strong>, was einige Minuten länger dauert, oder <strong>Ohne Lynis ausführen</strong>, das den vorhandenen Bericht nutzt."
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/monitor/audit/lynis-dialog.png",
|
||||
"alt": "Dialog, der anbietet, das Assessment mit oder ohne Lynis durchzuführen",
|
||||
"caption": "Der Lynis-Dialog vor einer Sicherheitsüberprüfung."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "accept",
|
||||
"title": "Annahme eines Risikos",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "<strong>Risiko akzeptieren</strong> erfasst eine Entscheidung zu einem Befund. Eine Begründung ist erforderlich und wird mit Autor und Datum gespeichert."
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Feld",
|
||||
"Optionen"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Grund",
|
||||
"Freitext, erforderlich."
|
||||
],
|
||||
[
|
||||
"Gilt nicht mehr nach",
|
||||
"90 Tage, 180 Tage, 1 Jahr oder läuft nicht ab. Wenn der Zeitraum endet, wird der Befund wieder aktiv."
|
||||
],
|
||||
[
|
||||
"An Überprüfung erinnern",
|
||||
"Eine Erinnerung, die die Entscheidung wieder auf sich aufmerksam macht, während sie in Kraft bleibt."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Ein akzeptierter Befund bleibt mit der Entscheidung sichtbar; <strong>Wieder aktiv setzen</strong> widerruft die Akzeptanz. Ein akzeptiertes Risiko ist keine Behebung: Der Vergleich meldet es als akzeptiert und nicht als gelöst."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "inventory",
|
||||
"title": "Inventar",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Identität, Proxmox VE-Version, Kernel, Subscription und Cluster.",
|
||||
"CPU, Speicher, Board, BIOS, Controller und IOMMU.",
|
||||
"Festplatten, SMART, Power-On-Stunden und aufgezeichnete Ereignisse.",
|
||||
"Adapter, Bonds, Bridges, Latenz und Verbindungen.",
|
||||
"Speicher, Gäste mit ihren Festplatten und Schnittstellen und Backups.",
|
||||
"PCI Passthrough und die Software ProxMenux verwaltet."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Änderungen | Prüfung und Bericht",
|
||||
"description": "Änderungsprotokoll von Prüfung und Bericht: ProxMenux-Änderungen am Host, vorheriger Zustand, Unterschiede und Möglichkeiten zum Rückgängigmachen."
|
||||
},
|
||||
"header": {
|
||||
"title": "Änderungen",
|
||||
"description": "Protokoll der von ProxMenux am Host ausgeführten Operationen und, soweit erfasst, des jeweiligen Zustands davor und danach.",
|
||||
"section": "Prüfung und Bericht"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "purpose",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Vom ausgeführten Skript zur bewirkten Änderung",
|
||||
"body": "Eine lange Funktion ändert möglicherweise nur zwei Zeilen. Das Protokoll erfasst jede konkrete Operation mit verantwortlichem Skript, Funktion und Version, betroffener Ressource, Unterschied und Möglichkeit zum Rückgängigmachen."
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Skript",
|
||||
"detail": "Funktion + Version"
|
||||
},
|
||||
{
|
||||
"label": "Erfassung",
|
||||
"detail": "Inhalt vor"
|
||||
},
|
||||
{
|
||||
"label": "Operation",
|
||||
"detail": "Datei · Paket · Service"
|
||||
},
|
||||
{
|
||||
"label": "Änderungsprotokoll",
|
||||
"detail": "Attribution + Differenz"
|
||||
}
|
||||
],
|
||||
"caption": "Die Erfassung erfolgt bei Ausführung der Operation und wird zusammengeführt, wenn Monitor das Protokoll liest."
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/monitor/audit/changes-view.png",
|
||||
"alt": "Ansicht Änderungen von Prüfung und Bericht mit Einträgen nach Nachinstallationsoption und Skript gruppiert",
|
||||
"caption": "Die Ansicht Änderungen mit dem Unterschied einer von ProxMenux bearbeiteten Datei."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "types",
|
||||
"title": "Arten von Einträgen",
|
||||
"intro": "Der Filter oben trennt die Einträge nach Art.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Art",
|
||||
"Was es aufzeichnet"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Konfiguration",
|
||||
"ProxMenux hat eine Datei geschrieben, bearbeitet oder entfernt, eine Einstellung geändert oder einen Dienst geändert."
|
||||
],
|
||||
[
|
||||
"Installationen",
|
||||
"ProxMenux hat ein Paket oder eine Komponente hinzugefügt, und die tatsächlich erschienenen Pakete werden aufgezeichnet."
|
||||
],
|
||||
[
|
||||
"Ausführungen",
|
||||
"ProxMenux hat einen Befehl ausgeführt; seine Auswirkungen hängen vom Befehl selbst ab."
|
||||
],
|
||||
[
|
||||
"Angewandt",
|
||||
"Eine Funktion wurde angewendet, bevor das Protokoll existierte; ihr vorheriger Zustand wurde nicht erfasst."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "groups",
|
||||
"title": "Wie die Ansicht organisiert ist",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Abschnitt",
|
||||
"Inhalt"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Post-Install-Optimierungen",
|
||||
"Gruppiert nach der Option nach der Installation, die der Benutzer ausgewählt hat."
|
||||
],
|
||||
[
|
||||
"ProxMenux-Skripte",
|
||||
"GPU, Coral, Netzwerk, Speicher, Sicherheit, Werkzeuge und weitere instrumentierte Skripte, einschließlich ProxMenux-Installer und ProxMenux Monitor."
|
||||
],
|
||||
[
|
||||
"Installierte Pakete und Werkzeuge",
|
||||
"Von ProxMenux auf dem Host installierte Software."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "<strong>Nach Funktion</strong> gruppiert die Einträge jedes Abschnitts nach der Funktion, die sie erzeugt hat."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "entry",
|
||||
"title": "Was jeder Eintrag zeigt",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Das verantwortliche Skript mit Funktion und Version.",
|
||||
"Datum und betroffene Ressource.",
|
||||
"Der bekannte Zustand vor und nach der Änderung.",
|
||||
"Die hinzugefügten und entfernten Zeilen.",
|
||||
"Die Pakete, die tatsächlich hinzugefügt wurden.",
|
||||
"Der Zustandswechsel eines Dienstes.",
|
||||
"<strong>Rückgängigmachen</strong>: <em>Stellt exakt den vorherigen Zustand wieder her</em>, <em>Löscht die Datei (vorher existierte keine)</em>, <em>Das Paket kann deinstalliert werden</em>, teilweises Rückgängigmachen oder <em>Kann nicht aus dem Protokoll rückgängig gemacht werden</em>."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "before",
|
||||
"title": "Was der vorherige Zustand bedeutet",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Der vorherige Zustand kann erfasster Inhalt, eine erstmals erstellte Datei oder ein unbekannter Zustand sein. Änderungen vor Einführung des Protokolls lassen sich nicht rekonstruieren; eine erneute Ausführung erfasst zunächst den dann vorgefundenen Zustand."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "limits",
|
||||
"title": "Umfang des Änderungsprotokolls",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Manuelle Änderungen und Änderungen durch andere Software werden nicht aufgezeichnet.",
|
||||
"Nur Operationen, die die ProxMenux-Auditprimitiven durchlaufen, werden abgedeckt.",
|
||||
"Die Protokollierung blockiert nie die beschriebene Operation: Kann ein Eintrag nicht geschrieben werden, läuft die Operation weiter.",
|
||||
"Aufeinanderfolgende Änderungen an einer Ressource werden als bekannter Ursprung gegen den aktuellen Zustand angezeigt."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "retention",
|
||||
"title": "Gespeicherte Nachweise",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Element",
|
||||
"Verhalten"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Einträge",
|
||||
"Sie werden auf dem Host aufbewahrt; nichts wird automatisch aus dem Journal entfernt."
|
||||
],
|
||||
[
|
||||
"Erfasster Inhalt",
|
||||
"Ein erfasstes Objekt wird beibehalten, während sich ein Eintrag darauf bezieht."
|
||||
],
|
||||
[
|
||||
"Größe einer Erfassung",
|
||||
"Inhalt über 1 MiB wird nicht als Ganzes gespeichert; der Eintrag zeichnet auf, dass die Aufnahme wegen seiner Größe übersprungen wurde."
|
||||
],
|
||||
[
|
||||
"Lesen",
|
||||
"Der Monitor lädt keine gespeicherten Objekte über 2 MiB."
|
||||
],
|
||||
[
|
||||
"Unterschied",
|
||||
"Es werden höchstens 400 Zeilen angezeigt; längere Unterschiede werden als gekürzt markiert."
|
||||
],
|
||||
[
|
||||
"Liste",
|
||||
"Die API liefert standardmäßig 200 Einträge je Anfrage, maximal 1000."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Gespeicherter Inhalt bedeutet kein automatisches Rückgängigmachen",
|
||||
"body": "Der vorherige Inhalt kann geprüft und manuell wiederhergestellt werden; die Ansicht Änderungen macht jedoch keine Operationen rückgängig. Ein Ausführungseintrag erfasst den Befehl, ohne alle Auswirkungen des ausgeführten Werkzeugs zu kennen."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Prüfung und Bericht | ProxMenux Monitor",
|
||||
"description": "Bewerten Sie einen Proxmox-VE-Knoten, dokumentieren Sie ProxMenux-Änderungen und legen Sie Erwartungen an Gastsysteme und Speicher fest, mit druckbaren Berichten."
|
||||
},
|
||||
"header": {
|
||||
"title": "Prüfung und Bericht",
|
||||
"description": "Bewertung des Knotens, Protokoll der ProxMenux-Änderungen und festgelegte Erwartungen, mit Dokumenten zum Drucken oder Speichern als PDF.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "views",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Drei Ansichten, drei Fragen",
|
||||
"body": "Prüfung und Bericht trennt Fakten zum Knoten, Eingriffe von ProxMenux und festgelegte Erwartungen. Lässt sich eine Konfiguration keinem erklärten Zweck gegenüberstellen, wird sie beschrieben und nicht als Fehler gemeldet."
|
||||
}
|
||||
},
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Bewertung - wie ist der Knoten?",
|
||||
"body": "Führt die Überprüfungen des gewählten Profils aus, erstellt das Inventar und klassifiziert, was Aufmerksamkeit benötigt, mit dem Nachweis jedes Ergebnisses."
|
||||
},
|
||||
{
|
||||
"icon": "refresh",
|
||||
"title": "Änderungen - was hat ProxMenux getan?",
|
||||
"body": "Listet Dateien, Pakete, Dienste und Befehle auf, die durch instrumentierte ProxMenux-Skripte geändert wurden, samt vorherigem Zustand, sofern er erfasst wurde."
|
||||
},
|
||||
{
|
||||
"icon": "fileText",
|
||||
"title": "Richtlinie — was wird erwartet?",
|
||||
"body": "Legt fest, welche Gastsysteme eine Sicherung benötigen oder mit dem Host starten müssen, welcher Speicher wesentlich ist und welche Prüfschwellen gelten."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Bewertung",
|
||||
"detail": "Fakten"
|
||||
},
|
||||
{
|
||||
"label": "Richtlinie",
|
||||
"detail": "Kontext"
|
||||
},
|
||||
{
|
||||
"label": "Änderungen",
|
||||
"detail": "Interventionen"
|
||||
}
|
||||
],
|
||||
"caption": "Die Bewertung liefert die Fakten, die Richtlinie gibt ihnen Kontext und das Änderungsprotokoll erfasst die Eingriffe von ProxMenux."
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/monitor/audit/assessment-view.png",
|
||||
"alt": "Prüfung und Bericht in ProxMenux Monitor mit den Ansichten Bewertung, Änderungen und Richtlinie",
|
||||
"caption": "Prüfung und Bericht mit geöffneter Ansicht Bewertung."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "boundaries",
|
||||
"title": "Drei verschiedene Funktionen",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Funktion",
|
||||
"Was es tut"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"<healthLink>Zustandsüberwachung</healthLink>",
|
||||
"Beobachtet Metriken und Ereignisse kontinuierlich und kann Benachrichtigungen auslösen."
|
||||
],
|
||||
[
|
||||
"Prüfung und Bericht",
|
||||
"Führt auf Anforderung eine Bewertung aus, dokumentiert den Knoten und vergleicht Durchläufe miteinander."
|
||||
],
|
||||
[
|
||||
"Änderungsprotokoll",
|
||||
"Erfasst die von ProxMenux über seine Audit-Grundfunktionen ausgeführten Operationen."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "pages",
|
||||
"title": "Seiten dieses Abschnitts",
|
||||
"blocks": [
|
||||
{
|
||||
"next": {
|
||||
"items": [
|
||||
{
|
||||
"label": "Bewertung und Bestandsaufnahme",
|
||||
"href": "/docs/monitor/audit-report/assessment",
|
||||
"tail": "Profile, Ergebnisse, akzeptierte Risiken und Bestandsaufnahme."
|
||||
},
|
||||
{
|
||||
"label": "Änderungen",
|
||||
"href": "/docs/monitor/audit-report/changes",
|
||||
"tail": "das Journal, was ProxMenux auf dem Host geändert hat."
|
||||
},
|
||||
{
|
||||
"label": "Richtlinie",
|
||||
"href": "/docs/monitor/audit-report/policy",
|
||||
"tail": "Gäste, Speicher und Schwellenwerte."
|
||||
},
|
||||
{
|
||||
"label": "Berichte und Vergleiche",
|
||||
"href": "/docs/monitor/audit-report/reports",
|
||||
"tail": "die sechs Dokumente und den Referenzlauf."
|
||||
},
|
||||
{
|
||||
"label": "Anwendungsbereich und Garantien",
|
||||
"href": "/docs/monitor/audit-report/scope",
|
||||
"tail": "Quellen, Grenzen und gespeicherte Daten."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Richtlinie | Prüfung und Bericht",
|
||||
"description": "Knotenrichtlinie von Prüfung und Bericht: Sicherung, Autostart und Wiederherstellungsziel jedes Gastsystems, Rolle jedes Speichers und Prüfschwellenwerte."
|
||||
},
|
||||
"header": {
|
||||
"title": "Richtlinie",
|
||||
"description": "Die Richtlinie legt fest, was keine Prüfung ableiten kann: Zweck jedes Gastsystems und Speichers sowie die Schwellenwerte der Prüfungen.",
|
||||
"section": "Prüfung und Bericht"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "principle",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Ohne Festlegung beschreibt der Bericht; mit ihr bewertet er",
|
||||
"body": "Eine Bewertung sieht, was der Host tut, nicht, wozu er dient. Ein Gast ohne Backup, dessen Verwendungszweck nicht angegeben ist, wird als Beobachtung gemeldet. Wenn dessen Sicherung als erforderlich erklärt wird, wird die gleiche Abwesenheit als Warnung gemeldet. Es muss nichts deklariert werden."
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/monitor/audit/policy-view.png",
|
||||
"alt": "Richtlinienansicht mit Gastsystemen, Speicher und Schwellenwerten des Knotens",
|
||||
"caption": "Die Richtlinienansicht."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "guests",
|
||||
"title": "Gäste",
|
||||
"intro": "Jede VM und jeder LXC des Knotens hat drei Felder. Ein auf Standard belassenes Feld übernimmt den daneben angezeigten allgemeinen Wert.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Feld",
|
||||
"Werte",
|
||||
"Auswirkungen auf die Bewertung"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Sicherung",
|
||||
"Erforderlich, Nicht erforderlich, Nicht angegeben",
|
||||
"Ein fehlendes Backup ist eine Warnung, wenn es erforderlich ist, eine Beobachtung, wenn es nicht angegeben ist, und es wird aus der Zählung ausgelassen, wenn es nicht erforderlich ist."
|
||||
],
|
||||
[
|
||||
"Autostart",
|
||||
"Erforderlich, Nicht erforderlich, Nicht angegeben",
|
||||
"Ob das Gastsystem mit dem Host starten muss."
|
||||
],
|
||||
[
|
||||
"Wiederherstellungsziel",
|
||||
"Std",
|
||||
"Das maximal akzeptable Alter des letzten Backups."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "storage",
|
||||
"title": "Speicher",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Ein nicht erreichbarer Speicher wird als kritisch gemeldet, wenn er für wesentlich erklärt wird oder einem laufenden Gast dient, als Warnung, wenn seine Rolle nicht angegeben wird, und als Beobachtung, wenn er für optional erklärt wird."
|
||||
}
|
||||
],
|
||||
"intro": "Jeder Speicher des Knotens wird als wesentlich, optional oder nicht angegeben deklariert."
|
||||
},
|
||||
{
|
||||
"id": "thresholds",
|
||||
"title": "Schwellenwerte",
|
||||
"intro": "Ein leeres Schwellenwertfeld verwendet den mitgelieferten Standardwert, der als Platzhalter angezeigt wird.",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Prüfung von Speicherkapazität (%) und Thin-Pool-Füllstand (%).",
|
||||
"Verhältnis der Thin-Überprovisionierung und der Speicherüberbelegung.",
|
||||
"ZFS-Scrub-Intervall (Tage).",
|
||||
"Ersatzgrenze für das Sicherungsalter (Tage) und Toleranz des Zeitplans (Verhältnis).",
|
||||
"Hinweis vor Zertifikatsablauf (Tage).",
|
||||
"Festplattendienstdauer (Stunden) und letztes Festplattenfehlerfenster (Tage).",
|
||||
"Alter des Lynis-Berichts (Tage) und der Paketindizes (Tage).",
|
||||
"Journal-Belegung im Verhältnis zur Obergrenze (%).",
|
||||
"Prüfung des Dateisystem-Speicherplatzes (%) und der Inodes (%)."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "save",
|
||||
"title": "Wie die Richtlinie gespeichert wird",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Die Festlegung wird geprüft und atomar in <code>/usr/local/share/proxmenux/audit_policy.json</code> gespeichert. Jeder Speichervorgang enthält eine Revision: Hat eine andere Sitzung die Festlegung geändert, wird der Entwurf nicht gespeichert und die Ansicht bietet an, die gespeicherte Fassung neu zu laden."
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Die Richtlinie wird nie automatisch abgeleitet",
|
||||
"body": "ProxMenux fügt keine eigenen Anforderungen hinzu. Ein leeres Feld behält den mitgelieferten Standardwert oder bleibt nicht angegeben; eine teilweise Festlegung betrifft nur die benannten Elemente."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,247 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Berichte und Vergleiche | Prüfung und Bericht",
|
||||
"description": "Die sechs Dokumente von Prüfung und Bericht, ihr Druck oder Speichern als PDF und der Vergleich von Durchläufen mit einem Referenzlauf."
|
||||
},
|
||||
"header": {
|
||||
"title": "Berichte und Vergleiche",
|
||||
"description": "Sechs Dokumente für unterschiedliche Fragen und der Vergleich jedes Durchlaufs mit einem Referenzlauf.",
|
||||
"section": "Prüfung und Bericht"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "intro",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Sechs Dokumente, nicht sechs Stile",
|
||||
"body": "Die Engine wählt Prüfungen und Abschnitte aus, bevor sie das Dokument erstellt. Eine schnelle Diagnose ist kein vollständiges Audit mit weniger Seiten, und ein Inventar zeigt keine Bewertungsergebnisse. Die folgenden Beispieldokumente verwenden fiktive Daten."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "documents",
|
||||
"title": "Die sechs Dokumente",
|
||||
"blocks": [
|
||||
{
|
||||
"downloads": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Vollständiges Audit",
|
||||
"body": "Dokumentiert den gesamten Knoten als technische Bestandsaufnahme.",
|
||||
"href": "/monitor/audit/sample-audit-full-report.pdf",
|
||||
"facts": [
|
||||
{
|
||||
"label": "Kontrollen",
|
||||
"value": "Alle verfügbaren Prüfungen."
|
||||
},
|
||||
{
|
||||
"label": "Inhalt",
|
||||
"value": "Ergebnisübersicht; Identität und Cluster; Hardware; Netzwerk und Latenz; Speicher; Gastsysteme; Passthrough; Anwendungen; Befunde mit Nachweisen; Quellen und Umfang."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Schnelldiagnose",
|
||||
"body": "Zeigt, was Aufmerksamkeit braucht, ohne das komplette Inventar.",
|
||||
"href": "/monitor/audit/sample-audit-diagnostic-report.pdf",
|
||||
"facts": [
|
||||
{
|
||||
"label": "Kontrollen",
|
||||
"value": "Die gleichen Prüfungen wie das vollständige Audit."
|
||||
},
|
||||
{
|
||||
"label": "Inhalt",
|
||||
"value": "Minimale Identität; kritische Befunde; Warnungen; relevante Beobachtungen; nicht verifizierte Messwerte und prioritäre Maßnahmen. Diagramme, Inventar und lange Anhänge werden ausgelassen."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Inventar",
|
||||
"body": "Beschreibt, was auf dem Knoten existiert, ohne es zu bewerten.",
|
||||
"href": "/monitor/audit/sample-audit-inventory-report.pdf",
|
||||
"facts": [
|
||||
{
|
||||
"label": "Kontrollen",
|
||||
"value": "Keine; kein Befund ist klassifiziert."
|
||||
},
|
||||
{
|
||||
"label": "Inhalt",
|
||||
"value": "Identität; Cluster; CPU und Speicher; Board, BIOS und Controller; Netzwerk; Storage; VMs und LXCs; Passthrough; Anwendungen und Elemente, die von ProxMenux verwaltet werden."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Sicherheitsüberprüfung",
|
||||
"body": "Umfasst die Exposition und die Kontrollen über den Zugang zum Knoten.",
|
||||
"href": "/monitor/audit/sample-audit-security-report.pdf",
|
||||
"facts": [
|
||||
{
|
||||
"label": "Kontrollen",
|
||||
"value": "Der Sicherheitsbereich sowie Containerprivilegien, Updates, Repositories und die APT-Kette."
|
||||
},
|
||||
{
|
||||
"label": "Inhalt",
|
||||
"value": "Identität und Cluster; Netzwerk und Latenz; Zugriff; Firewall; 2FA; Zertifikate; Privilegien; Updates; Repositories; Zustand und Alter von Lynis."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Überprüfung der Sicherungen",
|
||||
"body": "Prüft, ob der deklarierte Schutz vorhanden ist und ob seine Backups verwendbar sind.",
|
||||
"href": "/monitor/audit/sample-audit-backup-report.pdf",
|
||||
"facts": [
|
||||
{
|
||||
"label": "Kontrollen",
|
||||
"value": "Der Backup-Bereich plus Storage-Konnektivität und Benachrichtigungszustellung."
|
||||
},
|
||||
{
|
||||
"label": "Inhalt",
|
||||
"value": "Abdeckung pro Gast; erklärtes Wiederherstellungsziel; Alter und Ergebnis; Ziel; Aufbewahrung; Überprüfung; gescheiterte Jobs; Wiederherstellung und unvollständige Quellen."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Kapazität und Verschleiß",
|
||||
"body": "Misst Wachstumsspielraum und Anzeichen von Erschöpfung oder Alterung.",
|
||||
"href": "/monitor/audit/sample-audit-capacity-report.pdf",
|
||||
"facts": [
|
||||
{
|
||||
"label": "Kontrollen",
|
||||
"value": "Die Speicher- und Hardwarebereiche sowie Speicher, Swap, Journal und das Host-Dateisystem."
|
||||
},
|
||||
{
|
||||
"label": "Inhalt",
|
||||
"value": "Belegung und Schwellenwerte; Thin Pools; Überprovisionierung; Arbeitsspeicher; Inodes; ZFS; Temperaturen; Betriebsstunden; SMART-Fehler und NVMe/SSD-Lebensdauer."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/monitor/audit/audit-report-preview.png",
|
||||
"alt": "Erste Seite eines vollständigen Auditberichts",
|
||||
"caption": "Jedes Dokument teilt die Berichtskennung, die nummerierten Abschnitte, das Datum, den Knoten, das Profil und die Fußzeile."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Je nach Profil enthält das Dokument Knotenidentität und Bewertungsdatum, Ergebnisübersicht, Zusammenfassung nach Bereichen, Hardware-, Netzwerk- und Speicherstruktur, Schutz der Gastsysteme, Befunde mit Nachweisen, nicht lesbare Quellen sowie angewandten Umfang und Richtlinie."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "print",
|
||||
"title": "Drucken oder Speichern als PDF",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Starten",
|
||||
"body": "Die Bewertung nutzt das unter <strong>Bericht</strong> ausgewählte Profil."
|
||||
},
|
||||
{
|
||||
"title": "Überprüfung",
|
||||
"body": "Der abgeschlossene Durchlauf zeigt Befunde, nicht lesbare Quellen und die angewandte Richtlinie."
|
||||
},
|
||||
{
|
||||
"title": "Bericht erzeugen",
|
||||
"body": "<strong>Bericht erzeugen</strong> öffnet die als Dokument aufbereitete Ansicht."
|
||||
},
|
||||
{
|
||||
"title": "Druck",
|
||||
"body": "<strong>Drucken oder als PDF speichern</strong> öffnet den Druckdialog des Browsers zur Auswahl eines Druckers oder von <em>Als PDF speichern</em>."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutTip": {
|
||||
"title": "Der Ausdruck ist ein Dokument, kein Screenshot",
|
||||
"body": "Die Aktionsleiste ist ausgeblendet, eine Tabelle, die auf der nächsten Seite fortgesetzt wird, wiederholt ihre Kopfzeile, Blöcke vermeiden unnötige Pausen und jede Seite behält die Identifikation und Nummerierung."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "compare",
|
||||
"title": "Vergleich mit einem Referenzlauf",
|
||||
"intro": "<strong>Als Referenz verwenden</strong> markiert einen abgeschlossenen Durchlauf. Spätere Durchläufe werden damit verglichen und ihre Befunde aufgeteilt in :",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Gruppe",
|
||||
"Bedeutung"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Neu",
|
||||
"Jetzt berichtet und nicht vorher."
|
||||
],
|
||||
[
|
||||
"Verschlechtert",
|
||||
"Weiterhin gemeldet, aber schwerwiegender oder umfassender als zuvor."
|
||||
],
|
||||
[
|
||||
"Verbessert",
|
||||
"Weiterhin gemeldet, aber weniger schwerwiegend oder umfassend als zuvor."
|
||||
],
|
||||
[
|
||||
"gelöst",
|
||||
"Nicht mehr gemeldet und von niemandem als Risiko akzeptiert."
|
||||
],
|
||||
[
|
||||
"Akzeptiert",
|
||||
"Wird nicht mehr gezählt, weil ein Risiko akzeptiert wurde, nicht weil sich der Host geändert hat."
|
||||
],
|
||||
[
|
||||
"Nicht mehr bewertet",
|
||||
"Zuvor vorhanden, in diesem Durchlauf nicht enthalten; ihr Wegfall wurde nicht verifiziert."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Bezugslauf",
|
||||
"Verhalten"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Setzen Sie es",
|
||||
"Jeder fertige Lauf kann markiert werden; keiner wird automatisch markiert."
|
||||
],
|
||||
[
|
||||
"Es ändern",
|
||||
"Ein anderer markierter Durchlauf ersetzt die Referenz, ohne den Verlauf zu löschen."
|
||||
],
|
||||
[
|
||||
"Vergleichen",
|
||||
"Wenn keine zwei Durchläufe ausgewählt sind, verwendet der Vergleich die Referenz und den ausgewählten oder letzten Durchlauf."
|
||||
],
|
||||
[
|
||||
"Durchläufe aufbewahren",
|
||||
"Die 30 neuesten Durchläufe werden aufbewahrt; der Referenzlauf wird nie entfernt."
|
||||
],
|
||||
[
|
||||
"Ohne Referenz",
|
||||
"Die Ansicht zeigt, dass noch kein Referenzlauf gewählt wurde und somit keine Vergleichsgrundlage vorhanden ist."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Ein Bericht beschreibt einen Moment",
|
||||
"body": "Eine Bewertung bestätigt keinen ganzen Zeitraum. Ältere Ergebnisse beschreiben den aktuellen Zustand nicht mehr; die Ansicht zeigt das Alter des letzten Durchlaufs und jede Quelle behält ihren Erfassungszeitpunkt."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Umfang und Garantien | Prüfung und Bericht",
|
||||
"description": "Herkunft der Daten von Prüfung und Bericht, Grenzen des Prüfbereichs, Entwurfsgarantien und Speicherorte."
|
||||
},
|
||||
"header": {
|
||||
"title": "Umfang und Garantien",
|
||||
"description": "Woher Bewertungsdaten stammen, was außerhalb des Prüfbereichs liegt und wo Prüfung und Bericht seine Daten speichert.",
|
||||
"section": "Prüfung und Bericht"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "sees",
|
||||
"title": "Was er beobachtet",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Konfiguration und Zustand des lokalen Knotens.",
|
||||
"Die deklarierte Konfiguration der VMs und LXCs.",
|
||||
"Der Speicherzustand, wie ihn Proxmox VE erfasst.",
|
||||
"Die verfügbare Historie von Backups und Verifizierungen.",
|
||||
"SMART-Daten und die Ereignisse, die der Monitor gesammelt hat.",
|
||||
"Der Zustand von Diensten, Cluster, HA und lokalen Quellen."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "outside",
|
||||
"title": "Was außerhalb seiner Sicht ist",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Das Innere der Gäste, über das hinaus, was sie Proxmox VE erklären.",
|
||||
"Netzwerkausrüstung außerhalb des Hosts.",
|
||||
"Fernabhängigkeiten, die der Knoten nicht beobachten kann.",
|
||||
"Physischer Zustand, den die Hardware nicht bereitstellt.",
|
||||
"Das Änderungsprotokoll erfasst keine manuellen Aktionen oder Aktionen anderer Software."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Fehlende Beweise sind keine Beweise für Abwesenheit",
|
||||
"body": "Eine Quelle, die nicht gelesen werden kann, liefert ein nicht verifiziertes oder unvollständiges Ergebnis, niemals ein konformes. Der Bericht listet die Quellen auf, die nicht verfügbar waren."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "guarantees",
|
||||
"title": "Garantien für das Design",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Stabile Kennzeichen für die Kontrollen.",
|
||||
"Verlauf der Durchläufe und Befunde.",
|
||||
"Eine validierte, atomar gespeicherte Richtlinie.",
|
||||
"Akzeptierte Risiken mit einem Grund, sichtbar.",
|
||||
"Zuweisung von Änderungen an Skript und Funktion.",
|
||||
"Erfassung des Zustands vor und nach der Änderung, soweit verfügbar.",
|
||||
"Ein explizites Ergebnis, wenn etwas nicht gemessen oder erfasst werden kann."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "storage",
|
||||
"title": "Wo die Daten gespeichert werden",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Daten",
|
||||
"Ort"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Richtlinie",
|
||||
"<code>/usr/local/share/proxmenux/audit_policy.json</code>"
|
||||
],
|
||||
[
|
||||
"Bewertungen",
|
||||
"Die Prüfdatenbank des Monitors"
|
||||
],
|
||||
[
|
||||
"Erfasste Objekte",
|
||||
"<code>/usr/local/share/proxmenux/changes/objects/</code>"
|
||||
],
|
||||
[
|
||||
"Ausstehende Einträge",
|
||||
"<code>/usr/local/share/proxmenux/changes/spool/</code>"
|
||||
],
|
||||
[
|
||||
"Zusammengeführtes Änderungsprotokoll",
|
||||
"<code>/usr/local/share/proxmenux/changes.db</code>"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Ein Tool zur Überprüfung, keine Zertifizierung",
|
||||
"body": "Prüfung und Bericht prüft, vergleicht und dokumentiert den Knoten. Die Ergebnisse werden im Kontext des Systemzwecks, der festgelegten Richtlinie und der verfügbaren Quellen bewertet."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Apps-Dashboard: ein Starter für alle Weblinks | ProxMenux",
|
||||
"description": "Verwenden Sie das Apps-Dashboard, um registrierte LXC-Weblinks und benutzerdefinierte Links zu öffnen, sie nach Kategorie zu ordnen und zu dem Gast zurückzukehren, der jeden Dienst besitzt."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Apps Tab",
|
||||
"description": "Ein einzelner Launcher für die Web-Schnittstellen, die Sie über den Knoten verwenden, unabhängig davon, ob sie von einer registrierten LXC-Anwendung oder einem benutzerdefinierten Weblink stammen.",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Ein Launcher, kein Application Installer",
|
||||
"body": "Der Reiter <strong>Apps</strong> installiert keine Software und sucht nicht selbst nach Diensten. Er zeigt gespeicherte Weblinks in einem durchsuchbaren Raster. LXC-Links werden im <appTabLink>App-Reiter</appTabLink> des Gastsystems konfiguriert; eigene Links ergänzen VM-Dienste, Reverse Proxys und externe Dashboards."
|
||||
},
|
||||
"sources": {
|
||||
"heading": "Was in Apps erscheint",
|
||||
"intro": "Jede startbare URL wird zu einer eigenen Karte. Die Quelle bestimmt, wo diese Karte bearbeitet wird, aber nicht, wie sie während des normalen Gebrauchs aussieht.",
|
||||
"colSource": "Quelle",
|
||||
"colAppears": "Was erscheint",
|
||||
"colManagedFrom": "Wo es verwaltet wird",
|
||||
"rows": [
|
||||
{
|
||||
"source": "Registrierte LXC-Anwendung",
|
||||
"appears": "Eine Karte für jeden Weblink, der im Anwendungsprotokoll gespeichert ist.",
|
||||
"managedFrom": "VMs und LXCs → LXC-Dialog → App"
|
||||
},
|
||||
{
|
||||
"source": "Benutzerdefinierter Link an einen Gast gebunden",
|
||||
"appears": "Eine Service-URL, die mit einem bestimmten VM oder LXC verknüpft ist.",
|
||||
"managedFrom": "Apps → Bearbeiten"
|
||||
},
|
||||
{
|
||||
"source": "Eigener Link ohne Gastzuordnung",
|
||||
"appears": "Beliebiges HTTP(S)-Ziel, einschließlich externer Dienste und Dienste hinter einem Reverse Proxy.",
|
||||
"managedFrom": "Apps → Bearbeiten"
|
||||
}
|
||||
],
|
||||
"relationshipTitle": "Apps und der LXC App-Tab haben unterschiedliche Jobs",
|
||||
"relationshipBody": "Der <appTabLink>App-Reiter</appTabLink> des LXC verwaltet Anwendungsidentität, Weblinks und optionales Versionstracking. <strong>Apps</strong> verwendet diese Links als Schnellzugriff. Die Bearbeitung einer LXC-Karte öffnet daher den Gastdatensatz, ohne die Konfiguration zu duplizieren."
|
||||
},
|
||||
"cards": {
|
||||
"heading": "Wie man eine Karte benutzt",
|
||||
"intro": "Die gesamte Karte ist das Startziel, während ihre kleineren Kontrollen einen Kontext bieten, ohne den Dienst zu öffnen.",
|
||||
"items": [
|
||||
"Klicken Sie auf die Karte, um ihre URL in einem neuen Browser-Tab zu öffnen.",
|
||||
"Das Logo verwendet zuerst das Web Link-Logo und fällt gegebenenfalls auf das Anwendungslogo zurück.",
|
||||
"Der Kategoriechip verwendet die gleiche Farbe und Beschriftung wie der entsprechende Weblink im LXC App-Tab.",
|
||||
"Die Gastanzeige nennt die zugeordnete VM oder den LXC. Ein Klick öffnet dessen Dialog: LXC-Links öffnen <strong>App</strong>, VM-Links <strong>Status</strong>.",
|
||||
"Ein violetter Aufwärtspfeil kennzeichnet ein verfügbares Update der betreffenden Anwendung oder des Docker-Images. Er ist keine Gesamtzahl aller Updates des Gastsystems."
|
||||
]
|
||||
},
|
||||
"toolbar": {
|
||||
"heading": "Suche, Filter und Sortierung",
|
||||
"intro": "Die Symbolleiste verengt eine große Anwendungssammlung, ohne die gespeicherten Datensätze zu ändern.",
|
||||
"items": [
|
||||
"Die Suche entspricht dem Anwendungsnamen, dem Gastnamen, dem VMID und der Kategorie.",
|
||||
"Der Kategoriefilter zeigt jeweils eine Kategorie oder alle Anwendungen an.",
|
||||
"Sortieren Sie nach <strong>Name</strong>, <strong>ID</strong> oder <strong>Kategorie</strong>. Die Kategoriesortierung fügt Überschriften zwischen Kartengruppen ein.",
|
||||
"Die Sortierung wird in diesem Browser gespeichert. Suchtext und Kategoriefilter werden beim erneuten Seitenaufruf zurückgesetzt.",
|
||||
"Die Registerkarte Apps bleibt verfügbar, wenn das Raster leer ist, so dass der erste benutzerdefinierte Link hinzugefügt werden kann, ohne zuerst eine LXC-Anwendung zu registrieren."
|
||||
]
|
||||
},
|
||||
"customLinks": {
|
||||
"heading": "Hinzufügen und Bearbeiten von benutzerdefinierten Weblinks",
|
||||
"intro": "Verwenden Sie einen benutzerdefinierten Link, wenn der Dienst nicht durch eine registrierte LXC-Anwendung dargestellt wird.",
|
||||
"steps": [
|
||||
"Wählen Sie <strong>Link hinzufügen</strong> in der Werkzeugleiste oder der leeren Ansicht.",
|
||||
"Geben Sie einen Namen und eine vollständige <code>http://</code> oder <code>https://</code> URL ein.",
|
||||
"Optional ein Logo hinzufügen, eine Kategorie auswählen oder erstellen und den Link an einen VM oder LXC binden.",
|
||||
"Speichern Sie den Link. Seine Karte erscheint sofort im Raster.",
|
||||
"Zum Ändern oder Entfernen eines eigenen Links wählen Sie <strong>Bearbeiten</strong> und den Stift auf seiner Karte."
|
||||
],
|
||||
"colField": "Feld",
|
||||
"colRequired": "Erforderlich",
|
||||
"colPurpose": "Zweck",
|
||||
"fields": [
|
||||
{
|
||||
"field": "Name",
|
||||
"required": "Ja",
|
||||
"purpose": "Der kartentitel und der suchbegriff."
|
||||
},
|
||||
{
|
||||
"field": "URL",
|
||||
"required": "Ja",
|
||||
"purpose": "Das vollständige HTTP(S) Ziel, das von der Karte geöffnet wird."
|
||||
},
|
||||
{
|
||||
"field": "Logo-URL",
|
||||
"required": "Nein",
|
||||
"purpose": "Ein Fernbild, das auf der Karte angezeigt wird."
|
||||
},
|
||||
{
|
||||
"field": "Kategorie",
|
||||
"required": "Nein",
|
||||
"purpose": "Fügt ein gemeinsames Badge hinzu und ermöglicht die Kategoriefilterung."
|
||||
},
|
||||
{
|
||||
"field": "Gastzuordnung",
|
||||
"required": "Nein",
|
||||
"purpose": "Verbindet den Link mit einem VM oder LXC und aktiviert die Gastverknüpfung."
|
||||
}
|
||||
],
|
||||
"editTitle": "Bearbeiten der Quelle der Wahrheit",
|
||||
"editBody": "Stifte erscheinen im Bearbeitungsmodus nur bei eigenen Links. Für eine LXC-Anwendungskarte öffnen Sie den <appTabLink>App-Reiter</appTabLink> des Gastsystems und ändern dort den gespeicherten Weblink."
|
||||
},
|
||||
"categories": {
|
||||
"heading": "Kategorien und Aktualisierungssignale",
|
||||
"intro": "Kategorien organisieren Links; Updatesignale melden den Softwarezustand. Sie sind absichtlich getrennt.",
|
||||
"items": [
|
||||
"Kataloggestützte LXC-Registrierung kann eine Kategorie vorfüllen, bleibt aber editierbar.",
|
||||
"Benutzerdefinierte Kategorienamen können aus dem gleichen Selektor erstellt und dann vom Filter wiederverwendet werden.",
|
||||
"Kategoriefarben sind deterministisch und passen sich dem hellen oder dunklen Thema an. Lila und rote Bereiche sind für Update- und Gefahrenzustände reserviert.",
|
||||
"Bei Docker-Weblinks ordnet ProxMenux die Karte einem Container oder Image zu und zeigt dessen Image-Updatezustand. Docker-Engine-Updates bleiben im <updatesLink>Reiter Aktualisierungen</updatesLink> des LXC."
|
||||
]
|
||||
},
|
||||
"persistence": {
|
||||
"heading": "Persistenz und Cache-Verhalten",
|
||||
"intro": "Das Dashboard ist so konzipiert, dass es sich von bereits verfügbaren Monitordaten öffnet, anstatt jeden Gast neu zu scannen.",
|
||||
"items": [
|
||||
"Eigene Links werden atomar in <code>/etc/proxmenux/custom_links.json</code> gespeichert und beim Start von Monitor in den Arbeitsspeicher geladen.",
|
||||
"Registrierte LXC-Links bleiben Teil des gespeicherten Monitor-Datensatzes ihrer Anwendung; das Apps-Dashboard dupliziert sie nicht in die benutzerdefinierte Link-Datei.",
|
||||
"Das Erstellen, Bearbeiten oder Löschen eines benutzerdefinierten Links aktualisiert die In-Memory-Liste sofort.",
|
||||
"Die Sortierpräferenz gilt nur für diesen Browser und wird nicht zwischen Geräten oder Benutzern synchronisiert.",
|
||||
"Die Position von Apps in der Hauptnavigation wird unter <settingsLink>Einstellungen → Navigationsreihenfolge</settingsLink> festgelegt."
|
||||
]
|
||||
},
|
||||
"troubleshooting": {
|
||||
"heading": "Häufige Situationen",
|
||||
"colProblem": "Lage",
|
||||
"colResolution": "Lösung",
|
||||
"rows": [
|
||||
{
|
||||
"problem": "Eine LXC-Anwendung ist registriert, aber keine Karte erscheint",
|
||||
"resolution": "Öffnen Sie den Tab App und fügen Sie mindestens einen Weblink hinzu. Versions-Tracking allein erstellt keine Launcher-Karte."
|
||||
},
|
||||
{
|
||||
"problem": "URL oder Logo ist falsch",
|
||||
"resolution": "Bearbeiten Sie den benutzerdefinierten Link in Apps oder bearbeiten Sie den Weblink im LXC App-Tab."
|
||||
},
|
||||
{
|
||||
"problem": "Ein Docker-Service fehlt",
|
||||
"resolution": "Bearbeiten Sie die registrierte Docker-Anwendung und speichern Sie den veröffentlichten Webport des Dienstes als Weblink."
|
||||
},
|
||||
{
|
||||
"problem": "Der lila Pfeil bezieht sich auf das falsche Docker Update",
|
||||
"resolution": "Überprüfen Sie den Weblink-Namen und die Beschreibung, damit sie mit dem beabsichtigten Container oder Image übereinstimmen können."
|
||||
},
|
||||
{
|
||||
"problem": "Apps öffnen sich zuerst statt Systemübersicht",
|
||||
"resolution": "Der erste gespeicherte Eintrag unter Einstellungen → Navigationsreihenfolge wird zum Startreiter. Stellen Sie die Standardreihenfolge wieder her oder verschieben Sie Übersicht an die erste Stelle."
|
||||
}
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "LXC App Tab",
|
||||
"href": "/docs/monitor/dashboard/vms-lxcs/app",
|
||||
"tail": "— Anwendungen registrieren, Weblinks und optionales Versions-Tracking."
|
||||
},
|
||||
{
|
||||
"label": "LXC Updates Tab",
|
||||
"href": "/docs/monitor/dashboard/vms-lxcs/updates",
|
||||
"tail": " — Aktualisierungen für Anwendungen, Docker Engine und Images konfigurieren und ausführen."
|
||||
},
|
||||
{
|
||||
"label": "Tab Einstellungen",
|
||||
"href": "/docs/monitor/dashboard/settings#navigation-order",
|
||||
"tail": " — Navigationsreihenfolge und Startreiter ändern."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Hardware | ProxMenux-Dokumentation",
|
||||
"description": "Die Hardware-Registerkarte inventarisiert die physische Maschine: CPU und Motherboard, Speichermodule, thermische Sensoren, GPUs (mit Echtzeitüberwachung pro Slot und Ein-Klick-Treiber-Installation), Coral TPU-Beschleuniger, Speicherzusammenfassung mit Link-Geschwindigkeitsprüfungen, vollständige PCI- und USB-Gerätelisten, Stromverbrauch, PSUs, Lüfter und USV-Zustand."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Hardware",
|
||||
"description": "Die physische Maschine in einem Bildschirm - CPU und Motherboard-Identität, jedes Speichermodul, thermische Sensoren über alle Subsysteme hinweg, GPUs mit Live-Auslastung und ein eingebautes Treiber-Installationsprogramm, Coral-TPUs, jedes PCI- und USB-Gerät mit seinem Kernel-Treiber, das vollständige Festplatteninventar mit ausgehandelten Verbindungsgeschwindigkeiten sowie Strom, Kühlung und USV.",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Gebaut aus Standardwerkzeugen",
|
||||
"body": "Der größte Teil dieser Registerkarte wird aus <code>lscpu</code>, <code>dmidecode</code>, <code>lspci</code>, <code>lsusb</code>, <code>lsblk</code>, <code>smartctl</code>, <code>nvme</code>, <code>sensors</code>, <code>nvidia-smi</code>, <code>intel_gpu_top</code>, <code>amdgpu_top</code>, <code>ipmitool</code> und <code>upsc</code> analysiert. Abschnitte werden nur dann dargestellt, wenn das betreffende Tool Daten zurückgibt, so dass ein Host ohne USV die USV-Karte nicht zeigt und ein Host ohne IPMI keine Out-of-Band-Leistungszahlen anzeigt."
|
||||
},
|
||||
"thresholds": {
|
||||
"title": "Hier angewendete Statusfarben und -schwellen",
|
||||
"intro": "Alle Temperaturanzeigen verwenden dieselbe Einteilung: <green/> <strong>grün</strong> unter der Warnschwelle, <amber/> <strong>bernsteinfarben</strong> zwischen Warn- und kritischer Schwelle, <red/> <strong>rot</strong> ab der kritischen Schwelle. Empfohlene Standardwerte von ProxMenux :",
|
||||
"items": [
|
||||
"<strong>CPU-Temperatur</strong> — Warnung 80 °C, kritisch 90 °C.",
|
||||
"<strong>Disk Temperatur</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (Warnung/kritisch)."
|
||||
],
|
||||
"outro": "Alle Werte sind pro Host konfigurierbar. <link>Einstellungen → Grenzwerte der Zustandsüberwachung</link> ist die zentrale Referenz und erklärt ihre Anpassung."
|
||||
},
|
||||
"sections": {
|
||||
"heading": "Abschnitte",
|
||||
"intro": "Die Abschnitte erscheinen von oben nach unten in dieser Reihenfolge. Manche benötigen die passende Hardware oder ein installiertes Werkzeug und sind unten als <em>(bedingt)</em> markiert.",
|
||||
"systemInfoTitle": "Systeminformationen",
|
||||
"systemInfoIntro": "Zwei nebeneinander liegende Blöcke, immer vorhanden:",
|
||||
"systemInfoItems": [
|
||||
"<strong>CPU</strong> — Modell, Mikroarchitektur, Sockel/Kerne/Threads, Basis-/Boost-Takt, Virtualisierungsmerkmale (VT-x / AMD-V) und Cache-Topologie.",
|
||||
"<strong>Mainboard</strong> — Hersteller, Modell, BIOS-Version und -Datum sowie SMBIOS-UUID. Hilft beim Finden der passenden Hersteller-Downloadseite für Firmware-Updates."
|
||||
],
|
||||
"memoryTitle": "Speichermodule",
|
||||
"memoryBody": "Eine Zeile je belegtem Steckplatz aus <code>dmidecode</code>: Steckplatzbezeichnung, Modulgröße, Typ (DDR4/DDR5/ECC), konfigurierter und spezifizierter Takt, Hersteller, Teile- und Seriennummer. Leere Steckplätze sind ausgegraut, damit das Erweiterungspotenzial sichtbar bleibt.",
|
||||
"thermalTitle": "Thermische Überwachung",
|
||||
"thermalIntro": "Sieben Bereiche mit Daten aus <code>lm-sensors</code>, <code>sysfs</code> und werkzeugspezifischen Auswertungen. Speicher-hwmon-Sensoren werden dem physischen Blockgerät zugeordnet, sodass jedes Laufwerk mit Modell und <code>/dev/...</code>-Pfad erscheint. Ohne Sensoren einer Kategorie bleibt deren Bereich verborgen.",
|
||||
"thermalItems": [
|
||||
"<strong>CPU</strong> — Temperatur des CPU-Packages und der einzelnen Kerne.",
|
||||
"<strong>GPU</strong> — Sensoren dedizierter GPUs über <code>nvidia-smi</code>/<code>amdgpu_top</code> sowie Intel-iGPU. Hotspot- und Speicher-Junction-Temperatur, sofern der Treiber sie bereitstellt.",
|
||||
"<strong>NVME</strong> — zusammengesetzte Controllertemperatur, dem genauen NVMe-Namespace zugeordnet.",
|
||||
"<strong>HDD</strong> — <code>drivetemp</code>-Messwerte für Rotationsblockgeräte.",
|
||||
"<strong>SSD</strong> — <code>drivetemp</code>-Messwerte für nicht rotierende SATA/SAS-Blockgeräte.",
|
||||
"<strong>PCI</strong> — Sensoren, die als PCI-befestigte Geräte auftauchen (HBAs, Netzwerkkarten mit internen Sensoren).",
|
||||
"<strong>OTHER</strong> - Chipsatz, VRM, Umgebungssensoren, die anderswo nicht passen."
|
||||
]
|
||||
},
|
||||
"graphics": {
|
||||
"heading": "Grafikkarten",
|
||||
"intro": "Jeder Videocontroller erscheint als Karte mit Hersteller, Modell, Typ (<em>Integriert</em>/<em>PCI</em>/BMC), PCI-Adresse (BDF), Kerneltreiber und Modulen. <strong>Modus wechseln</strong> schaltet zwischen LXC-Freigabe mit nativem Treiber und VM-Passthrough (<code>vfio-pci</code>) um. <link>GPU-Modus wechseln (VM ↔ LXC)</link> beschreibt die Änderungen auf dem Host.",
|
||||
"vfioImageAlt": "Grafikkarten-Abschnitt mit einer an mgag200 gebundenen Matrox G200EH integrierten GPU (Ready for LXC) und einer an vfio-pci gebundenen NVIDIA Quadro P400 (Ready for VM passthrough)",
|
||||
"vfioImageCaption": "Zwei GPUs erkannt: Der Matrox BMC Chip ist auf dem nativen Treiber und bereit für LXC; der NVIDIA Quadro P400 ist an <code>vfio-pci</code> gebunden, bereit für VM Passthrough.",
|
||||
"lxcImageAlt": "Grafikkarten: Intel UHD Graphics iGPU mit i915 und NVIDIA Quadro P1000 mit nvidia, beide bereit für LXC-Container",
|
||||
"lxcImageCaption": "Der gleiche Knoten nach dem Umschalten der NVIDIA-Karte zurück zum nativen Treiber - beide GPUs sind jetzt bereit für LXC-Container.",
|
||||
"realtimeTitle": "Dialog zur Echtzeitüberwachung",
|
||||
"realtimeBody": "Ein Klick auf eine GPU öffnet die Überwachung dieses Steckplatzes. Alle drei Sekunden wird das passende Herstellerwerkzeug abgefragt. Sichtbar sind Hersteller, Typ, PCI-Steckplatz, Treiber, Kernelmodule, Engine-Auslastung (Render/3D, Video, Blitter, VideoEnhance), Grafik- und Speichertakt, Temperatur, gemeldete Leistungsaufnahme, VRAM und aktive Prozesse mit jeweiliger Engine-Last. Daten aus <code>/api/gpu/<slot>/realtime</code>.",
|
||||
"toolsIntro": "Das je GPU verwendete Herstellerwerkzeug :",
|
||||
"headerVendor": "Hersteller",
|
||||
"headerTool": "Werkzeug",
|
||||
"headerProject": "Projekt",
|
||||
"tools": [
|
||||
{
|
||||
"vendor": "NVIDIA",
|
||||
"tool": "nvidia-smi",
|
||||
"projectLabel": "developer.nvidia.com",
|
||||
"projectHref": "https://developer.nvidia.com/nvidia-system-management-interface"
|
||||
},
|
||||
{
|
||||
"vendor": "Intel iGPU",
|
||||
"tool": "intel_gpu_top (igt-gpu-tools)",
|
||||
"projectLabel": "gitlab.freedesktop.org",
|
||||
"projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools"
|
||||
},
|
||||
{
|
||||
"vendor": "AMD",
|
||||
"tool": "amdgpu_top",
|
||||
"projectLabel": "github.com/Umio-Yasuno/amdgpu_top",
|
||||
"projectHref": "https://github.com/Umio-Yasuno/amdgpu_top"
|
||||
},
|
||||
{
|
||||
"vendor": "Matrox / ASPEED (BMC)",
|
||||
"tool": "— (nur Anzeige)",
|
||||
"projectLabel": "Als BMC erkannt und gekennzeichnet; keine Echtzeitüberwachung."
|
||||
}
|
||||
],
|
||||
"nvidiaImageAlt": "Überwachung einer NVIDIA Quadro P1000: Hersteller NVIDIA, Treiber nvidia geladen, Grafiktakt 1.26 GHz, Speichertakt 2.50 GHz, Temperatur 50 °C, alle Engines bei 0 %, keine aktiven Prozesse, 4096 MiB Gesamtspeicher",
|
||||
"nvidiaImageCaption": "NVIDIA Quadro P1000 mit proprietärem Treiber: Taktfrequenzen, Temperatur, Engine-Auslastungsbalken und aktive Prozesse.",
|
||||
"intelImageAlt": "Überwachung einer Intel UHD Graphics iGPU mit i915: 11.31 W Leistungsaufnahme, 1 % Video-Engine-Last und ein ffmpeg-Prozess mit 8 MB",
|
||||
"intelImageCaption": "Intel iGPU mit <code>i915</code> aktiv. Die Tabelle Aktive Prozesse nimmt einen ffmpeg-Job mit der Video-Engine auf.",
|
||||
"amdImageAlt": "Überwachung der integrierten AMD Lucienne GPU mit amdgpu: Engine-Auslastung bei 0 % und amdgpu_top als aktiver Prozess",
|
||||
"amdImageCaption": "AMD-iGPU mit <code>amdgpu_top</code> überwacht. Das Werkzeug erscheint selbst als aktiver Prozess, weil es die Live-Daten erfasst.",
|
||||
"installTitle": "NVIDIA-Treiber aus dem Dialog installieren",
|
||||
"installBody": "Bei einer NVIDIA-GPU mit <code>nouveau</code>/<code>nvidiafb</code> ohne proprietären Treiber fehlen Takt-, Leistungs- und Prozesslastdaten. Der Dialog zeigt dann <strong>NVIDIA-Treiber installieren</strong> und startet das unter <link>NVIDIA-Treiber installieren (Host)</link> beschriebene Skript.",
|
||||
"noDriverAlt": "Überwachung einer NVIDIA Quadro P620 mit nvidiafb und nouveau, Hinweis Erweiterte Überwachung nicht verfügbar und blauer Schaltfläche NVIDIA-Treiber installieren",
|
||||
"noDriverCaption": "Noch kein proprietärer Treiber installiert — der Dialog bietet einen Ein-Klick-Installer.",
|
||||
"promptAlt": "NVIDIA GPU-Treiber-Installationsbestätigungsdialog mit erkannten GPUs, LXC-Containern mit NVIDIA-Durchgang und einem Yes/Cancel-Paar",
|
||||
"promptCaption": "Zusammenfassung vor der Installation: erkannte GPUs, LXC-Container, die bereits NVIDIA-Passthrough haben, und was das Skript tun wird. Nichts wird berührt, bis Sie bestätigen.",
|
||||
"successAlt": "Terminalausgang mit erfolgreich installiertem NVIDIA-Treiber 580.105.08 und nvidia-smi mit Quadro P620",
|
||||
"successCaption": "Erfolgreiche Installation - der NVIDIA <code>.run</code> wurde über DKMS gebaut, der Persistenzdienst ist vorhanden, und <code>nvidia-smi</code> meldet den GPU.",
|
||||
"warningTitle": "Eine von der GPU unterstützte Treiberversion wählen",
|
||||
"warningBody": "Neuere NVIDIA-Treiberzweige stellen die Unterstützung älterer GPU-Familien wie Maxwell oder Kepler ein. Meldet <code>nvidia-smi</code> nach der Installation <em>\"No devices were found\"</em> oder schlägt DKMS fehl, passt der gewählte Zweig möglicherweise nicht zur GPU. Starten Sie die Installation mit einem älteren Zweig, etwa Legacy 470.x für Kepler. Die Kompatibilität steht auf der <a>offiziellen Treibersuchseite</a>.",
|
||||
"whereGoIntro": "Wohin gehen von hier aus:",
|
||||
"whereGoItems": [
|
||||
"<link1>NVIDIA-Treiber installieren (Host)</link1> — vollständige Installationsanleitung, Kernel-Kompatibilitätsmatrix, optionaler NVENC-Patch und Übertragung auf LXCs.",
|
||||
"<link2>GPU-Modus wechseln (VM ↔ LXC)</link2> — Funktion des direkten Schalters <em>Modus wechseln</em>.",
|
||||
"<link3>GPU zu VM hinzufügen (Passthrough)</link3> und <link4>GPU zu LXC hinzufügen</link4> — erstmalige Zuweisung einer ungebundenen GPU."
|
||||
]
|
||||
},
|
||||
"coral": {
|
||||
"heading": "Coral TPU / AI-Beschleuniger",
|
||||
"subHeading": "(bedingt)",
|
||||
"intro": "Erscheint bei angeschlossenen Google-Coral- oder anderen KI-Beschleunigern. Der Gerätedialog zeigt Verbindung (M.2/Mini-PCIe/USB), PCIe-Breite, Hersteller-/Produkt-ID, Softwareunterstützung (<code>apex</code> im Kernel für PCIe, <code>libedgetpu</code> im Userspace für USB), Module (<code>gasket</code> + <code>apex</code>), Geräteknoten (<code>/dev/apex_*</code>), Edge-TPU-Laufzeitstatus, Live-Temperatur und Firmware-Warnschwellen.",
|
||||
"imageAlt": "Coral Edge TPU Detail modal: PCIe / M.2 Verbindung, PCIe 5.0 GT/s x1 Link, Anbieter 1ac1:089a, Kernel-Treiber apex, gasket und apex Module geladen, /dev/apex_0 vorhanden, Edge TPU Runtime nicht installiert, Temperatur 53.5 °C mit Hardware-Warnschwellenwerten",
|
||||
"imageCaption": "M.2 Coral mit den geladenen Host-Kernel-Modulen, dem Geräteknoten und den freigegebenen Firmware-Temperaturwarnungen. Die Laufzeitlinie wird grün, sobald die passende Edge TPU-Laufzeit installiert ist.",
|
||||
"pathsIntro": "Je nach Formfaktor gibt es zwei Installationspfade:",
|
||||
"pathsItems": [
|
||||
"<strong>M.2 / Mini-PCIe</strong> - der Host benötigt die Kernelmodule <code>gasket</code> + <code>apex</code>, die über DKMS erstellt wurden, damit der Geräteknoten <code>/dev/apex_0</code> beim Booten erscheint.",
|
||||
"<strong>USB Accelerator</strong> – der Host benötigt nur die Edge TPU User-Space Runtime (<code>libedgetpu1-std</code>) aus dem APT-Repository von Google."
|
||||
],
|
||||
"outro": "<installLink>Coral TPU auf dem Host installieren</installLink> erkennt und verwaltet beide Varianten. Hintergrundinformationen und die offizielle Laufzeit finden Sie unter <a>coral.ai/docs</a>. Anschließend weisen Sie das Gerät mit <lxcLink>Coral TPU zu LXC hinzufügen</lxcLink> einem Container zu."
|
||||
},
|
||||
"storage": {
|
||||
"heading": "Speicherzusammenfassung",
|
||||
"intro": "Alle dem Kernel bekannten Blockgeräte nach Typ. Je Datenträger: Kernelname (<code>sda</code>, <code>nvme0n1</code>, <code>zram0</code>…), Typ (<em>SSD</em>, <em>HDD</em>, <em>NVMe SSD</em>), Modell und ausgehandelte Verbindung. Ein Klick öffnet Modell, Seriennummer, Kapazität, Schnittstelle sowie aktuelle und maximale Verbindungsgeschwindigkeit.",
|
||||
"imageAlt": "Storage Summary-Karte mit elf Blockgeräten (SATA SSDs, SATA HDDs, NVMe SSDs und zram) mit Modellzeichenfolgen und ausgehandelten Verbindungsgeschwindigkeiten; die beiden NVMe-Laufwerke zeigen 3.0 x4 mit der aktuellen Geschwindigkeit hervorgehoben",
|
||||
"imageCaption": "Elf Geräte auf diesem Knoten. SATA-Verbindungen erscheinen als <em>SATA <version>, <Gb/s> (current: ...)</em>, NVMe-Laufwerke als <em><PCIe gen> x<width></em>.",
|
||||
"nvmeBody": "Bei NVMe wird die ausgehandelte Verbindung mit dem Gerätemaximum verglichen. Bei Abweichungen, etwa einer Gen3-x4-SSD mit <strong>3.0 x1</strong> in einem einspurig angebundenen Steckplatz, erscheint der aktuelle Wert bernsteinfarben. Das hilft bei langsamen Laufwerken oder nach einer geänderten Lane-Zuordnung durch ein BIOS-Update.",
|
||||
"nvmeModalAlt": "NVMe-Detaildialog für nvme0n1: NVMe SSD, 953.9 GB, aktueller Link 3.0 x1 bernsteinfarben, Maximum 3.0 x4, WDC CL SN720, Seriennummer, PCIe/NVMe",
|
||||
"nvmeModalCaption": "NVMe-Details mit reduzierter Lane-Anzahl: Das Laufwerk unterstützt x4, der Steckplatz ist nur x1 angebunden.",
|
||||
"outro": "SMART-Daten, Selbsttests, Verlauf und PDF-Bericht stehen unter <storageLink>Dashboard: Speicher</storageLink>. Dieselben Daten nutzt <smartLink>SMART-Datenträgerzustand und Tests</smartLink>. Ein langer Test über das Skript schreibt die JSON-Datei für <em>Speicher → Verlauf</em> in Monitor."
|
||||
},
|
||||
"pci": {
|
||||
"heading": "PCI-Geräte",
|
||||
"intro": "PCI-Geräte mit <strong>PCI-BDF</strong> (Bus:Device.Function, etwa <code>03:00.0</code>) und Klasse (<em>Speichercontroller</em>, <em>USB-Controller</em>, <em>Grafikkarte</em>, <em>Netzwerkcontroller</em>, <em>Audiocontroller</em>…). Jede Karte zeigt Hersteller, Gerätenamen und <strong>aktuell gebundenen Kerneltreiber</strong>, hilfreich bei Passthrough-, IOMMU- oder Treiberproblemen.",
|
||||
"imageAlt": "PCI Devices Abschnitt listet fünfzehn Geräte nach Klasse gruppiert: Speicher-Controller auf ahci / nvme, USB-Controller, Grafikkarten (einer auf vfio-pci, einer auf dem nativen Treiber), Netzwerk-Controller auf igb / tg3, ein Audio-Controller neben einem durchgelassenen GPU",
|
||||
"imageCaption": "Fünfzehn Geräte auf diesem Knoten. Beachten Sie, dass die GPU und die dazugehörige Audiofunktion beide an <code>vfio-pci</code> gebunden sind - eine Karte, die für den VM-Durchgang vorbereitet ist.",
|
||||
"bdfTitle": "Lesen des BDF",
|
||||
"bdfBody": "<code>03:00.0</code> steht für PCI-Bus <code>03</code>, Gerät <code>00</code>, Funktion <code>0</code>. Dedizierte GPUs verwenden meist <code>.0</code> für Grafik und <code>.1</code> für HDMI-Audio. Beide Funktionen werden gemeinsam durchgereicht; deshalb bereinigt <link>GPU-Modus wechseln</link> beim Verlassen des VM-Modus auch verwaiste Audiozuordnungen."
|
||||
},
|
||||
"usb": {
|
||||
"heading": "USB-Geräte",
|
||||
"intro": "USB-Geräte mit Hersteller und Produkt, USB-Version, <code>bus:device</code>-Adresse, <code>vendor:product</code>-ID und Kerneltreiber. Die Anzeige ordnet typische Rollen zu: <em>Kommunikation</em> (Z-Wave-/Zigbee-Sticks), <em>USV</em>, Speicher und HID. So lassen sich die Adapter ohne ID-Abgleich unterscheiden.",
|
||||
"imageAlt": "USB-Gerätekarte mit drei Geräten: einem Aeotec Z-Wave Z-Stick, einem ConBee II Zigbee-Koordinator und einem Ellipse ECO USV mit jeweils USB-Version, Adresse, Vendor:product ID und gebundenem Treiber",
|
||||
"imageCaption": "Drei USB-Geräte - zwei Heimautomationsradios auf <code>usbfs</code> und ein USV auf <code>usbfs</code> (NUT spricht mit ihm über libusb)."
|
||||
},
|
||||
"power": {
|
||||
"heading": "Stromverbrauch",
|
||||
"subHeading": "(bedingt)",
|
||||
"intro": "Erscheint, wenn der Host Leistungsdaten liefert. Zwei unabhängige Quellen werden angezeigt, sofern verfügbar :",
|
||||
"items": [
|
||||
"<strong>Gesamtleistung ACPI/IPMI</strong> — Leistungsaufnahme des ganzen Systems über einen Mainboard-Sensor oder BMC. Typisch für Server-Mainboards.",
|
||||
"<strong>CPU-Package-Leistung</strong> — aus Intel-RAPL-Zählern oder AMD-Entsprechung. Trennt die CPU-Leistung vom übrigen System auf Consumer-Mainboards ohne Gesamtsensor."
|
||||
],
|
||||
"supplyImageAlt": "Abschnitt Stromverbrauch zeigt die Gesamtentnahme von 198 W über die ACPI-Schnittstelle sowie eine Power Supplies-Karte mit zwei PSUs, die beide OK melden (185 W und 5 W Ausgang)",
|
||||
"supplyImageCaption": "Serverplatine mit einem einzigen ACPI-Leistungssensor und zwei PSUs, die über IPMI gemeldet werden — die zweite PSU ist die redundante, im Leerlauf bei 5 W.",
|
||||
"cpuImageAlt": "Abschnitt Stromverbrauch auf einer Verbraucherplatine mit nur CPU Power 8.7 W über Intel RAPL",
|
||||
"cpuImageCaption": "Verbraucherplatine ohne Ganzsystemsensor - der Abschnitt fällt nur auf RAPL CPU zurück."
|
||||
},
|
||||
"psu": {
|
||||
"heading": "Netzteile",
|
||||
"subHeading": "(bedingt)",
|
||||
"body": "Auf Server-Mainboards mit mehreren Netzteilen zeigt IPMI deren Vorhandensein (PSU 1 / PSU 2 / …), Eingangsspannung, Ausgangsleistung und Zustand OK/Fehler. Nach einer Stromstörung ist dies die erste Prüfung bei redundanten Netzteilen."
|
||||
},
|
||||
"fans": {
|
||||
"heading": "Systemlüfter",
|
||||
"subHeading": "(bedingt)",
|
||||
"body": "Drehzahl jedes Lüfters mit Minidiagramm, sofern unterstützt. Ohne Einzelwerte wird ein einziger Gehäuselüfterwert angezeigt."
|
||||
},
|
||||
"ups": {
|
||||
"heading": "UPS-Status",
|
||||
"subHeading": "(bedingt)",
|
||||
"body": "Erscheint bei konfiguriertem und erreichbarem NUT-Server (Network UPS Tools). Sichtbar sind Status (Netzbetrieb/Batteriebetrieb/Laden/Batterie schwach), Batterieladung, Restlaufzeit, Last, Eingangsspannung, Modell und Firmware. Dieselben Daten fließen in <em>Sicherheit und Zertifikate</em> der Zustandsüberwachung ein; Batteriebetrieb wird sofort gemeldet."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Wie die Daten gesammelt werden",
|
||||
"headerSection": "Abschnitt des Reiters",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerSource": "Quelle",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Statisches Inventar (PCI, CPU, BIOS)",
|
||||
"endpoint": "/api/hardware",
|
||||
"source": "<code>lspci -vmm</code>, <code>/proc/cpuinfo</code>, <code>dmidecode</code>; für die Laufzeit des Prozesses zwischengespeichert."
|
||||
},
|
||||
{
|
||||
"section": "Live-Sensorwerte",
|
||||
"endpoint": "/api/hardware/live",
|
||||
"source": "<code>sensors</code> (lm-sensors), <code>/sys/class/hwmon</code> und <code>/sys/block</code> identifizieren Speichergeräte. Temperaturen bleiben live; nur die Zuordnung von hwmon zu Geräten wird 60 Sekunden zwischengespeichert."
|
||||
},
|
||||
{
|
||||
"section": "CPU Temperaturverlauf",
|
||||
"endpoint": "/api/temperature/history",
|
||||
"source": "Zeitreihe, die der Temperatur-Collector alle 60 Sekunden erfasst und in SQLite speichert."
|
||||
},
|
||||
{
|
||||
"section": "GPU Live-Metriken",
|
||||
"endpoint": "/api/gpu/<slot>/realtime",
|
||||
"source": "NVIDIA: <code>nvidia-smi --query-gpu=...</code>. Intel: <code>intel_gpu_top</code>. AMD: sysfs <code>/sys/class/drm/cardN</code>."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Inventar mit der Betriebssystemansicht abgleichen",
|
||||
"codeComment2": "# Bestätigen Sie die GPU-Karte, die das Dashboard sieht"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Installieren Sie NVIDIA Treiber (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": "— was die Installationsschaltfläche des GPU-Modals ausführt."
|
||||
},
|
||||
{
|
||||
"label": "GPU-Modus wechseln (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": "— was der Inline-Modus-Schalter auf jeder GPU-Karte mit dem Host macht."
|
||||
},
|
||||
{
|
||||
"label": "Installieren Sie Coral TPU auf dem Host",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — Installation von Coral-Kernelmodul und -Laufzeit."
|
||||
},
|
||||
{
|
||||
"label": "SMART-Festplattenstatus und -test",
|
||||
"href": "/docs/disk-manager/smart-disk-test",
|
||||
"tail": " — das Skript hinter den SMART-Daten in der Datenträger-Detailansicht unter Speicher."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard: Speicher-Tab",
|
||||
"href": "/docs/monitor/dashboard/storage",
|
||||
"tail": "— vollständige SMART-Attributtabelle, Selbsttestverlauf und PDF-Bericht."
|
||||
},
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — die Kategorie CPU und Temperatur, die dieselben Sensoren nutzt."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — die Endpunkte für Hardware und GPU."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard-Index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — die anderen Reiter."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard | ProxMenux-Dokumentation",
|
||||
"description": "Das Dashboard ist die Hauptoberfläche von ProxMenux Monitor: zehn Inhaltsreiter einschließlich Apps-Starter, eine globale Kopfzeile und eine konfigurierbare Navigationsreihenfolge."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard",
|
||||
"description": "Die Alltagsansicht von ProxMenux Monitor: zehn Inhaltsreiter einschließlich Apps-Starter, eine globale Kopfzeile und eine konfigurierbare Navigationsreihenfolge.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"oneHeader": {
|
||||
"title": "Ein Header, zehn Tabs",
|
||||
"body": "Die Kopfzeile mit Logo, Knotenname, Statusanzeige, Laufzeit, Aktualisierung und Designauswahl bleibt sichtbar. Der aktive Reiter wechselt den gesamten Inhalt darunter. Die Statusfarbe entspricht der schwerwiegendsten Kategorie der <link>Zustandsüberwachung</link>; im Dashboard wird derselbe Wert angezeigt."
|
||||
},
|
||||
"tabs": {
|
||||
"heading": "Die zehn Tabs",
|
||||
"intro": "Jeder Tab hat eine eigene eigene Seite. Seiten werden schrittweise hinzugefügt, wenn die Dokumentation ausgefüllt wird; unten ist die vollständige Liste und wofür jeder verantwortlich ist.",
|
||||
"headerTab": "Tab.",
|
||||
"headerOwns": "Zuständig für",
|
||||
"rows": [
|
||||
{
|
||||
"name": "Systemübersicht",
|
||||
"linksTo": "/docs/monitor/dashboard/system-overview",
|
||||
"owns": "CPU / Speicher / Temperatur-Widgets, aktive VM & LXC Anzahl, historische Metriken Charts, Speicher und Netzwerk-Zusammenfassungen. Standardlanderegisterkarte, bis die Navigationsreihenfolge angepasst ist."
|
||||
},
|
||||
{
|
||||
"name": "Apps",
|
||||
"linksTo": "/docs/monitor/dashboard/apps",
|
||||
"owns": "Gemeinsamer Starter für registrierte LXC-Weblinks und eigene Links, mit Kategorien, Suche, Gastsystem-Verknüpfungen und Aktualisierungshinweisen je Anwendung."
|
||||
},
|
||||
{
|
||||
"name": "Speicher",
|
||||
"owns": "Proxmox-Pools, physische Festplatten, SMART-Daten, ZFS-Zustand, Verschleiß & Lebensdauer, Beobachtungshistorie."
|
||||
},
|
||||
{
|
||||
"name": "Netzwerk",
|
||||
"owns": "Physische Schnittstellen, Bonds, Bridges und OVS, IP/MAC-Adressen, RX/TX-Diagramme und RRD-Verlauf je Schnittstelle."
|
||||
},
|
||||
{
|
||||
"name": "VMs und LXCs",
|
||||
"owns": "Bestandsaufnahme der Gastsysteme, Detailansicht für Konfiguration, Metriken und Protokolle sowie Starten, Stoppen, Neustarten und Herunterfahren."
|
||||
},
|
||||
{
|
||||
"name": "Hardware",
|
||||
"owns": "CPU-Modell und Topologie, Speicherlayout, PCIe-Topologie, GPUs mit Echtzeitüberwachung pro Slot."
|
||||
},
|
||||
{
|
||||
"name": "Systemprotokolle",
|
||||
"owns": "Live <code>journalctl</code> mit Filtern, Proxmox Task History, Benachrichtigungsprotokoll, herunterladbare Log-Bundles."
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"owns": "Shell-Zugriff auf Host oder VM/CT im Browser mit <code>xterm.js</code> über WebSockets."
|
||||
},
|
||||
{
|
||||
"name": "Sicherheit",
|
||||
"owns": "Auth-Setup, Passwort / 2FA / API-Token, Audit-Log, optionales Fail2Ban-Panel, Secure Gateway-Bereitstellung."
|
||||
},
|
||||
{
|
||||
"name": "Einstellungen",
|
||||
"owns": "Monitor-Sprache, Navigationsreihenfolge, Benachrichtigungskanäle, KI-Anbieter, Zustandsschwellen, Ausschlüsse und Nachinstallationsoptimierungen."
|
||||
}
|
||||
]
|
||||
},
|
||||
"headerAnatomy": {
|
||||
"heading": "Kopfanatomie",
|
||||
"items": [
|
||||
"<strong>Logo + Produktname</strong> auf der linken Seite. Das Logo wird zu einer \"update available\"-Variante, wenn eine neuere Monitor-Version erkannt wird.",
|
||||
"<strong>Knotenidentität</strong>: Name aus <code>pvesh get /nodes</code>, ersatzweise <code>hostname</code>.",
|
||||
"<strong>Zustandsanzeige</strong>: Gesund (grün), Warnung (gelb), Kritisch (rot). Ein Klick öffnet die Zustandsüberwachung. Ein blaues <em>Info</em>-Abzeichen erscheint, wenn ausgeblendete Elemente noch innerhalb ihrer Unterdrückungsfrist liegen.",
|
||||
"<strong>Laufzeit</strong>: Betriebszeit des Hosts in gut lesbarem Format.",
|
||||
"<strong>Aktualisieren</strong>: wiederholt die Live-API-Aufrufe, ohne die gesamte Seite neu zu laden.",
|
||||
"<strong>Designauswahl</strong>: hell, dunkel oder System. In <code>localStorage</code> gespeichert."
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Apps Tab",
|
||||
"href": "/docs/monitor/dashboard/apps",
|
||||
"tail": " — gemeinsamer Weblink-Starter und seine Beziehung zu registrierten LXC-Anwendungen."
|
||||
},
|
||||
{
|
||||
"label": "Registerkarte Systemübersicht",
|
||||
"href": "/docs/monitor/dashboard/system-overview",
|
||||
"tail": "— die Landekarte, vollständig dokumentiert."
|
||||
},
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — Dialog hinter der Zustandsanzeige mit Details zu zehn Kategorien."
|
||||
},
|
||||
{
|
||||
"label": "Architektur",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": "— wie das Dashboard mit dem Flask-Backend spricht."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,251 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Registerkarte Netzwerk | ProxMenux-Dokumentation",
|
||||
"description": "Die Registerkarte Netzwerk erfasst alle Hostschnittstellen: physische Netzwerkkarten, Bridges, Bonds, VLANs und virtuelle VM/LXC-Schnittstellen. Die Detailansicht zeigt IP, MAC, Status, Bond-Mitglieder, Verkehr seit dem Start und ein RRD-Verlaufsdiagramm."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Netzwerk-Tab",
|
||||
"description": "Alle vom Kernel gemeldeten Schnittstellen — physische Karten, Bridges, Bonds, VLANs und virtuelle VM/LXC-Ports — sind in drei Karten gruppiert. Ein Klick auf eine Zeile öffnet Adressen, Verkehrszähler und RRD-Verlaufsdaten.",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Aktuelle Daten und Verlauf",
|
||||
"body": "Der aktuelle Status stammt aus <code>psutil.net_if_stats()</code> und <code>ip</code>, der Bandbreitenverlauf aus dem Proxmox-RRD-Speicher über <code>/api/network/<interface>/metrics</code>. Zähler werden etwa alle 5 Sekunden aktualisiert, RRD-Daten für das Diagramm bei Bedarf geladen."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Obere Reihe: vier Kennzahlenkarten",
|
||||
"headerCard": "Karte",
|
||||
"headerWhat": "Was es zeigt",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Netzwerkverkehr",
|
||||
"what": "Aggregierte RX / TX-Rate über alle Schnittstellen hinweg, formatiert in der richtigen Einheit (bps / Kbps / Mbps / Gbps)."
|
||||
},
|
||||
{
|
||||
"card": "Aktive Schnittstellen",
|
||||
"what": "Zwei Zähler: <em>Physical X / Y</em> und <em>Bridges X / Y</em>, jeweils aktiv im Verhältnis zur Gesamtzahl. Ein erster Anhaltspunkt, wenn etwas nicht mehr funktioniert."
|
||||
},
|
||||
{
|
||||
"card": "Netzwerkstatus",
|
||||
"what": "Schnelle Bewertung: In Ordnung / Warnung / Kritisch anhand von Verbindungsstatus, Gateway-Erreichbarkeit und Bridge-Integrität. Entspricht der Kategorie <em>Netzwerkschnittstellen</em> im Health Monitor."
|
||||
},
|
||||
{
|
||||
"card": "Netzwerklatenz",
|
||||
"what": "Paketumlaufzeit zum Gateway mit kleinem Verlaufsdiagramm. Ein Klick öffnet den unten beschriebenen <strong>Dialog Netzwerklatenz</strong>: Verlauf und Ping-Test bei Bedarf zu Gateway, Cloudflare oder Google mit herunterladbarem PDF-Bericht."
|
||||
}
|
||||
]
|
||||
},
|
||||
"flow": {
|
||||
"heading": "Netzwerkflussdiagramm",
|
||||
"intro": "Zwischen oberer Reihe und Gruppenkarten zeigt <strong>Network Flow</strong> die aktuelle Topologie. Die Paketwege führen von physischen Netzwerkkarten über Bridges zu VMs und Containern. Animierte Impulse stellen den aktuellen rx/tx-Verkehr jeder Verbindung dar.",
|
||||
"imageAlt": "Netzwerkflussdiagramm — NICs links, Host und Bridges in der Mitte, VMs und LXCs rechts, mit animierten Impulsen auf jeder Verbindung",
|
||||
"imageCaption": "Network Flow – farbkodierte Knoten sowie animierte Kometen, deren Richtung und Dicke Live-Verkehr widerspiegeln.",
|
||||
"elementsTitle": "Was das Diagramm zeigt",
|
||||
"elementsIntro": "Jeder Knoten stellt einen Eintrag aus demselben Inventar wie die Karten darunter dar. Die Anordnung als Topologie macht ihre Beziehungen sofort sichtbar:",
|
||||
"elements": [
|
||||
"<strong>Netzwerkkarten</strong> (orange) — physische Schnittstellen mit aktiver Verbindung; inaktive erscheinen blass.",
|
||||
"<strong>Host</strong> (orange) — der Proxmox-Host zwischen Netzwerkkarten und Bridges. Ein fester Bezugspunkt, nicht anklickbar.",
|
||||
"<strong>Bridges</strong> (cyan) — Linux- und OVS-Bridges mit mindestens einem aktiven Gast. Ungenutzte Bridges werden ausgeblendet, damit das Diagramm den tatsächlichen Verkehr zeigt.",
|
||||
"<strong>LXCs</strong> (cyan) — laufende Container an einer Bridge.",
|
||||
"<strong>VMs</strong> (lila) — laufende virtuelle Maschinen an einer Bridge.",
|
||||
"Gestoppte VMs und Container werden ausgeblendet."
|
||||
],
|
||||
"pulsesTitle": "Was die Animation kodiert",
|
||||
"pulsesBody": "Die animierten Kometen, die sich entlang jeder Kante bewegen, repräsentieren Live-Verkehr:",
|
||||
"pulses": [
|
||||
"<strong>Richtung</strong> — zur Netzwerkkarte bedeutet <em>tx</em> des Gastes, zum Gast bedeutet <em>rx</em>.",
|
||||
"Die <strong>Linienbreite</strong> wächst mit der rx+tx-Rate des Gastes. Bei wenig Verkehr bleibt eine schwache animierte Linie sichtbar, bei hohem Verkehr wird sie dick.",
|
||||
"<strong>Leuchten des Kometenkopfs</strong> — warm bei etwa 1 MB/s, intensiv ab 30 MB/s. Zeigt auf einen Blick, welcher Gast eine Netzwerkkarte stark auslastet.",
|
||||
"<strong>Klick</strong> — alle Knoten außer dem Host öffnen den unten beschriebenen Schnittstellendialog. Ein Klick auf den Host hat keine Wirkung; dafür gibt es hier keinen Dialog."
|
||||
],
|
||||
"useTitle": "Wenn es nützlich ist",
|
||||
"useBody": "Die Karten zeigen, <em>was</em> vorhanden ist; das Diagramm zeigt, <em>wie es verbunden ist</em> und wo Verkehr fließt. Sichtbar werden Gäste an derselben Bridge, zwei stark ausgelastete Gäste an derselben Netzwerkkarte als möglicher Engpass oder eine VM, die eine Verbindung allein auslastet."
|
||||
},
|
||||
"groups": {
|
||||
"heading": "Drei Schnittstellengruppen",
|
||||
"intro": "Drei Karten gruppieren Schnittstellen nach Funktion. Jede Kopfzeile zeigt die Anzahl aktiver Schnittstellen. Eine farbige Kennzeichnung nennt den <strong>Typ</strong> jeder Schnittstelle:",
|
||||
"badges": [
|
||||
"Blaues <strong>Physical</strong> — physische Netzwerkkarte.",
|
||||
"Grünes <strong>Bridge</strong> — Linux- oder OVS-Bridge (<code>vmbr*</code>).",
|
||||
"Purple <strong>Bond</strong> — Bond / LACP / Active-Backup-Aggregator.",
|
||||
"Cyanfarbenes <strong>VLAN</strong> — VLAN-Unterschnittstelle (<code>vmbr0.10</code>, <code>eno1.42</code>, …)."
|
||||
],
|
||||
"clickable": "<strong>Jede Zeile ist anklickbar</strong>: physische und virtuelle Schnittstellen, Bridges und Bonds. Der unten beschriebene Dialog zeigt Basisdaten, IPs, Zähler und den RX/TX-Verlauf aus dem Proxmox-RRD-Speicher.",
|
||||
"physicalTitle": "Physikalische Schnittstellen",
|
||||
"physicalBody": "Vom Kernel erkannte physische Schnittstellen: <code>eno1</code>, <code>enp4s0</code>, <code>eth0</code>, <code>wlp3s0</code> usw. Jedes Gerät hat eine Zeile mit blauem <strong>Physical</strong>-Label und Verbindungsstatus. Auch <em>Bond-Mitglieder</em> erscheinen hier mit Verweis auf den zugehörigen Bond.",
|
||||
"bridgeTitle": "Bridge-Schnittstellen",
|
||||
"bridgeBody": "Von Proxmox verwaltete Linux-Bridges (<code>vmbr0</code>, <code>vmbr1</code>, …) und OVS-Bridges. Jede Zeile zeigt das grüne <strong>Bridge</strong>-Label, bei nur einem Port die physische Schnittstelle und den Status. Bonds tragen das lila <strong>Bond</strong>-Label, VLAN-Unterschnittstellen das cyanfarbene <strong>VLAN</strong>-Label.",
|
||||
"vmTitle": "VM-/LXC-Schnittstellen",
|
||||
"vmBody": "Beim Gaststart erzeugte <code>tap*</code>- und <code>veth*</code>-Schnittstellen, eine je virtueller Netzwerkkarte. Die Kopfzeile zeigt <em>X / Y Active</em>; die Zeilen verlinken zur VM/CT auf der Registerkarte VMs & LXCs. Nach dem Stoppen verschwinden inaktive Einträge mit dem nächsten Aktualisierungszyklus."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Schnittstellendetails",
|
||||
"intro": "Ein Klick auf eine Zeile öffnet einen Dialog mit fünf Bereichen:",
|
||||
"headerBlock": "Block",
|
||||
"headerContents": "Inhalt",
|
||||
"rows": [
|
||||
{
|
||||
"block": "Grundlegende Informationen",
|
||||
"contents": "Name, Typ (physisch / Bridge / Bond / VLAN / vm), MAC-Adresse, Status (aktiv / inaktiv), MTU und zugrunde liegende physische Schnittstelle bei virtuellen Typen."
|
||||
},
|
||||
{
|
||||
"block": "Bond-Mitglieder",
|
||||
"contents": "Nur für Bonds: jede zugeordnete Netzwerkkarte mit Aktiv-/Fehlerstatus, Bond-Modus (active-backup / 802.3ad / balance-alb / …) und gegebenenfalls primäre Schnittstelle."
|
||||
},
|
||||
{
|
||||
"block": "IP-Adressen",
|
||||
"contents": "Jede IPv4/IPv6-Adresse mit der Präfixlänge. Autokonfigurierte link-lokale Adressen werden aufgelistet, aber ausgegraut."
|
||||
},
|
||||
{
|
||||
"block": "Verlaufsdiagramm",
|
||||
"contents": "RX/TX-Bandbreite im gewählten Zeitraum (1 Stunde / 24 Stunden / 7 Tage / 30 Tage / 1 Jahr), geladen über <code>/api/network/<interface>/metrics</code> aus Proxmox-RRD."
|
||||
},
|
||||
{
|
||||
"block": "Verkehr seit dem letzten Start",
|
||||
"contents": "RX/TX-Bytes und -Pakete seit dem letzten Hoststart sowie Zähler für Fehler und verworfene Pakete."
|
||||
}
|
||||
],
|
||||
"inactiveTitle": "Auch inaktive Schnittstellen haben eine Detailansicht",
|
||||
"inactiveBody": "Ist die Schnittstelle <em>inaktiv</em>, zeigt der Dialog den Hinweis „Schnittstelle inaktiv“ ohne aktuelle Zähler. Konfiguration mit Adressen und Bond-Mitgliedern sowie Verlaufsdaten bleiben zur Fehlerdiagnose sichtbar."
|
||||
},
|
||||
"latency": {
|
||||
"heading": "Dialog Netzwerklatenz",
|
||||
"intro": "Die Karte <em>Netzwerklatenz</em> in der oberen Reihe öffnet einen eigenen Dialog mit Verlauf, Tests bei Bedarf, drei Zielen und herunterladbarem PDF-Bericht.",
|
||||
"targetsTitle": "Ziele",
|
||||
"targetsIntro": "Die Auswahlliste oben bestimmt das Ping-Ziel:",
|
||||
"targets": [
|
||||
"<strong>Gateway</strong> — Ihr LAN-Router. Prüft nur den lokalen Abschnitt, um Switch- oder Kabelprobleme ohne WAN-Einfluss zu untersuchen.",
|
||||
"<strong>Cloudflare (1.1.1.1)</strong> — öffentlicher DNS-Resolver im Anycast-Netz. Prüft den WAN-Abschnitt.",
|
||||
"<strong>Google (8.8.8.8)</strong> — alternatives öffentliches Ziel zur Gegenprüfung oder bei regionalen Cloudflare-Störungen."
|
||||
],
|
||||
"mode1Title": "Modus 1 — Historische Ansicht",
|
||||
"mode1Alt": "Latenzdialog im Verlaufsmodus mit Ziel Gateway, Zeitraum von einer Stunde und eingezeichneten früheren Messwerten",
|
||||
"mode1Caption": "Gateway-Verlauf der letzten Stunde. Der Temperatur-/Latenz-Sammler schreibt die Messwerte alle 60 Sekunden in die Verlaufsdatenbank.",
|
||||
"mode1Body1": "Standardmodus beim Öffnen. Eine zweite Auswahl bestimmt den Zeitraum (<em>1 Stunde / 6 Stunden / 24 Stunden / 3 Tage / 7 Tage</em>). Über dem Diagramm stehen Aktuell / Minimum / Mittelwert / Maximum und ein Status Ausgezeichnet / Gut / Mittelmäßig / Schlecht nach den folgenden Schwellen.",
|
||||
"mode1Body2": "Quelle sind die Messwerte, mit denen Health Monitor anhaltende Netzwerkverzögerungen erkennt. Der Hintergrund-Thread <code>_temperature_collector_loop</code> misst das Gateway alle 60 Sekunden und speichert die Werte lokal in SQLite.",
|
||||
"mode2Title": "Modus 2 — Echtzeitprüfung",
|
||||
"mode2Alt": "Latenzdialog mit laufendem Echtzeit-Ping zu Cloudflare, 50 % Fortschritt und fortlaufenden Messwerten im Diagramm",
|
||||
"mode2Caption": "Zweiminütiger Cloudflare-Test mit einer Messung alle fünf Sekunden, die sofort im Diagramm erscheint. <em>Stoppen</em> beendet vorzeitig; <em>Erneut testen</em> ergänzt denselben Datensatz.",
|
||||
"mode2Intro": "Die Umstellung des Ziels auf Cloudflare oder Google startet einen On-Demand-Ping-Test. Verhalten:",
|
||||
"mode2Items": [
|
||||
"<strong>Dauer</strong> — zwei Minuten je Lauf mit Fortschrittsbalken und verbleibenden Sekunden.",
|
||||
"<strong>Intervall</strong> — eine Messung alle fünf Sekunden, 24 je Lauf.",
|
||||
"<strong>Methode</strong> — ICMP Echo Request (<code>ping</code>), drei aufeinanderfolgende Pings je Messwert mit gemittelter Latenz.",
|
||||
"<strong>Stop</strong> — beendet den Test sofort; Teildaten bleiben erhalten.",
|
||||
"<strong>Erneut testen</strong> — ergänzt die vorhandenen Daten um weitere Messwerte, sodass über mehrere Läufe ein längerer Verlauf entsteht.",
|
||||
"<strong>Aktuelle Statusanzeige</strong> — wird nach jeder Messung anhand derselben Schwellen für Ausgezeichnet / Gut / Mittelmäßig / Schlecht neu bewertet."
|
||||
],
|
||||
"thresholdsTitle": "Leistungsschwellen",
|
||||
"headerStatus": "Status",
|
||||
"headerRange": "Bereich",
|
||||
"headerImpact": "Praktische Auswirkungen",
|
||||
"thresholdRows": [
|
||||
{
|
||||
"status": "Exzellent",
|
||||
"range": "< 50 ms",
|
||||
"impact": "Optimal für Echtzeit-Apps, Spiele und Videoanrufe."
|
||||
},
|
||||
{
|
||||
"status": "Gut",
|
||||
"range": "50 – 100 ms",
|
||||
"impact": "Für die meisten Anwendungen akzeptabel, mit minimalen Auswirkungen."
|
||||
},
|
||||
{
|
||||
"status": "Mittelmäßig",
|
||||
"range": "100 – 200 ms",
|
||||
"impact": "Spürbare Verzögerung. Kann VoIP und interaktive Anwendungen beeinträchtigen."
|
||||
},
|
||||
{
|
||||
"status": "Schlecht",
|
||||
"range": "> 200 ms",
|
||||
"impact": "Erhebliche Latenz. Untersuchung empfohlen."
|
||||
}
|
||||
],
|
||||
"reportTitle": "Netzwerklatenzbericht (PDF)",
|
||||
"reportIntro": "Beide Modi haben neben der Zielauswahl eine Schaltfläche <strong>Bericht</strong>. Sie erzeugt ein PDF der Messungen als möglichen Anhang für eine Störungsmeldung beim Internetanbieter.",
|
||||
"reportPreviewAlt": "Erste PDF-Seite des Latenzberichts mit Zusammenfassung, Messanzeige, Statistik, Diagramm und Schwellenwerten",
|
||||
"reportPreviewCaption": "Die erste Seite enthält Zusammenfassung, Messanzeige, Hauptstatistik, Latenzverlauf und Schwellenwerte. Ab Seite 2 folgen die Messwerttabelle und die Methodik.",
|
||||
"downloadLabel": "Beispiel-Latenzbericht herunterladen (PDF)",
|
||||
"sectionsIntro": "Der Bericht umfasst sechs Abschnitte:",
|
||||
"sections": [
|
||||
"<strong>Zusammenfassung</strong> — Messanzeige von 0 bis über 300 ms mit grünen, gelben und roten Zonen; Status Ausgezeichnet / Gut / Mittelmäßig / Schlecht; Ziel, Modus, Messwertanzahl und Paketverlustübersicht.",
|
||||
"<strong>Latenzstatistik</strong> — vier Anzeigen für aktuellen Wert, Minimum, Mittelwert und Maximum sowie Messwertanzahl, mittleren Paketverlust und Testzeitraum.",
|
||||
"<strong>Latenzdiagramm</strong> — Flächendiagramm der Messwerte im Testzeitraum mit Minimum, Mittelwert und Maximum an der vertikalen Achse.",
|
||||
"<strong>Leistungsschwellen</strong> — die oben beschriebene vierstufige Skala mit einem Farbpunkt je Stufe.",
|
||||
"<strong>Detaillierte Ergebnisse</strong> — nummerierte Tabelle mit Zeitstempel, Latenz, Paketverlust und Status jeder Messung. Zeigt kurze Spitzen, die Mittelwerte verbergen können.",
|
||||
"<strong>Methodik</strong> — ICMP Echo Request, drei aufeinanderfolgende Pings je Messwert, Zielname und IP sowie abschließende Bewertung anhand des Status."
|
||||
],
|
||||
"useCaseTitle": "Anwendungsfall: Support beim Internetanbieter",
|
||||
"useCaseBody": "Führen Sie bei langsamer Verbindung den zweiminütigen Cloudflare-Test aus, verlängern Sie die Aufzeichnung mit <em>Erneut testen</em> und wählen Sie <em>Bericht</em>. Das PDF enthält alle Messwerte und die Methodik. Sie können es mit den Störungszeiten an eine Supportanfrage anhängen; der Anbieter bestimmt die erforderlichen Nachweise."
|
||||
},
|
||||
"excluding": {
|
||||
"heading": "Schnittstellen von der Überwachung ausschließen",
|
||||
"body1": "Schnittstellen lassen sich von der Überwachung ausschließen, etwa absichtlich deaktivierte Bridges, Testschnittstellen oder entfernte Netzwerkkarten mit verbliebener Konfiguration. Die Einstellung liegt in <code>excluded_interfaces</code>: Health Monitor erzeugt dafür weder Warnungen noch Benachrichtigungen und berücksichtigt sie nicht im Gesamtstatus.",
|
||||
"body2": "Wählen Sie im Kontextmenü <em>Von Überwachung ausschließen</em>. Die Schnittstelle bleibt mit lila Kennzeichnung <strong>ausgeschlossen</strong> sichtbar. Im selben Menü lässt sich die Überwachung wieder aktivieren."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Wie die Daten gesammelt werden",
|
||||
"headerSection": "Abschnitt des Reiters",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerSource": "Quelle",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Schnittstelleninventar",
|
||||
"endpoint": "/api/network",
|
||||
"source": "<code>ip -j addr</code> + <code>ip -j link</code> und Abfragen zu Bonds und Bridges."
|
||||
},
|
||||
{
|
||||
"section": "Übersichtskarten",
|
||||
"endpoint": "/api/network/summary",
|
||||
"source": "Zusammenfassung des Inventars und Anzahl aktiver und inaktiver Schnittstellen."
|
||||
},
|
||||
{
|
||||
"section": "RX/TX-Verlauf je Schnittstelle",
|
||||
"endpoint": "/api/network/<iface>/metrics",
|
||||
"source": "Aktuelle Zähler verwenden <code>/proc/net/dev</code>; der Diagrammverlauf stammt über pvesh aus Proxmox-RRD. VM/LXC-Schnittstellen nutzen Gastdaten, physische Schnittstellen und Bridges die Daten des Knotens."
|
||||
},
|
||||
{
|
||||
"section": "Latenz: aktuell",
|
||||
"endpoint": "/api/network/latency/current",
|
||||
"source": "Kurze Folge von <code>ping</code>-Anfragen an das konfigurierte Gateway oder Ziel."
|
||||
},
|
||||
{
|
||||
"section": "Latenz: historisch",
|
||||
"endpoint": "/api/network/latency/history",
|
||||
"source": "Messwerte werden etwa alle 60 Sekunden vom Hintergrundsammler für Temperatur und Latenz gespeichert."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Den im Dashboard angezeigten Schnittstellenstatus prüfen",
|
||||
"codeComment2": "# Eine aktuelle Latenzmessung über die gesamte Verbindung prüfen"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — Netzwerkkategorie und Schwellenwerte des Latenzverlaufs."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — Netzwerk- und Latenz-Endpunkte."
|
||||
},
|
||||
{
|
||||
"label": "Integrationen",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — die Prometheus-Abfrage liefert dieselben Netzwerkmetriken."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard-Index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": "Die anderen Tabs."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Netzwerk",
|
||||
"href": "/docs/network",
|
||||
"tail": "— die Aktionsseite: Brückenanalyse, persistente Schnittstellennamen, Backup & Neustart, iperf3."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Registerkarte Sicherheit | ProxMenux-Dokumentation",
|
||||
"description": "Die Registerkarte Sicherheit bündelt die Schutzfunktionen in zwei Spalten: ProxMenux Monitor (Authentifizierung, SSL/HTTPS, API-Tokens, Secure Gateway) und Proxmox VE (Firewall, Fail2Ban, Lynis-Audit). Mit Anleitungen zum Secure-Gateway-Assistenten, zum Lynis-Audit sowie zur Installation und Regelkonfiguration von Fail2Ban."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Sicherheits-Tab",
|
||||
"description": "Die Sicherheitsfunktionen im Dashboard sind in zwei Bereiche gegliedert: Einstellungen für Monitor selbst (Authentifizierung, SSL, Tokens, Secure Gateway) und für den überwachten Proxmox-Host (Firewall, Fail2Ban, Lynis).",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Zwei Bereiche, ein Tab",
|
||||
"body": "Die Registerkarte Sicherheit hat zwei Bereiche: <strong>ProxMenux Monitor</strong> (Dashboard-Einstellungen) und <strong>Proxmox VE</strong> (Host-Einstellungen). Die Karten für Fail2Ban und Lynis bieten bei fehlenden Werkzeugen deren Installation an und zeigen nach der Installation die Bedienelemente."
|
||||
},
|
||||
"monitor": {
|
||||
"heading": "ProxMenux Monitor",
|
||||
"intro": "Vier Karten steuern den Zugriff auf das Dashboard und die Authentifizierung."
|
||||
},
|
||||
"auth": {
|
||||
"heading": "Authentifizierung",
|
||||
"imageAlt": "Authentifizierungskarte mit Status Aktiviert, Abmelden, Passwort ändern, Informationen zur Zwei-Faktor-Authentifizierung und Schaltflächen zum Aktivieren von 2FA und Deaktivieren der Authentifizierung",
|
||||
"imageCaption": "Karte bei aktivierter Authentifizierung: Statusanzeige, Passwort ändern, 2FA aktivieren und die destruktive Aktion Authentifizierung deaktivieren.",
|
||||
"intro": "Die Karte verwaltet die Anmeldung am Dashboard. Ersteinrichtung, Passwortrichtlinie, TOTP-Einrichtung und Wiederherstellung bei verlorenem Authenticator sind unter <link>Zugriff und Authentifizierung</link> beschrieben. Diese Karte bietet die Einstellungen für den täglichen Gebrauch:",
|
||||
"items": [
|
||||
"<strong>Authentifizierungsstatus</strong> — Anzeige mit <em>Aktiviert</em> / <em>Deaktiviert</em> / <em>Abgelehnt</em>.",
|
||||
"<strong>Passwort ändern</strong> — aktuelles Passwort + neues Passwort + Bestätigung.",
|
||||
"<strong>Zwei-Faktor-Authentifizierung aktivieren / deaktivieren</strong> — öffnet beim Aktivieren den Einrichtungsdialog mit QR-Code und fragt beim Deaktivieren nach dem aktuellen Passwort.",
|
||||
"<strong>Authentifizierung deaktivieren</strong> — destruktive Aktion, die beim nächsten Besuch erneut den Einrichtungsdialog <em>Dashboard schützen?</em> anzeigt."
|
||||
]
|
||||
},
|
||||
"ssl": {
|
||||
"heading": "SSL / HTTPS",
|
||||
"imageAlt": "SSL/HTTPS-Karte mit Status HTTP ohne SSL, erkanntem Proxmox-Hostzertifikat samt Zertifikatsinhaber, Aussteller und Ablaufdatum sowie Optionen für das Proxmox-Zertifikat oder ein eigenes Zertifikat",
|
||||
"imageCaption": "SSL/HTTPS-Karte bei deaktiviertem HTTPS. Monitor erkennt das Zertifikat auf dem Proxmox-Host und bietet dessen Verwendung mit einem Klick an. Für eigene Dateien an anderer Stelle gibt es <em>Eigenes Zertifikat verwenden</em>.",
|
||||
"intro": "Stellt das Dashboard über HTTPS ohne vorgeschalteten Reverse-Proxy bereit. Die Karte erkennt das von Proxmox verwendete Zertifikat unter <code>/etc/pve/local/</code> und zeigt Zertifikatsinhaber, Aussteller und Ablaufdatum zur Prüfung vor der Aktivierung. HTTPS lässt sich auf zwei Wegen aktivieren:",
|
||||
"items": [
|
||||
"<strong>Proxmox-Zertifikat verwenden</strong> — Monitor übernimmt das Hostzertifikat mit einem Klick. Geeignet, wenn PVE und Dashboard denselben DNS-Namen verwenden.",
|
||||
"<strong>Eigenes Zertifikat verwenden</strong> — absolute Pfade zum <code>.pem</code>-Zertifikat und privaten <code>.key</code>-Schlüssel einfügen. Sie werden vor dem Dienstneustart geprüft. Scheitert das Laden, wechselt das Dashboard automatisch zurück zu HTTP und bleibt erreichbar."
|
||||
],
|
||||
"enabledAlt": "SSL/HTTPS-Karte mit aktiviertem HTTPS, aktivem Zertifikat samt Pfaden zu pve-ssl.pem und pve-ssl.key sowie Schaltfläche HTTPS deaktivieren",
|
||||
"enabledCaption": "HTTPS aktiv — die Karte zeigt das verwendete Zertifikat, die Dateipfade und die Aktion <em>HTTPS deaktivieren</em>, die auf HTTP am selben Port zurückschaltet.",
|
||||
"acmeTitle": "ACME / Let's Encrypt über Proxmox",
|
||||
"acmeBody": "Wenn Let’s Encrypt auf Ihrem Proxmox-Knoten unter <em>Datacenter → Certificates → ACME</em> eingerichtet ist, verwendet das Dashboard mit <em>Proxmox-Zertifikat verwenden</em> dasselbe Zertifikat, das der Host den Browsern bereitstellt. Eine eigene ACME-Einrichtung für Monitor ist nicht nötig.",
|
||||
"walkthroughLink": "Die Anleitung <link>HTTPS für ProxMenux Monitor</link> beschreibt die automatische Erkennung des ACME-Zertifikats, die auf dem Datenträger gespeicherten Daten und die Verwendung eines eigenen <code>.pem</code> / <code>.key</code>-Paars."
|
||||
},
|
||||
"apiTokens": {
|
||||
"heading": "API-Zugriffstokens",
|
||||
"emptyAlt": "Leere Karte für API-Zugriffstokens mit Informationen zu API-Tokens und Schaltfläche Neues API-Token erzeugen",
|
||||
"emptyCaption": "API-Token-Karte nach einer Neuinstallation. Das Feld <em>Informationen zu API-Tokens</em> erklärt Gültigkeitsdauer, Verwendung und Einbindung in <code>Authorization: Bearer</code>-Header.",
|
||||
"intro": "Tokens mit einem Jahr Gültigkeit für automatisierte Integrationen: Homepage-Widgets, REST-Sensoren für Home Assistant, Grafana-Datensammler, n8n-Abläufe und eigene Skripte. Die Karte führt durch drei Zustände: leer → Formular → erzeugt.",
|
||||
"generateBody": "<strong>Token erzeugen.</strong> Klicken Sie auf <em>Neues API-Token erzeugen</em>. Geben Sie einen aussagekräftigen <em>Tokennamen</em> zur späteren Identifizierung und Ihr <em>Passwort</em> zur zusätzlichen Bestätigung ein. Bei aktiviertem 2FA wird auch der aktuelle TOTP-Code verlangt.",
|
||||
"generateAlt": "Formular zum Erzeugen eines API-Tokens mit Feldern für Tokenname und Passwort sowie Schaltflächen Token erzeugen und Abbrechen",
|
||||
"generateCaption": "Formular zum Erzeugen eines API-Tokens: Namen eingeben und mit Passwort sowie bei aktivem 2FA mit TOTP-Code bestätigen.",
|
||||
"saveBody": "<strong>Speichern Sie das Token sofort.</strong> Der vollständige Tokenwert wird nach dem Erzeugen <strong>nur einmal</strong> angezeigt. Die Karte weist mit einem orangefarbenen Hinweis und einer Kopierschaltfläche darauf hin. Später lässt sich der Wert nicht abrufen; die Liste aktiver Tokens zeigt nur das Präfix.",
|
||||
"generatedAlt": "Erzeugtes API-Token mit maskiertem Wert, Kopierschaltfläche, Anleitung für den Header Authorization: Bearer und Liste aktiver Tokens samt Präfix",
|
||||
"generatedCaption": "Token erzeugt: Der Wert erscheint einmal mit Kopierschaltfläche und dem genauen Muster <code>Authorization: Bearer</code>. Darunter zeigt die Liste aktiver Tokens Name, Präfix und Erstellungsdatum, damit Sie einzelne Tokens widerrufen können.",
|
||||
"outro": "Jedes aktive Token hat eine Schaltfläche <em>Widerrufen</em>. Ein Widerruf macht das Token sofort ungültig; Integrationen mit diesem Token funktionieren dann nicht mehr. Anleitungen für Homepage, Home Assistant, n8n und Prometheus finden Sie unter <link>Integrationen</link>."
|
||||
},
|
||||
"gateway": {
|
||||
"heading": "Secure Gateway",
|
||||
"cardAlt": "Secure-Gateway-Karte vor der ersten Bereitstellung mit der Schaltfläche Secure Gateway bereitstellen",
|
||||
"cardCaption": "Secure-Gateway-Karte nach der Ersteinrichtung: Ein Klick startet den Assistenten.",
|
||||
"intro": "Greifen Sie von überall in Ihrem <a>Tailscale</a>-Tailnet auf Dashboard, Proxmox-Weboberfläche und Gäste zu, ohne Ports im Internet freizugeben. Monitor stellt auf dem Host einen Alpine-LXC-Container mit <code>tailscaled</code> als Subnetz-Router bereit. Nach der Freigabe in der Tailscale-Administrationskonsole erreichen entfernte Geräte die LAN-IP des Hosts.",
|
||||
"wizardTitle": "Schritt-für-Schritt-Assistent",
|
||||
"wizardIntro": "Erzeugen Sie vor dem Klick auf <em>Deploy Secure Gateway</em> einen Authentifizierungsschlüssel in der Tailscale-Konsole. Der Assistent fragt ihn in Schritt 2 ab.",
|
||||
"step0Title": "0. Tailscale-Authentifizierungsschlüssel erzeugen",
|
||||
"step0Body": "Melden Sie sich bei <a>login.tailscale.com/admin/settings/keys</a> an und klicken Sie auf <em>Generate auth key…</em>. Wählen Sie einen <em>vorab authentifizierten</em> Schlüssel, damit keine interaktive Tailscale-Anmeldung nötig ist. Kopieren Sie den Wert; er wird nur einmal angezeigt.",
|
||||
"step0Alt": "Seite Settings → Keys der Tailscale-Administrationskonsole mit hervorgehobener Schaltfläche Generate auth key",
|
||||
"step0Caption": "Tailscale-Admin-Konsole — <em>Settings → Keys → Auth Key generieren...</em>. Verwenden Sie ein kostenloses Tailscale-Konto, wenn Sie noch keins haben (Link innerhalb des Assistenten).",
|
||||
"step1Title": "1. Assistenten öffnen",
|
||||
"step1Body": "Klicken Sie auf der Registerkarte Sicherheit auf <em>Deploy Secure Gateway</em>. Der erste Schritt erläutert Funktionen und Voraussetzungen.",
|
||||
"step1Alt": "Einführung des Secure-Gateway-Assistenten: VPN-Zugriff ohne Portweiterleitung und mit Ende-zu-Ende-Verschlüsselung",
|
||||
"step1Caption": "Schritt 1 - Überblick über das, was das Secure Gateway bietet und eine Erinnerung daran, dass Sie ein kostenloses Tailscale-Konto benötigen.",
|
||||
"step2Title": "2. Tailscale-Authentifizierung",
|
||||
"step2Body": "Fügen Sie den Authentifizierungsschlüssel aus Schritt 0 ein und wählen Sie einen Hostnamen. Unter diesem Namen erscheint das Gateway in der Tailscale-Konsole, üblicherweise <code>proxmox-gateway</code> oder der Knotenname.",
|
||||
"step2Alt": "Schritt des Secure-Gateway-Assistenten mit Feldern für Tailscale-Authentifizierungsschlüssel und Gerätehostname sowie Link zum Erzeugen des Schlüssels",
|
||||
"step2Caption": "Schritt 2: Vorab authentifizierten Schlüssel einfügen und Gerätehostnamen wählen. Falls Sie Schritt 0 übersprungen haben, öffnet der Link unter dem Feld die entsprechende Tailscale-Seite.",
|
||||
"step3Title": "3. Zugangsbereich",
|
||||
"step3Intro": "Wählen Sie, was Ihr Tailnet durch das Gateway erreichen kann:",
|
||||
"step3Items": [
|
||||
"<strong>Proxmox Only</strong> — nur die Proxmox-Benutzeroberfläche und der Monitor. kleinste Angriffsfläche.",
|
||||
"<strong>Full Local Network</strong> — das gesamte LAN-Subnetz (automatisch von der primären Schnittstelle des Hosts erkannt). Sie erreichen NAS, Drucker, VMs und jedes andere LAN-Gerät.",
|
||||
"<strong>Eigene Subnetze</strong> — bestimmte CIDR-Netze angeben. Für Umgebungen mit mehreren VLANs, in denen nur ausgewählte Segmente erreichbar sein sollen."
|
||||
],
|
||||
"step3Alt": "Schritt Zugriffsbereich des Secure-Gateway-Assistenten mit den Optionen Nur Proxmox, Gesamtes lokales Netzwerk und Eigene Subnetze",
|
||||
"step3Caption": "Schritt 3: Zugriffsbereich wählen. <em>Gesamtes lokales Netzwerk</em> übernimmt automatisch das erkannte LAN-Subnetz.",
|
||||
"step4Title": "4. Erweiterte Optionen (optional)",
|
||||
"step4Intro": "Zwei optionale Schalter, beide <strong>standardmäßig deaktiviert</strong>:",
|
||||
"step4Items": [
|
||||
"<strong>Exit Node</strong> — nach Aktivierung und Auswahl auf einem entfernten Gerät wird dessen gesamter Internetverkehr über den WAN-Anschluss des Proxmox-Hosts geleitet. Auf Reisen erscheint der Datenverkehr des Telefons so mit der heimischen Internetverbindung.",
|
||||
"<strong>Routen akzeptieren</strong> — dieses Gateway erreicht Netze, die von <em>anderen</em> Subnetz-Routern im Tailnet angekündigt werden, etwa bei mehreren Standorten."
|
||||
],
|
||||
"step4Alt": "Schritt Erweiterte Optionen im Secure-Gateway-Assistenten mit den Kontrollkästchen Exit Node und Accept Routes",
|
||||
"step4Caption": "Schritt 4: Exit Node und Accept Routes. Lassen Sie beide deaktiviert, wenn Sie nur vom Telefon oder Laptop auf das Dashboard zugreifen möchten.",
|
||||
"step5Title": "5. Prüfen und bereitstellen",
|
||||
"step5Body": "Letzte Zusammenfassung vor der Bereitstellung. Der Assistent erinnert an einen anschließenden manuellen Schritt in der Tailscale-Konsole: <strong>die Subnetzroute genehmigen</strong>.",
|
||||
"step5Alt": "Schritt Prüfen und bereitstellen im Secure-Gateway-Assistenten mit Zusammenfassung von Hostname, Zugriffsmodus, Netzen, Exit Node und Accept Routes sowie Schaltfläche Gateway bereitstellen",
|
||||
"step5Caption": "Schritt 5 — Überprüfen Sie die Konfiguration und Bereitstellung. Der blaue Hinweis unten markiert die ausstehende Routengenehmigung.",
|
||||
"approvalTitle": "Ein letzter manueller Schritt im Tailscale-Admin",
|
||||
"approvalBody": "Öffnen Sie nach der Bereitstellung <a>login.tailscale.com/admin/machines</a> und genehmigen Sie die vom Gateway angekündigte Subnetzroute. Erst dann können entfernte Geräte im Tailnet über das Gateway auf LAN-IPs zugreifen. Tailscale markiert ausstehende Routen mit einer gelben Warnung in der Gerätezeile. Klicken Sie auf <em>Edit route settings</em> und aktivieren Sie die Route."
|
||||
},
|
||||
"pve": {
|
||||
"heading": "Proxmox VE",
|
||||
"intro": "Die Schutzfunktionen des Hosts: Firewall, Angriffserkennung und Sicherheitsprüfung. Die Karten für Fail2Ban und Lynis bieten bei Bedarf die Installation an und zeigen danach die Verwaltungsfunktionen."
|
||||
},
|
||||
"firewall": {
|
||||
"heading": "Proxmox Firewall",
|
||||
"imageAlt": "Proxmox-Firewall-Karte mit Cluster- und Hoststatus, Schnellzugriffsregeln für Monitor und die Proxmox-Weboberfläche, Zählern, Regelliste und Schaltfläche Regel hinzufügen",
|
||||
"imageCaption": "Proxmox-Firewall-Karte: Schalter für Cluster und Host, häufige Ports unter <em>Schnellzugriffsregeln</em>, Zähler unter <em>Regelübersicht</em> und vollständige Liste mit <em>+ Regel hinzufügen</em>.",
|
||||
"intro": "Die Karte verwaltet die Firewall-Konfiguration von Proxmox VE. Das klassische Backend verwendet <code>iptables</code>, das alternative <code>nftables</code>. Beliebige außerhalb von Proxmox erstellte Regeln werden nicht verwaltet. Drei Bereiche:",
|
||||
"items": [
|
||||
"<strong>Cluster-Firewall + Host-Firewall</strong> — globale Schalter. Die Cluster-Firewall muss aktiv sein, damit die Hostregeln greifen. Die Karte zeigt diese Abhängigkeit direkt an der Einstellung.",
|
||||
"<strong>Schnellzugriffsregeln</strong> — vorbereitete Zeilen für <code>8008/TCP</code> (Monitor) und <code>8006/TCP</code> (Proxmox-Weboberfläche) mit Status erlaubt, gesperrt oder ungeschützt. Die Proxmox-Oberfläche wird über ein <em>integriertes</em> Firewall-Makro erlaubt, das sich nicht versehentlich löschen lässt.",
|
||||
"<strong>Regelübersicht</strong> — Zähler für alle Regeln, accept-Regeln, drop/reject-Regeln und verschiedene geschützte Ports. Die Werte stammen aus <code>/etc/pve/firewall/cluster.fw</code> und <code>/etc/pve/nodes/<node>/host.fw</code>.",
|
||||
"<strong>Firewall-Regeln</strong> — Liste mit Aktion, Protokoll, Port, Quelle und Ebene. <em>+ Regel hinzufügen</em> öffnet den Editor in der Karte, das Papierkorbsymbol löscht die jeweilige Regel. Änderungen werden in den Proxmox-Dateien gespeichert und erscheinen auch in dessen Oberfläche (Datacenter / Node → Firewall)."
|
||||
]
|
||||
},
|
||||
"fail2ban": {
|
||||
"heading": "Fail2Ban",
|
||||
"subHeading": "(abhängig vom Status)",
|
||||
"whatIs": "<strong>Was ist das?</strong> Fail2Ban ist ein quelloffener Dienst, der wiederholte fehlgeschlagene Anmeldungen in Protokollen erkennt und die IP-Adresse per Firewall sperrt. Er schützt SSH und Webanmeldungen vor fortlaufenden Brute-Force-Angriffen. ProxMenux richtet drei Jails ein: SSH, Proxmox-Webanmeldung (Port 8006) und ProxMenux-Monitor-Anmeldung (Port 8008).",
|
||||
"notBundled": "Fail2Ban ist <strong>nicht im Lieferumfang enthalten</strong>. Die Karte passt sich daran an, ob es installiert ist: Fehlt es, lässt es sich mit einem Klick installieren. Danach zeigt sie den aktuellen Jail-Status und gesperrte IP-Adressen und ermöglicht es, die Anzahl der Versuche sowie die Sperrdauer pro Jail anzupassen.",
|
||||
"notInstalledAlt": "Fail2Ban-Karte im Zustand Nicht installiert mit Beschreibung des Schutzes für SSH, Proxmox-Weboberfläche und Monitor über nftables sowie Schaltfläche Fail2Ban installieren und konfigurieren",
|
||||
"notInstalledCaption": "Fail2Ban-Karte vor der Installation - die blaue Box zeigt an, was die Installation konfigurieren würde.",
|
||||
"clickBody": "Klicken Sie auf <em>Fail2Ban installieren und konfigurieren</em>. Ein Bestätigungsdialog listet alle Änderungen auf, die das Skript am Host vornehmen wird:",
|
||||
"confirmAlt": "Fail2Ban-Bestätigung mit aggressivem SSH-Modus, Schutz für Proxmox auf Port 8006 und Monitor auf Port 8008, nftables-Erkennung, journald-Protokollanpassung und SSH-Härtung über MaxAuthTries",
|
||||
"confirmCaption": "Installationsbestätigung: Jail-Liste, angepasste journald-Protokollstufe zum Lesen von SSH-Ereignissen und zusätzliche SSH-Härtung (<code>MaxAuthTries=3</code>).",
|
||||
"confirmIntro": "Nach der Bestätigung zeigt ein Panel die Installation live an: apt, Jail-Konfiguration und Prüfungen. Es verwendet denselben Mechanismus wie der ProxMenux-CLI-Installer.",
|
||||
"progressAlt": "Panel mit Fail2Ban-Installationsprotokoll: Paket, journald MaxLevelStore für Anmeldungen, Jails, nftables-Erkennung, MaxAuthTries-Härtung, Kommunikationstest mit fail2ban-client und Abschlussmeldung",
|
||||
"progressCaption": "Installation läuft: Jeder Schritt wird im Panel protokolliert. Connection closed am Ende kennzeichnet das Ende der Übertragung.",
|
||||
"afterInstall": "Nach der Installation zeigt die Karte den aktuellen Status: konfigurierte Jails, gesperrte IPs und jüngste Sperrereignisse. Die Registerkarten trennen <em>Jails und gesperrte IPs</em> von <em>Letzte Aktivitäten</em> mit den letzten N Fail2Ban-Protokolleinträgen.",
|
||||
"activeAlt": "Aktive Fail2Ban-Karte mit drei Jails (proxmenux, proxmox, sshd), Zählern für gesperrte IPs, alle Sperren und fehlgeschlagene Versuche sowie Zeilen mit Versuchen, Sperrdauer, Zeitraum und Zahnradsymbol",
|
||||
"activeCaption": "Fail2Ban aktiv: die drei Standard-Jails (<code>proxmenux</code>, <code>proxmox</code>, <code>sshd</code>) mit Einstellungen für Versuche, Sperrdauer und Erkennungszeitraum.",
|
||||
"tuneBody": "<strong>Jail-Regeln anpassen.</strong> Über das Zahnradsymbol ändern Sie <em>Max Retries</em>, <em>Ban Time</em> und <em>Find Time</em>, den gleitenden Zeitraum zum Zählen der Versuche. Eine dauerhafte Sperre bleibt bis zur manuellen Aufhebung bestehen. Das Formular erklärt übliche Werte.",
|
||||
"configAlt": "Konfigurationsformular für das Jail sshd mit Max Retries, Ban Time in Sekunden, Permanent Ban, Find Time, Hinweisen zu üblichen Werten und Schaltfläche Konfiguration speichern",
|
||||
"configCaption": "Jail sshd bearbeiten: Wählen Sie einen niedrigeren Wert für <em>Max Retries</em>, wenn SSH nur aus Ihrem Subnetz genutzt wird, oder verlängern Sie <em>Ban Time</em> für ein öffentlich erreichbares Dashboard.",
|
||||
"outro": "Die Anleitung <em>Installation, Konfiguration und Deinstallation</em> behandelt auch die manuelle Installation, die Änderung von SSH MaxAuthTries und das Protokoll <code>proxmenux-auth.log</code>. Sie finden sie unter <link>ProxMenux → Sicherheit → Fail2Ban</link>.",
|
||||
"calloutTitle": "Ohne Fail2Ban sperrt dieser Mechanismus keine IPs",
|
||||
"calloutBody": "ProxMenux Monitor prüft die von Fail2Ban gesperrten IPs auf <em>Anwendungsebene</em>, bevor Flask-Anfragen verarbeitet werden. Es fragt fail2ban-client ab und speichert das Ergebnis 30 Sekunden zwischen; eine SQL-Sperrtabelle wird nicht gelesen. Ohne Fail2Ban werden fehlgeschlagene Anmeldungen in <code>proxmenux-auth.log</code> protokolliert, dieser Mechanismus sperrt dann aber keine IPs."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Lynis-Sicherheitsprüfung",
|
||||
"subHeading": "(abhängig vom Status)",
|
||||
"whatIs": "<strong>Was ist das?</strong> Lynis ist ein quelloffenes Sicherheitsprüfwerkzeug mit rund 280 Hostprüfungen, etwa zu Dateirechten, Kernel-Härtung, SSH, Paketschwachstellen, Kryptografie, geplanten Aufgaben und Dienstkennungen. Es liefert einen Härtungsindex von 0 bis 100, Warnungen und Vorschläge. Es dient als verbreitete Ausgangsbasis zur Bewertung von Debian-Servern.",
|
||||
"whyUseful": "<strong>Warum ist es nützlich?</strong> Die Sicherheit anhand einzelner Konfigurationsdateien zu bewerten ist schwierig. Lynis erkennt häufig übersehene Punkte: fehlende Kernel-Schutzoptionen, schwache SSH-Verfahren, nicht dauerhafte Protokolle oder <code>NOPASSWD</code> in sudoers für Standardkonten. Ein erneuter Lauf nach ProxMenux-Anpassungen macht die Veränderung als Punktwert vergleichbar.",
|
||||
"notInstalledAlt": "Lynis-Karte im Zustand Nicht installiert mit Schaltfläche Lynis installieren und Funktionen: Härtungsindex, Schwachstellenerkennung, Konformitätsprüfung und GitHub-Quellcode",
|
||||
"notInstalledCaption": "Lynis-Karte vor der Installation - die blaue Box fasst zusammen, was das Tool tut.",
|
||||
"notBundled": "Lynis ist ebenfalls <strong>nicht enthalten</strong>. ProxMenux installiert es direkt aus dem offiziellen GitHub-Quellcode statt aus dem Debian-Paket.",
|
||||
"confirmAlt": "Bestätigungsdialog für Lynis mit seinen Funktionen: Härtungsindex, Schwachstellenerkennung, Konfigurationsanalyse, Konformitätsprüfung und Bezug aus dem offiziellen GitHub-Repository",
|
||||
"confirmCaption": "Installationsbestätigung mit ausdrücklichem Hinweis auf die GitHub-Quelle.",
|
||||
"progressAlt": "Live-Installationspanel für Lynis mit Installation der aktuellen Version, Bestätigung von Version 3.1.6 und Abschlussmeldung",
|
||||
"progressCaption": "Installation läuft: Das Panel zeigt den Verlauf wie bei Fail2Ban live an.",
|
||||
"afterInstall": "Nach der Installation zeigt die Karte die Version und einen leeren Prüfverlauf. Klicken Sie auf <em>Sicherheitsprüfung starten</em>, um den ersten Scan auszuführen.",
|
||||
"installedAlt": "Lynis-Karte nach der Installation mit Versionsanzeige 3.1.6, Zeitpunkt der letzten Prüfung, Härtungsindex 0, Warnungen 0, Vorschläge 0, leerem Bericht und Schaltfläche Sicherheitsprüfung starten",
|
||||
"installedCaption": "Lynis ist installiert, es gibt noch keine Prüfung. Die Kennzahlen zeigen zunächst null.",
|
||||
"runningAlt": "Lynis-Karte während der Prüfung mit Fortschrittsmeldung, geschätzter Dauer von 2 bis 5 Minuten und deaktivierter Schaltfläche Prüfung läuft",
|
||||
"runningCaption": "Prüfung läuft: Die Schaltfläche zeigt eine Ladeanimation und die Karte weist auf eine Dauer von 2 bis 5 Minuten hin.",
|
||||
"finishedBody": "Nach Abschluss zeigt die Karte die Ergebnisse: Härtungsindex, Warnungen, Vorschläge und die Liste <em>Prüfberichte</em> mit früheren Scans.",
|
||||
"resultsAlt": "Lynis-Karte mit Index 71, Aufschlüsselung Lynis 66 und PVE 71, 3 Warnungen, 40 Vorschlägen, für Proxmox angepasstem Wert 71 von 100 im Bereich Gut, Berichten mit PDF-Download und Schaltfläche Sicherheitsprüfung starten",
|
||||
"resultsCaption": "Beispielergebnis: Härtungsindex <strong>71/100 (Gut)</strong>. Die Karte zeigt den Lynis-Rohwert (66) und den für Proxmox angepassten Wert (71). Die Anpassung hängt vom Rohwert und vom Anteil der als erwartetes Proxmox-VE-Verhalten eingestuften Befunde ab; es werden keine festen 11 Punkte addiert.",
|
||||
"scoreTitle": "Lynis-Rohwert und an Proxmox angepasster Wert",
|
||||
"scoreIntro": "Lynis-Regeln sind auf allgemeine Debian-Systeme ausgelegt. Proxmox weicht aus berechtigten Gründen teilweise davon ab, etwa durch Cluster-Dienste als root oder eigene <code>journald</code>-Einstellungen. Die Karte zeigt beide Werte, damit Sie:",
|
||||
"scoreItems": [
|
||||
"Ihren <em>Lynis-Rohwert</em> wie externe Prüfer verfolgen.",
|
||||
"Den <em>für Proxmox angepassten</em> Wert verfolgen, eine passendere Vergleichsbasis für Knoten desselben Clusters."
|
||||
],
|
||||
"reportBody": "<strong>Vollständiger Bericht.</strong> Die Schaltfläche <em>PDF</em> jeder Prüfung lädt einen mehrseitigen Bericht herunter: Zusammenfassung, Systeminformationen, Sicherheitslage, erläuterte Warnungen, nach Auswirkung geordnete Vorschläge und Paketinventar. Er eignet sich als Anhang für eine Sicherheitsprüfung.",
|
||||
"reportAlt": "Beispiel der ersten PDF-Berichtsseite mit Zusammenfassung, Index 71 von 100, Anzahl der Warnungen und Vorschläge, Hostname, Kernel, Lynis-Version, Datum und Übersicht der Sicherheitslage",
|
||||
"reportCaption": "Erste Seite des Berichts mit Zusammenfassung, Systeminformationen und Sicherheitslage. Es folgen ausführliche Warnungen, Vorschläge und die Liste installierter Pakete. Ein <a>Beispiel-PDF</a> ist als Referenz beigefügt.",
|
||||
"runPeriodically": "Führen Sie das Audit regelmäßig durch (nach größeren Proxmox-Upgrades, nach der Anwendung von Nachinstallationsoptimierungen, bevor Sie einen Fernzugriffspfad öffnen) und bewahren Sie die Berichte auf - der Trend ist wichtiger als jede einzelne Zahl.",
|
||||
"outro": "Die Anleitung zu <em>Installation, Konfiguration und Deinstallation</em> sowie die Erläuterung eines Beispielberichts finden Sie unter <link>ProxMenux → Sicherheit → Lynis</link>."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Wie die Daten gesammelt werden",
|
||||
"headerCard": "Karte",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerSource": "Quelle",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Authentifizierung, 2FA, Passwortänderung",
|
||||
"endpoint": "/api/auth/*",
|
||||
"source": "Lokale Authentifizierungskonfiguration in ~/.config/proxmenux-monitor/auth.json; JWTs werden von Monitor ausgestellt."
|
||||
},
|
||||
{
|
||||
"card": "SSL / HTTPS",
|
||||
"endpoint": "/api/auth/ssl/*",
|
||||
"source": "<code>openssl x509</code> auf <code>/etc/pve/local/pve-ssl.pem</code> + <code>/etc/proxmenux/ssl_config.json</code>."
|
||||
},
|
||||
{
|
||||
"card": "API-Tokens auflisten, erzeugen und widerrufen",
|
||||
"endpoint": "/api/auth/api-tokens",
|
||||
"source": "Token-Zeilen lokal gehalten; nichts verlässt den Host."
|
||||
},
|
||||
{
|
||||
"card": "Secure Gateway (Bereitstellung + Status)",
|
||||
"endpoint": "/api/oci/*",
|
||||
"source": "Erstellt einen Alpine-LXC-Container mit <code>tailscaled</code> über <code>pct create</code> / <code>pct exec</code>."
|
||||
},
|
||||
{
|
||||
"card": "Firewall Status & Regeln",
|
||||
"endpoint": "/api/security/firewall/*",
|
||||
"source": "<code>pve-firewall</code> + <code>/etc/pve/firewall/<cluster|host>.fw</code>."
|
||||
},
|
||||
{
|
||||
"card": "Fail2Ban (nur wenn installiert)",
|
||||
"endpoint": "/api/security/fail2ban/*",
|
||||
"source": "<code>fail2ban-client status</code>, <code>/var/log/fail2ban.log</code>, <code>/etc/fail2ban/jail.local</code>."
|
||||
},
|
||||
{
|
||||
"card": "Lynis Audit (nur wenn installiert)",
|
||||
"endpoint": "/api/security/lynis/*",
|
||||
"source": "Führt <code>lynis audit system</code> im Hintergrund aus und liest den Bericht aus <code>/var/log/lynis-report.dat</code>."
|
||||
}
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Zugriff und Authentifizierung",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — vollständige Ersteinrichtung, Auswahl einer 2FA-App, Wiederherstellung bei verlorenem Authenticator und Reverse-Proxy-Beispiele."
|
||||
},
|
||||
{
|
||||
"label": "Integrationen",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — Anleitungen für API-Tokens mit Homepage, Home Assistant, Prometheus und n8n sowie die vollständige Secure-Gateway-Einrichtung."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tailRich": " — alle Endpunkte unter <code>/api/auth</code>, <code>/api/security</code> und <code>/api/oci</code> mit Methode, Anfrageinhalt und curl-Beispielen."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Sicherheit → Fail2Ban",
|
||||
"href": "/docs/security/fail2ban",
|
||||
"tail": " — Installationsanleitung, eingerichtete Jails und manuelle Installation."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Sicherheit → Lynis",
|
||||
"href": "/docs/security/lynis",
|
||||
"tail": " — Beispielbericht, Einordnung des Ergebnisses und Zeitpunkt für eine erneute Prüfung."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,367 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Registerkarte Einstellungen | ProxMenux-Dokumentation",
|
||||
"description": "Die Registerkarte Einstellungen verwaltet Sprache, Navigationsreihenfolge, Dashboard-Präferenzen, Überwachungsschwellen und Ausschlüsse, Benachrichtigungen, KI und das Inventar der Nachinstallationsoptimierungen."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Tab Einstellungen",
|
||||
"description": "Monitor-Sprache, Navigationsreihenfolge, Dashboard-Präferenzen, Überwachungsausschlüsse, Benachrichtigungen, KI-Konfiguration und aktuelles ProxMenux-Optimierungsinventar.",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Wo jede Einstellung gespeichert wird",
|
||||
"body": "Einstellungen bündelt Dashboard-Darstellung, Health-Monitor-Überwachung, Alarmversand und bereits von ProxMenux vorgenommene Hoständerungen. Karten mit ausführlicher Dokumentation verlinken darauf; hier finden Sie den Einstieg."
|
||||
},
|
||||
"interfaceLanguage": {
|
||||
"heading": "Schnittstellensprache",
|
||||
"intro": "Wählen Sie die Sprache der <strong>Weboberfläche des Monitors</strong>. Die Änderung gilt sofort, ohne Dienstneustart und ohne die Sprache der ProxMenux-Shellmenüs zu ändern.",
|
||||
"items": [
|
||||
"ProxMenux Monitor bietet derzeit Englisch, Deutsch, Spanisch, Französisch, Italienisch, Portugiesisch, Slowakisch und Schwedisch an.",
|
||||
"Beim ersten Besuch wird die Browsersprache verwendet, sofern unterstützt; andernfalls Englisch.",
|
||||
"Die Auswahl ändert die Seitensprache und synchronisiert weitere offene Registerkarten desselben Browserprofils.",
|
||||
"Fehlt eine Übersetzung, erscheint nur dieser Text auf Englisch statt als fehlerhafter Schlüssel oder Platzhalter."
|
||||
],
|
||||
"scopeTitle": "Lokale Browsereinstellung",
|
||||
"scopeBody": "Die Auswahl liegt in <code>localStorage</code> unter <code>proxmenux-ui-language</code>. Sie gilt für das aktuelle Browserprofil und Gerät, nicht für den ganzen Knoten. Jeder Benutzer kann seine Sprache wählen."
|
||||
},
|
||||
"navigationOrder": {
|
||||
"heading": "Navigationsreihenfolge",
|
||||
"intro": "Ordnen Sie die sieben Haupteinträge: <strong>Übersicht, Apps, VMs & LXCs, Knoten, Sicherung, Terminal und Verwaltung</strong>. Klicken Sie auf <strong>Bearbeiten</strong>, ziehen Sie die Zeilen und speichern Sie.",
|
||||
"items": [
|
||||
"Mit der Maus beginnt das Ziehen beim Drücken. Auf Touchscreens ist ein 250-ms-Langdruck nötig, um es vom Scrollen zu unterscheiden.",
|
||||
"Die Gruppen <strong>Knoten</strong> und <strong>Verwaltung</strong> werden als Ganzes verschoben; ihre Unterseiten behalten die festgelegte Reihenfolge.",
|
||||
"Das Mobilmenü verwendet dieselbe gespeicherte Reihenfolge.",
|
||||
"<strong>Standard wiederherstellen</strong> setzt den bearbeiteten Reihenfolgeentwurf zurück. Speichern übernimmt die Änderung.",
|
||||
"Neue Hauptregisterkarten künftiger Versionen werden an die eigene Reihenfolge angehängt; Ihre Anordnung bleibt erhalten."
|
||||
],
|
||||
"landingTitle": "Der erste Eintrag ist die Startansicht",
|
||||
"landingBody": "Monitor öffnet den ersten gespeicherten Eintrag. Bei <strong>Knoten</strong> ist das Speicher, bei <strong>Verwaltung</strong> Systemprotokolle. Die Reihenfolge liegt in diesem Browser unter <code>proxmenux-nav-order</code>; jedes Gerät kann eine eigene Anordnung verwenden."
|
||||
},
|
||||
"networkUnits": {
|
||||
"heading": "Netzwerkeinheiten",
|
||||
"imageAlt": "Karte Netzwerkeinheiten mit der Anzeigeauswahl Bytes",
|
||||
"imageCaption": "Wählen Sie zwischen Bits pro Sekunde und Bytes pro Sekunde für jede im Dashboard angezeigte Netzwerkrate.",
|
||||
"body": "Zeigt den Netzwerkdurchsatz in <strong>Bits pro Sekunde</strong> (Mbps/Gbps) oder <strong>Bytes pro Sekunde</strong> (MB/s/GB/s). Standard sind Bits wie bei Netzwerkkarten und Internetanbietern; Dateiübertragungen verwenden oft Bytes. Diagramme, Labels und Hinweise ändern sich sofort ohne Neuladen."
|
||||
},
|
||||
"health": {
|
||||
"heading": "Gesundheitsmonitor",
|
||||
"intro": "Die Karte legt die <strong>Unterdrückungsdauer</strong> fest: wie lange die Prüfung wartet, bevor eine verworfene Warnung erneut erscheinen darf. CPU, Speicher, Datenspeicher, Laufwerke, Netzwerk, VMs, PVE-Dienste, Protokolle, Updates und Sicherheit haben jeweils eine Auswahl:",
|
||||
"items": [
|
||||
"<strong>24 h</strong> — Standard für die meisten transienten Kategorien.",
|
||||
"<strong>72 h</strong> — für Ereignisse, die Sie einige Tage stummschalten möchten.",
|
||||
"<strong>168 h</strong> (1 Woche) und <strong>720 h</strong> (1 Monat) — regelmäßige Kontrollen.",
|
||||
"<strong>8760 h</strong> (1 Jahr) — Unterdrückung für einen langen Zeitraum.",
|
||||
"<strong>-1</strong> — permanente Stille, bis Sie es manuell wieder aktivieren.",
|
||||
"<strong>Eigene Stundenanzahl</strong> — eine ganze Zahl für einen Zwischenwert."
|
||||
],
|
||||
"imageAlt": "Einstellungen, Health-Monitor-Karte mit Dauer je Kategorie und aktiven Unterdrückungen",
|
||||
"imageCaption": "Die Auswahllisten bestimmen die Dauer künftiger Unterdrückungen. Der Bereich darunter zeigt stummgeschaltete Warnungen und ermöglicht ihre Reaktivierung.",
|
||||
"editTitle": "Bearbeitungsmodus",
|
||||
"editBody": "Die Karte ist zunächst schreibgeschützt. <strong>Bearbeiten</strong> oben rechts aktiviert Auswahllisten und Reaktivierungsschaltflächen. <strong>Speichern</strong> übernimmt geänderte Dauern und vorgemerkte Reaktivierungen gemeinsam; <strong>Abbrechen</strong> verwirft sie. Speichern wird erst bei Änderungen aktiv.",
|
||||
"activeTitle": "Aktive Unterdrückungen",
|
||||
"activeIntro": "Unter den Dauerangaben listet <strong>Aktive Unterdrückungen</strong> zeitlich begrenzte —24 Stunden, 7 Tage oder eigener Zeitraum— und <em>dauerhafte</em> Unterdrückungen auf. Jede Zeile zeigt:",
|
||||
"activeItems": [
|
||||
"Ein farbiges Abzeichen: <strong>Dauerhaft</strong> in Orange oder eine Restzeit wie <strong>noch 24 h</strong> / <strong>noch 7 Tage</strong> in Blau.",
|
||||
"Die Warnungskennung in lesbarer Form (z. B. <code>pve_storage_full_PBS-Cloud</code> → <em>PVE-Speicher voll: PBS-Cloud</em>).",
|
||||
"Kategorie, Schweregrad und Zeitpunkt, zu dem die Warnung verworfen wurde.",
|
||||
"Eine Schaltfläche <strong>Reaktivieren</strong> im Bearbeitungsmodus merkt die Aufhebung der Unterdrückung beim Speichern vor."
|
||||
],
|
||||
"activeReenableTitle": "Warnung reaktivieren",
|
||||
"activeReenableBody": "<strong>Reaktivieren</strong> markiert die Zeile beim Bearbeiten grün und streicht die Kennung durch; noch ist nichts übernommen. Erneuter Klick bedeutet <strong>Rückgängig</strong>. <strong>Speichern</strong> sendet je Reaktivierung parallel <code>POST /api/health/un-acknowledge</code> und entfernt die Zeilen. Besteht das Problem weiter und unterstützt die Kategorie erneute Meldungen, erscheint es beim nächsten Scan wieder unter Aktiv.",
|
||||
"activePermanentNote": "Dauerhafte Unterdrückungen über <em>Dauerhaft</em> oder den Standardwert <code>-1</code> <strong>werden nur hier aufgehoben</strong>. Der allgemeine Dialog bietet dafür keinen Knopf; dieser Bereich vereint Übersicht und Reaktivierung.",
|
||||
"activeAutoRefreshTitle": "Automatische Aktualisierung",
|
||||
"activeAutoRefreshBody": "Die Liste aktualisiert sich beim Verwerfen oder Reaktivieren einer Warnung im Health Monitor, bei erneutem Tabfokus und bei Sichtbarkeitswechseln. Ein Neuladen ist nicht nötig.",
|
||||
"calloutTitle": "Details auf der Health-Monitor-Seite",
|
||||
"calloutBody": "Eskalation, automatische Auflösung bei verschwundenen Geräten und der Unterschied zwischen Verwerfen und Beheben stehen unter <link>Health Monitor → Warnungen verwerfen und Unterdrückungsdauer</link>. Diese Karte bietet die Auswahllisten und aktiven Unterdrückungen."
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Health-Monitor-Schwellenwerte",
|
||||
"intro": "Die vorige Karte regelt <em>die Ruhezeit nach einer Unterdrückung</em>; diese bestimmt <strong>den Auslösewert einer Warnung</strong>. Die meisten Schwellenprüfungen bieten anpassbare Werte für <strong>Warnung</strong> und <strong>Kritisch</strong>. Die Tabelle erklärt Ausnahmen wie die kombinierte Swap-Regel und den aktuellen RAM-Detektor.",
|
||||
"whatForTitle": "Wozu es dient",
|
||||
"whatForIntro": "Die Standardwerte sind ein Ausgangspunkt, aber jede Umgebung hat eigene Betriebsbedingungen:",
|
||||
"whatForItems": [
|
||||
"Ein Homelab mit einer SSD kann früher bei 75/90 % Belegung warnen, um Platz für Snapshots zu lassen.",
|
||||
"Speicherschwellen sollten Messwerte und Last des Hosts berücksichtigen. Ceph-Redundanz allein rechtfertigt keine lockereren Warnungen; hohe ZFS-ARC-Nutzung ist nicht mit nicht rückgewinnbarem Arbeitsspeicher gleichzusetzen.",
|
||||
"Wählen Sie Temperaturschwellen anhand der Laufwerksspezifikationen und tatsächlichen Bedingungen. Passive oder aktive Kühlung allein bestimmt keine allgemein niedrigere oder höhere sichere Grenze.",
|
||||
"Ein stark virtualisierter Host kann bei Builds CPU-Spitzen erreichen, ohne für jeden 80-%-Peak zu warnen; anhaltende Überlast muss weiter gemeldet werden."
|
||||
],
|
||||
"whatForOutro": "Unterstützte Änderungen gelten <strong>bei der nächsten Prüfung</strong>. Der Health Monitor liest <code>/usr/local/share/proxmenux/health_thresholds.json</code> in jedem Zyklus ohne Neustart. Einige Anzeigen wie die Datenträgertemperatur verwenden diese Werte; manche Kapazitätsbalken haben eigene Grenzen. Die RAM-Zeile beschreibt eine aktuelle Ausnahme.",
|
||||
"coloursTitle": "Statusfarben für Warnung und Kritisch",
|
||||
"coloursIntro": "Widgets mit dem konfigurierten Paar Warnung/Kritisch verwenden die drei folgenden Zustände. Andere Anzeigen, etwa PVE-Kapazitätsbalken, haben eigene Grenzen; ihre Farbe allein belegt keine Health-Monitor-Warnung.",
|
||||
"headerColour": "Farbe",
|
||||
"headerRange": "Bereich",
|
||||
"headerMeaning": "Bedeutung",
|
||||
"colourRows": [
|
||||
{
|
||||
"colour": "Grün",
|
||||
"range": "Wert < Warnung",
|
||||
"meaning": "Normaler Betriebsbereich. Keine Warnung wird erzeugt."
|
||||
},
|
||||
{
|
||||
"colour": "Orange",
|
||||
"range": "Warnung ≤ Wert < Kritisch",
|
||||
"meaning": "Warnzustand. Health Monitor erzeugt ein WARNING-Ereignis; Benachrichtigungen beachten Kanalfilter und Ruhezeiten."
|
||||
},
|
||||
{
|
||||
"colour": "rot",
|
||||
"range": "Wert ≥ kritisch",
|
||||
"meaning": "Kritischer Zustand. Health Monitor erzeugt ein CRITICAL-Ereignis, das Ruhezeiten umgeht. Kategorie- und Ereigniseinstellungen des Kanals gelten weiter; die Zustellung hängt auch von seiner Verfügbarkeit ab."
|
||||
}
|
||||
],
|
||||
"sectionsTitle": "Abschnitte und empfohlene Standardwerte",
|
||||
"sectionsIntro": "Dies sind die ProxMenux-Standardwerte, bis Sie sie ändern. Die Abschnitte folgen <em>Rechenlast</em>, <em>Temperatur</em> und <em>Speicherkapazität</em>, von aktueller Last bis belegtem Platz.",
|
||||
"headerSection": "Abschnitt",
|
||||
"headerWarning": "Warnung",
|
||||
"headerCritical": "Kritisch",
|
||||
"headerGates": "Gesteuerte Prüfung",
|
||||
"thresholdRows": [
|
||||
{
|
||||
"section": "CPU-Auslastung",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Dauerlastwarnung, wenn die mittlere CPU-Auslastung im Prüfzeitraum über der Schwelle liegt."
|
||||
},
|
||||
{
|
||||
"section": "Arbeitsspeicher",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "RAM-Druck des Hosts. Der konfigurierbare Standard zeigt Kritisch bei 95 %, doch der aktuelle Detektor verwendet fest 90 % über längere Zeit; diese Einstellung ändert diesen Laufzeitzweig derzeit nicht."
|
||||
},
|
||||
{
|
||||
"section": "Swap (nur kritischer Schwellenwert)",
|
||||
"warning": "—",
|
||||
"critical": "80 %",
|
||||
"gates": "Swap-CRITICAL erfordert zugleich mehr als 80 % Swap und weniger als 15 % verfügbaren RAM über mehrere Messungen. Belegter Swap allein löst die Regel nicht aus."
|
||||
},
|
||||
{
|
||||
"section": "CPU-Temperatur",
|
||||
"warning": "80 °C",
|
||||
"critical": "90 °C",
|
||||
"gates": "CPU-Package- oder Kerntemperatur aus <code>lm-sensors</code>."
|
||||
},
|
||||
{
|
||||
"section": "Festplattentemperatur — HDD",
|
||||
"warning": "60 °C",
|
||||
"critical": "65 °C",
|
||||
"gates": "HDD-Temperatur. Standard: Warnung bei 60 °C, Kritisch bei 65 °C. Das sind Überwachungswerte, keine universelle Herstellergrenze; prüfen Sie die Modellspezifikation."
|
||||
},
|
||||
{
|
||||
"section": "Datenträgertemperatur — SSD",
|
||||
"warning": "70 °C",
|
||||
"critical": "75 °C",
|
||||
"gates": "SATA-SSDs in 2,5-Zoll- oder M.2-Bauform. Diese Klasse verwendet 70/75 °C als Standard; tatsächliche Grenzen hängen vom Modell ab."
|
||||
},
|
||||
{
|
||||
"section": "Datenträgertemperatur — NVMe",
|
||||
"warning": "80 °C",
|
||||
"critical": "85 °C",
|
||||
"gates": "NVMe-Temperatur. Standardwerte dieser Klasse sind 80/85 °C. Die Drosseltemperatur des Controllers hängt vom Modell ab und beträgt nicht immer 85 °C."
|
||||
},
|
||||
{
|
||||
"section": "Datenträgertemperatur — SAS",
|
||||
"warning": "55 °C",
|
||||
"critical": "65 °C",
|
||||
"gates": "SAS-Temperatur. Diese Klasse verwendet Warnung bei 55 °C und Kritisch bei 65 °C. Das sind <em>Überwachungsstandards</em>, kein Beweis eines Kühlfehlers bei 55 °C oder eine allgemeine Herstellergrenze."
|
||||
},
|
||||
{
|
||||
"section": "Datenträgerplatz — Host",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Kapazität von <code>/</code> und jedem Einhängepunkt des Hosts (<code>/var/lib/vz</code>, <code>/mnt/*</code>…)."
|
||||
},
|
||||
{
|
||||
"section": "Plattenraum — LXC Rootfs",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Root-Laufwerk pro Container, bewertet anhand der Rootfs-Größe von PVE."
|
||||
},
|
||||
{
|
||||
"section": "LXC-Einhängepunkte",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Kapazität von Einhängepunkten laufender CTs: mp0, mp1, NFS und Bind-Mounts. Ohne rootfs."
|
||||
},
|
||||
{
|
||||
"section": "PVE-Speicher",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Von PVE verwaltete Speicher: LVM, LVM-thin, ZFS-pool, RBD/Ceph und PBS. Nicht alle sind Blockspeicher."
|
||||
},
|
||||
{
|
||||
"section": "ZFS-Pool",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "ZFS-Pools auf dem Host, unabhängig von ihrer Registrierung in PVE."
|
||||
}
|
||||
],
|
||||
"defaultsTitle": "Standardwerte, Anpassungen und Zurücksetzen",
|
||||
"defaultsBody": "Jeder Abschnitt beginnt mit Standardwerten; Sie speichern nur gewünschte Änderungen. Die Karte zeigt den <em>wirksamen</em> Wert: Ihre Änderung oder den Standard. <strong>Zurücksetzen</strong> entfernt alle Änderungen in sämtlichen Abschnitten.",
|
||||
"validationTitle": "Validierung",
|
||||
"validationBody": "Beim Speichern werden erlaubte Bereiche geprüft und Kritisch unter Warnung abgelehnt. Die Oberfläche zeigt Fehler; der Server validiert API-Anfragen vor dem Speichern erneut."
|
||||
},
|
||||
"lxcDetection": {
|
||||
"heading": "LXC-Update-Erkennung",
|
||||
"imageAlt": "LXC-Update-Erkennung mit Schalter zur Suche nach Paketupdates in laufenden Debian-, Ubuntu- und Alpine-Containern",
|
||||
"imageCaption": "Schalter für regelmäßige Prüfungen mit <code>apt list --upgradable</code> / <code>apk list -u</code> in laufenden CTs. Standardmäßig aktiviert. Der zugehörige Schalter unter Benachrichtigungen → Dienste erscheint bei aktiver Erkennung.",
|
||||
"intro": "Der Schalter zwischen Schwellen und Benachrichtigungen steuert den LXC-Scan. Aktiv fragt er Paketmanager laufender CTs ab; Hardware zeigt Ergebnisse und <code>lxc_updates_available</code> erhält sie. Deaktiviert stoppt er seine <code>pct exec</code>-Aufrufe und entfernt LXC-Einträge aus <code>managed_installs.json</code>; <code>/api/managed-installs</code> meldet den Status dann ohne 24-Stunden-Wartezeit nicht mehr.",
|
||||
"whatRunsTitle": "Was die Prüfung ausführt",
|
||||
"whatRunsIntro": "Für jeden CT im Zustand <code>running</code> mit unterstütztem Paketmanager:",
|
||||
"whatRunsItems": [
|
||||
"<strong>Metadatenaktualität.</strong> Ist der apt/apk-Cache älter als <strong>24 Stunden</strong>, wird eine Aktualisierung mit <code>apt-get update -qq</code> auf Debian/Ubuntu oder <code>apk update</code> auf Alpine versucht, mit 60 s Zeitlimit. Bei Fehlern verwendet die Liste den vorhandenen, eventuell veralteten Cache.",
|
||||
"<strong>Auflistung.</strong> Führt <code>apt list --upgradable</code> / <code>apk list -u</code> aus und ermittelt Paketanzahl und einige Paketnamen.",
|
||||
"<strong>Duplikate je CT vermeiden.</strong> Ein Fingerabdruck aus Gesamtzahl, Sicherheitsupdates und sortierten Namen verhindert tägliche Wiederholungen desselben Bestands. Wesentliche Änderungen melden erneut."
|
||||
],
|
||||
"selfUpdateTitle": "CTs mit Updates außerhalb von apt können 0 melden",
|
||||
"selfUpdateBody": "Die Erkennung umfasst nur den Paketmanager im CT. Außerhalb von apt aktualisierte Software, etwa ein eingerichteter <code>plexupdate</code>-Job oder Images aus <code>docker pull</code>, zählt nicht dazu. Null apt-Updates beweisen nicht, dass alle Anwendungen aktuell sind. Ausstehende Basissystempakete werden weiter erkannt.",
|
||||
"refreshTitle": "Warum Metadaten nach 24 Stunden erneuert werden",
|
||||
"refreshBody": "Lange laufende CTs können alte apt-Metadaten haben, wenn niemand <code>apt update</code> ausführt. <code>apt list --upgradable</code> kann dann neue Updates übersehen. ProxMenux versucht eine Erneuerung nach mehr als 24 Stunden und überspringt sie bei neuerem Cache.",
|
||||
"toggleTitle": "Benachrichtigungsschalter bei aktiver Erkennung",
|
||||
"toggleBody": "Der Schalter <code>lxc_updates_available</code> je Kanal unter <strong>Benachrichtigungen → Dienste</strong> erscheint nur bei aktiver Erkennung. Beim Abschalten verschwindet die Zeile in allen Kanälen. Die Datenbank bewahrt die Einstellung; beim Einschalten kehrt der bisherige Wert zurück.",
|
||||
"purgeTitle": "Was beim Abschalten der Erkennung gelöscht wird",
|
||||
"purgeBody": "Das Abschalten entfernt sofort alle <code>type=lxc</code>-Einträge aus <code>/usr/local/share/proxmenux/managed_installs.json</code>. Hardware zeigt beim nächsten Neuladen keine LXC-Updatezähler mehr. Nach dem Einschalten füllt der nächste Erkennungszyklus den Bestand erneut; ein manueller API-Aufruf kann dies vorziehen."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Ausschlüsse von Remote-Speicher",
|
||||
"imageAlt": "Karte für entfernte Speicherausschlüsse mit PBS-Cloud, PBS und PBS2 sowie Schaltern für Zustand und Warnungen je Zeile",
|
||||
"imageCaption": "Schalter für <em>Zustand</em> und <em>Warnungen</em> je Speicher. Sind beide aus, zählt der Speicher nicht mehr im Health Monitor und sendet keine Meldungen. Unter Speicher bleibt er als ausgeschlossen sichtbar.",
|
||||
"intro": "Von Proxmox verwaltete Speicher (NFS / CIFS / PBS / Ceph / iSCSI usw.) lassen sich mit zwei unabhängigen Schaltern ausschließen:",
|
||||
"items": [
|
||||
"<strong>Zustand</strong> — wird dieser Schalter deaktiviert, zählt der Speicher nicht mehr zur Speicherkategorie des Health Monitor. Hilfreich für meist abgeschaltete Archiv-Volumes oder entfernte Sicherungsziele, die nur nach Zeitplan eingeschaltet werden.",
|
||||
"<strong>Warnungen</strong> — ausgeschaltet verhindert dieser Schalter Meldungen für den Speicher über eingerichtete Kanäle, auch bei aktiven Zustandsprüfungen. Hilfreich, wenn Sie den Zustand im Dashboard sehen möchten, ohne Meldungen zu erhalten."
|
||||
],
|
||||
"outro": "Ausgeschlossene Speicher bleiben auf der <link>Registerkarte Speicher</link> mit dem violetten Abzeichen <em>ausgeschlossen</em> sichtbar. Der Zustand wird in der SQLite-Tabelle <code>excluded_storages</code> gespeichert."
|
||||
},
|
||||
"interfaceExclusions": {
|
||||
"heading": "Ausschlüsse von Netzwerkschnittstellen",
|
||||
"imageAlt": "Karte für Schnittstellenausschlüsse mit vmbr0, vmbr1, vmbr2, bond0 und eno1 sowie Zustands- und Warnungsschaltern je Schnittstelle",
|
||||
"imageCaption": "Wie bei Speicherausschlüssen gibt es <em>Zustand</em> und <em>Warnungen</em> je Schnittstelle. Jede Zeile zeigt Namen, Typ (Bridge / Bond / physisch), IP und Verbindungsgeschwindigkeit.",
|
||||
"intro": "Dasselbe Prinzip gilt für Netzwerkschnittstellen: Jede lässt sich von Zustandsprüfungen, Benachrichtigungen oder beiden ausschließen. Typische Beispiele:",
|
||||
"items": [
|
||||
"Eine bewusst deaktivierte Reserve-Bridge.",
|
||||
"Eine physisch entfernte Netzwerkkarte, die noch in <code>/etc/network/interfaces</code> steht.",
|
||||
"Eine VLAN-Unterschnittstelle, die nur bei Wartungsarbeiten genutzt wird.",
|
||||
"Eine Verwaltungs-Bridge mit bekannten, wiederholten Verbindungswechseln während der Wartung."
|
||||
],
|
||||
"outro": "Der Zustand wird in der SQLite-Tabelle <code>excluded_interfaces</code> gespeichert. Das violette Abzeichen <em>ausgeschlossen</em> auf der <link>Registerkarte Netzwerk</link> hält ausgeschlossene Schnittstellen sichtbar."
|
||||
},
|
||||
"notifications": {
|
||||
"heading": "Benachrichtigungen und KI",
|
||||
"body1": "Hier aktivieren Sie ProxMenux-Monitor-Benachrichtigungen und die KI-Umformulierung. <em>Benachrichtigungen aktivieren</em> startet den Hintergrundversand, registriert ein Proxmox-VE-Webhook-Ziel für dessen Ereignisse und öffnet die Kanaleinstellungen für Telegram, Discord, E-Mail, Gotify und weitere Dienste. Die KI-Umformulierung liegt im selben Bereich unter aufklappbaren erweiterten Einstellungen.",
|
||||
"body2": "Eigene Seiten erklären die Optionen: Kanäle, Ereignisschalter, formatierte Nachrichten, Anzeigename, Versand mit Duplikatfilter, Wartezeiten, Bündelung und Ruhezeiten, PVE-Webhook, KI-Anbieter und Prompt-Modi:",
|
||||
"items": [
|
||||
"<notifLink>Benachrichtigungen</notifLink>: Kanaleinrichtung (Telegram, Discord, Gotify, E-Mail mit Gmail-/Microsoft-App-Passwörtern, ntfy, Slack, Teams und allgemeiner Webhook), Ereigniskategorien, formatierte Nachrichten, Anzeigename, Versand, PVE-Webhook, Verlauf und API.",
|
||||
"<aiLink>KI-Assistent</aiLink>: Anbieter (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), Modelle, Standard- oder eigene Prompts, Ausgabesprache, Detailgrad je Kanal und KI-Vorschläge."
|
||||
]
|
||||
},
|
||||
"optimizations": {
|
||||
"heading": "ProxMenux-Optimierungen",
|
||||
"intro": "Bestand der von ProxMenux auf dem Host registrierten Nachinstallationsoptimierungen. Optionen aus <autoLink>Automatisierte Nachinstallation</autoLink> und <customLink>Anpassbare Nachinstallation</customLink> tragen ihre Anwendung in <code>/usr/local/share/proxmenux/installed_tools.json</code> ein. Der Monitor liest diesen Bestand. Ein Eintrag prüft nicht erneut, ob alle Einstellungen unverändert sind.",
|
||||
"imageAlt": "ProxMenux-Optimierungskarte mit 14 Einträgen aus Farbpunkt, Name und Version: APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged mit Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal und VFIO IOMMU Passthrough.",
|
||||
"imageCaption": "Jede Optimierung erscheint mit Name, Version und Farbpunkt. Oben rechts steht der orange Zähler <em>14 aktiv</em>. Werkzeuge mit verfügbarem Quellcode lassen sich öffnen.",
|
||||
"dotsTitle": "Was die Punkte bedeuten",
|
||||
"dotsItems": [
|
||||
"<green/> <strong>Grüner Punkt</strong>: registrierte Optimierung ohne Legacy-Markierung und ohne angezeigtes Update. Öffnen Sie die Zeile, wenn Quellcode verfügbar ist.",
|
||||
"<amber/> <strong>Oranger Punkt und <em>legacy</em>-Abzeichen</strong>: registrierte Optimierung, deren Skript umbenannt oder ersetzt wurde. Der erhaltene Quellcode öffnet sich im Legacy-Modus mit oranger Hervorhebung. Die aktuelle Host-Konfiguration wird dabei nicht erneut geprüft."
|
||||
],
|
||||
"clickTitle": "Quellcode öffnen",
|
||||
"clickBody": "Ein Klick zeigt die zugeordnete Bash-Funktion und den Skriptnamen (<code>auto_post_install.sh</code> oder <code>customizable_post_install.sh</code>). Aktuelle Werkzeuge stammen aus Host-Dateien, ältere können erhaltenen Quellcode nutzen. Syntaxhervorhebung und Kopieren erleichtern die Prüfung. Dies ist kein garantiertes Abbild des bei der Installation ausgeführten Codes.",
|
||||
"detailAlt": "Quellcodefenster für APT IPv4 Force mit der Bash-Funktion force_apt_ipv4 aus customizable_post_install.sh Version 1.0. Der hervorgehobene Code konfiguriert /etc/apt/apt.conf.d/99-force-ipv4 mit Acquire ForceIPv4 true, registriert das Werkzeug und zeigt eine übersetzte Abschlussmeldung zur APT-IPv4-Konfiguration.",
|
||||
"detailCaption": "Quellcode von <em>APT IPv4 Force</em>: Funktion <code>force_apt_ipv4()</code> aus <code>customizable_post_install.sh v1.0</code>, mit Syntaxhervorhebung und Kopieren per Klick.",
|
||||
"whyTitle": "Warum das wichtig ist",
|
||||
"whyBody": "ProxMenux kann Kernel-Parameter, Paketquellen, Netzwerk, Logrotation und GPU-Durchreichung ändern. Prüfen Sie die registrierten Optimierungen vor manuellen Änderungen, besonders wenn jemand anderes den Host eingerichtet hat. Die Karte zeigt Bestand und verfügbaren Quellcode; sie prüft nicht jede aktuelle Einstellung und bewahrt keinen exakten Ausführungsverlauf.",
|
||||
"updatesTitle": "Hinweis auf verfügbare Updates",
|
||||
"updatesBody": "Ist die Optimierung auf dem Datenträger neuer als die auf dem Host registrierte Version, erscheint ein Hinweis mit Anzahl und <strong>Anwenden</strong>. <strong>Anwenden</strong> öffnet die Auswahl der Optimierungen, wie <em>Verfügbare Updates anwenden</em> im Nachinstallationsmenü. Wählen Sie die Updates; ProxMenux führt ihre Funktionen erneut aus und aktualisiert den Bestand. Sind alle aktuell, verschwindet der Hinweis.",
|
||||
"updatesAlt": "ProxMenux-Optimierungskarte mit Hinweis auf verfügbare Updates, deren Anzahl und Anwenden-Schaltfläche für die Auswahl",
|
||||
"updatesCaption": "Der Hinweis erscheint, wenn mindestens eine Optimierung auf dem Datenträger neuer ist. <link>Verfügbare Updates anwenden</link> erklärt den Ablauf und die entsprechende Path-A-Option im Shell-Menü.",
|
||||
"revertTitle": "Eine Optimierung rückgängig machen",
|
||||
"revertBody": "Um eine Optimierung rückgängig zu machen, wählen Sie die passende Option unter <link>Optimierungen deinstallieren</link> im ProxMenux-Scripts-Menü. Dies entfernt den Eintrag aus <code>installed_tools.json</code>; nach dem Neuladen erscheint er nicht mehr."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Wie die Daten gesammelt werden",
|
||||
"headerCard": "Karte",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerSource": "Quelle",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Schnittstellensprache",
|
||||
"endpoint": "localStorage",
|
||||
"source": "Browser-Einstellung <code>proxmenux-ui-language</code>; ohne gespeicherte Wahl wird zunächst die Browsersprache verwendet."
|
||||
},
|
||||
{
|
||||
"card": "Navigationsreihenfolge",
|
||||
"endpoint": "localStorage",
|
||||
"source": "Browser-Einstellung <code>proxmenux-nav-order</code>; sie legt auch die Startregisterkarte fest."
|
||||
},
|
||||
{
|
||||
"card": "Netzwerkeinheiten",
|
||||
"endpoint": "/api/settings",
|
||||
"source": "In der SQLite-Einstellungstabelle des Dashboards gespeichert."
|
||||
},
|
||||
{
|
||||
"card": "Health-Monitor-Zeitdauern",
|
||||
"endpoint": "/api/health/settings",
|
||||
"source": "Unterdrückungsdauer je Kategorie in der Health-Monitor-Datenbank."
|
||||
},
|
||||
{
|
||||
"card": "Speicher-/Schnittstellenausschlüsse",
|
||||
"endpoint": "/api/storage/exclusions, /api/network/exclusions",
|
||||
"source": "SQLite Tabellen <code>excluded_storages</code> und <code>excluded_interfaces</code>."
|
||||
},
|
||||
{
|
||||
"card": "Bereich Benachrichtigungen und KI",
|
||||
"endpoint": "/api/notifications/*",
|
||||
"source": "Siehe <notifLink>Benachrichtigungen</notifLink> und <aiLink>KI-Assistent</aiLink>."
|
||||
},
|
||||
{
|
||||
"card": "ProxMenux-Optimierungsliste",
|
||||
"endpoint": "/api/proxmenux/installed-tools",
|
||||
"source": "Liest <code>/usr/local/share/proxmenux/installed_tools.json</code>, geschrieben durch <code>register_tool</code>-Aufrufe der Nachinstallationsskripte."
|
||||
},
|
||||
{
|
||||
"card": "Quellcodefenster einer Optimierung",
|
||||
"endpoint": "/api/proxmenux/tool-source",
|
||||
"source": "Extrahiert die zugeordnete Bash-Funktion aus <code>auto_post_install.sh</code> oder <code>customizable_post_install.sh</code> auf dem Host; ältere Werkzeuge können erhaltenen Quellcode nutzen."
|
||||
}
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Weitere Schritte",
|
||||
"items": [
|
||||
{
|
||||
"label": "Registerkarte Apps",
|
||||
"href": "/docs/monitor/dashboard/apps",
|
||||
"tail": " — der App-Starter, dessen Position die Navigationsreihenfolge bestimmt."
|
||||
},
|
||||
{
|
||||
"label": "Benachrichtigungen",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — Kanäle, Ereignisschalter, kanalbezogene Anpassungen, Verlauf und Testversand."
|
||||
},
|
||||
{
|
||||
"label": "KI-Assistent",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tail": " — Anbieter, Modelle, Prompt-Modi, Sprachen und Detailgrad je Kanal."
|
||||
},
|
||||
{
|
||||
"label": "Health Monitor → Warnungen unterdrücken und Unterdrückungsdauer",
|
||||
"href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration",
|
||||
"tail": " — wie die obigen Auswahllisten je Kategorie funktionieren."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Scripts → Automatisierte Nachinstallation",
|
||||
"href": "/docs/post-install/automated",
|
||||
"tailRich": " und <customLink>Anpassbare Nachinstallation</customLink> — die Skripte, die Einträge in der obigen Optimierungsliste registrieren."
|
||||
},
|
||||
{
|
||||
"label": "Optimierungen deinstallieren",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — wie Sie eine oben registrierte Optimierung rückgängig machen."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard-Index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — zurück zur Übersicht der Registerkarten."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,268 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Registerkarte Speicher | ProxMenux-Dokumentation",
|
||||
"description": "Die Registerkarte Speicher vereint vier Ansichten: Proxmox-Speicher mit Status, ZFS-Pools, interne Laufwerke mit SMART und externe USB-Laufwerke. Die Laufwerksdetails zeigen SMART-Attribute, Verschleiß, Lebensdauer und dauerhaft gespeicherte Beobachtungen."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Registerkarte Speicher",
|
||||
"description": "Der gesamte Hostspeicher auf einer Seite: Proxmox-Speicher NFS / CIFS / LVM / ZFS / dir, ZFS-Poolzustand, interne SATA/NVMe-Laufwerke mit SMART und externe USB-Laufwerke. Ein Klick auf ein Laufwerk öffnet SMART-Attribute und Beobachtungsverlauf.",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Unterstützt durch drei Quellen",
|
||||
"body": "Proxmox-Speicher stammen aus <code>pvesm status</code>, ZFS aus <code>zpool status</code>, physische Laufwerke aus <code>lsblk</code> + <code>smartctl</code> und NVMe-Felder aus <code>nvme</code>. Die Seite aktualisiert sich etwa alle 60 Sekunden; die Detailansicht fordert eine SMART-Abfrage an."
|
||||
},
|
||||
"thresholds": {
|
||||
"title": "Hier angewendete Statusfarben und -schwellen",
|
||||
"intro": "Health Monitor bewertet den Status als <green/> <strong>grün</strong> unter Warnung, <amber/> <strong>orange</strong> zwischen Warnung und Kritisch und <red/> <strong>rot</strong> ab Kritisch. Die Standardwerte folgen. Einzelne Dashboard-Balken können andere, unten beschriebene Farbgrenzen verwenden.",
|
||||
"items": [
|
||||
"<strong>Kapazität</strong> (Hostlaufwerke, PVE-Speicher, ZFS-Pools, LXC-Einhängepunkte) — Warnung 85 %, Kritisch 95 %.",
|
||||
"<strong>Laufwerkstemperatur</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (Warnung / Kritisch)."
|
||||
],
|
||||
"outro": "Alle Werte lassen sich je Host konfigurieren. <link>Einstellungen → Health-Monitor-Schwellen</link> nennt die maßgeblichen Werte und erklärt ihre Anpassung."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Obere Reihe: Speicherübersicht",
|
||||
"intro": "Vier Karten fassen beim Öffnen Gesamtkapazität, lokale Nutzung, entfernte Nutzung und physische Laufwerke zusammen. Sie geben schnelle Antworten; die Karten darunter enthalten die Details.",
|
||||
"imageAlt": "Registerkarte Speicher mit vier Karten: Gesamtspeicher, lokale Nutzung, entfernte Nutzung und physische Laufwerke",
|
||||
"imageCaption": "Obere Reihe: Gesamtkapazität und Laufwerksanzahl, lokal und entfernt belegte Bytes sowie physische Laufwerke nach Typ mit Zustandsübersicht.",
|
||||
"headerCard": "Karte",
|
||||
"headerWhat": "Was es zeigt",
|
||||
"totalLabel": "Gesamtspeicher",
|
||||
"totalWhat": "Gesamte Rohkapazität aller physischen Laufwerke. Die Fußzeile nennt die Anzahl erkannter Laufwerke.",
|
||||
"localLabel": "Lokale Nutzung",
|
||||
"localWhat": "Belegte Bytes auf lokalem Speicher: LVM / LVM-thin / ZFS / dir auf den Hostlaufwerken. Der Hauptwert zeigt belegte Bytes, die Fußzeile <em>X.XX % von Y TB</em> zusätzlich den Belegungsgrad.",
|
||||
"remoteLabel": "Entfernte Nutzung",
|
||||
"remoteWhat": "Dasselbe Format wie Lokale Nutzung für entfernte Speicher NFS / CIFS / PBS / Ceph / iSCSI. Sie werden getrennt gezählt, da lokale und entfernte Ausfälle unterschiedlich wirken und die Ressourcen anders geplant und überwacht werden.",
|
||||
"disksLabel": "Physische Laufwerke",
|
||||
"disksIntro": "Zwei Aufschlüsselungslinien für das Inventar:",
|
||||
"disksItems": [
|
||||
"<strong>Nach Typ</strong> — Anzahl der NVMe-Laufwerke in Lila, SSDs und HDDs in Blau. Angezeigt werden erkannte Typen; ein reiner NVMe-Host zeigt nur diesen Zähler.",
|
||||
"<strong>Nach Zustand</strong> — Anzahl <em>normaler</em> Laufwerke in Grün, mit <em>Warnung</em> in Gelb und <em>kritischer</em> in Rot. Ohne Probleme erscheint nur „X normal“; die anderen Zustände werden erst bei entsprechenden Befunden angezeigt."
|
||||
]
|
||||
},
|
||||
"pveStorage": {
|
||||
"heading": "Proxmox Speicherkarte",
|
||||
"intro": "Je Speicher aus <code>/etc/pve/storage.cfg</code> eine Zeile mit Typ (<code>nfs</code> / <code>cifs</code> / <code>zfspool</code> / <code>lvm</code> / <code>lvmthin</code> / <code>dir</code> / <code>pbs</code>), Name, Status aktiv/Fehler/nicht überwacht, Belegungsgrad und Farbbalken:",
|
||||
"items": [
|
||||
"<strong>Bis 75 %</strong> — blauer Balken und Wert.",
|
||||
"<strong>Über 75 % bis 90 %</strong> — gelber Balken und Wert. Diese Farbgrenzen sind von den Health-Monitor-Schwellen getrennt.",
|
||||
"<strong>> 90 %</strong> — roter Balken und Wert. Diese Farbgrenze ist von der Eskalation im Health Monitor getrennt.",
|
||||
"<strong>Fehler</strong> — roter Rahmen um die Zeile bei konfiguriertem, aber unerreichbarem Speicher, etwa ausgefallenem NFS-Server oder abgelaufenen CIFS-Zugangsdaten.",
|
||||
"<strong>Ausgeschlossen</strong> — lila Rahmen und Kennzeichnung „nicht überwacht“. Vom Benutzer ausgeschlossene Speicher, etwa absichtlich getrennte Archivvolumes."
|
||||
],
|
||||
"calloutTitle": "Speicher von der Überwachung ausschließen",
|
||||
"calloutBody": "Im Speichermenü lässt sich der Speicher als <em>von Überwachung ausgeschlossen</em> markieren. Die Einstellung liegt in <code>excluded_storages</code> und gilt für Dashboard und Health Monitor: keine Benachrichtigungen und kein Einfluss auf den Gesamtstatus."
|
||||
},
|
||||
"zfs": {
|
||||
"heading": "ZFS Poolkarte",
|
||||
"intro": "Erscheint nur bei installiertem ZFS und mindestens einem Pool. Jede Zeile zeigt einen Pool mit Status, Größe, belegtem und freiem Platz sowie Statussymbol:",
|
||||
"items": [
|
||||
"<strong>ONLINE</strong> — grün. Alles gesund.",
|
||||
"<strong>DEGRADED</strong> — gelb. Der Pool liefert Daten, aber mindestens ein Gerät ist nicht verfügbar; ein Austausch muss geprüft werden.",
|
||||
"<strong>FAULTED</strong> / <strong>UNAVAIL</strong> / <strong>SUSPENDED</strong> — rot. Der Pool liefert keine Daten und erfordert sofortiges Eingreifen."
|
||||
],
|
||||
"outro": "ZFS-Zustand und SMART-Status jedes Laufwerks fließen in die Kategorie <em>Laufwerke und E/A</em> im <link>Health Monitor</link> ein."
|
||||
},
|
||||
"physical": {
|
||||
"heading": "Physische Laufwerke und SMART-Status",
|
||||
"intro": "Interne Festplatten (SATA / NVMe). Jede Zeile kondensiert die nützlichsten Felder auf einen Blick:",
|
||||
"items": [
|
||||
"<strong>Gerätepfad</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Typkennzeichnung</strong> — SATA / NVMe und passendes Symbol.",
|
||||
"<strong>Systemkennzeichnung</strong> — orange Markierung für erkannte Betriebssystemlaufwerke. Die Erkennung verwendet die Einhängepunkte <code>/</code> und <code>/boot</code>; zugehörige Laufwerke erhalten <em>System</em>. Eine fehlende Markierung beweist nicht, dass das Laufwerk gefahrlos gelöscht oder anders verwendet werden kann.",
|
||||
"<strong>Modell</strong> — Hersteller und Modell aus <code>smartctl -i</code>.",
|
||||
"<strong>Kapazität</strong> — in gut lesbaren Einheiten.",
|
||||
"<strong>Temperatur</strong> — aktueller Wert in °C, eingefärbt nach Laufwerkstyp; NVMe verwendet höhere Schwellen als SATA.",
|
||||
"<strong>SMART-Status</strong> — bestanden / fehlgeschlagen / unbekannt.",
|
||||
"<strong>Beobachtungsanzeige</strong> — enthält der dauerhafte Verlauf <code>disk_observations</code> Einträge für das Laufwerk, erscheint eine blaue Kennzeichnung mit der Anzahl, etwa <em>3 obs.</em>. Ein Klick öffnet die Beobachtungen.",
|
||||
"<strong>Zustandsanzeige</strong> — In Ordnung / Warnung / Kritisch anhand von SMART und jüngsten Beobachtungen."
|
||||
],
|
||||
"clickHint": "Die gesamte Zeile öffnet per Klick die unten beschriebenen Laufwerksdetails.",
|
||||
"warningTitle": "Systemlaufwerke mit Bedacht behandeln",
|
||||
"warningBody": "Laufwerke mit orangefarbenem <strong>System</strong> enthalten das laufende Betriebssystem. Die Kennzeichnung hilft bei der Erkennung; <link>ProxMenux → Laufwerksverwaltung → Formatieren / Löschen</link> verweigert destruktive Aktionen darauf. Verwenden Sie zur Umnutzung einer Startplatte eine Rettungsumgebung außerhalb des laufenden Proxmox."
|
||||
},
|
||||
"external": {
|
||||
"heading": "Externer Speicher (USB)",
|
||||
"body": "USB-Laufwerke haben eine eigene Karte, die nur bei angeschlossenen Geräten erscheint. Sie zeigt dieselben Felder wie interne Laufwerke und ein orangefarbenes <strong>USB</strong>-Label. Da sie oft nur für Sicherungen oder gelegentliche Übertragungen verbunden sind, bleiben Beobachtungen erhalten, während E/A-Fehler getrennter USB-Laufwerke nicht eskalieren."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Dialog mit Laufwerksdetails",
|
||||
"intro": "Ein Klick auf ein Laufwerk öffnet vier Registerkarten: <strong>Übersicht</strong> · <strong>SMART</strong> · <strong>Verlauf</strong> · <strong>Zeitplan</strong>. Die Kopfzeile zeigt Gerätepfad, Modell, Kapazität und gegebenenfalls das orangefarbene <em>System</em>-Label.",
|
||||
"overviewTitle": "Registerkarte 1 — Übersicht",
|
||||
"overviewImageAlt": "Laufwerksdetails mit Übersicht, Zustand, Ringanzeige für Verschleiß und Lebensdauer sowie wichtigen SMART-Attributen",
|
||||
"overviewImageCaption": "Übersicht: Identifikation, Zustand, Restlebensdauer mit aktuellem Verschleiß und geschriebenen Daten sowie wichtige SMART-Attribute.",
|
||||
"overviewIntro": "Standardansicht zum Prüfen des Laufwerkszustands ohne Testlauf. Drei Bereiche:",
|
||||
"overviewItems": [
|
||||
"<strong>Identifikation</strong> — Modell, Seriennummer, Kapazität und Zustand In Ordnung / Warnung / Kritisch.",
|
||||
"<strong>Verschleiß und Lebensdauer</strong> — Ring für Restlebensdauer (97 %, 50 %, …) mit Quellattribut (<em>Media Wearout Indicator</em>, <em>Percentage Used</em>, …), Verschleißbalken, Prognose <em>Geschätzte Lebensdauer</em> in Jahren und geschriebenen Gesamtdaten. NVMe zeigt auch <em>Available Spare</em>.",
|
||||
"<strong>SMART-Attribute</strong>: Die wichtigsten Werte erscheinen in einem Raster mit zwei Spalten: Temperatur, Betriebsstunden mit lesbarer Dauer wie <em>3 Jahre und 116 Tage</em>, Drehzahl oder <em>SSD</em>, Einschaltzyklen, SMART-Status, neu zugewiesene Sektoren, ausstehende Sektoren und CRC-Fehler. Die vollständige Attributtabelle befindet sich auf der Registerkarte SMART."
|
||||
],
|
||||
"smartTitle": "Tab. 2 — SMART",
|
||||
"smartImageAlt": "Laufwerksdetails, SMART-Registerkarte mit kurzem und erweitertem Test, letztem Ergebnis und vollständiger Attributtabelle",
|
||||
"smartImageCaption": "SMART-Registerkarte: kurzen oder erweiterten Test starten, letztes Ergebnis und alle Attribute prüfen sowie den vollständigen Bericht zum Drucken oder Speichern als PDF öffnen.",
|
||||
"smartIntro": "Verfügbare Aktionen in drei Bereichen:",
|
||||
"smartItems": [
|
||||
"<strong>SMART-Test starten</strong> — zwei Schaltflächen. <em>Kurzer Test (~2 Min.)</em> wartet auf das Ergebnis und zeigt es im Dialog. <em>Erweiterter Test (Hintergrund)</em> kann bei großen Laufwerken Stunden dauern, läuft auf dem Server weiter und benachrichtigt bei Abschluss.",
|
||||
"<strong>Letzter Test</strong> — Typ, Status (<em>bestanden</em> / <em>fehlgeschlagen</em>) und Zeitstempel des letzten Laufs.",
|
||||
"<strong>SMART-Attribute</strong> — vollständige Tabelle mit ID, Name, Wert, schlechtestem Wert und Status In Ordnung, Warnung oder Kritisch. SATA/SAS zeigt die nummerierte Liste. NVMe verwendet <code>nvme smart-log</code>: Temperatur, verfügbare Reserve, verbrauchter Anteil, gelesene/geschriebene Einheiten, Hostzugriffe, Controller-Auslastungszeit, Einschaltzyklen, unsichere Abschaltungen, Medienfehler, Fehlerprotokolleinträge und Zeit im Warn-/Kritischbereich der Gesamttemperatur."
|
||||
],
|
||||
"pdfTitle": "Vollständigen SMART-Bericht anzeigen (PDF)",
|
||||
"pdfIntro": "Unten auf SMART öffnet <strong>Vollständigen SMART-Bericht anzeigen</strong> einen druckbaren Bericht. Speichern Sie ihn über den Browser-Druckdialog als PDF zum Archivieren oder für den Herstellersupport bei einer RMA.",
|
||||
"pdfPreviewAlt": "Erste Seite des SMART-Berichts mit Zusammenfassung, PASSED-Ring und Laufwerksinformationen",
|
||||
"pdfPreviewCaption": "Erste Seite: Zusammenfassung, PASSED-Ring und vollständige Laufwerksinformationen. Das Beispiel-PDF enthält SSD-Verschleiß, alle SMART-Attribute und den Testverlauf.",
|
||||
"pdfDownloadLabel": "Beispiel-SMART-Bericht herunterladen (PDF)",
|
||||
"pdfSectionsIntro": "Der Bericht hat sechs Hauptabschnitte:",
|
||||
"pdfSections": [
|
||||
"<strong>Zusammenfassung</strong> — PASSED/FAILED, verständliche Zustandsbewertung — in Ordnung, Verschleiß oder Ausfall — und vier Angaben: Berichtszeit, letzter Testtyp, Ergebnis und geprüfte Attribute.",
|
||||
"<strong>Laufwerksinformationen</strong> — Modell, Seriennummer, Kapazität, Typ HDD/SSD/NVMe, Familie, Bauform, Schnittstelle (SATA 3.3 · 6.0 Gb/s, …), TRIM, Temperatur und optimale Schwelle, Betriebsstunden, Einschaltzyklen, SMART, ausstehende/neu zugewiesene Sektoren und CRC-Fehler.",
|
||||
"<strong>SSD-Verschleiß und Lebensdauer</strong> (nur SSD/NVMe) — Restlebensdauer, Quellattribut, aktueller Verschleiß, geschriebene Daten und Betriebsstunden.",
|
||||
"<strong>Vollständige SMART-Attribute</strong> — ID, Name, Wert, schlechtester Wert, Schwelle, Rohwert und Status jedes Attributs. Wichtige Attribute wie Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count und Media Wearout Indicator werden unter der Zeile kurz erklärt.",
|
||||
"<strong>Letzter Selbsttest und vollständiger Verlauf</strong> — letzter Test mit Typ, Ergebnis, Abschlussmeldung und damaligen Betriebsstunden sowie nummerierte Tabelle aller aufbewahrten Tests.",
|
||||
"<strong>Empfehlungen</strong> — Maßnahmen anhand des Ergebnisses. Für gesunde Laufwerke: <em>Laufwerk in Ordnung / regelmäßige Tests / Sicherungsstrategie</em>. Bei auffälligen Attributen folgen Hinweise zum Austausch."
|
||||
],
|
||||
"pdfOutro": "Der Browser erstellt den druckbaren Bericht; Drucken und Als PDF speichern öffnen beide den Druckdialog. Wählen Sie einen Namen wie <code>SMART-<short-id>.pdf</code>. Bewahren Sie datierte Berichte zum Vergleich oder für den Herstellersupport auf.",
|
||||
"historyTitle": "Registerkarte 3 — Verlauf",
|
||||
"historyImageAlt": "Laufwerksdetails, Verlauf mit früheren SMART-Tests sowie Download und Löschen",
|
||||
"historyImageCaption": "SMART-Testverlauf des Laufwerks. Jede Zeile zeigt Typ, Zeit, Alter, Markierung des neuesten Tests sowie Download der <code>smartctl</code>-Ausgabe und Löschen.",
|
||||
"historyIntro": "Aufbewahrte abgeschlossene kurze und erweiterte Tests des Laufwerks. Jeder Eintrag enthält die ursprüngliche <code>smartctl</code>-Ausgabe und die von Monitor für das Dashboard ausgewerteten Felder. Aktionen je Zeile:",
|
||||
"historyItems": [
|
||||
"<strong>Herunterladen</strong> — speichert den JSON-Snapshot mit den vom Bericht verwendeten <code>smartctl -a</code>-Daten. Hilfreich, wenn der Herstellersupport die ursprünglichen Diagnosefelder benötigt.",
|
||||
"<strong>Löschen</strong> — entfernt einen Test manuell aus dem Verlauf. Die Aufbewahrung im Zeitplan (<em>letzte 5 / 10 / 20</em>) löscht automatisch die ältesten."
|
||||
],
|
||||
"scheduleTitle": "Registerkarte 4 — Zeitplan",
|
||||
"scheduleImageAlt": "Laufwerksdetails, Zeitplan-Registerkarte mit Schalter für automatische SMART-Tests, Zeitplanliste und Schaltfläche Zeitplan hinzufügen",
|
||||
"scheduleImageCaption": "Zeitplan: Testtyp, Intervall und Aufbewahrung wählen; Monitor richtet <code>cron</code> für automatische Tests ein.",
|
||||
"scheduleIntro": "Automatische SMART-Tests über cron ohne Terminal. Drei Bereiche:",
|
||||
"scheduleItems": [
|
||||
"<strong>Automatische SMART-Tests</strong> — gemeinsamer Schalter für alle Zeitpläne des Laufwerks. Er pausiert sie während der Wartung, ohne ihre Konfiguration zu löschen.",
|
||||
"<strong>Konfigurierte Zeitpläne</strong> — je Zeitplan eine Zeile mit Typ (<em>kurz</em> / <em>lang</em>), lesbarem Cron-Ausdruck (<em>„Am 1. des Monats um 03:00“</em>, <em>„Jeden Sonntag um 02:00“</em>), betroffenen Laufwerken und Aufbewahrung.",
|
||||
"<strong>Zeitplan hinzufügen / bearbeiten</strong> — Typ (<em>kurz ~2 Min.</em> / <em>lang 1–4 Std.</em>), Intervall (<em>täglich / wöchentlich / monatlich</em>), Monats- oder Wochentag, Uhrzeit und Ergebnisse aufbewahren (<em>letzte 5 / 10 / 20</em>)."
|
||||
],
|
||||
"scheduleOutro": "Der Zeitplan erzeugt einen Cron-Eintrag auf dem Host, der Monitor aufruft. Ergebnisse landen im SMART-Verlauf auf Registerkarte 3; die Aufbewahrung entfernt nach neuen Tests automatisch die ältesten Ergebnisse.",
|
||||
"tempTitle": "Dialog mit Temperaturverlauf",
|
||||
"tempIntro": "Monitor erfasst regelmäßig Messwerte von Laufwerken mit Temperatursensor und speichert sie lokal als Verlauf. Der aktuelle Wert steht in der Übersicht; ein Klick öffnet den Temperaturverlauf.",
|
||||
"tempImageAlt": "Temperaturverlauf mit Gerätepfad und Modell, Zeiträumen von 1 Stunde, 24 Stunden, 7 oder 30 Tagen, Anzeigen für Aktuell/Minimum/Mittelwert/Maximum und Liniendiagramm nach den Schwellen des Laufwerkstyps",
|
||||
"tempImageCaption": "Der Temperaturdialog öffnet sich aus der Übersicht bei einem Sensorwert ungleich null. Das Diagramm verwendet die Schwellen für HDD / SSD / NVMe / SAS.",
|
||||
"tempShowsTitle": "Inhalt des Dialogs",
|
||||
"tempShowsItems": [
|
||||
"<strong>Zeitraumauswahl</strong>: <em>1 Stunde</em>, standardmäßig <em>24 Stunden</em>, <em>7 Tage</em> oder <em>30 Tage</em>. Die Auflösung wird je Anfrage für ein lesbares Diagramm angepasst.",
|
||||
"<strong>Vier Kennzahlen</strong>: <em>Aktuell</em>, <em>Minimum</em>, <em>Mittelwert</em> und <em>Maximum</em> im Zeitraum. <em>Aktuell</em> verwendet dieselben Schwellen wie Speicheransicht und Benachrichtigungen für normale, erhöhte oder hohe Temperatur.",
|
||||
"<strong>Liniendiagramm</strong> der Temperatur im Zeitverlauf, dessen Linie und Fläche nach Laufwerkstyp eingefärbt sind:"
|
||||
],
|
||||
"tempDiskTypes": [
|
||||
"HDD - typischerweise kühlere Schwellenwerte.",
|
||||
"SSD — moderate Schwellenwerte.",
|
||||
"NVMe — höhere Schwellenwerte (NVMe läuft vom Design her heißer).",
|
||||
"SAS — Warnung bei 55 °C und Kritisch bei 65 °C; die Warnschwelle unterscheidet sich von HDD."
|
||||
],
|
||||
"tempConfigurable": "Alle vier Typen werden unter <em>Einstellungen → Health-Monitor-Schwellen</em> konfiguriert.",
|
||||
"tempWhyTitle": "Warum der Verlauf wichtig ist",
|
||||
"tempWhyItems": [
|
||||
"<strong>Trends erkennen.</strong> Ein einzelner Wert zeigt nicht, dass ein Laufwerk seit Wochen wärmer wird, etwa durch Lüfterprobleme, Staub oder benachbarte Wärmequellen. Die Ansichten für 7 und 30 Tage zeigen den Verlauf.",
|
||||
"<strong>Spitzen zuordnen.</strong> Hat eine Sicherung oder Wiederherstellung die Temperatur kurz über die Schwelle erhöht, zeigen die Ansichten für 1 und 24 Stunden, ob es einmalig oder wiederkehrend war.",
|
||||
"<strong>Schwellen anpassen.</strong> Prüfen Sie vor Änderungen unter <em>Einstellungen → Health-Monitor-Schwellen</em> im 30-Tage-Diagramm den tatsächlichen Betriebsbereich des Laufwerks."
|
||||
],
|
||||
"obsTitle": "Beobachtungsverlauf über Registerkarten hinweg",
|
||||
"obsIntro": "Laufwerksfehler können sich allmählich entwickeln. Ein Laufwerk kann SMART <strong>PASSED</strong> melden und dennoch Lesefehler in dmesg, SATA-Verbindungsabbrüche oder zeitweise ausstehende Sektoren zeigen. ProxMenux speichert diese <em>Signale</em> und zeigt sie im Dialog neben dem aktuellen SMART-Status.",
|
||||
"obsImageAlt": "Übersicht eines Laufwerks mit bestandenem SMART und null neu zugewiesenen/ausstehenden Sektoren und CRC-Fehlern, aber einer E/A-Beobachtung mit ursprünglicher Kernelmeldung, ATA-Erklärung, erstem und letztem Zeitpunkt und Zähler",
|
||||
"obsImageCaption": "Ein Laufwerk mit <strong>bestandenem SMART</strong> kann frühere Beobachtungen haben. Die Karte ergänzt den aktuellen Status um den Signalverlauf.",
|
||||
"obsWhatTitle": "Was ist eine Beobachtung?",
|
||||
"obsWhatIntro": "ProxMenux speichert erkannte Laufwerksereignisse aus Kernelprotokoll, dmesg oder SMART als <strong>Beobachtung</strong>, wenn sie einzeln zu detailliert für eine Benachrichtigung wären. Jede Zeile zeigt:",
|
||||
"obsWhatItems": [
|
||||
"<strong>Typ</strong> — E/A-, SMART-, Dateisystem-, ZFS-Pool- oder Verbindungsfehler.",
|
||||
"<strong>Ursprüngliche Kernelmeldung</strong> aus dmesg zum Kopieren in eine Suchmaschine oder Supportanfrage.",
|
||||
"<strong>Kurze Erklärung</strong> bekannter ATA-Codes: <code>IDNF</code>, Sektoradresse nicht gefunden, möglicher Sektor- oder Kabelfehler; <code>UNC</code>, nicht korrigierbarer Lesefehler, defekter Sektor; und weitere Standardcodes.",
|
||||
"<strong>Erster und letzter Zeitpunkt</strong> sowie <strong>Anzahl der Vorkommen</strong>, gruppiert nach Fehlersignatur."
|
||||
],
|
||||
"obsWhyTitle": "Warum ProxMenux sie speichert und anzeigt",
|
||||
"obsWhyItems": [
|
||||
"<strong>Fehler können sich entwickeln.</strong> ATA-Busfehler, UNC-Sektoren oder Medienfehler können auftreten, bevor SMART <em>FAILED</em> meldet. Der dmesg-Puffer bewahrt sie nicht über Neustarts hinweg; der Beobachtungsverlauf schon.",
|
||||
"<strong>SMART schließt nicht jeden Fehler aus.</strong> Ein Laufwerk kann grüne Attribute und trotzdem Probleme haben. Beobachtungen bewahren zusätzliche Symptome wie ICRC, IDNF, SATA-Verbindungsresets oder Geschwindigkeitsreduzierungen.",
|
||||
"<strong>Trennt aktuell von kürzlich.</strong> Health Monitor löst vorübergehende Fehler automatisch, wenn sie nicht mehr auftreten. Der Verlauf zeigt noch Tage später beispielsweise drei E/A-Fehler einer Nacht.",
|
||||
"<strong>Grundlage abgestufter Benachrichtigungen.</strong> disk_io verwendet die Beobachtungsrate der Tabelle für still, WARNING oder CRITICAL über das seit 1.2.1.2 gleitende 24-Stunden-Fenster."
|
||||
],
|
||||
"obsDedupTitle": "Duplikate und erneute Benachrichtigungen",
|
||||
"obsDedupBody1": "Beobachtungen werden nach <strong>Signatur</strong> gruppiert, einem stabilen Fingerabdruck aus Fehlertyp, Gerät und wichtigen Meldungsfeldern. Wiederholungen erhöhen <code>occurrence_count</code> der vorhandenen Zeile. Eine <strong>andere Signatur</strong> erzeugt eine weitere Beobachtung und gilt für Benachrichtigungen als neues Ereignis.",
|
||||
"obsDedupBody2": "Gegen Benachrichtigungskaskaden meldet die erste Kombination aus Laufwerk, Signatur und Schweregrad den Befund. Dieselbe Kombination meldet sich trotz steigender Anzahl erst nach 24 Stunden erneut. Ein Wechsel von WARNING zu CRITICAL unterbricht diese Wartezeit.",
|
||||
"obsDismissTitle": "Dauerhafter Verlauf und aktive Fehler",
|
||||
"obsDismissBody1": "Beobachtungen lassen sich nicht verwerfen, ausblenden oder löschen. Jede Signatur hat eine Karte; Wiederholungen erhöhen die Anzahl und aktualisieren den letzten Zeitpunkt. Der Verlauf folgt der Seriennummer: Ein anderes Laufwerk beginnt leer, auch am selben Port; eine Kernel-Umbenennung bewahrt seinen Verlauf.",
|
||||
"obsDismissBody2": "Das Beheben oder Verwerfen eines aktiven Fehlers im Health Monitor verändert die Beobachtungen nicht. Sie bleiben nach automatischer Auflösung erhalten, sodass eine vorübergehende Warnung von letzter Woche heute sichtbar bleibt. Aktive Fehler verwalten Sie unter <link>Health Monitor</link>."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Wie die Daten gesammelt werden",
|
||||
"headerSection": "Abschnitt des Reiters",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerSource": "Quelle",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Obere Übersichtskarten",
|
||||
"endpoint": "/api/storage/summary",
|
||||
"source": "Aggregiert aus <code>lsblk</code>, <code>zpool list</code>, <code>vgs</code> / <code>lvs</code>."
|
||||
},
|
||||
{
|
||||
"section": "Inventar je Laufwerk",
|
||||
"endpoint": "/api/storage",
|
||||
"source": "<code>lsblk -O</code> + <code>smartctl -i</code> je Gerät mit Identitätscache, der bei Hotplug-Ereignissen geleert wird."
|
||||
},
|
||||
{
|
||||
"section": "Proxmox-Speicher",
|
||||
"endpoint": "/api/proxmox-storage",
|
||||
"source": "<code>pvesh get /nodes/<node>/storage</code> mit dem aktiven / Online-Zustand von jedem."
|
||||
},
|
||||
{
|
||||
"section": "Aktuelle SMART-Werte",
|
||||
"endpoint": "/api/storage/smart/<disk>",
|
||||
"source": "<code>smartctl -A <dev></code> ist eine mögliche Abfrage; der Detail-Endpunkt verwendet auch vollständige SMART-JSON-Daten und NVMe-spezifische Werte."
|
||||
},
|
||||
{
|
||||
"section": "SMART-Selbsttestverlauf",
|
||||
"endpoint": "/api/storage/smart/<disk>/history",
|
||||
"source": "Als JSON-Snapshots unter <code>/usr/local/share/proxmenux/smart/<disk>/</code> gespeichert."
|
||||
},
|
||||
{
|
||||
"section": "Dauerhafte Beobachtungen",
|
||||
"endpoint": "/api/storage/observations",
|
||||
"source": "SQLite-Tabelle, die Health Monitor in jedem Zyklus aktualisiert und nach Auflösung aktiver Fehler beibehält."
|
||||
}
|
||||
],
|
||||
"outro": "Überprüfung der Sammelkette auf dem Host:",
|
||||
"codeComment1": "# Aktuellen Stand aus einem Skript abrufen",
|
||||
"codeComment2": "# Dashboard-Daten mit der direkten Betriebssystemansicht vergleichen"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — Kategorie Laufwerke und E/A sowie Unterdrückungsregeln."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — Speicher- und SMART-Endpunkte."
|
||||
},
|
||||
{
|
||||
"label": "Benachrichtigungen",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tailRich": " — welche Folgeaktionen <code>disk_io_error</code>, <code>storage_unavailable</code> und <code>smart_test_failed</code> auslösen."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard-Index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": "Die anderen Tabs."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Datenträgerverwaltung",
|
||||
"href": "/docs/disk-manager",
|
||||
"tail": " — TUI-Aktionen: Formatieren, Löschen, SMART-Tests und Laufwerke in VMs oder Container importieren."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → SMART-Laufwerkszustand und Tests",
|
||||
"href": "/docs/disk-manager/smart-disk-test",
|
||||
"tail": " — CLI-Entsprechung: SMART-Tests planen, das angezeigte JSON exportieren und Testtypen sowie Ergebnisinterpretation nachschlagen."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Systemprotokolle | ProxMenux-Dokumentation",
|
||||
"description": "Die Registerkarte Systemprotokolle konsolidiert drei Quellen in einem Bildschirm: journalctl mit Filtern und Download, Proxmox Task History (UPIDs) und Benachrichtigungsprotokoll - alle durchsuchbar, nach Schweregrad / Zeitbereich filterbar und als Textbündel herunterladbar."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Systemprotokolle",
|
||||
"description": "Drei Unterreiter in einer Ansicht: das Systemjournal (journalctl mit Filtern), der Proxmox-Aufgabenverlauf und das Benachrichtigungsprotokoll. Alle drei lassen sich durchsuchen, filtern und als Textpakete herunterladen.",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"readOnly": {
|
||||
"title": "Read-only nach Design",
|
||||
"body": "Dieser Reiter verändert keine Protokolldateien. Die Filter werden in der URL bzw. im Ansichtsstatus gehalten; Downloads werden auf dem Server erstellt. Das Dashboard löscht keine Einträge. Zur Protokollpflege verwenden Sie auf dem Host <code>journalctl --vacuum-time=<N></code> oder <code>logrotate</code>."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Obere Reihe: vier Zähler",
|
||||
"items": [
|
||||
"<strong>Einträge insgesamt</strong> — Anzahl der Protokolleinträge im aktiven Filterzeitraum.",
|
||||
"<strong>Fehler</strong> — Anzahl der Einträge mit Schweregrad ≤ 3 (<code>err</code> / <code>crit</code> / <code>alert</code> / <code>emerg</code>).",
|
||||
"<strong>Warnungen</strong> — Anzahl der Einträge mit Schweregrad 4 (<code>warning</code>).",
|
||||
"<strong>Sicherungen</strong> — Anzahl der vzdump-/PBS-Aufgabeneinträge im selben Zeitraum."
|
||||
]
|
||||
},
|
||||
"subtabs": {
|
||||
"heading": "Drei Unterreiter",
|
||||
"logsTitle": "Protokolle",
|
||||
"logsIntro": "Das Systemjournal wird auf dem Server mit <code>journalctl</code> abgerufen. Die Werkzeugleiste bietet folgende Filter :",
|
||||
"logsFilters": [
|
||||
"<strong>Schweregrad</strong> — emerg / alert / crit / err / warning / notice / info / debug oder eine beliebige Kombination.",
|
||||
"<strong>Zeitbereich</strong> — zuletzt 5 min. / 15 min. / 1 h / 6 h / 24 h / 7 d / Custom.",
|
||||
"<strong>Freitextsuche</strong> — Teilzeichenfolge oder regulärer Ausdruck (<code>journalctl --grep</code>).",
|
||||
"<strong>Unit-Filter</strong> — auf eine bestimmte systemd-Unit beschränken (<code>pveproxy.service</code>, <code>nginx.service</code>, …)."
|
||||
],
|
||||
"logsRowsAfter": "Jede Zeile zeigt Zeitstempel, Schweregradabzeichen, Quelleinheit und die Nachricht. Lange Nachrichten brechen mit einem \"mehr anzeigen\"-Schalter zusammen. Die Aktion <strong>Download</strong> bündelt den aktuellen Filter über <code>GET /api/logs/download</code> in einer einzigen <code>.txt</code>-Datei – nützlich, wenn Sie ein Stück Journal mit jemandem teilen möchten.",
|
||||
"logDetailsModalTitle": "Dialog Protokolldetails",
|
||||
"logDetailsBody": "Ein Klick auf eine Zeile öffnet <strong>Protokolldetails</strong> mit allen strukturierten Feldern, die journald für diesen Eintrag erfasst hat — wie bei <code>journalctl --output=verbose</code> auf dem Host.",
|
||||
"logDetailsImageAlt": "Dialog Protokolldetails — einzelner Journaleintrag mit Stufe, Dienst, Zeitstempel, Quelle, systemd-Unit, Prozess-ID, Hostname und vollständiger Nachricht",
|
||||
"logDetailsImageCaption": "Protokolldetails — alle strukturierten journald-Felder dieses Eintrags mit der vollständigen, ungekürzten Nachricht am Ende. Hilfreich bei cron- und Dienstprotokollen, wenn die ausgeführte Befehlszeile wichtig ist.",
|
||||
"fieldsIntro": "Gezeigte Felder:",
|
||||
"fields": [
|
||||
"<strong>Level</strong> — farbiges Schweregradabzeichen (INFO / WARNUNG / ERROR / KRITIKAL).",
|
||||
"<strong>Service</strong> — Kurzname der Einheit / des Prozesses, der den Eintrag ausgegeben hat.",
|
||||
"<strong>Timestamp</strong> — vollständiges Datum und Uhrzeit der Logzeile.",
|
||||
"<strong>Source</strong> — Ursprung des Eintrags (Journal, Kernel, Audit, ...).",
|
||||
"<strong>Systemd Unit</strong> — die tatsächliche <code>.service</code>/<code>.timer</code>/<code>.socket</code>-Einheit, wenn der Eintrag mit einer Einheit verknüpft war.",
|
||||
"<strong>Process ID</strong> — PID des Sendevorgangs.",
|
||||
"<strong>Hostname</strong> — nützlich, wenn Zeitschriften über Clusterknoten weitergeleitet werden.",
|
||||
"<strong>Nachricht</strong> — vollständige, ungekürzte Nachricht in einem Monospace-Block zum Kopieren."
|
||||
],
|
||||
"maxLevelStoreTitle": "Journald MaxLevelStore",
|
||||
"maxLevelStoreBody": "Bei einer neuen Proxmox-Installation verwendet journald standardmäßig <code>MaxLevelStore=warning</code> und verwirft dadurch Info-Meldungen. Monitor erkennt dies beim Start und ergänzt eine Drop-in-Datei (<code>/etc/systemd/journald.conf.d/proxmenux-loglevel.conf</code>) mit dem Grenzwert <code>info</code>. So werden Informationsmeldungen und schwerwiegendere Meldungen gespeichert; debug ist darin nicht enthalten.",
|
||||
"backupsTitle": "Sicherungen",
|
||||
"backupsBody": "Proxmox-Taskhistorie gefiltert auf Backup-bezogene Einträge. Eine Zeile pro Aufgabe (<code>vzdump</code>, PBS-Transfers, Garbage Collect, Verify) mit dem Status (OK / WARNINGS / ERROR), beteiligter Gast, Quellspeicher, Dauer und UPID. Klicken Sie auf eine Zeile, um das vollständige Aufgabenprotokoll über <code>GET /api/task-log/<upid></code> zu laden - die gleichen Daten, die Proxmox über <em>Datacenter → Tasks</em>, die auf Backups beschränkt sind, freigibt.",
|
||||
"notificationsTitle": "Benachrichtigungen",
|
||||
"notificationsBody1": "Alle von Monitor versendeten Benachrichtigungen: Telegram, Discord, E-Mail, Gotify, ntfy, Slack, Teams und Webhook. Jede Zeile zeigt Zeitstempel, Kanal, Ereignistyp, Schweregrad, erzeugten Titel und Nachrichtentext sowie bei aktivierter KI einen Schalter zum Vergleich der KI-Fassung mit dem Original.",
|
||||
"notificationsBody2": "Hier prüfen Sie, ob ein Kanal tatsächlich Nachrichten zustellt, und vergleichen die KI-Fassung mit der ursprünglichen Vorlage. Die Kanäle konfigurieren Sie auf der Detailseite <link>Benachrichtigungen</link>."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Wie die Daten gesammelt werden",
|
||||
"headerSubtab": "Unterregisterkarte",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerSource": "Quelle",
|
||||
"rows": [
|
||||
{
|
||||
"subtab": "Protokolle (Live-Filter)",
|
||||
"endpoint": "/api/logs",
|
||||
"source": "<code>journalctl --output json --since <range></code> mit serverseitigen Filtern für Schweregrad, Unit und Suche."
|
||||
},
|
||||
{
|
||||
"subtab": "Herunterladen",
|
||||
"endpoint": "/api/logs/download",
|
||||
"source": "Dieselbe Abfrage als Klartext für grep / less."
|
||||
},
|
||||
{
|
||||
"subtab": "Sicherungen",
|
||||
"endpoint": "/api/backups",
|
||||
"source": "PVE-Taskhistorie gefiltert nach <code>vzdump</code>, PBS-Transfers, Garbage Collect, Verify."
|
||||
},
|
||||
{
|
||||
"subtab": "Details einer Sicherungsaufgabe",
|
||||
"endpoint": "/api/task-log/<upid>",
|
||||
"source": "Vollständiges Aufgabenprotokoll im Klartext aus <code>/var/log/pve/tasks/<index>/<upid></code>."
|
||||
},
|
||||
{
|
||||
"subtab": "Meldeverlauf",
|
||||
"endpoint": "/api/notifications/history",
|
||||
"source": "Die SQLite-Tabelle <code>notification_history</code> wird von der Versandschleife gefüllt."
|
||||
}
|
||||
],
|
||||
"apiIntro": "Live-Filter und Downloads sind auch über die API erreichbar:",
|
||||
"codeComment1": "# Fehler und schwerwiegendere Meldungen der letzten Stunde mit einem Suchwort",
|
||||
"codeComment2": "# Laden Sie das vollständige Journal der letzten 6 Stunden als Klartext herunter",
|
||||
"codeComment3": "# Vollständige Ausgabe einer bestimmten Aufgabe anhand ihrer UPID abrufen"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — die Kategorie Systemprotokolle zur Erkennung dauerhafter, sprunghafter oder kaskadierender Muster."
|
||||
},
|
||||
{
|
||||
"label": "Benachrichtigungen",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — die Journalüberwachung liest dieselbe Quelle und erzeugt bei Treffern Benachrichtigungen."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — die Endpunkte logs und task-log mit ihren Abfrageparametern."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard-Index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — die anderen Reiter."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Systemübersicht | ProxMenux-Dokumentation",
|
||||
"description": "Der Standardstartreiter von ProxMenux Monitor: vier Kennzahlenkarten (CPU, Arbeitsspeicher, aktive VMs und LXCs, Temperatur) mit Live-Aktualisierung und Minidiagramm, ein Verlaufsdiagramm und kompakte Speicher- und Netzwerkübersichten mit Links zu ihren Detailreitern."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Registerkarte Systemübersicht",
|
||||
"description": "Der Reiter, den das Dashboard standardmäßig öffnet: vier Live-Kennzahlenkarten oben, ein Verlaufsdiagramm in der Mitte und kompakte Speicher- und Netzwerkübersichten unten. Sie verwenden dieselben APIs wie die jeweiligen Detailreiter.",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"readOnly": {
|
||||
"title": "Eine schreibgeschützte Momentaufnahme",
|
||||
"body": "Alle Bereiche dieses Reiters dienen der Information. Aktionen finden Sie in den verlinkten Detailreitern: Speicher zur Datenträgerverwaltung, VMs und LXCs zum Starten und Stoppen von Gästen sowie Sicherheit zur Authentifizierung."
|
||||
},
|
||||
"captureAlt": "Registerkarte Systemübersicht — vier metrische Karten (CPU, Speicher, aktive VMs, Temperatur), Knotenmetrikdiagramm und Speicher- / Netzwerkzusammenfassungskarten",
|
||||
"captureCaption": "Systemübersicht, der Standardstartreiter. Die vier Karten zeigen Live-Werte, das Diagramm zeigt den Verlauf und die beiden unteren Karten fassen Speicher und Netzwerk zusammen.",
|
||||
"topRow": {
|
||||
"heading": "Obere Reihe: Live-Kennzahlenkarten",
|
||||
"intro": "Vier Karten im 2×2-Raster auf Mobilgeräten und in einer Reihe auf dem Desktop. Jede wird alle paar Sekunden über <code>/api/system</code> aktualisiert.",
|
||||
"headerCard": "Karte",
|
||||
"headerWhat": "Was es zeigt",
|
||||
"headerSource": "Quelle",
|
||||
"rows": [
|
||||
{
|
||||
"card": "CPU-Auslastung",
|
||||
"what": "Aktueller Prozentsatz mit Fortschrittsbalken. Der Vitaldaten-Sampler aktualisiert ihn etwa jede Sekunde.",
|
||||
"source": "psutil.cpu_percent()"
|
||||
},
|
||||
{
|
||||
"card": "Arbeitsspeichernutzung",
|
||||
"what": "Belegte GB, Prozentsatz und Gesamt-GB. Der Balken zeigt den Prozentsatz.",
|
||||
"source": "psutil.virtual_memory()"
|
||||
},
|
||||
{
|
||||
"card": "Aktive VM und LXC",
|
||||
"what": "Anzahl laufender Gäste mit Aufschlüsselung nach Laufend/Gestoppt und Gesamtzahlen der VMs und LXCs in der Fußzeile.",
|
||||
"source": "/api/vms (konsolidiert)"
|
||||
},
|
||||
{
|
||||
"card": "Temperatur",
|
||||
"what": "CPU-Temperatur in °C mit Statusanzeige (kühl/warm/heiß) und einem Minidiagramm der letzten 5 Minuten im Hintergrund. Ohne Sensor erscheint <em>N/A</em>. Ein Klick öffnet die Temperaturdetails.",
|
||||
"source": "sensors / coretemp"
|
||||
}
|
||||
],
|
||||
"thresholdsTitle": "Hier angewendete Statusfarben und -schwellen",
|
||||
"thresholdsIntro": "Ringe, Balken und Minidiagramme verwenden dieselbe Einteilung: <green/> <strong>grün</strong> unter der Warnschwelle, <amber/> <strong>bernsteinfarben</strong> zwischen Warn- und kritischer Schwelle, <red/> <strong>rot</strong> ab der kritischen Schwelle. Empfohlene Standardwerte von ProxMenux :",
|
||||
"thresholdsItems": [
|
||||
"<strong>CPU-Auslastung</strong> — Warnung 85 %, kritisch 95 %.",
|
||||
"<strong>Arbeitsspeicher</strong> — Warnung 85 %, kritisch 95 %. Swap löst ebenfalls ab 5 % Nutzung den kritischen Zustand aus; ein gesunder Proxmox-Host sollte Swap nur selten verwenden.",
|
||||
"<strong>CPU-Temperatur</strong> — Warnung 80 °C, kritisch 90 °C."
|
||||
],
|
||||
"thresholdsOutro": "Alle Werte sind pro Host konfigurierbar. <link>Einstellungen → Grenzwerte der Zustandsüberwachung</link> ist die zentrale Referenz und erklärt ihre Anpassung.",
|
||||
"sparklineTitle": "Das Minidiagramm zeigt den Verlauf",
|
||||
"sparklineBody": "Die Temperaturkarte zeichnet eine 5-Minuten-Spur unter dem Wert, wobei die Linie und die Farbverlaufsfarbe dem gleichen Warning/Critical-Paar folgen, das oben dokumentiert ist. Es ist der schnellste Weg, um zu sehen, ob der Host in einem thermischen Aufstieg ist, ohne das Detail Modal zu öffnen."
|
||||
},
|
||||
"processes": {
|
||||
"heading": "Prozesse mit der höchsten CPU- und Arbeitsspeichernutzung",
|
||||
"intro": "Die Karten CPU-Auslastung und Arbeitsspeicher öffnen eine sortierbare Liste der 25 führenden Prozesse: nach CPU-Auslastung beim Öffnen über CPU, nach residentem Speicher beim Öffnen über Arbeitsspeicher.",
|
||||
"listTitle": "Der Listendialog",
|
||||
"listItems": [
|
||||
"<strong>Automatische Aktualisierung</strong> — die Liste wird bei geöffnetem Dialog alle 5 Sekunden aktualisiert. Beim Schließen enden die Abfragen.",
|
||||
"<strong>Filter</strong> — das Suchfeld grenzt die Liste nach Befehl, Benutzer oder PID ein.",
|
||||
"<strong>Inline bar</strong> — die primäre metrische Spalte zeichnet einen kleinen Balken, der auf den höchsten Wert in der gefilterten Liste skaliert ist, so dass das Ranking auch dann sichtbar bleibt, wenn kein Prozess in der Nähe von 100 % liegt.",
|
||||
"<strong>Mobiles Layout</strong> — unter 640 px werden PID und Benutzer ausgeblendet. Befehl, CPU % und Arbeitsspeicher passen so ohne horizontales Scrollen auf den Telefonbildschirm."
|
||||
],
|
||||
"captureListAlt": "Dialog Prozesse nach Arbeitsspeichernutzung — nach RSS sortierte Tabelle mit PID, Benutzer, Befehl, CPU % und Arbeitsspeicher",
|
||||
"captureListCaption": "Die Speicherkarte öffnet die nach RSS (indigo accent) sortierte Liste. Die CPU-Karte öffnet die gleiche Liste, sortiert nach CPU-Nutzung (blauer Akzent).",
|
||||
"detailTitle": "Angaben zu den einzelnen Prozessen",
|
||||
"detailIntro": "Ein Klick auf eine Zeile öffnet einen zweiten Dialog mit Live-Daten dieses Prozesses in vier Abschnitten :",
|
||||
"detailItems": [
|
||||
"<strong>Übersicht</strong> — Zustand, Elternprozess, Threadanzahl, offene Dateideskriptoren, Benutzer und Gruppe.",
|
||||
"<strong>Ressourcen</strong> — CPU %, Arbeitsspeicher %, residenter Speicher (RSS), virtuelle Größe, Swap und gesamte gelesene/geschriebene I/O-Daten.",
|
||||
"<strong>Befehl</strong> — Kurzname, vollständige Befehlszeile, Pfad der ausführbaren Datei und Arbeitsverzeichnis.",
|
||||
"<strong>Laufzeit</strong> — Startzeitpunkt und bisherige Laufzeit."
|
||||
],
|
||||
"detailRefresh": "Der Detaildialog wird alle 3 Sekunden aktualisiert. Endet der Prozess, stoppen die Abfragen und der bernsteinfarbene Hinweis <em>Dieser Prozess wurde beendet</em> erscheint. Die letzte erfasste Ansicht bleibt abgeblendet sichtbar und zeigt den Zustand vor dem Ende.",
|
||||
"captureDetailAlt": "Prozessdetaildialog — Übersicht, Ressourcen, Befehl und Laufzeit für eine PID",
|
||||
"captureDetailCaption": "Pro-Prozess-Detaildialog geöffnet von einer Listenzeile. Die Akzentfarbe stimmt mit der Karte überein, die sie geöffnet hat (blau für CPU, indigo für Memory)."
|
||||
},
|
||||
"middle": {
|
||||
"heading": "Mitte: Knotenmetrikdiagramme",
|
||||
"body1": "Unter den Karten zeigt <code>NodeMetricsCharts</code> CPU-, Arbeitsspeicher- und Datenträger-I/O-Verläufe aus dem RRD-Speicher von Proxmox über <code>/api/node/metrics</code>. Wählbar sind <em>1 Stunde / 24 Stunden / 7 Tage / 30 Tage / 1 Jahr</em>. Bei größeren Zeiträumen sinkt die Datenauflösung, damit die Anzeige flüssig bleibt.",
|
||||
"body2": "Dies sind die gleichen Graphen, die die Proxmox-Web-Benutzeroberfläche für einen Knoten darstellt, nur in das dunkle Thema des Monitors konsolidiert und mit den anderen Panels ausgerichtet."
|
||||
},
|
||||
"bottom": {
|
||||
"heading": "Untere Reihe: Speicher- und Netzwerkübersichten",
|
||||
"storageTitle": "Speicherübersichtskarte",
|
||||
"storageIntro": "Eine verdichtete Ansicht des Speicherzustands des Hosts, unterteilt in drei Blöcke:",
|
||||
"storageItems": [
|
||||
"<strong>Gesamtkapazität des Knotens</strong> — Summe aller VM-/LXC-Speicher und des lokalen Systemspeichers mit einem Verlaufsbalken für belegten und freien Platz.",
|
||||
"<strong>Gesamtkapazität / Physische Datenträger</strong> — Rohkapazität und Anzahl der erkannten physischen Datenträger.",
|
||||
"<strong>VM-/LXC-Speicher</strong> — belegter und freier Platz sowie Prozentsatz der Gastspeicher, ergänzt um deren Anzahl bei mehreren Speichern.",
|
||||
"<strong>Lokaler Speicher (System)</strong> — Root-/Systemeinhängepunkt des Hosts, getrennt vom Gastpool."
|
||||
],
|
||||
"storageDrillIn": "Details finden Sie im <link>Reiter Speicher</link>: SMART pro Datenträger, ZFS-Pools, Beobachtungsverlauf usw.",
|
||||
"networkTitle": "Netzwerkübersichtskarte",
|
||||
"networkBody1": "Die obere Zeile zeigt die Anzahl der aktiven Schnittstellen (physisch + Brücken kombiniert). Darunter befinden sich zwei Reihen farbiger Abzeichen für die Schnittstellen <code>up</code> — physische NICs in blau, Brücken in einer Sekundärfarbe. Ein Zeitrahmen-Selektor oben rechts (1 Stunde / 24 Stunden / 7 Tage / 30 Tage / 1 Jahr) steuert ein kleines RX / TX-Verkehrsdiagramm.",
|
||||
"networkBody2": "Details pro Schnittstelle (IP/MAC, RRD-Diagramm, Bridge-Mitglieder, Bond-Modus usw.) stehen im <link>Reiter Netzwerk</link>."
|
||||
},
|
||||
"refresh": {
|
||||
"heading": "Aktualisierungsmodell",
|
||||
"intro": "Jeder Bereich verwaltet seinen Ladezustand (<code>loadingStates.cpu</code>, <code>loadingStates.storage</code>, …), damit eine langsame Quelle die anderen nicht blockiert. Beim Laden erscheint ein pulsierender Platzhalter. Fehler werden abgefangen; ohne Temperatursensor zeigt die Karte etwa <em>N/A</em> statt eines Fehlers.",
|
||||
"items": [
|
||||
"<strong>Obere Kennzahlenkarten</strong> — Aktualisierung etwa alle 5 Sekunden. CPU und Temperatur erhalten zusätzlich jede Sekunde Daten vom Vitaldaten-Sampler.",
|
||||
"<strong>Knotenmetrikdiagramm</strong> — lädt beim Öffnen sowie bei Änderung von Zeitraum oder Sprache. Erforderliche Wiederholungsversuche erfolgen nach 60 Sekunden.",
|
||||
"<strong>Speicherkarte</strong> — Aktualisierung etwa alle 60 Sekunden. SMART-Daten bleiben länger im Cache; der Speicherreiter fordert bei Bedarf eine neue Abfrage an.",
|
||||
"<strong>Netzwerkkarte</strong> — Zusammenfassung alle 59 Sekunden und Verkehrsdiagramm alle 60 Sekunden für den gewählten Zeitraum.",
|
||||
"<strong>Manuell aktualisieren</strong> — die Schaltfläche Aktualisieren im Kopf lädt alle Bereiche sofort neu."
|
||||
]
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Wie die Daten gesammelt werden",
|
||||
"headerCard": "Karte",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerSource": "Quelle",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Statusanzeige im Kopf",
|
||||
"endpoint": "/api/health",
|
||||
"source": "Der zwischengespeicherte Gesamtstatus, der vom Health Monitor in jedem Zyklus erzeugt wird."
|
||||
},
|
||||
{
|
||||
"card": "CPU / RAM / Swap / Betriebszeit",
|
||||
"endpoint": "/api/system",
|
||||
"source": "<code>/proc/stat</code>, <code>/proc/meminfo</code>, <code>/proc/uptime</code> mit Kurzfenster-CPU-Probenahme."
|
||||
},
|
||||
{
|
||||
"card": "Host-Info (Kernel, BIOS, Distro)",
|
||||
"endpoint": "/api/info",
|
||||
"source": "<code>uname -a</code>, <code>dmidecode</code>, PVE-Version. Pro Prozess zwischengespeichert."
|
||||
},
|
||||
{
|
||||
"card": "Speicher / Netzwerk / VMs Karten",
|
||||
"endpoint": "/api/storage/summary, /api/network/summary, /api/vms",
|
||||
"source": "Siehe die dedizierten Tabs für jeden. Die Kopfkarten zeigen eine verdichtete Ansicht von den gleichen Endpunkten."
|
||||
},
|
||||
{
|
||||
"card": "Aktualisierungsintervall",
|
||||
"endpoint": "—",
|
||||
"source": "Systemdaten alle 5 Sekunden; Speicher, VMs und Netzwerkzusammenfassung alle 59 Sekunden. Aktualisieren im Kopf lädt alle Bereiche sofort neu."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Aufruf für die Statusanzeige im Kopf",
|
||||
"codeComment2": "# öffentlich, kein Token",
|
||||
"codeComment3": "# Authentifizierter Snapshot, der von den Karten verwendet wird"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — der Dialog hinter der Statusanzeige im Kopf: zehn Kategorien sowie Ausblenden und Unterdrücken von Meldungen."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — die Endpunkte system, info und health."
|
||||
},
|
||||
{
|
||||
"label": "Benachrichtigungen",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": "— wie sich die gleichen Status in Telegram / Discord / E-Mail-Nachrichten verwandeln."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard-Index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — die übrigen Dashboard-Reiter auf einen Blick."
|
||||
},
|
||||
{
|
||||
"label": "Architektur",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": " — die Hintergrundthreads und APIs hinter dieser Ansicht."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Terminal | ProxMenux-Dokumentation",
|
||||
"description": "Browser-Shell auf dem Proxmox-Host: bis zu 4 Terminals in Rasteransicht, Tastaturhilfen für Mobilgeräte (ESC, TAB, Pfeile, Ctrl-Kombinationen), integrierte Befehlsübersicht mit cheat.sh und JWT-Schutz."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Terminal Tab",
|
||||
"description": "Eine echte Shell-Sitzung auf dem Proxmox-Host im Browser: bis zu vier Terminals gleichzeitig, Tastaturhilfen für Mobilgeräte und eine integrierte Befehlsübersicht im selben Design wie das übrige Dashboard.",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Ein echter PTY im Browser",
|
||||
"body": "Das Terminal legt über <code>flask_terminal_routes</code> eine serverseitige PTY an, verbindet sie per WebSocket mit <code>xterm.js</code> im Browser und läuft als <code>root</code>, dem Benutzer der systemd-Unit. Wie bei <code>ssh root@<host></code> stehen <code>vim</code>, <code>tmux</code>, ncurses-Werkzeuge und die Proxmox-CLIs (<code>qm</code>, <code>pct</code>, <code>pvesh</code>, <code>pvecm</code>) zur Verfügung. Jede PTY exportiert <code>PROXMENUX_TERMINAL=monitor</code>. Alle untergeordneten <code>bash</code>-Prozesse, auch ein späterer Start von <code>menu</code>, erben die Variable, damit ProxMenux den Browserterminal-Kontext erkennt."
|
||||
},
|
||||
"singleAlt": "ProxMenux Monitor Terminal Registerkarte — Einzelterminalsitzung mit Fastfetch-Systemzusammenfassung beim Login",
|
||||
"singleCaption": "Ein Host-Terminal offen — die obige Symbolleiste zeigt die Anzahl (<em>1 / 4 Terminals</em>), <em> + New</em>, <em>Search</em>, <em>Clear</em> und <em>Close</em>. Die mobilen Tastaturhelfer erscheinen unter dem Terminal auf Touch-Geräten.",
|
||||
"target": {
|
||||
"heading": "Verbindungsziel",
|
||||
"body1": "Die Registerkarte Terminal öffnet eine Shell auf dem <strong>Proxmox-Host selbst</strong> - die gleiche Anmeldung, die Sie über SSH erhalten würden. Jeder Tab öffnet ein brandneues Host-Terminal.",
|
||||
"body2": "Um einen <strong>LXC-Container</strong> aus dem Browser zu erreichen, verwenden Sie die dedizierte <em>Console</em>-Taste auf jeder laufenden CT-Karte in der <link>VMs & LXCs tab</link>. Es öffnet ein Modal, auf dem <code>pct enter <vmid></code> ausgeführt wird, und verwendet die gleiche mobilfreundliche Symbolleiste, die unten beschrieben wird."
|
||||
},
|
||||
"menuGuard": {
|
||||
"heading": "Schutz bei der Selbstaktualisierung von menu in diesem Terminal",
|
||||
"body1": "Bei der Selbstaktualisierung ersetzt <code>menu</code> nach Bestätigung seinen Skriptbaum und lädt sich neu. Über SSH oder die Proxmox-Konsole funktioniert das, im Browser würde dabei jedoch die PTY der Shell beendet und der WebSocket getrennt. Deshalb lesen <code>check_updates_stable</code>, <code>check_updates_beta</code> und <code>apply_release_channel</code> die Variable <code>PROXMENUX_TERMINAL</code> und erkennen den Monitor-Kontext.",
|
||||
"body2": "Dann wird der Ja/Nein-Dialog durch einen Hinweis mit dem offiziellen Installationsbefehl ersetzt: <code>bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"</code> für Stable bzw. die entsprechende URL mit <code>install_proxmenux_beta.sh</code> für Beta. Die Aktualisierung wird über SSH oder die Proxmox-Hostkonsole ausgeführt; im Browserterminal lesen und bestätigen Sie nur den Hinweis."
|
||||
},
|
||||
"fourTerminals": {
|
||||
"heading": "Bis zu vier Terminals gleichzeitig",
|
||||
"intro": "Mit der Registerkarte können Sie bis zu vier Host-Terminals gleichzeitig öffnen. Jeder bekommt seinen eigenen PTY und seinen eigenen WebSocket - es sind völlig unabhängige Sitzungen. Zwei Layouts wechseln mit den Icons neben der Schaltfläche \"Neu\":",
|
||||
"items": [
|
||||
"<strong>Reiteransicht</strong> — ein sichtbares Terminal, die übrigen als benannte Reiter oben (<em>Terminal 1</em>, <em>Terminal 2</em>…). Gut für eine Aufgabe, während die anderen im Hintergrund laufen.",
|
||||
"<strong>Rasteransicht</strong> — alle offenen Terminals gleichzeitig in einem 2×2-Raster. So können Sie <code>htop</code> und <code>iftop</code> beobachten und im dritten Terminal bearbeiten, ohne die Ansicht zu wechseln."
|
||||
],
|
||||
"outro": "Die Werkzeugleiste zeigt die Anzahl (<em>1/4 Terminals</em>, <em>4/4 Terminals</em>). <strong>+ Neu</strong> öffnet einen Reiter, das kleine <code>×</code> in dessen Kopf schließt ihn. Die große rote Schaltfläche <strong>Schließen</strong> oben beendet alle Terminals."
|
||||
},
|
||||
"gridAlt": "ProxMenux Monitor Terminal Registerkarte — Rasteransicht mit vier Host-Terminals mit ls, Netzwerkkonfiguration, iftop und ProxMenux Hauptmenü nebeneinander",
|
||||
"gridCaption": "Rasteransicht (4 / 4 Terminals) — vier unabhängige Host-PTYs parallel mit Verzeichnisliste, <code>/etc/network/interfaces</code>, <code>iftop</code> und ProxMenux-Hauptmenü. Der Layout-Schalter in der Werkzeugleiste wechselt zwischen Raster und Reitern.",
|
||||
"keyboard": {
|
||||
"heading": "Tastaturhilfen für Mobilgeräte",
|
||||
"intro": "Telefon- und Tablet-Tastaturen bieten meist kein ESC, TAB, keine Pfeiltasten oder Tastenkombinationen mit Modifikatoren. Diese werden für <code>vim</code>, <code>nano</code>, <code>htop</code> und TUI-Menüs benötigt. Der Terminalreiter zeigt daher auf kleinen oder berührungsempfindlichen Geräten eine Reihe von Touch-Schaltflächen darunter an :",
|
||||
"headerButton": "Schaltfläche",
|
||||
"headerSends": "Sendet",
|
||||
"headerUse": "Typische Verwendung",
|
||||
"rows": [
|
||||
{
|
||||
"button": "ESC",
|
||||
"sends": "\\x1b",
|
||||
"use": "Einfügemodus in <code>vim</code> verlassen, einen TUI-Dialog abbrechen, eine Suche beenden."
|
||||
},
|
||||
{
|
||||
"button": "TAB",
|
||||
"sends": "\\t",
|
||||
"use": "Pfadvervollständigung und Feldnavigation in dialog/whiptail."
|
||||
},
|
||||
{
|
||||
"button": "↑ ↓ ← →",
|
||||
"sends": "\\x1bO[ABCD]",
|
||||
"use": "Shell-Historie, Cursorbewegung, Menünavigation."
|
||||
},
|
||||
{
|
||||
"button": "↵ Eingabetaste",
|
||||
"sends": "\\r",
|
||||
"use": "Bestätigen. Manche Bildschirmtastaturen ersetzen Enter durch Los/Fertig; diese Schaltfläche ist eindeutig."
|
||||
},
|
||||
{
|
||||
"button": "Ctrl ▾",
|
||||
"sends": "Auswahlliste",
|
||||
"useRich": true
|
||||
}
|
||||
],
|
||||
"ctrlIntro": "Drei Kontrollsequenzen:",
|
||||
"ctrlItems": [
|
||||
"<code>Ctrl+C</code> — laufenden Befehl abbrechen oder unterbrechen (<code>\\x03</code>).",
|
||||
"<code>Ctrl+X</code> — <code>nano</code> beenden (<code>\\x18</code>).",
|
||||
"<code>Ctrl+R</code> — Rückwärtssuche im bash-Verlauf (<code>\\x12</code>)."
|
||||
],
|
||||
"modalTitle": "Dieselbe Werkzeugleiste im LXC-Konsolendialog",
|
||||
"modalBody": "Die über <link>VMs und LXCs → Konsole</link> gestartete Containerkonsole zeigt dieselben Tastaturhilfen unter dem Dialog. Beim Verbinden gibt sie automatisch <code>pct enter <vmid></code> ein, sodass Sie direkt im Container landen."
|
||||
},
|
||||
"lxcAlt": "ProxMenux Monitor — LXC-Konsolendialog, Terminal: ubuntu (ID: 103), mit derselben mobilen Werkzeugleiste (ESC, TAB, Pfeile, Enter, Ctrl) darunter",
|
||||
"lxcCaption": "LXC-Konsolendialog, geöffnet über <em>VMs und LXCs → Konsole</em>. Der Kopf zeigt den Zielcontainer (<em>Terminal: ubuntu (ID: 103)</em>), darunter erscheint dieselbe Touch-Werkzeugleiste.",
|
||||
"search": {
|
||||
"heading": "Befehle suchen — integrierte Kurzübersicht",
|
||||
"intro": "Die blaue Schaltfläche <strong>Suchen</strong> öffnet eine fehlertolerante Befehlssuche. Geben Sie einige Buchstaben eines Linux- oder Proxmox-Befehls (<code>ls</code>, <code>tar</code>, <code>qm</code>, <code>pct</code>, <code>zpool</code>, <code>systemctl</code>…) ein. Der Dialog zeigt Beispiele mit <em>An aktives Terminal senden</em>. So müssen Sie zur Suche nach einer Option keinen anderen Browserreiter öffnen.",
|
||||
"modalAlt": "ProxMenux Monitor — Dialog Befehle suchen mit fehlertoleranter Suche nach Linux- und Proxmox-Befehlen über cheat.sh und mehreren ls-Beispielen",
|
||||
"modalCaption": "Befehlssuche nach <code>ls</code> — jedes Ergebnis zeigt Befehl, Beschreibung und einen kleinen Sendepfeil zum aktiven Terminal. Unten rechts steht die Datenquelle (<em>Bereitgestellt von cheat.sh</em>).",
|
||||
"aboutLabel": "Über cheat.sh:",
|
||||
"aboutBody": "ist eine quelloffene, von der Community gepflegte Kurzübersicht mit kurzen Praxisbeispielen für Hunderte von Linux-Befehlen, Administrationswerkzeugen und Programmiersprachen. Ursprünglich für <code>curl cheat.sh/<command></code> im Terminal entwickelt, ist sie auch im Browser erreichbar. ProxMenux Monitor leitet die Abfragen serverseitig weiter, damit der Dialog denselben Ursprung wie das Dashboard verwendet.",
|
||||
"headerSource": "Quelle",
|
||||
"headerWhen": "Wenn es verwendet wird",
|
||||
"headerWhat": "Was du siehst",
|
||||
"onlineLabel": "(online)",
|
||||
"onlineWhen": "Wenn der Host einen Internetzugang hat und der cheat.sh-Proxy antwortet.",
|
||||
"onlineWhat": "Mehrere Praxisbeispiele pro Befehl mit einer Beschreibung darüber. Der Statuspunkt im Dialogkopf ist <green>grün</green>.",
|
||||
"fallbackLabel": "Lokale Ersatzliste",
|
||||
"fallbackWhen": "Wenn cheat.sh nicht erreichbar ist (Offline-Host, restriktive Firewall, cheat.sh-Ausfall).",
|
||||
"fallbackWhat": "Eine mitgelieferte Liste gängiger Linux- und Proxmox-Befehle. Kleinerer Katalog, aber immer verfügbar. Der Statuspunkt ist <red>rot</red>.",
|
||||
"sendingNote": "<strong>So funktioniert das Senden</strong>: Der kleine Pfeil neben dem Ergebnis sendet den Befehlstext an das aktive Terminal: den gewählten Reiter oder das zuletzt angeklickte Terminal im Raster. Der Dialog schließt sich automatisch, sodass Sie direkt Enter drücken können."
|
||||
},
|
||||
"auth": {
|
||||
"heading": "Authentifizierung",
|
||||
"items": [
|
||||
"Der Browser fordert zunächst über <code>POST /api/terminal/ticket</code> mit JWT im <code>Authorization</code>-Header ein Einmalticket an. Dieses wird beim Öffnen des WebSockets übergeben und läuft nach 5 Sekunden ab. Bei aktivierter Authentifizierung wird eine Verbindung ohne gültiges Ticket geschlossen, bevor eine PTY angelegt wird.",
|
||||
"Bei einem Reverse Proxy muss dieser WebSocket-Upgrades weiterleiten. Beispiele für Nginx / Caddy / Traefik stehen unter <link>Zugriff und Authentifizierung</link>."
|
||||
]
|
||||
},
|
||||
"clipboard": {
|
||||
"heading": "Zwischenablage, Scrollback und Größenänderung",
|
||||
"items": [
|
||||
"<strong>Kopieren und Einfügen</strong> — über die Zwischenablage des Browsers. Text mit Maus oder Trackpad auswählen und das Systemtastenkürzel verwenden (<code>Cmd+C</code> unter macOS, <code>Ctrl+Shift+C</code> unter Linux/Windows). Linux-Desktops unterstützen auch Einfügen per Mittelklick.",
|
||||
"<strong>Scrollback</strong> — mit Mausrad oder Zwei-Finger-Geste blättern. xterm.js hält die letzten mehreren Tausend Zeilen im Speicher.",
|
||||
"<strong>Größe ändern</strong> — bei einer Größenänderung des Dashboardbereichs wird die PTY-Fenstergröße angepasst, damit <code>htop</code> und <code>vim</code> korrekt dargestellt werden.",
|
||||
"<strong>Wiederverbinden beim Zurückkehren</strong> — ein App-Wechsel auf Telefon oder Tablet, etwa dem iPad, kann den WebSocket trennen. Der Terminalreiter erkennt die Sichtbarkeitsänderung und verbindet sich beim Zurückkehren automatisch neu, mit 15 Sekunden Zeitlimit für langsame VPN-Verbindungen."
|
||||
]
|
||||
},
|
||||
"disconnect": {
|
||||
"heading": "Ursachen für Verbindungsabbrüche",
|
||||
"intro": "Die häufigsten Gründe, warum eine Sitzung endet und was mit jedem zu tun ist:",
|
||||
"headerCause": "Ursache",
|
||||
"headerFix": "Lösung",
|
||||
"rows": [
|
||||
{
|
||||
"cause": "Sitzungs-JWT beim Öffnen oder Wiederverbinden abgelaufen (24 Stunden).",
|
||||
"fix": "Aktualisieren Sie die Seite und melden Sie sich erneut an. Das Terminal ist nicht für unbeaufsichtigte Sitzungen konzipiert, so dass die JWT-Lebensdauer dem regulären Dashboard-Login entspricht."
|
||||
},
|
||||
{
|
||||
"cause": "Inaktivitätszeitlimit des Reverse Proxys.",
|
||||
"fix": "Erhöhen Sie <code>proxy_read_timeout</code> in Nginx oder den entsprechenden Wert in Caddy / Traefik (Beispiele unter Zugriff und Authentifizierung)."
|
||||
},
|
||||
{
|
||||
"cause": "Telefon oder Tablet im Ruhezustand.",
|
||||
"fix": "Beim Aufwecken des Geräts verbindet sich der Reiter automatisch neu (15 Sekunden Zeitlimit für VPN-Verbindungen). Falls nicht, laden Sie ihn neu."
|
||||
},
|
||||
{
|
||||
"cause": "Service-Neustart auf dem Host.",
|
||||
"fix": "Jeder Neustart von <code>proxmenux-monitor.service</code> beendet alle PTYs. Öffnen Sie neue Terminals, sobald das Dashboard fertig geladen ist."
|
||||
}
|
||||
]
|
||||
},
|
||||
"warning": {
|
||||
"title": "Das Terminal ist eine Root-Shell auf dem Host",
|
||||
"body": "Das Terminal übernimmt den Benutzer der systemd-Unit (<code>root</code>) und hat volle Rechte auf dem Proxmox-Host. Konfigurieren Sie Benutzername, Passwort und 2FA unter <authLink>Zugriff und Authentifizierung</authLink>, bevor Sie Zugriffe außerhalb des lokalen Netzes erlauben. Bei deaktivierter Authentifizierung kann jeder mit Zugriff auf Port 8008 ohne weitere Rückfragen oder SSH-Zugangsdaten eine Root-Shell öffnen. Nutzen Sie extern <gatewayLink>Secure Gateway</gatewayLink> (Tailscale) oder einen HTTPS-Reverse-Proxy, statt den Port im Internet freizugeben."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Zugriff und Authentifizierung",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — Reverse-Proxy-Beispiele mit den für das Terminal erforderlichen WebSocket-Upgrade-Zeilen."
|
||||
},
|
||||
{
|
||||
"label": "Architektur",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": " — WebSocket-Transport (HTTP über flask-sock bzw. HTTPS / WSS über gevent)."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — die WebSocket-Endpunkte /ws/terminal und /ws/script/<sid> neben der übrigen API."
|
||||
},
|
||||
{
|
||||
"label": "Integrationen → Secure Gateway",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": "- wenn Sie einen Terminalzugriff von außerhalb des LAN wünschen, ohne den Port 8008 freizulegen."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard-Index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — die anderen Reiter."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,245 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "LXC-App-Reiter: Erkennung, Links und Versionsverfolgung | ProxMenux",
|
||||
"description": "Entdecken und registrieren Sie LXC-Anwendungen, erstellen Sie Weblinks und verfolgen Sie optional installierte und verfügbare Versionen."
|
||||
},
|
||||
"header": {
|
||||
"title": "LXC-App-Reiter: Erkennung, Links und Versionsverfolgung",
|
||||
"description": "Geben Sie jeder LXC-Anwendung eine dauerhafte Identität, einen Webzugang und einen optionalen Versionsnachweis, ohne die Registrierung an Updates zu koppeln."
|
||||
},
|
||||
"intro": {
|
||||
"p1": "Die Registerkarte <strong>App</strong> zeichnet auf, welche Anwendungen zu einer LXC gehören. Eine Registrierung kann nur einen Namen und einen Weblink enthalten oder auch einen Detektor für installierte Versionen und eine Upstream-Quelle enthalten.",
|
||||
"p2": "Das Verfahren zur Softwareänderung wird separat im <link>Reiter Aktualisierungen</link> konfiguriert. Das Speichern einer App startet niemals einen Installer oder Updater.",
|
||||
"callout": "Registrierung, Versionsverfolgung und Aktualisierung sind drei unabhängige Funktionen. Jeder kann verwendet werden, ohne die anderen beiden zu benötigen.",
|
||||
"dashboardTitle": "Von der Registrierung bis zum Apps Launcher",
|
||||
"dashboard": "Jeder hier gespeicherte Weblink erscheint auch als Karte im übergeordneten <appsLink>Apps-Reiter</appsLink>. Diese LXC-Seite bleibt die maßgebliche Stelle für Name, Logo, Links und Versionsverfolgung."
|
||||
},
|
||||
"overview": {
|
||||
"heading": "Was ein Anwendungsdatensatz bietet",
|
||||
"lead": "Ein einzelner gespeicherter Datensatz kann Folgendes umfassen:",
|
||||
"items": [
|
||||
"Anzeigename und ein an das Farbschema angepasstes Logo.",
|
||||
"Ein oder mehrere anklickbare Weblinks, die aus der LXC-Adresse, dem Schema und dem gespeicherten Port erstellt wurden.",
|
||||
"Ein optionaler Detektor für die derzeit im LXC installierte Version.",
|
||||
"Eine optionale GitHub, HTTP JSON oder Docker Hub-Quelle für die neueste verfügbare Version.",
|
||||
"Benachrichtigungen über neue Versionen und Einstellungen zur Aufnahme in den Aktualisierungszähler pro App.",
|
||||
"Ein entsprechender Abschnitt auf der Registerkarte Updates, auch wenn die Versionsverfolgung deaktiviert ist."
|
||||
]
|
||||
},
|
||||
"discovery": {
|
||||
"heading": "Zwischengespeicherte Erkennung und Anwendungen suchen",
|
||||
"lead": "Anwendungsvorschläge sind Teil des per-LXC modalen Cache. Der Start-Scan bereitet sie im Hintergrund vor, so dass das Öffnen des App-Tabs zwischengespeicherte Ergebnisse sofort anzeigen kann.",
|
||||
"items": [
|
||||
"Das Öffnen des App-Reiters startet <strong>keinen</strong> neuen Katalogscan und fragt den LXC nicht wiederholt ab.",
|
||||
"<strong>Anwendungen suchen</strong> startet ausdrücklich eine neue Erkennung für diesen LXC. Verwenden Sie dies nach einer Softwareinstallation bei bereits laufendem ProxMenux.",
|
||||
"Die vorherige Liste bleibt sichtbar, während der explizite Scan ausgeführt wird. Neue Übereinstimmungen werden hinzugefügt, wenn sie beendet sind.",
|
||||
"Wird keine neue Übereinstimmung gefunden, steht das Ergebnis neben den Aktionen. <strong>Anwendung registrieren</strong> bleibt für manuelle Einträge verfügbar.",
|
||||
"Das Speichern, Entfernen oder Wiederherstellen einer App aktualisiert den gleichen Cache sofort. Das Starten oder Wiederherstellen eines LXC aktualisiert nur diesen Gast durch sein bestehendes Lebenszyklusereignis."
|
||||
],
|
||||
"callout": "Ein Vorschlag ist keine Registrierung. Er bleibt schreibgeschützt, bis <strong>Registrieren</strong> gewählt und das Formular gespeichert wird."
|
||||
},
|
||||
"registration": {
|
||||
"heading": "Eine Anwendung registrieren",
|
||||
"lead": "Ein erkannter Vorschlag und eine manuelle Aufzeichnung verwenden denselben Editor:",
|
||||
"steps": [
|
||||
"Klicken Sie bei einem Vorschlag auf <strong>Registrieren</strong> oder auf <strong>Anwendung registrieren</strong>, um im Katalog zu wählen oder einen eigenen Namen einzugeben.",
|
||||
"Überprüfen Sie den Namen und das Logo, die im Katalog vorgeschlagen werden.",
|
||||
"Ergänzen Sie die benötigten Weblinks. Erkannte lauschende Ports werden als Vorschläge angeboten, aber nicht automatisch gespeichert.",
|
||||
"Lassen Sie <strong>Upstream-Version verfolgen</strong> für reine Link-Datensätze deaktiviert oder aktivieren Sie es und prüfen Sie den Detektor für die installierte Version sowie die Upstream-Quelle.",
|
||||
"Bei aktivierter Versionsverfolgung <strong>Detektor testen</strong> verwenden und danach speichern.",
|
||||
"Nach der Bearbeitung <strong>Fertig</strong> wählen. App und Aktualisierungen verwenden denselben aktualisierten Cache-Datensatz."
|
||||
]
|
||||
},
|
||||
"catalog": {
|
||||
"heading": "Kataloggestützte Registrierung",
|
||||
"lead": "Der Katalog liefert Standardwerte, aber der gespeicherte Datensatz bleibt editierbar.",
|
||||
"items": [
|
||||
"Suchergebnisse können den kanonischen Namen, das Logo und die gemeinsamen Web-Ports vorfüllen.",
|
||||
"Bekannte Versionsdetektoren basieren auf echten Paketnamen, Binärdateien, Dateien, Python-Distributionen, OCI-Beschriftungen oder Befehlen und nicht auf einer universellen <code>/root/.app</code>-Annahme.",
|
||||
"Verifizierte Laufzeitüberschreibungen haben Vorrang, wenn eine Installation einen Pfad verwendet, der sich von den Metadaten des Installationsprogramms unterscheidet.",
|
||||
"Proxmox VE Helper-Scripts-Marker wie <code>/root/.slug</code> bleiben ein Kompatibilitätssignal für neuere Helferinstallationen, nicht der einzige Detektor.",
|
||||
"Alle vorgeschlagenen Werte sind vor dem Speichern bearbeitbar, um offizielle Installationsprogramme und manuelle Installationen abzudecken."
|
||||
]
|
||||
},
|
||||
"docker": {
|
||||
"heading": "Wie Docker LXCs dargestellt sind",
|
||||
"lead": "Für einen LXC, dessen primäre Plattform Docker ist, ist <strong>Docker</strong> die auf LXC registrierte Anwendung.",
|
||||
"items": [
|
||||
"Eine containerisierte Arbeitslast wie Portainer, Frigate oder Vaultwarden wird nicht als unabhängige native LXC-Anwendung vorgeschlagen.",
|
||||
"Docker-Dienste mit veröffentlichten TCP-Ports werden im Docker-Editor als optionale Weblinks angeboten.",
|
||||
"Jeder vorgeschlagene Link zeigt den Service, Host-Port und Container-Port an. Nur Links, die ein Webinterface bereitstellen, sollten gespeichert werden.",
|
||||
"Das globale Docker-Logo wird verwendet, wenn ein Link kein bestimmtes Logo hat. Ein Per-Link-Logo überschreibt es, wenn eines konfiguriert ist.",
|
||||
"Nachdem Docker registriert wurde, werden Docker Engine und Bildaktualisierungen zusammen im Abschnitt auf der Registerkarte Updates angezeigt."
|
||||
],
|
||||
"callout": "Diese Struktur verhindert, dass ein Docker-Workload wie eine direkt im LXC installierte Software aussieht, während gleichzeitig schnelle Verbindungen zu seinen Schnittstellen erhalten bleiben."
|
||||
},
|
||||
"webLinks": {
|
||||
"heading": "Weblinks und Logos",
|
||||
"lead": "Weblinks funktionieren mit oder ohne Versionsverfolgung.",
|
||||
"items": [
|
||||
"Jeder Link speichert ein Schema, einen Port, eine optionale Beschreibung und eine optionale Logo-URL.",
|
||||
"Die angezeigte URL verwendet die aktuelle Adresse, die bereits für den LXC erkannt wurde; die Adresse wird nicht in jedem App-Record dupliziert.",
|
||||
"Ein Link ohne eigenes Logo fällt auf das App-Level-Logo zurück.",
|
||||
"Mehrere Links können eine Admin-Schnittstelle, API, eine sekundäre Benutzeroberfläche oder einen anderen Endpunkt derselben App darstellen.",
|
||||
"Eine nur gespeicherte Link-App wird auch in Updates angezeigt, wo ein benutzerdefinierter Updater später konfiguriert werden kann."
|
||||
]
|
||||
},
|
||||
"tracking": {
|
||||
"heading": "Optionale Versionsverfolgung",
|
||||
"lead": "Die Versionsverfolgung kombiniert einen Detektor für die installierte Version mit einer optionalen Upstream-Quelle. Beide Seiten werden unabhängig geprüft.",
|
||||
"colMethod": "Methode zur Ermittlung der installierten Version",
|
||||
"colUse": "Verwendung",
|
||||
"detectorRows": [
|
||||
{
|
||||
"method": "dpkg / apk",
|
||||
"use": "Lies die installierte Paketversion aus Debian, Ubuntu oder Alpine Paket-Metadaten."
|
||||
},
|
||||
{
|
||||
"method": "binary",
|
||||
"use": "Führt einen absoluten binären Pfad oder einen Befehlsnamen mit Versionsargumenten aus."
|
||||
},
|
||||
{
|
||||
"method": "file + regex",
|
||||
"use": "Lies eine echte Datei und extrahiert die Version mit einer Capture-Gruppe."
|
||||
},
|
||||
{
|
||||
"method": "docker label / docker exec",
|
||||
"use": "Lesen Sie ein OCI-Versionslabel oder führen Sie einen Versionsbefehl in einem Docker-Container aus."
|
||||
},
|
||||
{
|
||||
"method": "python distribution",
|
||||
"use": "Verwendet importlib.metadata über den ausgewählten Python-Interpreter."
|
||||
},
|
||||
{
|
||||
"method": "command",
|
||||
"use": "Führt einen fortgeschrittenen Befehl im argv-Format ohne Shell aus und extrahiert die Version aus seiner Ausgabe."
|
||||
},
|
||||
{
|
||||
"method": "manual",
|
||||
"use": "Speichert eine manuell eingegebene Version; sie muss nach dem Upgrade der App geändert werden."
|
||||
},
|
||||
{
|
||||
"method": "OCI image",
|
||||
"use": "Für Container aus OCI manager Apps. Liest App- und Image-Versionen aus dem Installationsdatensatz und vergleicht den installierten Digest mit dem veröffentlichten Registry-Digest. Keine Konfiguration erforderlich."
|
||||
}
|
||||
],
|
||||
"sourcesHeading": "Quellen für die verfügbare Version",
|
||||
"sources": [
|
||||
"<strong>GitHub-Repository</strong>: neueste Version oder Tag aus einem öffentlichen <code>owner/name</code>-Repository.",
|
||||
"<strong>HTTP JSON</strong>: ein öffentlicher Endpunkt plus ein gepunkteter Pfad wie <code>data.version</code> oder <code>releases[0].tag_name</code>.",
|
||||
"<strong>Docker Hub</strong>: versionierte Tags, die durch einen regulären Ausdruck gefiltert werden. Eine Live-Vorschau zeigt echte übereinstimmende Tags, bevor der Datensatz gespeichert wird.",
|
||||
"Veränderliche Tags wie <code>latest</code>, <code>stable</code> oder <code>lts</code> enthalten keine Version. Verfolgen Sie solche Images anhand ihres Digests über die Docker-Image-Aktualisierungen."
|
||||
],
|
||||
"regexHeading": "Schreiben des Capture-Ausdrucks",
|
||||
"regexLead": "Der reguläre Ausdruck muss die Version in seiner <strong>ersten Erfassungsgruppe</strong> zurückgeben.",
|
||||
"regexRules": [
|
||||
"Passen Sie den Text an, der von der ausgewählten Binär-, Datei-, Befehls- oder Tag-Quelle ausgegeben wird; raten Sie keinen generischen Pfad.",
|
||||
"Schreiben Sie literale Punkte als <code>\\.</code>, damit sie nicht für beliebige Zeichen stehen.",
|
||||
"Lassen Sie einen führenden <code>v</code> nur zu, wenn die Quelle ihn enthalten kann.",
|
||||
"Fügen Sie Suffixe wie Pre-Release oder Distro-Revisionen nur dann hinzu, wenn sie für den Vergleich aussagekräftig sind.",
|
||||
"Vor dem Speichern <strong>Detektor testen</strong> verwenden und prüfen, ob die angezeigte installierte Version zum LXC passt."
|
||||
],
|
||||
"regexExampleLead": "Gemeinsame semantische Versionserfassung:",
|
||||
"regexExample": "v?(\\d+\\.\\d+\\.\\d+)",
|
||||
"regexCallout": "Ein erfolgreiches Regex-Match ist kein Beweis dafür, dass der Detektorpfad korrekt ist. Der Pfad oder das Paket muss auch in der registrierten realen Anlage vorhanden sein."
|
||||
},
|
||||
"updater": {
|
||||
"heading": "Versionsverfolgung und -aktualisierung sind unabhängig",
|
||||
"lead": "Der <link>Reiter Aktualisierungen</link> legt einen App-Abschnitt an, sobald ein Anwendungsdatensatz gespeichert wird.",
|
||||
"items": [
|
||||
"Ein Link-only-Record zeigt an, dass die Versionsverfolgung nicht konfiguriert ist, aber dennoch einen benutzerdefinierten Update-Befehl erhalten kann.",
|
||||
"Eine App mit Tracking, aber ohne ausführbare Methode zeigt eine neutrale Nachricht an, in der ein benutzerdefinierter Befehl angefordert wird.",
|
||||
"Eine App mit einem verifizierten Proxmox VE Helper-Scripts-Wrapper kann diesen integrierten Updater auch dann verwenden, wenn die Registrierung über einen Weblink begann.",
|
||||
"Durch Hinzufügen oder Bearbeiten eines Updaters wird der Detektor oder die Upstream-Quelle, die auf der Registerkarte App gespeichert ist, nicht geändert."
|
||||
]
|
||||
},
|
||||
"states": {
|
||||
"heading": "Versionsangaben auf der App-Karte",
|
||||
"colState": "Zustand",
|
||||
"colDisplay": "Anzeige",
|
||||
"colMeaning": "Bedeutung",
|
||||
"rows": [
|
||||
{
|
||||
"state": "Update verfügbar",
|
||||
"display": "Verfügbare Version in lila mit einem nach oben gerichteten Symbol",
|
||||
"meaning": "Die installierten und Upstream-Versionen unterscheiden sich."
|
||||
},
|
||||
{
|
||||
"state": "Aktuell",
|
||||
"display": "Installierte und neueste Versionen ohne den lila Alarm",
|
||||
"meaning": "Der letzte Check fand keine neuere Upstream-Version."
|
||||
},
|
||||
{
|
||||
"state": "Versionsprüfung ausstehend",
|
||||
"display": "Prüfung läuft oder steht aus",
|
||||
"meaning": "Der Datensatz ist konfiguriert, hat aber noch nicht beide Prüfungen abgeschlossen."
|
||||
},
|
||||
{
|
||||
"state": "Tracking deaktiviert",
|
||||
"display": "Nur Weblinks; kein Versionsvergleichsblock",
|
||||
"meaning": "Der Datensatz bleibt gültig und kann immer noch einen Updater haben."
|
||||
},
|
||||
{
|
||||
"state": "Prüffehler",
|
||||
"display": "Bernstein Erklärung im Inneren der Karte",
|
||||
"meaning": "Der zuvor gespeicherte Zustand bleibt sichtbar, während der Detektor oder Upstream-Fehler gemeldet wird."
|
||||
}
|
||||
]
|
||||
},
|
||||
"management": {
|
||||
"heading": "Verwalten von gespeicherten und vorgeschlagenen Apps",
|
||||
"lead": "Die Aktionen am unteren Rand des Tabs haben unterschiedliche Rollen:",
|
||||
"items": [
|
||||
"<strong>Anwendungen suchen</strong> aktualisiert die Erkennung nur für diesen LXC.",
|
||||
"<strong>Registrieren Sie eine andere Anwendung</strong> öffnet den Katalog und den manuellen Editor, ohne den LXC neu zu scannen.",
|
||||
"<strong>Bearbeiten</strong> zeigt je Karte Entfernen, Prüfen, Benachrichtigungen und Felder bearbeiten.",
|
||||
"<strong>Ausblenden</strong> entfernt einen unerwünschten Vorschlag. Ausgeblendete Erkennungen lassen sich in der Registrierungsübersicht wiederherstellen.",
|
||||
"<strong>Prüfen</strong> aktualisiert die Versionsdaten der gewählten gespeicherten App und sucht keine neuen Apps."
|
||||
]
|
||||
},
|
||||
"troubleshooting": {
|
||||
"heading": "Häufige Situationen",
|
||||
"colProblem": "Situation",
|
||||
"colResolution": "Lösung",
|
||||
"rows": [
|
||||
{
|
||||
"problem": "Software wurde installiert, nachdem ProxMenux gestartet wurde",
|
||||
"resolution": "Wählen Sie Anwendungen suchen. Der explizite Scan aktualisiert die zwischengespeicherten Vorschläge dieses LXC."
|
||||
},
|
||||
{
|
||||
"problem": "Keine Anwendung festgestellt",
|
||||
"resolution": "Registrieren Sie es manuell. Ein Name und ein Weblink sind ausreichend; Tracking kann später hinzugefügt werden."
|
||||
},
|
||||
{
|
||||
"problem": "Der vorgeschlagene Detektor gibt die falsche Version zurück",
|
||||
"resolution": "Öffnen Sie Felder bearbeiten, wählen Sie den realen Paket-, Binär- oder Dateipfad aus und testen Sie den Detektor vor dem Speichern."
|
||||
},
|
||||
{
|
||||
"problem": "Ein Docker Workload wird nicht als LXC App angeboten",
|
||||
"resolution": "Registrieren Sie Docker und fügen Sie die veröffentlichte Benutzeroberfläche des Workloads als Docker-Weblink hinzu. Image-Updates bleiben im Docker Abschnitt."
|
||||
},
|
||||
{
|
||||
"problem": "Eine gespeicherte App hat keinen Update-Button",
|
||||
"resolution": "Öffnen Sie die Registerkarte Updates und konfigurieren Sie die Aktualisierungsmethode. Versions-Tracking allein definiert nicht, wie ein Update installiert wird."
|
||||
}
|
||||
]
|
||||
},
|
||||
"figures": {
|
||||
"catalog": {
|
||||
"alt": "Anwendungsregistrierungskatalog mit Suchergebnissen, Logos, Ports und Detektorfeldern",
|
||||
"caption": "Katalog-Metadaten beschleunigen die Registrierung, während jeder vorgeschlagene Wert editierbar bleibt."
|
||||
},
|
||||
"webLinks": {
|
||||
"alt": "Gespeicherte LXC-Anwendungskarte mit einem anklickbaren Weblink",
|
||||
"caption": "Ein Link-Only-Record ist gültig: Das Versions-Tracking kann deaktiviert bleiben und ein Updater kann unabhängig hinzugefügt werden."
|
||||
},
|
||||
"tracking": {
|
||||
"alt": "Optionale Felder für den Detektor der installierten Version und die Upstream-Quelle",
|
||||
"caption": "Die Installationsversionserkennung und die Upstream-Quelle werden separat konfiguriert und getestet."
|
||||
},
|
||||
"card": {
|
||||
"alt": "Gespeicherte Anwendungskarte mit installierten und verfügbaren Versionen sowie einem Weblink",
|
||||
"caption": "Die Karte kombiniert Identität, Versionsnachweis und Webzugriff, ohne Update-Aktionen von diesem Tab aus auszuführen."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "LXC-Aktualisierungen: Betriebssystem, Apps und Docker | ProxMenux",
|
||||
"description": "Konfigurieren und Ausführen von Betriebssystem-, Anwendungs-, Docker Engine- und Docker-Image-Updates aus einem LXC-Container."
|
||||
},
|
||||
"header": {
|
||||
"title": "LXC-Aktualisierungen: Betriebssystem, Apps und Docker",
|
||||
"description": "Überprüfen Sie jedes Update-Ziel an einem Ort, führen Sie es unabhängig aus oder kombinieren Sie ausgewählte Ziele in einer kontrollierten Massenaktion."
|
||||
},
|
||||
"intro": {
|
||||
"p1": "Der Reiter <strong>Aktualisierungen</strong> trennt Versionserkennung und Installation. Registrierung und optionale Versionsverfolgung erfolgen im <link>App-Reiter</link>; ausführbare Aktualisierungsmethoden werden hier verwaltet.",
|
||||
"p2": "Eine gespeicherte Anwendung wird in Updates angezeigt, auch wenn sie nur einen Weblink enthält. Die Versionsverfolgung ist optional und ein Updater kann unabhängig konfiguriert werden.",
|
||||
"callout": "Die Registrierung wählt keinen Updater aus. Wird ein passender Helper-Scripts-Updater erkannt, wählen und speichern Sie <strong>Helper-Scripts</strong> oder <strong>Eigener Befehl</strong>. Die Erkennung garantiert keine Kompatibilität. Die Wahl gilt pro App, auch wenn mehrere denselben LXC nutzen."
|
||||
},
|
||||
"overview": {
|
||||
"heading": "Was der Tab enthält",
|
||||
"lead": "Jedes verfügbare Ziel hat seinen eigenen Abschnitt und seine eigene Aktion:",
|
||||
"items": [
|
||||
"<strong>Betriebssystempakete</strong> für Debian-, Ubuntu- und Alpine-Container.",
|
||||
"Ein Abschnitt je <strong>registrierter Anwendung</strong>, auch für Datensätze mit nur einem Link.",
|
||||
"Ein <strong>Docker</strong>-Abschnitt, wenn Docker registriert ist, wobei Docker Engine und getaggte Images gruppiert sind.",
|
||||
"Ein konfigurierbarer Abschnitt <strong>Sammelaktualisierung</strong> mit anschließenden Sicherungs-, Neustart- und Zeitplanoptionen."
|
||||
]
|
||||
},
|
||||
"mechanisms": {
|
||||
"heading": "Wie eine Aktualisierungsmethode ausgewählt wird",
|
||||
"lead": "Der integrierte Weg für Proxmox VE Helper-Scripts verwendet den offiziellen <helper>update-apps-Mechanismus</helper>. Andere Installationen verwenden die passende Paket-, Docker- oder eigene Methode.",
|
||||
"officialReference": "Offizielle Referenz: Die <helper>Proxmox VE Helper-Scripts-Update-Apps-Dokumentation</helper> umfasst interaktive und unbeaufsichtigte Modi, Backups, Trockenläufe, temporäre Build-Ressourcen, Protokolle und Exit-Codes.",
|
||||
"colSource": "Quelle",
|
||||
"colAction": "Gezeigte Aktion",
|
||||
"colNotes": "Was läuft",
|
||||
"rows": [
|
||||
{
|
||||
"source": "APT- oder APK-Pakete",
|
||||
"action": "OS Updates anwenden",
|
||||
"notes": "Aktualisiert die Containerpakete. Als dpkg- oder apk-Pakete installierte registrierte Apps werden im selben Lauf berücksichtigt."
|
||||
},
|
||||
{
|
||||
"source": "Proxmox VE Helper-Scripts",
|
||||
"action": "Update anwenden",
|
||||
"notes": "Nachdem Helper-Scripts explizit ausgewählt wurde, wird das offizielle Anwendungsskript ausgeführt, das durch den validierten /usr/bin/update-Wrapper identifiziert wurde. Eine Marker- oder Katalogübereinstimmung allein ermöglicht niemals die Ausführung."
|
||||
},
|
||||
{
|
||||
"source": "Eigener Befehl",
|
||||
"action": "Führen Sie den Updater aus",
|
||||
"notes": "Führt den gespeicherten Befehl im LXC aus und ersetzt jeden integrierten App-Updater für diesen Datensatz."
|
||||
},
|
||||
{
|
||||
"source": "Docker Engine",
|
||||
"action": "Docker Engine aktualisieren",
|
||||
"notes": "Aktualisiert nur installierte Docker-Pakete und deren erforderliche Abhängigkeiten. Andere Betriebssystempakete und Container bleiben unverändert."
|
||||
},
|
||||
{
|
||||
"source": "Docker-Image",
|
||||
"action": "Image aktualisieren",
|
||||
"notes": "Zieht das ausgewählte Image und erstellt die Compose-Servicegruppe oder den geschützten eigenständigen Container neu."
|
||||
}
|
||||
],
|
||||
"callout": "Ein eigener Befehl <strong>ersetzt</strong> Helper-Scripts für diese Anwendung. Manuelle, Sammel- und geplante Läufe beachten die gespeicherte Wahl. Vorhandene eigene Befehle und ausdrücklich gespeicherte ältere Sammel- bzw. aktivierte Zeitplanauswahlen bleiben erhalten. Neu registrierte Apps werden nie durch einen alten Zeitplan aufgenommen."
|
||||
},
|
||||
"docker": {
|
||||
"heading": "Docker Engine und Docker Images",
|
||||
"lead": "Nach der Docker-Registrierung im App-Reiter erscheinen Docker Engine und Image-Inventar im selben Abschnitt <strong>Docker</strong>.",
|
||||
"items": [
|
||||
"Die Docker Engine-Versionsverfolgung ist vom OS-Paketzähler getrennt und verfügt über einen eigenen Update-Button.",
|
||||
"Lokale Images mit Tags werden anhand unveränderlicher Digests mit ihrer Registry verglichen. <strong>Jetzt prüfen</strong> aktualisiert das Inventar, ohne Images herunterzuladen oder Container neu zu starten.",
|
||||
"Compose-Dienste werden von ihrem deklarierten Projekt aktualisiert. Images, die zur gleichen Servicegruppe gehören, werden zusammen bearbeitet, damit das Projekt nicht wiederholt neu erstellt wird.",
|
||||
"Ein eigenständiger Container wird anhand seiner aktuellen Konfiguration neu erstellt. Der geschützte Ablauf bewahrt Rücksetzungsdaten auf und stellt bei einem Fehler den vorherigen Container wieder her.",
|
||||
"Jedes Image kann separat in manuellen, massenhaften und geplanten Updates ausgewählt werden, mit Ausnahme deklarierter Compose-Abhängigkeiten, die dem übergeordneten Service folgen müssen."
|
||||
],
|
||||
"callout": "Container, die innerhalb von Docker laufen, werden nicht als unabhängige LXC-Anwendungen angezeigt. Ihre veröffentlichten Webports können als Links unter der Docker-Registrierung gespeichert werden, während Bildaktualisierungen im Docker-Bereich verbleiben."
|
||||
},
|
||||
"actions": {
|
||||
"heading": "Individuelle Aktionen und Statusfarben",
|
||||
"lead": "Jeder Abschnitt bleibt unabhängig voneinander umsetzbar, unabhängig davon, ob ein Bulk-Update konfiguriert ist oder nicht.",
|
||||
"items": [
|
||||
"<strong>Configure</strong> öffnet den Updater-Selektor, wenn keine Methode ausgewählt ist; <strong>Edit</strong> ändert eine gespeicherte Auswahl. Die Informationsschaltflächen erklären jede Option, verlinken auf die offizielle Dokumentation und zeigen ein benutzerdefiniertes Skriptbeispiel an. Die Auswahl einer Option führt sie nicht aus.",
|
||||
"Wenn die Versionsverfolgung deaktiviert ist, aber ein Updater vorhanden ist, wird die neutrale Aktion <strong>Run updater</strong> angezeigt. ProxMenux behauptet nicht, dass ein Update anhängig ist.",
|
||||
"Konfigurieren Sie ohne einen verfügbaren Helper-Scripts-Updater einen benutzerdefinierten Befehl. Das Deaktivieren einer Methode wählt nicht stillschweigend eine andere aus; bestehende Plan-/Zeitplanauswahlen bleiben gespeichert und nicht verfügbare Ziele werden gemeldet.",
|
||||
"Die Aktion <strong>Update image</strong> gilt nur für die ausgewählte Docker-Einheit; sie aktualisiert weder Docker Engine noch nicht verwandte Images."
|
||||
],
|
||||
"statusColState": "Bekannter Zustand",
|
||||
"statusColAppearance": "Aussehen",
|
||||
"statusColMeaning": "Bedeutung",
|
||||
"statusRows": [
|
||||
{
|
||||
"state": "Verifiziertes Update verfügbar",
|
||||
"appearance": "Lila Text, nach oben gerichtetes Symbol und lila Aktion",
|
||||
"meaning": "Installierte und verfügbare Versionen bzw. Image-Digests unterscheiden sich."
|
||||
},
|
||||
{
|
||||
"state": "Nachweislich aktuell",
|
||||
"appearance": "Grünes Häkchen und grüne Aktion Aktualisiert",
|
||||
"meaning": "Die letzte abgeschlossene Überprüfung bestätigt, dass das Ziel aktuell ist."
|
||||
},
|
||||
{
|
||||
"state": "Version unbekannt",
|
||||
"appearance": "Neutraler Text und neutrale Handlung",
|
||||
"meaning": "Ein Updater kann ausgeführt werden, aber es gibt keinen Versionsnachweis, um ihn als anhängig oder aktuell zu kennzeichnen."
|
||||
}
|
||||
]
|
||||
},
|
||||
"custom": {
|
||||
"heading": "Benutzerdefinierte Aktualisierungsbefehle",
|
||||
"lead": "Verwenden Sie einen benutzerdefinierten Befehl, wenn die Installation keinen verifizierten integrierten Updater hat oder wenn die normale Prozedur ersetzt werden muss.",
|
||||
"items": [
|
||||
"Öffnen Sie <strong>Configure</strong>, wenn das Feld leer ist, oder <strong>Edit</strong>, wenn bereits eine Methode vorhanden ist.",
|
||||
"Bei einer integrierten App oder Docker Engine zeigt der Editor den aktuell verwendeten Befehl an. Das Speichern verschiedener Inhalte macht es zum expliziten Override für diesen Datensatz.",
|
||||
"Testen Sie zuerst die komplette Prozedur im LXC Terminal. Es muss nicht interaktiv sein, das korrekte Arbeitsverzeichnis verwenden und beim Ausfall einen Nicht-Null-Ausgangsstatus zurückgeben.",
|
||||
"<code>pct exec</code> nicht einschließen; ProxMenux betritt bereits den Container und führt den Befehl als root aus."
|
||||
],
|
||||
"exampleLead": "Beispiel eines vollständigen Containerverfahrens:",
|
||||
"example": "cd /opt/my-app && ./update.sh",
|
||||
"callout": "Ein Versionsbefehl wie <code>myapp --version</code> liest nur eine Version; es ist kein Updater. Befehle laufen mit administrativen Privilegien, so dass gespeicherte Inhalte mit der gleichen Sorgfalt wie ein Root-Shell-Befehl überprüft werden müssen."
|
||||
},
|
||||
"bulk": {
|
||||
"heading": "Sammelaktualisierung",
|
||||
"lead": "Die Sammelaktualisierung erstellt eine wiederverwendbare Aktion für eine genau festgelegte Zielauswahl im LXC. Sie steht nach den App- und Docker-Abschnitten und vor <strong>Optionen</strong>.",
|
||||
"items": [
|
||||
"Betriebssystempakete sind Pflicht. Zusätzlich muss mindestens eine App, Docker Engine oder eine Docker-Image-Einheit ausgewählt werden.",
|
||||
"Apps und Docker-Einheiten werden einzeln ausgewählt. Der übergeordnete Compose-Dienst zeigt die mit ihm zu aktualisierenden Abhängigkeiten.",
|
||||
"Nicht verfügbare oder entfernte Ziele werden als veraltet markiert und müssen entfernt werden, bevor die Konfiguration gespeichert werden kann.",
|
||||
"<strong>Aktualisierungen anwenden</strong> ist lila, wenn ein gewähltes Ziel ein nachgewiesenes Update hat, grün, wenn alle nachweislich aktuell sind, und neutral bei unbekanntem Ergebnis.",
|
||||
"Durch das Entfernen der Bulk-Konfiguration werden keine einzelnen Aktualisierungsmethoden oder Einstellungen für geplante Aktualisierungen entfernt."
|
||||
],
|
||||
"callout": "Bulk Update ersetzt nicht die einzelnen Buttons. Es ist eine optionale Abkürzung für eine Auswahl, die zusammen laufen sollte."
|
||||
},
|
||||
"options": {
|
||||
"heading": "Backup- und Neustartoptionen",
|
||||
"lead": "Die gleichen Optionen gelten für manuelle, Massen- und geplante Durchläufe:",
|
||||
"items": [
|
||||
"<strong>Sicherung vor dem Anwenden</strong> erstellt ein vzdump-Backup auf dem gewählten Speicher. Schlägt die erforderliche Sicherung fehl, startet die Aktualisierung nicht.",
|
||||
"<strong>Neustart nach dem Anwenden</strong> startet den LXC nur nach einem erfolgreichen Lauf neu.",
|
||||
"Die Auswahlen werden pro LXC gespeichert und bleiben unabhängig von der Zielliste."
|
||||
]
|
||||
},
|
||||
"scheduled": {
|
||||
"heading": "Geplante Updates",
|
||||
"lead": "Geplante Updates verwenden die gleichen ausführbaren Ziele und Sicherheitsoptionen wie manuelle Aktionen.",
|
||||
"items": [
|
||||
"Wählen Sie einen voreingestellten oder cron-Ausdruck und wählen Sie dann genaue Ziele aus: Betriebssystempakete, einzelne Apps, Docker Engine, eigenständige Docker-Einheiten oder Compose-Dienstgruppen.",
|
||||
"Ein Release Hold gilt nur für ausgewählte Anwendungen mit Versionstracking. Apps ohne Tracking führen ihren Updater immer dann aus, wenn ihr Zeitplan fällig ist.",
|
||||
"Der Zustand des letzten Laufs unterscheidet Erfolg, Teilerfolg, Fehler, Sicherheitsaufschub und keine ausstehenden Updates. Nach dem ersten geplanten Lauf öffnet <strong>Aktualisierungen → Geplante Aktualisierungen → Protokoll anzeigen</strong> die vollständige Ausgabe des Updaters und seiner aufgerufenen Unterskripte.",
|
||||
"Nach jedem Durchlauf überprüft ProxMenux den standardmäßigen Debian-Reboot-erforderlichen Marker. Wenn ein Neustart erforderlich ist, wird dies auf der Registerkarte Updates und der Abschlussbenachrichtigung angezeigt; die Warnung wird gelöscht, wenn der LXC gestartet oder neu gestartet wird.",
|
||||
"Protokolle geplanter Läufe liegen auf dem Proxmox-Host in <code>/usr/local/share/proxmenux/logs/lxc-updates/</code> mit dem Namen <code><VMID>-scheduled-<run-id>.log</code>. Pro LXC bleiben die letzten zehn Protokolle erhalten; ältere Dateien werden automatisch gelöscht.",
|
||||
"Diese beibehaltene Historie gilt für geplante Updates. Ein manuelles Update zeigt seine Ausgabe live im Monitor-Ausführungsfenster an und erstellt kein geplantes Protokoll in diesem Verzeichnis.",
|
||||
"Externe Host-Zeitpläne, die von Proxmox VE Helper-Scripts erkannt wurden, werden separat angezeigt, so dass eine überlappende Automatisierung sichtbar ist."
|
||||
],
|
||||
"callout": "Führen Sie jede ausgewählte Methode manuell aus, bevor Sie einen Zeitplan aktivieren. Geplante Befehle können keine Eingabeaufforderungen beantworten."
|
||||
},
|
||||
"completion": {
|
||||
"heading": "Was passiert nach einem Update",
|
||||
"lead": "Das Update gilt nicht als abgeschlossen, wenn der Terminalbefehl lediglich beendet wird.",
|
||||
"items": [
|
||||
"Derselbe Lauf zeichnet sein Endergebnis auf und aktualisiert den OS-Paketzustand, die registrierten App-Versionen und das Docker-Inventar.",
|
||||
"Geplante Durchläufe behalten ihre Terminalausgabe bei und melden, ob ein Neustart noch erforderlich ist, um die Anwendung von Paketänderungen abzuschließen.",
|
||||
"Der LXC-Cache wird durch den verifizierten Post-Update-Zustand ersetzt, so dass Badges und Buttons das vorherige Ergebnis nicht beibehalten.",
|
||||
"Wenn ein angehaltener oder wiederhergestellter LXC startet, aktualisiert das vorhandene Lebenszyklusereignis diesen LXC erneut. Docker-Inventar wartet, bis der Daemon fertig ist, anstatt ein leeres Startergebnis als endgültig zwischenzuspeichern.",
|
||||
"Aktivierte Benachrichtigungen werden vom finalisierten Durchlauf ausgegeben, einschließlich Teilfehlern und gruppierten Docker-Bildergebnissen."
|
||||
]
|
||||
},
|
||||
"troubleshooting": {
|
||||
"heading": "Häufige Situationen",
|
||||
"colProblem": "Situation",
|
||||
"colResolution": "Lösung",
|
||||
"rows": [
|
||||
{
|
||||
"problem": "Es wurde keine Aktualisierungsmethode identifiziert",
|
||||
"resolution": "Öffnen Sie die Konfiguration, fügen Sie die offizielle nicht-interaktive Prozedur hinzu und testen Sie sie manuell, bevor Sie sie planen."
|
||||
},
|
||||
{
|
||||
"problem": "Eine Proxmox VE Helper-Scripts-Identität wird angezeigt, aber es gibt keine Aktion",
|
||||
"resolution": "Der LXC hat Legacy-Identifikationsdaten, aber keinen verifizierten /usr/bin/update-Wrapper. Fügen Sie eine benutzerdefinierte Methode erst hinzu, nachdem Sie das korrekte Verfahren bestätigt haben."
|
||||
},
|
||||
{
|
||||
"problem": "Docker-Bilder sind nach dem Start oder der Wiederherstellung vorübergehend leer",
|
||||
"resolution": "Warten Sie, bis Docker fertig ist, oder drücken Sie jetzt Überprüfen. Das Inventar wiederholt den Start und behandelt ein vorübergehendes leeres Ergebnis nicht als endgültig."
|
||||
},
|
||||
{
|
||||
"problem": "Ein gespeichertes Bulk-Ziel ist nicht mehr verfügbar",
|
||||
"resolution": "Bearbeiten Sie die Bulk-Konfiguration, entfernen Sie das veraltete Ziel und wählen Sie den aktuellen Ersatz aus, wenn eines vorhanden ist."
|
||||
},
|
||||
{
|
||||
"problem": "Ein benutzerdefinierter Befehl scheitert",
|
||||
"resolution": "Führen Sie es im LXC-Terminal aus und überprüfen Sie dessen Pfad, Abhängigkeiten, nicht-interaktive Flags und Exit-Code."
|
||||
},
|
||||
{
|
||||
"problem": "Ein geplantes Update sagt, dass ein Neustart erforderlich ist",
|
||||
"resolution": "Öffnen Sie Protokoll anzeigen, prüfen Sie den abgeschlossenen Lauf und starten Sie den LXC neu. ProxMenux löscht die Warnung, sobald das Lebenszyklusereignis den erneuten Start meldet."
|
||||
}
|
||||
]
|
||||
},
|
||||
"figures": {
|
||||
"osPending": {
|
||||
"alt": "Abschnitt Betriebssystempakete mit ausstehenden und Sicherheitsupdates",
|
||||
"caption": "Der Betriebssystembereich hält Paketaktualisierungen unabhängig von Anwendungs- und Docker-Aktionen."
|
||||
},
|
||||
"options": {
|
||||
"alt": "LXC Update-Optionen mit Pre-Update-Backup und Post-Update-Neustart",
|
||||
"caption": "Backup- und Neustarteinstellungen gelten für manuelle, Massen- und geplante Ausführung."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,244 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: VMs und LXCs | ProxMenux-Dokumentation",
|
||||
"description": "Inventar aller Gäste mit CPU, Arbeitsspeicher und Datenträgern in Echtzeit. Die Details zeigen Konfiguration, Ressourcen, Sicherungen, aktuelle Proxmox-Protokollergebnisse, Notizen und Starten / Herunterfahren / Neustart / Stopp."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: VMs und LXCs",
|
||||
"description": "Vollständiges Gastinventar des Knotens: vier Kennzahlen oben, eine sortierbare VM-/LXC-Liste darunter und Gastdetails mit Konfiguration, Ressourcen, Sicherungen, Protokollen sowie Starten/Herunterfahren/Neustart/Stopp.",
|
||||
"section": "ProxMenux Monitor · Übersicht"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Steuerung der Gäste",
|
||||
"body": "Hier steuern Sie den Lebenszyklus der Gäste. Aktionen laufen nach ausdrücklicher Bestätigung über <code>POST /api/vms/<vmid>/control</code> und aktualisieren die Gastzeile. Erzwungenes Ausschalten erfordert die eigene Schaltfläche Stopp erzwingen."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Obere Reihe: vier Stat-Karten",
|
||||
"intro": "Vier Karten fassen den Gastzustand zusammen: Gesamtzahl, CPU-Auslastung, zugewiesener Arbeitsspeicher im Verhältnis zur Hostkapazität und Datenträgerzuweisung.",
|
||||
"imageAlt": "Registerkarte VMs & LXCs — oberste Reihe von vier Statistikkarten: Total VMs & LXCs, Total CPU, Total Memory, Total Disk",
|
||||
"imageCaption": "Obere Reihe: Gesamtzahlen und Laufend/Gestoppt, aktuelle CPU-Auslastung, belegter Speicher / laufenden Gästen zugewiesener Speicher / insgesamt zugewiesener Speicher mit Grenzwertanzeige sowie zugewiesener Datenträgerplatz.",
|
||||
"headerCard": "Karte",
|
||||
"headerWhat": "Was es zeigt",
|
||||
"totalLabel": "Gesamtzahl der VMs und LXCs",
|
||||
"totalWhat": "Gesamtzahl mit zwei Abzeichen — <em>X Running</em> (grün) und <em>Y Stopped</em> (rot, nur wenn > 0). Die Nummer, die Sie sehen, wenn etwas nach einem Neustart nicht wieder auftaucht.",
|
||||
"cpuLabel": "CPU gesamt",
|
||||
"cpuWhat": "Gesamte aktuelle CPU-Auslastung aller Gäste als Anteil der physischen Host-CPU mit der Fußzeile <em>„Zugewiesene CPU-Auslastung“</em>.",
|
||||
"memoryLabel": "Gesamtspeicher",
|
||||
"memoryIntro": "Drei Messwerte vertikal gestapelt:",
|
||||
"memoryItems": [
|
||||
"<strong>Aktuell belegt</strong> — großer Wert, etwa <em>15.4 GB</em>, und <em>X.X % von Y GB</em> des Host-RAMs. Der blaue Balken zeigt den Prozentsatz.",
|
||||
"<strong>Laufenden Gästen zugewiesen</strong> + <strong>Insgesamt zugewiesen</strong> — Summe von <code>maxmem</code> der <em>laufenden</em> Gäste neben der Summe <em>aller</em> Gäste einschließlich gestoppter. Die erste ist jetzt relevant, die zweite beim gleichzeitigen Start aller Gäste.",
|
||||
"<strong>Innerhalb der Grenzen</strong> ist grün und wechselt zu <em>Überbucht</em>, wenn die Gesamtzuweisung den Host-RAM übersteigt. Kontrollierte Überbuchung kann mit KSM funktionieren; die Anzeige warnt früh bei knappem Spielraum."
|
||||
],
|
||||
"diskLabel": "Gesamtes Laufwerk",
|
||||
"diskWhat": "Summe des Speicherplatzes, der allen Gästen in der entsprechenden Einheit (GB / TB) zugewiesen ist, mit der Fußzeile <em>\"Zugeordneter Speicherplatz\"</em>."
|
||||
},
|
||||
"inventory": {
|
||||
"heading": "Liste virtueller Maschinen und Container",
|
||||
"intro": "Eine Reihe pro Gast. Die Liste stammt aus <code>/api/vms</code>, die <code>qm list</code> + <code>pct list</code> + <code>pvesh /cluster/resources</code> auf dem Host konsolidiert.",
|
||||
"imageAlt": "Liste virtueller Maschinen und Container — eine Zeile pro Gast mit Status, Typabzeichen, Name, ID und Inline-CPU / Speicher / Festplattenprozentsatz",
|
||||
"imageCaption": "Das mobil optimierte Layout des Inventars - die gleichen Daten, die die Desktop-Ansicht zeigt, werden in einer einzigen Spalte neu gestapelt, wobei die Prozentsätze und Statusindikatoren kompakt gehalten werden.",
|
||||
"rowsIntro": "Jede Zeile zeigt:",
|
||||
"rows": [
|
||||
"<strong>Statussymbol</strong> — grünes Wiedergabedreieck für laufend oder rotes Quadrat für gestoppt. Gestoppte Gäste werden abgeblendet und fallen sofort auf.",
|
||||
"<strong>Typanzeige</strong> — <em>LXC</em> in Cyan für Container, <em>VM</em> in Lila für virtuelle Maschinen.",
|
||||
"<strong>Name</strong> — Hostname oder Anzeigename des Gasts.",
|
||||
"<strong>VMID</strong> — die numerische ID von Proxmox unter dem Namen.",
|
||||
"<strong>Inline-Metriken</strong> — drei Prozent mit ihrem Symbol (CPU %, Memory %, Disk %). Jedes Symbol wird orange, wenn die Metrik eine Aufmerksamkeitsschwelle überschreitet (z. B. Speicher über 90 %), so dass ein schneller Scan Ihnen sagt, welcher Gast unter Druck steht, ohne ihn zu öffnen."
|
||||
],
|
||||
"clickHint": "Ein Klick auf eine Zeile öffnet den Detaildialog, unabhängig davon, ob der Gast läuft oder gestoppt ist.",
|
||||
"mobileTitle": "Die Liste ist für Mobilgeräte entworfen",
|
||||
"mobileBody": "Auf Telefonen und in schmalen Fenstern stehen Typ, Name, ID und die drei Prozentwerte untereinander wie im Bild. Auf breiten Ansichten verteilen sie sich horizontal. In beiden Fällen öffnet ein Tippen auf die gesamte Zeile die Details."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Gastdetaildialog",
|
||||
"intro": "Der Detaildialog zeigt Gastname, VMID, Typ, Zustand und Laufzeit. Seine Navigation passt sich dem Gast an: <strong>Status</strong>, <strong>App</strong> und <strong>Updates</strong> für die LXC-Anwendungsverwaltung, <strong>Mounts</strong> bei vorhandenen LXC-Mountpoints, <strong>Logs</strong> für durch OCI manager Apps installierte Container sowie <strong>Backups</strong> und <strong>Firewall</strong>. Die feste Aktionsleiste hält die Start- und Stoppfunktionen sowie das LXC-Terminal in jeder Registerkarte bereit.",
|
||||
"statusTitle": "Tab. 1 — Status",
|
||||
"statusImageAlt": "Gastdetails — Status mit Live-Werten für CPU, Arbeitsspeicher und Datenträger, Datenträger-/Netzwerk-I/O, Betriebssystemlogo und Ressourcen/IP-Adressen",
|
||||
"statusImageCaption": "Status: oben CPU, Arbeitsspeicher und Datenträger mit Balken; darunter gesamte I/O-Daten (Datenträger gelesen/geschrieben, Netzwerk empfangen/gesendet); anschließend Ressourcen mit Notizen, + Info und IP-Adressliste.",
|
||||
"statusIntro": "Der Standardreiter zum Prüfen des Gastzustands. Drei Bereiche:",
|
||||
"liveTitle": "1. Zeile Live-Metriken",
|
||||
"liveItems": [
|
||||
"<strong>CPU-Auslastung (X Kerne)</strong> — Prozentsatz mit Balken. Die konfigurierte Kernzahl im Kopf erklärt, worauf sich 100 % bezieht.",
|
||||
"<strong>Arbeitsspeicher</strong> — <em>belegt / maximal</em> in GB mit Balken.",
|
||||
"<strong>Datenträger</strong> — <em>belegt / maximal</em> für das primäre Gast-Image im selben Format."
|
||||
],
|
||||
"ioTitle": "2. I/O-Gesamtwerte + OS-Logo",
|
||||
"ioItems": [
|
||||
"<strong>Datenträger-I/O</strong> — gelesene (↓) und geschriebene (↑) Daten seit dem Start. Zeigt einen plötzlichen I/O-Anstieg gegenüber dem üblichen Gastverhalten.",
|
||||
"<strong>Netzwerk-I/O</strong> — insgesamt empfangene (↓) und gesendete (↑) Daten, entsprechend den Datenträgerwerten.",
|
||||
"<strong>OS-Verteilungslogo</strong> - das Debian / Ubuntu / Alpine / Windows / usw.-Symbol, das vom Betriebssystemtyp des Gastes erkannt wird. Ein schneller visueller Hinweis beim Scrollen mehrerer geöffneter Modals."
|
||||
],
|
||||
"resourcesTitle": "3. Ressourcenblock",
|
||||
"resourcesIntro": "Gastkonfiguration aus Proxmox: CPU-Kerne, Arbeitsspeicher (konfiguriertes <code>maxmem</code>) und Swap. Zwei aufklappbare Bereiche im Kopf:",
|
||||
"resourcesItems": [
|
||||
"<strong>Notizen</strong> — bearbeitbare Gastbeschreibung. Speichern ruft <code>PUT /api/vms/<vmid>/config</code> auf und schreibt in <code>/etc/pve/qemu-server/<vmid>.conf</code> oder <code>/etc/pve/lxc/<vmid>.conf</code>.",
|
||||
"<strong>+ Info</strong> — BIOS-Modus, Maschinentyp, Agentstatus, hostpci-Passthrough-Einträge, CT-Einhängepunkte und Startreihenfolge."
|
||||
],
|
||||
"ipsTitle": "4. IP-Adressen",
|
||||
"ipsBody": "Jede IPv4-/IPv6-Adresse des Gasts erscheint als grüne Anzeige. Die Liste bleibt bei gestopptem Gast oder einer VM ohne QEMU-Agent leer. LXCs melden ihre Adressen direkt.",
|
||||
"appTitle": "Tab 2 — App (nur LXC)",
|
||||
"appIntro": "Registriert Anwendungen, die zum LXC gehören, speichert Weblinks und vergleicht optional installierte und verfügbare Versionen. Vorschläge kommen aus dem Start-Cache; <strong>Find-Anwendungen</strong> aktualisiert ausdrücklich die Entdeckung für diesen LXC, nachdem neue Software installiert wurde.",
|
||||
"appLinkLead": "Siehe die",
|
||||
"appLinkLabel": "dedizierte App-Seite",
|
||||
"appLinkTail": "für zwischengespeicherte Erkennung, kataloggestützte Registrierung, Docker-Weblinks und Versionsdetektoren.",
|
||||
"updatesTitle": "Tab 3 — Updates (nur LXC)",
|
||||
"updatesIntro": "<strong>Betriebssystempakete</strong>, Apps, <strong>Docker Engine</strong> und Docker-Images bleiben getrennte Ziele. Jedes lässt sich einzeln starten oder in einer genau festgelegten Sammelaktion bzw. einem Zeitplan auswählen.",
|
||||
"updatesLinkLead": "Siehe die",
|
||||
"updatesLinkLabel": "dedizierte Updates Seite",
|
||||
"updatesLinkTail": "für integrierte und eigene Updater, Neuerstellung von Docker-Containern, Sammelauswahl, Sicherheitsoptionen und Zeitplanung.",
|
||||
"mountsTitle": "Reiter 4 — Einhängepunkte (nur LXC, falls vorhanden)",
|
||||
"mountsImageAlt": "LXC-Details, Einhängepunkte: PVE-Volumes, Bind-Mounts vom Host oder PVE-Speicher sowie im CT eingehängte NFS-/CIFS-Freigaben. Je Karte: Typ, Kapazität, belegte/gesamte Bytes, Optionen und Statuspunkt — grün intakt, bernsteinfarben schreibgeschützt/abweichend, rot nicht erreichbar.",
|
||||
"mountsImageCaption": "Einhängepunkte erscheint nur bei LXCs mit mindestens einem konfigurierten oder nachträglich hinzugefügten Remote-Einhängepunkt. Ohne Einhängepunkte fehlt der Reiter.",
|
||||
"mountsIntro": "Proxmox zeigt konfigurierte <code>mpX</code>-Einhängepunkte, jedoch keine später im CT über <code>mount.cifs</code>, NFS mit <code>autofs</code> usw. hinzugefügten. Dieser Reiter verbindet <strong>beide Ansichten</strong>: konfigurierte Einhängepunkte <strong>und</strong> im Container erkannte Laufzeiteinhängungen, mit Status und abrufbarer Kapazität.",
|
||||
"mountTypesTitle": "Erkannte Einhängepunkttypen",
|
||||
"mountTypesItems": [
|
||||
"<strong>PVE-Volume</strong> — liegt auf Proxmox-verwaltetem Speicher, etwa ZFS-Subvolume, Verzeichnis oder Ceph RBD. Die Kapazität stammt aus den PVE-Speicherstatistiken und entspricht der Proxmox-Anzeige.",
|
||||
"<strong>Bind-Mount aus PVE-Speicher</strong> — <code>mpX</code>-Eintrag mit einem Pfad auf PVE-bekanntem Speicher.",
|
||||
"<strong>Bind-Mount vom Host</strong> — <code>mpX</code>-Eintrag mit beliebigem Hostpfad (<code>/mnt/something</code>). Die Kapazität liefert <code>df</code> für diesen Pfad.",
|
||||
"<strong>Ad-hoc in CT</strong> – Mount, der <em>nur</em> im Mount-Namespace des Containers existiert (z. B. eine NFS-Freigabe, die der CT selbstständig mountet). Die Kapazität wird über <code>pct exec <vmid> df</code> gelesen, was die einzige Möglichkeit ist, sie anzuzeigen – <code>/proc/<pid>/root</code> vom Host stellt die tatsächlichen Statistiken des Remote-Mounts nicht offen."
|
||||
],
|
||||
"mountStateTitle": "Statuspunkt und Warnungen je Karte",
|
||||
"mountStateItems": [
|
||||
"<green/> <strong>Grün</strong> — Einhängepunkt intakt und erreichbar.",
|
||||
"<amber/> <strong>Bernsteinfarben</strong> — konfiguriert, aber nicht eingehängt, schreibgeschützt oder <em>Zombie-Bind</em>. Dabei fehlt die Hostquelle, während der CT sie noch als eingehängt sieht, etwa nach Entfernen eines USB-Laufwerks oder <code>umount</code> auf dem Host.",
|
||||
"<red/> <strong>Rot</strong> — nicht erreichbar: Die Laufzeitprüfung konnte den Einhängepunkt nicht erreichen, etwa eine NFS-Freigabe bei ausgefallenem Server."
|
||||
],
|
||||
"mountsCalloutTitle": "Zusätzliche Informationen gegenüber Proxmox",
|
||||
"mountsCalloutBody": "Zeigt alle Lese- und Schreibziele des Containers samt Kapazität. Im CT eingehängte NFS-/CIFS-Freigaben, die Proxmox nicht anzeigt, erhalten dieselbe Darstellung und Zustandsprüfung. Nicht erreichbare Remote-Mounts und Zombie-Binds werden vor Problemen bei einer Sicherung markiert.",
|
||||
"logsTitle": "Tab 5 — Protokolle (nur OCI-Container)",
|
||||
"logsBody": "Nur für Container aus OCI manager Apps. Zeigt die Hauptprozess-Konsole des Images aus <code>/var/log/proxmenux/oci/VMID.console.log</code>: letzte 100, 500 oder 1000 Zeilen, Live-Verfolgung bei laufendem Container, Filter und Download. Die Datei wird beim Öffnen neu gelesen, auch bei gestopptem Container. Details: <ociLink>OCI-Container in ProxMenux Monitor</ociLink>.",
|
||||
"backupsTitle": "Tab. 6 — Backups",
|
||||
"backupsImageAlt": "Pro-Gast-Bohr-in-Modal - Backups-Registerkarte mit der verfügbaren Backup-Liste, Ziel-Tag, Größen und der Create Backup-Schaltfläche",
|
||||
"backupsImageCaption": "Alle Sicherungen dieses Gasts auf konfigurierten Proxmox-Speichern, neueste zuerst. Die Kopfzeile zeigt ihre Anzahl.",
|
||||
"backupsIntro": "Listet alle Gastsicherungen auf konfigurierten Proxmox-Speichern, neueste zuerst. Der Zähler im Titel zeigt, ob Sicherungen vorhanden sind. Jede Zeile enthält :",
|
||||
"backupsItems": [
|
||||
"<strong>Zeitstempel</strong> — Datum und Uhrzeit des Laufs.",
|
||||
"<strong>Zielanzeige</strong> — Speicherort (PBS-Cloud, PBS-Local, NFS-Backup, …), nach Zustand eingefärbt.",
|
||||
"<strong>Größe</strong> — endgültige Größe der Sicherung auf dem Datenträger."
|
||||
],
|
||||
"backupsOutro": "<strong>+ Sicherung erstellen</strong> startet eine Sicherung auf dem in Proxmox als „Backup target“ markierten Speicher. Die Wiederherstellung erfolgt in der Proxmox-Weboberfläche; Monitor zeigt aktuelle Sicherungen des Gasts und erstellt neue.",
|
||||
"firewallTitle": "Tab. 7 — Firewall",
|
||||
"firewallIntro": "Liest das Proxmox-Firewallprotokoll des Gasts direkt vom Host, ohne Zusatzdienst oder regelmäßige Abfragen. Der Reiter ist immer sichtbar; der Inhalt hängt davon ab, ob die Firewall aktiv ist und Regeln tatsächlich protokollieren.",
|
||||
"firewallItems": [
|
||||
"<strong>Firewall deaktiviert</strong> — eine bernsteinfarbene Mitteilung erklärt genau, wo sie in der Proxmox-Benutzeroberfläche aktiviert werden soll (<em><Container|VM> → Firewall → Options</em>) und erinnert Sie daran, dass mindestens eine Regel <code>log: info</code> (oder höher) benötigt, bevor Pakete angezeigt werden.",
|
||||
"<strong>Firewall aktiv, noch keine Ereignisse</strong> — Hinweis im leeren Bereich auf die nötige Protokollierung, hilfreich direkt nach dem Aktivieren.",
|
||||
"<strong>Ereignisse vorhanden</strong> — scrollbarer Monospace-Bereich mit Originaleinträgen nach Aktion: <green>ACCEPT</green> grün, <orange>REJECT</orange> orange, <red>DROP</red> rot. Der Zähler im Kopf nennt die geladenen Einträge."
|
||||
],
|
||||
"firewallRefresh": "<em>Aktualisieren</em> lädt neue Einträge bei Bedarf. Ohne automatische Abfrage bleibt die Ansicht eine Momentaufnahme des Öffnens oder letzten Aktualisierens. Quelle ist <code>/var/log/pve-firewall.log</code>, nach VMID gefiltert über <code>GET /api/vms/<vmid>/firewall/log</code>.",
|
||||
"firewallCalloutTitle": "Warum haben Sie es hier, wenn die Proxmox-Benutzeroberfläche es bereits zeigt?",
|
||||
"firewallCalloutBody": "Spart den Wechsel zur Proxmox-Oberfläche und hält die Ansicht auf dieselbe VMID beschränkt: Gast starten, Einhängepunkte und Firewallereignisse prüfen, Gast wieder stoppen. Regeln werden in Proxmox bearbeitet; Monitor verändert sie nicht.",
|
||||
"actionBarTitle": "Untere Aktionsleiste",
|
||||
"actionBarIntro": "Immer sichtbar am Fuß des Modals, unabhängig davon, welcher Tab aktiv ist:",
|
||||
"consoleItem": "<strong>Konsole</strong> öffnet bei laufenden LXCs <code>pct enter <vmid></code> im Container. Sie nutzt wie der <link>Terminalreiter</link> xterm.js und WebSocket sowie die <strong>mobile Werkzeugleiste</strong> mit ESC, TAB, Pfeilen, Enter und Ctrl+C / Ctrl+X / Ctrl+R. Damit ist die Bedienung per Telefon oder Tablet möglich. VMs nutzen hier keine Konsole; verwenden Sie Proxmox noVNC.",
|
||||
"lifecycleIntro": "Darunter stehen vier Schaltflächen im 2×2-Raster. Jede sendet <code>POST /api/vms/<vmid>/control</code> mit der passenden <code>action</code>. Ihre Verfügbarkeit hängt vom Gastzustand ab.",
|
||||
"headerButton": "Schaltfläche",
|
||||
"headerEnabled": "Aktiviert, wenn",
|
||||
"headerAction": "Aktion an Host gesendet",
|
||||
"lifecycleRows": [
|
||||
{
|
||||
"button": "Starten",
|
||||
"color": "green",
|
||||
"enabled": "Der Gast ist gestoppt.",
|
||||
"action": "qm start / pct start"
|
||||
},
|
||||
{
|
||||
"button": "Herunterfahren",
|
||||
"color": "blue",
|
||||
"enabled": "Der Gast läuft.",
|
||||
"action": "qm shutdown / pct shutdown — geordnetes Herunterfahren, ACPI"
|
||||
},
|
||||
{
|
||||
"button": "Neustart",
|
||||
"color": "blue",
|
||||
"enabled": "Der Gast läuft.",
|
||||
"action": "qm reboot / pct reboot — geordneter Neustart"
|
||||
},
|
||||
{
|
||||
"button": "Stopp erzwingen",
|
||||
"color": "red",
|
||||
"enabled": "Der Gast läuft.",
|
||||
"action": "qm stop / pct stop — hartes Ausschalten"
|
||||
}
|
||||
],
|
||||
"forceStopTitle": "Stopp erzwingen schaltet sofort aus",
|
||||
"forceStopBody": "<strong>Stopp erzwingen</strong> umgeht das Herunterfahren wie ein Ziehen des Stromkabels. Nutzen Sie <strong>Herunterfahren</strong>, solange der Gast reagiert. Erzwingen Sie den Stopp nur bei hängendem Herunterfahren und akzeptiertem Datenverlustrisiko. Farbe und Beschriftung warnen vor versehentlichem Auslösen."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Wie die Daten gesammelt werden",
|
||||
"headerSection": "Abschnitt des Reiters",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerSource": "Quelle",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Bestandsverzeichnis",
|
||||
"endpoint": "/api/vms",
|
||||
"source": "<code>pvesh get /cluster/resources --type vm</code> für VM und CT."
|
||||
},
|
||||
{
|
||||
"section": "Detail-Panel (Konfiguration, Netzwerk, Festplatten)",
|
||||
"endpoint": "/api/vms/<vmid>",
|
||||
"source": "<code>qm config <id></code> für VMs / <code>pct config <id></code> für CTs."
|
||||
},
|
||||
{
|
||||
"section": "Kennzahlendiagramm pro Gast",
|
||||
"endpoint": "/api/vms/<vmid>/metrics",
|
||||
"source": "PVE RRD-Daten (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) werden zu einer chartfreundlichen Form verdichtet."
|
||||
},
|
||||
{
|
||||
"section": "Aktuelle Proxmox-Protokollergebnisse",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "<code>pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000</code>. Bei Befehlsfehlern wird eine leere Liste zurückgegeben; dies sind keine vollständigen Systemprotokolle aus dem Gast."
|
||||
},
|
||||
{
|
||||
"section": "Backups für Gäste verfügbar",
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
"source": "<code>pvesm list <storage></code> durch VMID gefiltert."
|
||||
},
|
||||
{
|
||||
"section": "Pro-Gast-Firewall-Log (Firewall-Tab)",
|
||||
"endpoint": "/api/vms/<vmid>/firewall/log",
|
||||
"source": "<code>/var/log/pve-firewall.log</code> durch VMID gefiltert."
|
||||
},
|
||||
{
|
||||
"section": "Einschalttasten (Start / Stop / Reboot / Shutdown)",
|
||||
"endpoint": "/api/vms/<vmid>/control",
|
||||
"source": "<code>qm start|stop|reboot|shutdown</code> oder <code>pct</code>-Äquivalente."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Dashboard-Daten mit PVE abgleichen",
|
||||
"codeComment2": "# Gastkonfiguration genau wie im Detaildialog prüfen",
|
||||
"codeComment3": "# VM",
|
||||
"codeComment4": "# CT"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tailRich": " — Kategorie VMs und Container: Startfehler, QMP-Zeitüberschreitungen und CT-Herunterfahrfehler."
|
||||
},
|
||||
{
|
||||
"label": "Benachrichtigungen",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tailRich": "— was die <code>vm_*</code>, <code>ct_*</code>, <code>migration_*</code> und <code>backup_*</code> Ereignisse nachgeschaltet auslösen."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tailRich": " — die Endpunkte für VMs und Sicherungen."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard-Index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tailRich": " — die anderen Reiter."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux: VM erstellen",
|
||||
"href": "/docs/create-vm",
|
||||
"tailRich": " — Bereitstellung: NAS-Systemvorlagen (Synology und andere), Linux-/Windows-VMs und für Proxmox angepasste Standardwerte."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,372 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox-Zustandsüberwachung — CPU, Arbeitsspeicher, Datenspeicher, SMART, ZFS, Protokolle | ProxMenux",
|
||||
"description": "Proaktive Zustandsüberwachung für Proxmox VE: zehn Kategorien alle fünf Minuten (CPU und Temperatur, Arbeitsspeicher und Swap, Datenspeicher, Laufwerke/SMART, Netzwerk, VMs, Dienste, Protokolle, Updates und Sicherheit), vier Schweregrade, Unterdrückungsdauer je Kategorie, automatische Bereinigung behobener Fehler, dauerhafter Laufwerksverlauf und Meldungen über Telegram, Discord, Gotify oder E-Mail.",
|
||||
"ogTitle": "Proxmox-Zustandsüberwachung — CPU, Arbeitsspeicher, Datenspeicher, SMART, ZFS, Protokolle",
|
||||
"ogDescription": "Proaktive Zustandsüberwachung für Proxmox VE in zehn Kategorien, mit Schweregraden, Unterdrückungsdauer und ereignisbasierten Benachrichtigungen.",
|
||||
"twitterTitle": "Proxmox Gesundheitsmonitor | ProxMenux",
|
||||
"twitterDescription": "Proaktive Zustandsüberwachung für Proxmox VE in zehn Kategorien mit Schweregraden und Benachrichtigungen."
|
||||
},
|
||||
"header": {
|
||||
"title": "Gesundheitsmonitor",
|
||||
"description": "Die fortlaufende Selbstprüfung untersucht zehn Kategorien des Hostzustands im Fünfminutentakt. Dazwischen erfasst sie Messwerte, fasst doppelte Befunde zu strukturierten Ereignissen zusammen und versorgt Dashboard, Benachrichtigungen und optionale KI-Überarbeitung aus derselben Datenquelle.",
|
||||
"section": "ProxMenux-Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Ein Scanner, drei Verbraucher",
|
||||
"body": "Ein Hintergrundthread führt alle fünf Minuten die vollständige Prüfung aus und speichert jeden Befund unter einem stabilen <code>error_key</code> in SQLite. Damit kann <strong>(1)</strong> das Dashboard den aktuellen Zustand anzeigen, <strong>(2)</strong> das Benachrichtigungssystem neue Ereignisse an die eingerichteten Kanäle verteilen und <strong>(3)</strong> der optionale KI-Assistent Warnungen verständlich umformulieren. Eine Konfiguration versorgt alle nachfolgenden Komponenten."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Wie es funktioniert",
|
||||
"intro": "Die Zustandsüberwachung nutzt zwei parallele Threads. Ein leichter <strong>Messwertsammler</strong> füllt Verlaufspuffer für CPU, Arbeitsspeicher und Temperatur. Der <strong>vollständige Prüfzyklus</strong> liest die Puffer, bewertet anhaltende Zustände und führt etwa alle fünf Minuten die übrigen Prüfungen aus. Anschließend speichert er Befunde für Dashboard und Benachrichtigungen in SQLite.",
|
||||
"scannerTitle": "Von der Probe zum gespeicherten Befund",
|
||||
"scannerCaption": "Der Sammler füllt zwischen den Prüfzyklen Verlaufspuffer: CPU alle 5 s, Arbeitsspeicher alle 30 s und Temperatur alle 15 s. Er wertet selbst keine Warnungen aus. Der vollständige Zyklus bewertet die Puffer und führt aufwendigere Prüfungen für SMART, ZFS, Protokolle und Dienste aus, bevor er Befunde in SQLite speichert.",
|
||||
"scannerArrowLabel": "Schritt",
|
||||
"scannerNodes": {
|
||||
"samplerLabel": "Messwertsammler",
|
||||
"samplerDetail": "CPU-Auslastung 5 s\nArbeitsspeicher 30 s\nTemperatur 15 s\n→ Verlaufspuffer",
|
||||
"cycleLabel": "Vollständiger Gesundheitszyklus",
|
||||
"cycleDetail": "Alle 5 min\nLiest Puffer\n+ aktuelle Prüfungen\n(SMART, ZFS,\nDienste, Journal …)",
|
||||
"checksLabel": "Prüfungen nach Kategorien",
|
||||
"checksDetail": "Zehn Kategorien\n(CPU, Arbeitsspeicher,\nDatenspeicher, Laufwerke,\nNetzwerk, VMs,\nDienste, Protokolle,\nUpdates, Sicherheit)",
|
||||
"sqliteLabel": "SQLite",
|
||||
"sqliteDetail": "Tabelle errors\n(aktiv +\nunterdrückt)\n+ disk_observations\n(dauerhafter Verlauf\nje Laufwerk)"
|
||||
},
|
||||
"notifTitle": "Vom gespeicherten Befund zum Benutzer",
|
||||
"notifCaption": "Der Meldepfad. Die gleiche Fehlertabelle steuert auch die Dashboard-Ansicht (Active / Dismissed-Listen live gerendert) und wird von der Bereinigungsroutine am Ende jedes Zyklus verbraucht, um veraltete Einträge automatisch aufzulösen - beide laufen aus den gleichen Daten, ohne den Dispatcher zu durchlaufen.",
|
||||
"notifArrowLabel": "Ereignis",
|
||||
"notifNodes": {
|
||||
"errorsLabel": "Fehlertabelle",
|
||||
"errorsDetail": "Aktive +\nunterdrückte Zeilen\nmit Schlüssel\nerror_key",
|
||||
"dispatcherLabel": "Benachrichtigungsversender",
|
||||
"dispatcherDetail": "Neue + verschärfte\nEreignisse einreihen\nNach Schaltern\n+ Sperrzeit",
|
||||
"templatesLabel": "Vorlagen + KI-Überarbeitung",
|
||||
"templatesDetail": "Vorlage\nje Ereignis\n→ optionale KI-\nÜberarbeitung in\nverständliche Sprache",
|
||||
"channelsLabel": "Kanäle",
|
||||
"channelsDetail": "Telegram\nDiscord\nGotify\nE-Mail (SMTP)"
|
||||
}
|
||||
},
|
||||
"categories": {
|
||||
"heading": "Die zehn Kategorien",
|
||||
"imageAlt": "Zustandsüberwachung mit zehn Kategorien und aktuellem Status: CPU, Arbeitsspeicher, Datenspeicher, Laufwerke, Netzwerk, VMs, Dienste, Protokolle, Updates und Sicherheit",
|
||||
"imageCaption": "Health Monitor Ansicht - die zehn Kategorien mit ihrem aktuellen Status. Kategorien auf einem gesunden Host zeigen alle OK; Warnungen und kritische Ereignisse erscheinen inline mit den Zeilen, die sie erzeugt haben.",
|
||||
"intro": "Jeder Zyklus führt zehn unabhängige Prüfungen aus. Jede liefert einen von vier Zuständen (<strong>OK</strong>, <strong>INFO</strong>, <strong>WARNING</strong>, <strong>CRITICAL</strong>) und strukturierte Daten wie Gerätenamen, Protokollauszüge und genaue Schwellenwerte. Diese erscheinen im Dashboard und im Benachrichtigungstext.",
|
||||
"headerCategory": "Kategorie",
|
||||
"headerChecks": "Sub-Kontrollen",
|
||||
"headerEvents": "Typische Ereignisse",
|
||||
"rows": [
|
||||
{
|
||||
"category": "CPU & Temperatur",
|
||||
"checks": "CPU Nutzung mit Hysterese, Sensortemperatur",
|
||||
"events": "Anhaltend hohe CPU-Auslastung; Temperaturwarnungen anhand gesammelter Sensormesswerte."
|
||||
},
|
||||
{
|
||||
"category": "Arbeitsspeicher & Swap",
|
||||
"checks": "RAM Nutzung, Swap Nutzung",
|
||||
"events": "Anhaltender Speicherdruck; Aktivität des OOM-Killers; ausgeschöpfter Swap."
|
||||
},
|
||||
{
|
||||
"category": "Speicher",
|
||||
"checks": "Proxmox-Speicher, Root-Dateisystem",
|
||||
"events": "Konfigurierte Belegungsschwellen auf Root oder anderen überwachten Dateisystemen überschritten (standardmäßig 85% Warnung / 95% kritisch); NFS-Freigabe offline; CIFS-Anmeldung fehlgeschlagen; LVM-thin-Pool voll."
|
||||
},
|
||||
{
|
||||
"category": "Platten und SMART",
|
||||
"checks": "SMART, dmesg I/O-Fehler, ZFS Pools, LVM, Dateisystemfehler",
|
||||
"events": "SMART-Gesundheit fehlgeschlagen; neu zugewiesene / ausstehende Sektoren; ATA-I / O-Fehler; ZFS-Pool DEGRADED / FAULTED; ext4-Read-only-Remount."
|
||||
},
|
||||
{
|
||||
"category": "Netzwerk",
|
||||
"checks": "Konnektivität, Verbindungszustand, Gateway-Latenz",
|
||||
"events": "Brücken- oder Bond-Down; Gateway nicht erreichbar; persistente Latenzspitzen."
|
||||
},
|
||||
{
|
||||
"category": "VMs und Container",
|
||||
"checks": "QMP Kommunikation, VM Startup, Container Startup",
|
||||
"events": "Fehlgeschlagener VM-Boot; CT-Abschaltungsfehler; QMP-Sockel-Timeout; fehlende Konfiguration / Festplatte nach einem Klon."
|
||||
},
|
||||
{
|
||||
"category": "PVE-Dienste",
|
||||
"checks": "<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>, Cluster-Modus",
|
||||
"events": "Dienst abgestürzt; Cluster-Quorum verloren; <code>pmxcfs</code> hängt."
|
||||
},
|
||||
{
|
||||
"category": "Systemprotokolle",
|
||||
"checks": "Persistente Fehler, Fehlerspitzen, Fehlerkaskaden, kritische Kernelmeldungen",
|
||||
"events": "Wiederholte identische Fehler; plötzliches Warnsignal (Kaskadenmuster); <code>BUG:</code> / <code>OOPS:</code> / <code>oom-killer</code> in dmesg."
|
||||
},
|
||||
{
|
||||
"category": "Systemaktualisierungen",
|
||||
"checks": "Ausstehende Updates, Sicherheitsupdates, Kernel / PVE-Version, Systemalter",
|
||||
"events": "Ausstehende Sicherheits- oder Kernelupdates; lange nicht aktualisiertes System. Bei verfügbaren Updates erscheint in der Übersicht <em>Jetzt aktualisieren</em>. Die Schaltfläche startet den vollständigen ProxMenux-Updateablauf. Beim Schließen wird der Zustand mit <code>?refresh=1</code> neu abgefragt, damit die Anzeige ohne Warten auf den nächsten Zyklus aktualisiert wird."
|
||||
},
|
||||
{
|
||||
"category": "Sicherheit & Zertifikate",
|
||||
"checks": "Anmeldeversuche, Zertifikate laufen ab, optionaler Fail2Ban jail Status",
|
||||
"events": "Wiederholte fehlgeschlagene SSH- oder Webanmeldungen; PVE-Zertifikat läuft in weniger als 30 Tagen ab; aktive Fail2Ban-Sperren."
|
||||
}
|
||||
]
|
||||
},
|
||||
"severity": {
|
||||
"heading": "Schweregradmodell",
|
||||
"headerStatus": "Status",
|
||||
"headerColour": "Farbe",
|
||||
"headerMeaning": "Bedeutung",
|
||||
"headerNotification": "Benachrichtigung",
|
||||
"rows": [
|
||||
{
|
||||
"status": "OK",
|
||||
"colour": "Grün",
|
||||
"meaning": "Gesund. Keine Befunde in dieser Kategorie.",
|
||||
"notification": "Keine Benachrichtigung."
|
||||
},
|
||||
{
|
||||
"status": "INFO",
|
||||
"colour": "Blau",
|
||||
"meaning": "Vorübergehender oder bereits behobener Zustand, der es wert ist, einmal notiert zu werden. Wird auch für Kategorien verwendet, die <em>nur noch</em> verworfene Elemente übrig haben.",
|
||||
"notification": "Fakultativ. Jeder Ereignistyp kann pro Kanal ein- oder ausgeschaltet werden."
|
||||
},
|
||||
{
|
||||
"status": "WARNING",
|
||||
"colour": "Gelb",
|
||||
"meaning": "Aufmerksamkeit ist erforderlich, aber der Host ist immer noch funktionsfähig. Ursache ist nicht trivial - lesen Sie die Details.",
|
||||
"notification": "Wird gesendet, wenn der Ereignisschalter für diesen Kanal aktiv ist."
|
||||
},
|
||||
{
|
||||
"status": "CRITICAL",
|
||||
"colour": "rot",
|
||||
"meaning": "Funktionalität gebrochen oder Datenverlust möglich. Erforderliche Maßnahmen.",
|
||||
"notification": "Wird gesendet, wenn der Ereignisschalter für den Kanal aktiv ist. Eine CPU-Temperaturmeldung mit CRITICAL löst als Sicherheitswarnung auch nach vorheriger Bestätigung erneut aus."
|
||||
}
|
||||
],
|
||||
"infoNote": "Eine Kategorie mit <strong>OK</strong>, die noch unterdrückte Ereignisse mit laufender Frist enthält, erscheint als <strong>INFO</strong>. So bleibt sichtbar, dass Meldungen unterdrückt werden.",
|
||||
"unknownTitle": "UNKNOWN, wenn eine Prüfung nicht abgeschlossen werden kann",
|
||||
"unknownBody": "Eine nicht verfügbare Prüfung liefert <code>UNKNOWN</code>. Nach drei aufeinanderfolgenden Zyklen wird ein dauerhafter Befund gespeichert. Das Dashboard zeigt die Prüfung gelb an. Im Gesamtzustand ist <code>UNKNOWN</code> auf <strong>WARNING</strong> begrenzt; eine fehlende Prüfung allein macht den Host nicht kritisch."
|
||||
},
|
||||
"dashboardView": {
|
||||
"heading": "Die Dashboard-Ansicht",
|
||||
"intro": "Die Zustandsüberwachung befindet sich auf der Registerkarte <strong>Übersicht</strong>. Die Statusanzeige im Kopfbereich (Gesund / Warnung / Kritisch) öffnet ein Dialogfenster mit zwei Listen:",
|
||||
"items": [
|
||||
"<strong>Aktiv</strong> — Kategorien mit ungelösten Befunden. Aufgeklappte Zeilen zeigen die auslösenden Einzelprüfungen, den ursprünglichen Text in <code>reason</code>, die Geräte- oder VM-ID und gegebenenfalls einen Link zu Datenspeicher, Netzwerk, VMs, Protokollen oder Hardware.",
|
||||
"<strong>Unterdrückt</strong> — vom Benutzer bestätigte Einträge mit noch laufender Unterdrückungsfrist. Jede Zeile zeigt Restzeit und eingestellte Dauer. Nach Ablauf verschwindet sie aus dieser Liste. Besteht die Ursache weiter und unterstützt die Kategorie erneutes Auslösen, erscheint der Eintrag wieder unter <em>Aktiv</em>."
|
||||
],
|
||||
"pillTitle": "Die Statusanzeige folgt der schwerwiegendsten Kategorie",
|
||||
"pillBody": "Die Farbe im Dashboard-Kopf folgt dem höchsten Schweregrad: CRITICAL → rot, sonst WARNING → gelb, sonst INFO → blau, sonst grün. Dieselbe Logik steuert den Punkt im Favicon und das PWA-Symbol.",
|
||||
"updateNowTitle": "Schaltfläche Jetzt Aktualisieren im Overview-Header",
|
||||
"updateNowBody1": "Meldet <em>Systemupdates</em> ausstehende Updates, erscheint neben der Statusanzeige <strong>Jetzt aktualisieren</strong>. Der Dialog startet denselben Hostablauf wie <em>ProxMenux → Settings post-install Proxmox → Proxmox System Update</em>: Repository-Bereinigung, <code>apt full-upgrade</code> über <code>update-pve-safe.sh</code>, DKMS-Neubau verwalteter Treiber bei neuem Kernel, autoremove/autoclean und gegebenenfalls eine Neustartabfrage. Der Fortschritt wird laufend angezeigt.",
|
||||
"updateNowBody2": "Nach Abschluss ruft das Schließen des Dialogs <code>GET /api/health/details?refresh=1</code> auf und verwirft damit den Cache dieses Endpunkts. Ausstehende Updates und Statusanzeige werden anhand des neuen Paketstands neu berechnet. Der Hinweis verschwindet ohne Warten auf den nächsten Zyklus. Auf einem aktuellen Host bleibt die Schaltfläche verborgen."
|
||||
},
|
||||
"dismiss": {
|
||||
"heading": "Warnungen bestätigen und die Unterdrückungsdauer",
|
||||
"intro": "Manche Ereignisse bleiben lange bestehen: <em>Systemupdates: Updates verfügbar</em> gilt bis zur Aktualisierung des Hosts. Dafür ist nicht alle fünf Minuten eine neue Nachricht nötig. <em>Jetzt aktualisieren</em> in der Übersicht behebt diesen Fall direkt. Für andere Fälle oder aufgeschobene Updates bietet die Zustandsüberwachung zwei verbundene Möglichkeiten zum Unterdrücken von Meldungen:",
|
||||
"step1": "<strong>Einzelnes Ereignis bestätigen</strong> im Dialog. Das Menü bietet <strong>24 Stunden</strong>, <strong>7 Tage</strong> oder <strong>Dauerhaft</strong>, unabhängig vom Kategoriestandard. Die Auswahl sendet <code>POST /api/health/acknowledge</code> mit <code>error_key</code> und gewählten <code>suppression_hours</code> (<code>-1</code> für dauerhaft). Das Ereignis wechselt mit Zeitstempel <code>acknowledged_at</code> in die unterdrückte Liste.",
|
||||
"dropdownImageAlt": "Menü zum Unterdrücken einer Warnung: 24 Stunden, 7 Tage oder dauerhaft",
|
||||
"dropdownImageCaption": "Die gewählte Dauer gilt nur für diese Warnung; ohne Einzelauswahl greift der Kategoriestandard. Dauerhafte Bestätigungen erhalten die bernsteinfarbene Markierung <em>Dauerhaft</em> und lösen normalerweise nicht erneut aus. Eine Ausnahme ist die unten beschriebene kritische CPU-Temperatur.",
|
||||
"step2": "<strong>Unterdrückungsdauer je Kategorie</strong>. Unter Einstellungen → Zustandsüberwachung oder über <code>POST /api/health/settings</code> lässt sich für jede der zehn Kategorien die Standarddauer ohne Einzelauswahl festlegen:",
|
||||
"imageAlt": "Einstellung der Unterdrückungsdauer je Kategorie unter Einstellungen → Zustandsüberwachung",
|
||||
"imageCaption": "Ein Auswahlmenü je Kategorie. Für häufige Meldungen wie ausstehende Updates eignet sich eine längere Dauer, für schnell neu zu bewertende Ereignisse eine kürzere. Darunter stehen die aktiven Unterdrückungen.",
|
||||
"outro": "Während der Unterdrückung läuft die Prüfung weiter und aktualisiert <code>last_seen</code>, ohne neue Meldung. Nach Ablauf bewertet der nächste Zyklus die Ursache erneut: Er löst gegebenenfalls wieder aus oder entfernt den Eintrag, wenn der Zustand behoben ist.",
|
||||
"activeSuppressionsTitle": "Bestätigungen prüfen und aufheben — Aktive Unterdrückungen",
|
||||
"activeSuppressionsBody": "Alle zeitweise oder dauerhaft unterdrückten Warnungen stehen unter <strong>Einstellungen → Zustandsüberwachung → Aktive Unterdrückungen</strong>. Jede Zeile zeigt Kennung, Kategorie, Schweregrad, Bestätigungszeit und Restzeit. <strong>Wieder aktivieren</strong> hebt die Bestätigung für den nächsten Scan auf. Dauerhafte Bestätigungen lassen sich hier zurücknehmen, zeitlich begrenzte vorzeitig beenden. Aktivieren Sie <em>Bearbeiten</em>, wählen Sie die gewünschten Zeilen (grüner Rand und durchgestrichen) und speichern Sie. Abbrechen verwirft die Auswahl.",
|
||||
"autoTitle": "Automatische Unterdrückung nach Änderung der Dauer",
|
||||
"autoBody": "Ein anderer Wert als die standardmäßigen 24 Stunden hat eine zweite Wirkung: <strong>Neue Befunde der Kategorie werden bereits bestätigt gespeichert</strong>. Eine eingestellte Woche für Laufwerksmeldungen gilt damit auch für neue Meldungen, ohne jede einzeln zu bestätigen. Sie erscheinen direkt unter Unterdrückt mit der gewählten Restzeit. Kategorien mit 24 Stunden behalten das normale Verhalten: Neue Befunde bleiben aktiv, bis Sie handeln.",
|
||||
"tempTitle": "Ausnahme für CPU-Temperatur CRITICAL",
|
||||
"tempBody": "Die Persistenzschicht besitzt eine Sonderregel für <strong>CPU-Temperatur CRITICAL</strong>: Ein solcher Datensatz umgeht frühere Bestätigung und automatische Unterdrückung. Daraus folgt nicht, dass jede Temperaturprüfung beim Überschreiten eines konfigurierten kritischen Werts einen kritischen Datensatz erzeugt.",
|
||||
"nonDismissableTitle": "Welche Befunde lassen sich bestätigen?",
|
||||
"nonDismissableBody": "Der Dialog zeigt Bestätigen nur, wenn die Einzelprüfung ausdrücklich dismissable = true liefert. Bei false oder fehlendem Feld bleibt die Schaltfläche verborgen. Der Schweregrad bestimmt diese Erlaubnis nicht: Mehrere kritische Prüfungen erlauben eine Bestätigung. Die Beispiele beschreiben aktuelle Daten; Unterdrücken behebt keine Ursache.",
|
||||
"headerFinding": "Feststellung",
|
||||
"headerWhy": "Verhalten beim Bestätigen",
|
||||
"rows": [
|
||||
{
|
||||
"finding": "CPU-Temperatur: Warnung / kritisch",
|
||||
"why": "Die aus Messwerten ermittelte Temperaturwarnung erlaubt ausdrücklich die Bestätigung. Eine separate Persistenzregel umgeht sie, wenn ein CPU-Temperaturdatensatz mit CRITICAL eintrifft."
|
||||
},
|
||||
{
|
||||
"finding": "Kritische Belegung des Root-Dateisystems",
|
||||
"why": "Die Belegungsprüfungen erlauben ausdrücklich die Bestätigung, auch bei kritischer Auslastung. Sie schafft weder Platz noch beseitigt sie das Risiko fehlgeschlagener Schreibzugriffe."
|
||||
},
|
||||
{
|
||||
"finding": "ZFS pool DEGRADED / FAULTED",
|
||||
"why": "ZFS-Poolbelegungsprüfungen erlauben ausdrücklich die Bestätigung. Andere Poolbefunde folgen ihrem eigenen Kennzeichen. Bestätigen repariert keinen beeinträchtigten oder ausgefallenen Pool."
|
||||
},
|
||||
{
|
||||
"finding": "Festplatten-I/O-Fehler mit SMART FAILED",
|
||||
"why": "Gespeicherte Laufwerksbefunde aus dem Journal können eine Bestätigung erlauben. SMART FAILED muss trotzdem untersucht werden; die Schaltfläche hängt vom Kennzeichen der Einzelprüfung ab, nicht nur vom Warntext."
|
||||
},
|
||||
{
|
||||
"finding": "Netzschnittstelle DOWN",
|
||||
"why": "Gespeicherte Schnittstellenprüfungen mit DOWN erlauben ausdrücklich die Bestätigung. Das stellt weder Bridge, Bond noch physische Verbindung oder Fernzugriff wieder her."
|
||||
},
|
||||
{
|
||||
"finding": "I/O-Ereignisse auf gesunden Festplatten (INFO)",
|
||||
"why": "Vorübergehende ATA- oder dmesg-Ereignisse bei gesundem SMART können rein informativ sein und sich selbst auflösen. Solche Zeilen brauchen keine Bestätigungsschaltfläche; die Prüfung bestimmt, wann der Zustand behoben ist."
|
||||
}
|
||||
],
|
||||
"principle": "Nutzen Sie die beim tatsächlichen Befund angebotene Schaltfläche, statt ihre Verfügbarkeit aus Kategorie oder Schweregrad abzuleiten. Die Bestätigung steuert Anzeige und Meldungen. Wiederherstellungsprüfungen und Laufwerksverlauf bleiben davon getrennt."
|
||||
},
|
||||
"autoresolve": {
|
||||
"heading": "Autoauflösung und Reinigung",
|
||||
"intro": "Viele Warnungen sollen verschwinden, wenn die Ursache entfällt: eine VM startet wieder, ein Laufwerk wurde entfernt oder die Temperatur ist wieder normal. Die Bereinigung am Ende jedes Fünfminutenzyklus wendet diese Regeln an:",
|
||||
"headerTrigger": "Trigger",
|
||||
"headerAction": "Aktion",
|
||||
"rows": [
|
||||
{
|
||||
"trigger": "CPU-Auslastung / Temperatur wieder normal.",
|
||||
"action": "Als behoben markiert; verschwindet aus der aktiven Liste."
|
||||
},
|
||||
{
|
||||
"trigger": "Speicherdruck wieder unterhalb der Warnschwelle nach einer OOM / Memory Warnung.",
|
||||
"action": "Als behoben markiert."
|
||||
},
|
||||
{
|
||||
"trigger": "VM / CT, auf den der Fehler verweist, existiert nicht mehr (<code>qm status</code> / <code>pct status</code> ungleich Null).",
|
||||
"action": "Aufgelöst als entfernte Ressource markiert."
|
||||
},
|
||||
{
|
||||
"trigger": "Disk, auf den der Fehler verwiesen wird, ist in <code>/dev/</code> nicht mehr vorhanden.",
|
||||
"action": "Markiert aufgelöst als entferntes Gerät. Die permanente Beobachtungsgeschichte bleibt erhalten (siehe nächster Abschnitt)."
|
||||
},
|
||||
{
|
||||
"trigger": "Befunde aus dem Systemjournal (Kategorie <code>logs</code>, SMART-Einträge, ATA-/I/O-Fehler), deren Unterdrückungsfrist abläuft.",
|
||||
"action": "Werden entfernt. Jeder Scan prüft ab diesem Zeitpunkt neue Journaleinträge; dieselbe historische Zeile wird nicht erneut ausgegeben."
|
||||
},
|
||||
{
|
||||
"trigger": "Seit mehr als sieben Tagen behobene Fehler.",
|
||||
"action": "Aus der Datenbank gelöscht, um die Tabelle klein zu halten. Die Benachrichtigungshistorie ist unabhängig und wird länger aufbewahrt."
|
||||
}
|
||||
],
|
||||
"permanentTitle": "Dauerhaft unterdrückt bedeutet nicht behoben",
|
||||
"permanentBody": "Die Kategoriedauer <code>-1</code> (<em>dauerhaft</em>) unterdrückt weitere Warnungen für bestätigte Einträge, überspringt aber nicht die automatische Prüfung. Entfällt die Ursache, etwa nach Löschen der Ressource oder Unterschreiten des Schwellenwerts, wird der Eintrag weiterhin automatisch bereinigt."
|
||||
},
|
||||
"observations": {
|
||||
"heading": "Laufwerksbeobachtungen — der dauerhafte Verlauf",
|
||||
"intro": "Laufwerksereignisse sollen erhalten bleiben. Eine SMART-Warnung auf <code>/dev/sdh</code> um 02:14 Uhr bleibt wichtig, auch wenn die I/O-Störung vorbei und der Fehler automatisch behoben ist. Das Laufwerk hat nun eine Vorgeschichte. Dafür führt die Zustandsüberwachung eine separate <strong>dauerhafte</strong> Tabelle: <code>disk_observations</code>.",
|
||||
"headerProperty": "Eigenschaft",
|
||||
"headerErrors": "Tabelle <code>errors</code> (Aktiv)",
|
||||
"headerObs": "Tabelle <code>disk_observations</code>",
|
||||
"rows": [
|
||||
{
|
||||
"property": "Zweck",
|
||||
"errors": "Versorgt die <em>aktuelle</em> Zustandsansicht und den Benachrichtigungsversand.",
|
||||
"obs": "Dauerhaftes Prüfprotokoll je Laufwerk."
|
||||
},
|
||||
{
|
||||
"property": "Automatische Auflösung",
|
||||
"errors": "Ja — Zeilen werden gelöscht, wenn die Bedingung verschwindet.",
|
||||
"obs": "Nein - Einträge bleiben für immer bestehen, es sei denn, der Benutzer weist sie ausdrücklich ab."
|
||||
},
|
||||
{
|
||||
"property": "Deduplizierungsschlüssel",
|
||||
"errors": "<code>error_key</code> (z.B. <code>smart_sdh</code>).",
|
||||
"obs": "<code>(disk_registry_id, error_type, error_signature)</code> mit stabilen Signaturen, die von flüchtigen Daten befreit sind."
|
||||
},
|
||||
{
|
||||
"property": "Wo gezeigt",
|
||||
"errors": "Dialog der Zustandsüberwachung (Listen Aktiv / Unterdrückt).",
|
||||
"obs": "Laufwerksdetailkarte auf der Registerkarte <strong>Datenspeicher</strong>, mit „X obs.“ je Laufwerk."
|
||||
},
|
||||
{
|
||||
"property": "Was es aufzeichnet",
|
||||
"errors": "Was auch immer derzeit scheitert.",
|
||||
"obs": "SMART-Warnungen (Sektorprobleme / Temperatur / CRC / fehlgeschlagene Selbsttests), I/O-Fehler (ATA / NVMe/dm), Dateisystemfehler, ZFS-Poolereignisse."
|
||||
}
|
||||
],
|
||||
"outro": "Eine Warnung kann aus dem Dashboard verschwinden, während der Vorfall im Laufwerksverlauf bleibt. Die Detailkarte unter Datenspeicher zeigt die Anzahl offener Beobachtungen sowie Zeitstempel, Schweregrad und ursprünglichen Rohtext. Das hilft bei der Entscheidung über einen Austausch.",
|
||||
"renameTitle": "Geänderte Gerätenamen werden automatisch zusammengeführt",
|
||||
"renameBody": "Laufwerke können zunächst unter vorläufigen Namen wie <code>ata8</code> oder <code>nvme0n1p3</code> erscheinen. Die Beobachtungsschicht ordnet Einträge anhand bekannter Seriennummern zu: Wird derselbe Datenträger später als <code>sdh</code> erkannt, werden frühere Beobachtungen zu <code>ata8</code> im nächsten Zyklus an <code>sdh</code> angehängt. Der Verlauf bleibt zusammenhängend."
|
||||
},
|
||||
"notification": {
|
||||
"heading": "Vom Befund zur Benachrichtigung",
|
||||
"intro": "Jeder aktive Fehler ist auch ein Kandidat für die Benachrichtigungsmaschine. Der Fluss:",
|
||||
"items": [
|
||||
"Der Scanner zeichnet den Befund mit Kategorie + Schweregrad + strukturierten Details auf.",
|
||||
"Ist der Ereignistyp in den globalen Benachrichtigungen <strong>aktiviert</strong> und hat der Kanal die Kategorie nicht stummgeschaltet, wird ein Ereignis eingereiht.",
|
||||
"Die Vorlagenlogik erzeugt aus den strukturierten Daten Titel und Text. Bei aktivierter KI-Überarbeitung erhält der eingerichtete Anbieter dieses Paar für eine verständliche Fassung.",
|
||||
"Die Kanalimplementierung versendet es: Telegram Nachricht, Discord Einbettung, Gotify Push oder E-Mail. Das Versandergebnis wird in <code>notification_history</code> gespeichert.",
|
||||
"Bestätigen startet die Unterdrückungsfrist. Weitere Erkennungen desselben <code>error_key</code> erzeugen währenddessen normalerweise keine Meldung und werden nicht automatisch für das Fristende eingereiht. Die Ausnahme für kritische CPU-Temperatur bleibt bestehen."
|
||||
],
|
||||
"outro": "Die Kanalkonfiguration mit Telegram-Bot-Token, Webhook-URLs, KI-Schlüsseln, Ereignisschaltern und Kanalanpassungen ist unter <notifLink>Benachrichtigungen</notifLink> und <aiLink>KI-Assistent</aiLink> beschrieben."
|
||||
},
|
||||
"rest": {
|
||||
"heading": "REST-Endpunkte",
|
||||
"intro": "Die Dialogaktionen sind per API für Skripte, Dashboards und Chatbots verfügbar. Bei aktiver Monitor-Authentifizierung benötigen Aufrufe ein gültiges Bearer-Token aus Anmeldung oder API-Tokenverwaltung. Änderungen wie Bestätigen, Speichern oder Bereinigen verwaister Fehler erfordern full_admin; read_only erhält 403. Bei deaktivierter oder abgelehnter Authentifizierung erlauben diese Prüfungen Zugriff ohne Token.",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerMethod": "Methode",
|
||||
"headerUse": "Verwendung",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Leichte Zustandsabfrage mit JSON-Feldern <code>status</code>, <code>timestamp</code> und <code>version</code>. Für Schlüsselwortprüfungen in Uptime Kuma geeignet; bei aktiver Monitor-Authentifizierung muss der Client einen Bearer-Header senden."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
"method": "GET",
|
||||
"use": "Gesamtzustand mit einem Schweregrad und einer Zusammenfassung. Authentifiziert."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/details",
|
||||
"method": "GET",
|
||||
"use": "Alle zehn Kategorien mit jeweiligem Status und den zugrunde liegenden strukturierten Daten."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/full",
|
||||
"method": "GET",
|
||||
"use": "Vollständige Momentaufnahme: Kategorien, aktive und unterdrückte Fehler sowie eigene Unterdrückungsdauer. Versorgt den Dialog mit einer Anfrage und nutzt für schnelle Antworten einen sechs Minuten gültigen Hintergrundcache."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/active-errors",
|
||||
"method": "GET",
|
||||
"use": "Nur die aktive Liste. Filterbar durch <code>?category=<name></code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/dismissed",
|
||||
"method": "GET",
|
||||
"use": "Nur die unterdrückten Einträge mit verbleibenden Stunden."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/acknowledge",
|
||||
"method": "POST",
|
||||
"use": "Körper: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Deaktivieren Sie eine Warnung mit dem konfigurierten Fenster der Kategorie."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/settings",
|
||||
"method": "GET / POST",
|
||||
"use": "Lesen oder schreiben Sie die Werte für die Unterdrückungsdauer pro Kategorie."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/cleanup-orphans",
|
||||
"method": "POST",
|
||||
"use": "Manuelle Bereinigung von Fehlern, deren zugrunde liegendes Gerät / VM verschwunden ist. Idempotent."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Aktuellen Zustand für ein Skript abrufen",
|
||||
"codeComment2": "# Verwerfen Sie einen bestimmten Fehler",
|
||||
"codeComment3": "# Setzen Sie die Unterdrückung der Festplatten-Kategorie auf eine Woche"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "Dashboard",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — hier lässt sich der Dialog der Zustandsüberwachung öffnen."
|
||||
},
|
||||
{
|
||||
"label": "Benachrichtigungen",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — Kanäle, Ereignisschalter, KI-Überarbeitung und Verlauf."
|
||||
},
|
||||
{
|
||||
"label": "KI-Assistent",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tail": " — Anbieter (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), Promptmodus, Detailgrad je Kanal und Sprache."
|
||||
},
|
||||
{
|
||||
"label": "Architektur",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tailRich": "— das SQLite-Schema (<code>errors</code>, <code>disk_observations</code>, <code>events</code>) und die Hintergrund-Thread-Kadenz."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor – Selbstgehostetes Web-Dashboard für Proxmox VE | ProxMenux",
|
||||
"description": "ProxMenux Monitor ist ein selbst gehostetes Web-Dashboard für Proxmox VE: Echtzeit-Hostmetriken, Speicher und SMART Daten, Netzwerk, VMs und Container, Hardware, Protokolle, ein integriertes Web-Terminal, ein proaktiver Health Monitor, Benachrichtigungen an Telegram / Discord / E-Mail, ein optionaler KI-Assistent, ein REST API und Integrationen mit Tools wie Homepage und Home Assistant.",
|
||||
"ogTitle": "ProxMenux Monitor – Selbstgehostetes Web-Dashboard für Proxmox VE",
|
||||
"ogDescription": "Echtzeit-Dashboard Proxmox VE: Hostmetriken, Speicher SMART, Netzwerk, VMs und Container, Hardware, Protokolle, Webterminal, Gesundheitsmonitor, Benachrichtigungen, KI-Assistent, REST API.",
|
||||
"twitterTitle": "ProxMenux Monitor | ProxMenux",
|
||||
"twitterDescription": "Selbst gehostetes Proxmox VE Dashboard mit Health Monitor, Benachrichtigungen, KI-Assistent und REST API."
|
||||
},
|
||||
"header": {
|
||||
"title": "ProxMenux Monitor",
|
||||
"description": "Ein selbst gehostetes Proxmox-VE-Web-Dashboard als AppImage. Es läuft als einzelner systemd-Dienst auf dem Host, lauscht auf TCP-Port 8008 und stellt API und Oberfläche aus einem Prozess bereit.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"atGlance": {
|
||||
"title": "Auf einen Blick",
|
||||
"body": "Einzelner AppImage auf dem Proxmox-Host → Flask Backend (Port 8008), der Live-Daten über <code>psutil</code>, <code>pvesh</code>, <code>smartctl</code>, <code>journalctl</code> sammelt → Next.js-Dashboard, das vom selben Prozess bereitgestellt wird. Optionale Authentifizierung (Passwort + 2FA), optionaler KI-Assistent, optionale Benachrichtigungen, REST API für Integrationen."
|
||||
},
|
||||
"hero": {
|
||||
"alt": "ProxMenux Monitor Dashboard – Systemübersichtsbildschirm mit CPU, Speicher-, Temperatur- und Betriebszeit-Widgets",
|
||||
"caption": "Standard-Startbildschirm – Metriken und Gesundheitszustand auf Hostebene auf einen Blick."
|
||||
},
|
||||
"coverage": {
|
||||
"heading": "Was das Dashboard abdeckt",
|
||||
"intro": "Acht erstklassige Abschnitte, jeder unterstützt durch seine eigenen API Endpunkte:",
|
||||
"tableSection": "Abschnitt",
|
||||
"tableWhat": "Was angezeigt wird",
|
||||
"sections": [
|
||||
{
|
||||
"name": "Gesundheitsmonitor",
|
||||
"description": "Aktive und verworfene Warnungen für CPU, Arbeitsspeicher, Speicher, Festplatten, Netzwerk, Dienste, Protokolle, VMs, Updates und Sicherheit. Steuert die Benachrichtigungs-Engine."
|
||||
},
|
||||
{
|
||||
"name": "Speicher",
|
||||
"description": "Proxmox-Speicher pools, physische Festplatten (SATA / NVMe / USB), SMART Attribute, ZFS pool Status, Verschleiß und Lebensdauer, I/O-Aktivität."
|
||||
},
|
||||
{
|
||||
"name": "Netzwerk",
|
||||
"description": "Alle Schnittstellen (physisch, Bonds, Bridges, OVS), IP/MAC/Status, Echtzeit-RX/TX-Diagramme, historische RRD-Daten pro Schnittstelle."
|
||||
},
|
||||
{
|
||||
"name": "VMs und Container",
|
||||
"description": "VM-/LXC-Inventar mit Status, Ressourcen und Betriebszeit. Die Detailansicht zeigt Konfiguration, historische Metriken, Proxmox-Logdownloads und Start-/Stopp-/Neustart-/Herunterfahraktionen. Die Logs hängen vom Proxmox-Endpunkt ab; es ist kein vollständiges Gastbetriebssystem-Logarchiv."
|
||||
},
|
||||
{
|
||||
"name": "Hardware",
|
||||
"description": "CPU Modell und Topologie, Speicherlayout, PCIe-Geräte, GPU Liste mit Treiber und Echtzeitüberwachung pro Steckplatz (NVIDIA / Intel iGPU)."
|
||||
},
|
||||
{
|
||||
"name": "Protokolle und Ereignisse",
|
||||
"description": "Live <code>journalctl</code> mit Schweregrad-/Zeitbereichs-/Schlüsselwortfiltern, Proxmox-Aufgabenverlauf, Benachrichtigungsprotokoll, herunterladbaren Protokollpaketen."
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"description": "Browser-Shell für den Host und unterstützte VM-/CT-Konsolen über <code>xterm.js</code> und WebSockets. Es gilt der konfigurierte Authentifizierungsmodus: Bei deaktivierter oder abgelehnter Anmeldung können erreichbare Clients Sitzungen ohne Login öffnen. Das bedeutet keine Protokollierung jedes Befehls."
|
||||
},
|
||||
{
|
||||
"name": "Sicherheit",
|
||||
"description": "Fehlgeschlagene Anmeldungen, Status der Fail2Ban-Jails, kürzlich gesperrte IP-Adressen und Integration mit dem Jail <code>[proxmenux]</code> des Hosts."
|
||||
}
|
||||
],
|
||||
"footer": "Jeder Abschnitt verfügt über eine eigene Dokumentationsseite unter <link>Dashboard</link> in der Seitenleiste."
|
||||
},
|
||||
"howItRuns": {
|
||||
"heading": "Wie es läuft",
|
||||
"intro": "ProxMenux Monitor wird als eigenständige AppImage bereitgestellt. Eine einzelne systemd-Unit (<code>proxmenux-monitor.service</code>) startet einen Flask-Prozess, der:",
|
||||
"bullets": [
|
||||
"Hört auf <strong>TCP 8008</strong> auf dem Host (HTTP).",
|
||||
"Stellt das Next.js-Dashboard als statische Dateien unter <code>/</code> und die API unter <code>/api/*</code> aus demselben Prozess bereit.",
|
||||
"Zieht Live-Daten mit Standard-Host-Tools ab: <code>psutil</code>, <code>pvesh</code>, <code>smartctl</code>, <code>journalctl</code>, <code>zpool</code>, <code>ip</code>, <code>nvidia-smi</code> usw.",
|
||||
"Behält seinen eigenen Status in einer lokalen SQLite-Datenbank bei (<code>/usr/local/share/proxmenux/health_monitor.db</code>): verworfene Warnungen, Festplattenbeobachtungen, Benachrichtigungskonfiguration, AI-Konfiguration. Der Authentifizierungsstatus befindet sich separat in <code>/root/.config/proxmenux-monitor/auth.json</code>."
|
||||
],
|
||||
"footer": "Der vollständige Anfrageablauf, das Dateilayout und die systemd-Integration werden in <link>Architektur</link> beschrieben."
|
||||
},
|
||||
"noAgent": {
|
||||
"title": "Kein Agent für die Gäste",
|
||||
"body": "Der Monitor liest alle Daten auf dem Host aus. Auf VMs und CTs muss kein Agent installiert werden: Die Gastdaten stammen aus der Proxmox-API und aus den Informationen, die der Kernel des Hosts über die laufenden Gastsysteme bereitstellt."
|
||||
},
|
||||
"access": {
|
||||
"heading": "Zugriff auf das Dashboard",
|
||||
"intro": "Zwei Zugriffsmuster werden unterstützt und die Anwendung erkennt, welches verwendet wird:",
|
||||
"codeComment1": "# 1) Direkter Zugriff auf dem Host",
|
||||
"codeComment2": "# 2) Über Reverse Proxy (Nginx / Caddy / Traefik)",
|
||||
"afterCode": "Der Reverse-Proxy sollte <code>X-Forwarded-For</code>, <code>X-Forwarded-Proto</code> und <code>X-Forwarded-Host</code> korrekt setzen und WebSocket-Upgrades weiterleiten. Bei Standardports nutzt der Browser seinen aktuellen Ursprung. Für Client-IPs vertraut das Backend weitergeleiteten Adressen nur mit explizitem PROXMENUX_TRUST_PROXY=1; beschränken Sie dabei direkten Backendzugriff.",
|
||||
"footer": "Einrichtung beim ersten Start, Passwort + TOTP 2FA und Reverse-Proxy-Snippets werden unter <link>Zugriff und Authentifizierung</link> behandelt."
|
||||
},
|
||||
"mobile": {
|
||||
"heading": "Mobile Nutzung und Installation auf dem Startbildschirm",
|
||||
"intro": "Das Dashboard passt sich der Bildschirmgröße an und wird als Progressive Web App geliefert. <code>public/manifest.json</code> deklariert <code>display: standalone</code>, App-Namen, Symbol und Designfarbe. Das Hinzufügen zum Startbildschirm ermöglicht einen eigenständigen Start ohne Adressleiste, mit angepasstem Startbildschirm und dunklem Dashboard-Design.",
|
||||
"phoneAlt": "ProxMenux Monitor läuft auf einem Telefon – Haupt-Dashboard-Ansicht",
|
||||
"phoneCaption": "Haupt-Dashboard auf einem Telefon – das Layout wird für kleine Ansichtsfenster neu gestaltet.",
|
||||
"addHeading": "Zum Startbildschirm hinzufügen",
|
||||
"iosLabel": "iOS Safari:",
|
||||
"iosBody": "Teilen-Schaltfläche → <em>Zum Startbildschirm hinzufügen</em>. Das Symbol stammt von <code>/apple-touch-icon.png</code>, das im AppImage ausgeliefert wird.",
|
||||
"androidLabel": "Android Chrome / Edge:",
|
||||
"androidBody": "Menü mit drei Punkten → <em>App installieren</em> (oder <em>Zum Startbildschirm hinzufügen</em> bei älteren Versionen).",
|
||||
"afterInstall": "Nach der Installation wird durch Öffnen des Symbols das Dashboard im Standalone-Modus mit einem eigenen Task-Switcher-Eintrag gestartet.",
|
||||
"onlineOnlyTitle": "Nur online nutzbar",
|
||||
"onlineOnlyBody": "Die PWA lässt sich installieren, ist aber <strong>nicht</strong> offlinefähig: Es gibt keinen Service Worker. Die Verknüpfung verhält sich wie eine native App. Zum Laden des Dashboards muss das Gerät den Host jedoch weiterhin über TCP 8008 erreichen können, etwa über LAN, VPN oder HTTPS mit einem Reverse-Proxy."
|
||||
},
|
||||
"health": {
|
||||
"heading": "Der Gesundheitsmonitor und Benachrichtigungen",
|
||||
"alt": "Health Monitor-Bildschirm mit den verfolgten 10-Kategorien (CPU, Arbeitsspeicher, Speicher, Festplatten, Netzwerk, Dienste, Protokolle, VMs, Updates, Sicherheit) mit aktuellem Status",
|
||||
"caption": "Health Monitor-Ansicht – die verfolgten 10-Kategorien mit ihrem aktuellen Status. Aktive und verworfene Warnungen werden hier angezeigt, wenn das System welche auslöst.",
|
||||
"body1": "Im Dashboard läuft der <strong>Health Monitor</strong> im Hintergrund und erzeugt strukturierte Ereignisse: hohe CPU-Temperatur, SMART-Warnungen, verschlechterte ZFS-Pools, OOM-Prozessabbrüche, VM-/CT-Ausfälle und Sicherheitsvorfälle. Jedes Ereignis hat Kategorie, Schweregrad (INFO / WARNING / CRITICAL) und einen stabilen <code>error_key</code>, der Duplikate zusammenfasst.",
|
||||
"feedsIntro": "Ereignisse versorgen drei Dinge gleichzeitig:",
|
||||
"feedsHealth": "Die <strong>Health Monitor-Ansicht</strong> im Dashboard (aktive + verworfene Listen).",
|
||||
"feedsChannels": "Die <strong>Benachrichtigungs-Engine</strong> – Telegram, Discord, E-Mail, Gotify, Pushover und Apprise (Mehrkanal). Jeder Kanal wird unabhängig konfiguriert und die Kategorien pro Ereignis können stummgeschaltet werden.",
|
||||
"feedsAI": "Der optionale <strong>KI-Assistent</strong> erklärt mit dem gewählten Anbieter (OpenAI, Anthropic, Gemini, Groq, Ollama oder OpenRouter) eingehende Ereignisse verständlich und schlägt bei Aktivierung in den KI-Einstellungen weitere Schritte vor.",
|
||||
"suppressionTitle": "Einzelne Warnungen unterdrücken statt alles stummschalten",
|
||||
"suppressionBody": "Jede Kategorie hat eine eigene <em>Unterdrückungsdauer</em>. Nach Verwerfen wird dieselbe Warnung für diesen Zeitraum stummgeschaltet (standardmäßig 24 Stunden, je Kategorie bis dauerhaft einstellbar). Echte Verschärfungen, etwa CPU-Temperatur über der kritischen Schwelle, lösen unabhängig davon erneut aus."
|
||||
},
|
||||
"api": {
|
||||
"heading": "REST API und Integrationen",
|
||||
"intro": "REST-Endpunkte liefern Überwachungsdaten als JSON über HTTP/HTTPS für Homepage, Home Assistant, Uptime Kuma und eigene Skripte. Grafana kann den separaten Prometheus-Textexporter unter <code>/api/prometheus</code> nutzen. Anfragen sind mit <code>curl</code> möglich.",
|
||||
"tokens": "Langlebige API-Tokens (365 Tage) werden aus <strong>Einstellungen → API Zugriffstokens</strong> oder über <code>POST /api/auth/generate-api-token</code> generiert.",
|
||||
"bearer": "Token werden als <code>Authorization: Bearer …</code> gesendet. Der öffentliche Endpunkt <code>/api/health</code> eignet sich für Verfügbarkeitsprüfungen ohne Zugangsdaten. Unter <code>/api/auth/*</code> liegen öffentliche Setup-/Login-/Statusrouten und geschützte Konto-/Tokenverwaltung; nicht alle sind anonym.",
|
||||
"catalog": "Der vollständige Endpunktkatalog, Anleitungen zur Token-Rotation und Best Practices für die Sicherheit finden Sie in der <linkApi>API-Referenz</linkApi>; Vorgefertigte Beispiele für Homepage, Home Assistant, Grafana, Uptime Kuma und ein generisches cURL-Muster finden Sie in <linkIntegrations>Integrationen</linkIntegrations>."
|
||||
},
|
||||
"serviceControl": {
|
||||
"heading": "Dienststeuerung",
|
||||
"intro": "Der Monitor wird wie jeder systemd-Dienst verwaltet. Zusätzlich gibt es zwei Einträge in der ProxMenux-Textoberfläche unter <em>Einstellungen</em>:",
|
||||
"codeComment": "# Manuelle Steuerung",
|
||||
"footer": "Siehe <link>Einstellungen → ProxMenux Monitor</link> für die Umschaltung im Menü und den Statusüberprüfungsablauf."
|
||||
},
|
||||
"nextSteps": {
|
||||
"heading": "Wo geht es weiter?",
|
||||
"items": [
|
||||
{
|
||||
"label": "Architektur",
|
||||
"description": "– Flask Backend, systemd Einheit, SQLite Schema, KI-Anbieter, Benachrichtigungskanäle."
|
||||
},
|
||||
{
|
||||
"label": "Zugriff und Authentifizierung",
|
||||
"description": "– erster Start, Passwort-Einrichtung, TOTP 2FA, Reverse-Proxy-Konfiguration, Fail2Ban-Integration."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard",
|
||||
"description": "— jede Sektion der Oberfläche auf einer eigenen Seite."
|
||||
},
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"description": "– alle Endpunkte, Anforderungs-/Antwortformen und Token-Verwaltung."
|
||||
},
|
||||
{
|
||||
"label": "Integrationen",
|
||||
"description": "– Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma, generisches cURL Muster."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,255 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox-Integrationen — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor",
|
||||
"description": "Konfigurationsbeispiele zum Kopieren für Homepage, Home Assistant, Grafana über Prometheus und Uptime Kuma. Jedes Beispiel zeigt die benötigte Konfiguration, die Monitor-API-Endpunkte und den Authentifizierungsheader.",
|
||||
"ogTitle": "Proxmox-Integrationen — Homepage, Home Assistant, Grafana, Prometheus",
|
||||
"ogDescription": "Anleitungen zur Verbindung von ProxMenux Monitor mit Homepage, Home Assistant, Grafana, Prometheus und Uptime Kuma.",
|
||||
"twitterTitle": "Proxmox Integrationen | ProxMenux Monitor",
|
||||
"twitterDescription": "Rezepte für Homepage, Home Assistant, Grafana, Prometheus und Uptime Kuma."
|
||||
},
|
||||
"header": {
|
||||
"title": "Integrationen",
|
||||
"description": "Beispiele zum Kopieren für die Werkzeuge Ihres Homelabs: Homepage, Home Assistant, Grafana über Prometheus und Uptime Kuma. Jedes Beispiel zeigt die vom Zielwerkzeug erwartete Konfiguration, den verwendeten Monitor-Endpunkt und den nötigen Authentifizierungsheader.",
|
||||
"section": "ProxMenux-Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Was Sie von dieser Seite aus erstellen können",
|
||||
"body": "Kopieren Sie das jeweilige Beispiel in Ihr Werkzeug. Die Endpunkte sind in der <link>API-Referenz</link> beschrieben; diese Seite zeigt ihre Verwendung in Homepage, Home Assistant und Grafana. Die Screenshots zeigen die Ausgabe der Beispiele."
|
||||
},
|
||||
"auth": {
|
||||
"heading": "Authentifizierung: Das Einzige, was jedes Rezept braucht",
|
||||
"intro": "Die meisten von diesen Integrationen verwendeten Endpunkte werden authentifiziert. Sie haben zwei Möglichkeiten, diese Anforderung zu erfüllen.",
|
||||
"optAtitle": "Option A — API-Token (für Integrationen empfohlen)",
|
||||
"optAbody1": "Öffnen Sie <strong>Einstellungen → Sicherheit → API-Token</strong>. Wählen Sie <em>Token erzeugen</em>, vergeben Sie einen Namen wie <em>homepage</em>, <em>home-assistant</em> oder <em>prometheus</em> und kopieren Sie das Token: Es erscheint <em>nur einmal</em>. Es läuft standardmäßig nach einem Jahr ab und ist einzeln widerrufbar. Nutzen Sie es für Clients außerhalb des Browsers.",
|
||||
"optAbody2": "Ab diesem Zeitpunkt ist jede Anfrage nur noch:",
|
||||
"optBtitle": "Option B — Login-Flow (Benutzername + Passwort)",
|
||||
"optBbody": "Nützlich für Skripte, die sich als menschlicher Benutzer authentifizieren. Das zurückgegebene Token ist kurzlebig; die meisten Integrationen sollten Option A bevorzugen.",
|
||||
"outro": "Das TOTP-Feld ist nur bei aktivierter Zwei-Faktor-Authentifizierung nötig. Tokenwechsel, Widerruf, Passwortrichtlinien und Prüfprotokoll sind unter <link>Zugriff und Authentifizierung</link> beschrieben.",
|
||||
"httpsTitle": "Verwendung von HTTPS anstelle von HTTP",
|
||||
"httpsIntro": "Jedes Rezept unten verwendet <code>http://</code> in den URLs, um die Beispiele kurz zu halten. Wenn Sie TLS auf dem Monitor aktiviert haben (<strong>Settings → Security → SSL/HTTPS</strong>), tauschen Sie <code>http://</code> in jeder URL gegen <code>https://</code> aus – das ist die einzige Änderung. Zwei spezielle Anmerkungen zu bestimmten Werkzeugen:",
|
||||
"httpsItems": [
|
||||
"<strong>Selbstsignierte Zertifikate.</strong> Die Home-Assistant-Integration <code>rest:</code> prüft TLS standardmäßig. Für ein selbstsigniertes Monitor-Zertifikat setzen Sie <code>verify_ssl: false</code> in jeden REST-Block neben <code>scan_interval:</code> oder nehmen die Monitor-CA in den Vertrauensspeicher auf. Entsprechendes gilt für andere Werkzeuge mit Zertifikatsprüfung.",
|
||||
"<strong>Prometheus</strong> enthält unten bereits <code>scheme: https</code>. Aktivieren oder behalten Sie <code>https</code>, wenn TLS im Monitor aktiv ist."
|
||||
]
|
||||
},
|
||||
"homepage": {
|
||||
"heading": "Homepage",
|
||||
"headingHref": "https://gethomepage.dev",
|
||||
"intro": "Homepage ist ein vollständig statisches, anpassbares Anwendungs-Dashboard. ProxMenux Monitor wird über das eingebaute <code>customapi</code>-Widget angeschlossen - fügen Sie einen Diensteintrag in <code>services.yaml</code> ein, starten Sie die Homepage neu und die Karte erscheint mit Live-Nummern.",
|
||||
"iconCalloutTitle": "Das offizielle ProxMenux-Logo ist auf dashboardicons.com",
|
||||
"iconCalloutBody": "Die Beispiele nutzen <code>icon: proxmenux.png</code>. Homepage sucht einfache Dateinamen automatisch bei <a1>dashboardicons.com</a1>, einer Symbolsammlung für selbst gehostete Dashboards. Der ProxMenux-Eintrag steht unter <a2>dashboardicons.com/icons/external/proxmenux</a2> und wird beim ersten Anzeigen geladen. Dasselbe funktioniert für Tausende anderer Werkzeuge wie Telegram, Discord, Grafana oder Tailscale: <code>icon: <name>.png</code> genügt im Diensteintrag.",
|
||||
"imageAlt": "Homepage Dashboard mit drei ProxMenux Monitor Karten (EDGE, VOID, DREAM) mit Uptime, CPU, RAM und Temperatur für jeden Proxmox Host",
|
||||
"imageCaption": "Drei ProxMenux Monitor-Instanzen, die als Homepage-Karten gerendert wurden – Uptime, CPU, RAM und CPU Temperatur live von <code>/api/system</code> auf jedem Host alle 10 s gelesen.",
|
||||
"basicTitle": "Grundlegendes Widget — keine Authentifizierung",
|
||||
"basicIntro": "Verwenden Sie dies, wenn sich ProxMenux Monitor in einem vertrauenswürdigen Netzwerk befindet und Sie die Authentifizierung auf der Monitorseite noch nicht aktiviert haben. Der einfachste mögliche <code>services.yaml</code>-Eintrag:",
|
||||
"authedTitle": "Authentifiziertes Widget",
|
||||
"authedIntro": "Generieren Sie ein API-Token in <strong>Settings → Security → API Tokens</strong> auf dem Monitor, kopieren Sie es und fügen Sie es in den <code>Authorization</code>-Header unten ein - ersetzen Sie das Beispiel-Token, das nach <code>Bearer</code> angezeigt wird, durch das, das Sie gerade kopiert haben:",
|
||||
"authedOutro": "Starten Sie die Homepage neu und die Karte leuchtet mit Live-Werten auf. Verwenden Sie das gleiche Token für alle Homepage-Widgets, die auf denselben ProxMenux Monitor-Host zeigen.",
|
||||
"multiTitle": "Einrichtung von Multiwidgets — System, Speicher, Netzwerk",
|
||||
"multiIntro": "Für mehr Details nutzen Sie drei Karten mit unterschiedlichen Endpunkten: Systemmetriken, Datenspeicher und Netzwerk. Für dieselbe Monitor-Instanz verwenden alle dasselbe Token.",
|
||||
"multiCalloutTitle": "Mehrere Proxmox Hosts",
|
||||
"multiCalloutBody": "Wiederholen Sie den Block je Host für die gezeigten Karten. Jeder Eintrag nutzt <code>http://<host>:8008</code> seiner Monitor-Instanz. Erzeugen und speichern Sie ein Token je Host: Getrennte Installationen besitzen eigene Signierschlüssel, daher gilt ein fremdes Token nicht automatisch."
|
||||
},
|
||||
"homeAssistant": {
|
||||
"heading": "Home Assistant",
|
||||
"headingHref": "https://www.home-assistant.io",
|
||||
"intro": "Die Beispiele nutzen Home Assistants integrierte <code>rest</code>-Integration; eine eigene HACS-Komponente ist nicht nötig. Sie liest Monitor-Endpunkte aus der <link>API-Referenz</link> und erzeugt Sensoren und Attribute für Automatisierungen. Die Konfiguration liefert ungefähr 25 Sensoren für Ressourcen, Zustand, VMs/CTs, Datenspeicher, Netzwerk und Updates. Fügen Sie sie in <code>configuration.yaml</code> ein und laden oder starten Sie HA neu.",
|
||||
"imageAlt": "Home-Assistant-Übersicht mit ProxMenux-Entitäten: Zustandsanzeige, CPU-/RAM-/Temperaturanzeigen, VM-Anzahl, Datenspeicherbelegung und aktive Fehler",
|
||||
"imageCaption": "ProxMenux Monitor als erstklassige Home Assistant-Integration - Sensoren, die aus dem untenstehenden YAML-Rezept aufgebaut sind.",
|
||||
"step1Title": "1 · Speichern Sie den API-Token",
|
||||
"step1Body": "Speichern Sie das Token getrennt von der Hauptkonfiguration in <code>secrets.yaml</code>. Bearer-Präfix und Token stehen in einem Wert, der als Header referenziert wird. Die Datei ist nicht verschlüsselt und muss ebenfalls privat bleiben. Ihr Ort hängt von der Installation ab, meist <code>/config/secrets.yaml</code> unter HA OS oder Container.",
|
||||
"step2Title": "2 · REST-Konfiguration einfügen",
|
||||
"step2Body": "Sechs REST-Blöcke decken die Hauptbereiche ab. Ihr <code>scan_interval</code> passt zur Änderungsrate: Systemressourcen alle 30 s, Zustand alle 60 s, langsam veränderliche Bestände alle 5–10 Minuten. In <code>configuration.yaml</code> einfügen:",
|
||||
"step3Title": "3 · Hinzufügen von binären Sensoren und Vorlagenhelfern",
|
||||
"step3Body": "Zwei binäre Sensoren und zwei Vorlagensensoren ergänzen die Integration. Damit werden Automatisierungen und bedingte Lovelace-Karten übersichtlicher, ohne überall Jinja-Ausdrücke zu wiederholen.",
|
||||
"step4Title": "4 · Neu laden und prüfen",
|
||||
"step4Body": "Prüfen Sie zuerst die Syntax unter <em>Entwicklerwerkzeuge → YAML → Konfiguration prüfen</em>. Laden Sie dann <em>Gesamte YAML-Konfiguration</em> neu oder starten Sie HA neu. Filtern Sie unter <em>Einstellungen → Geräte & Dienste → Entitäten</em> nach <em>proxmenux</em>. Die ungefähr 25 Entitäten sollten sich innerhalb eines Abfrageintervalls füllen.",
|
||||
"replaceTitle": "Ersetzen einer früheren Version dieses Rezepts?",
|
||||
"replaceBody": "Falls Sie eine ältere Version dieser YAML-Blöcke verwendet haben, kann die Entitätsregistrierung von Home Assistant noch alte Entitäts-IDs enthalten. Veraltete Entitäten erscheinen dann weiterhin; Lovelace-Karten melden beispielsweise <em>Entität nicht gefunden</em>. Bereinigen Sie die Konfiguration in zwei Schritten: Entfernen Sie zunächst die bisherigen Blöcke <code>rest:</code> und <code>template:</code> aus <code>configuration.yaml</code> und laden Sie die Konfiguration neu. Filtern Sie anschließend unter <em>Einstellungen → Geräte & Dienste → Entitäten</em> nach <em>proxmenux</em> und entfernen Sie Einträge, die als „Wiederhergestellt“ oder nicht verfügbar angezeigt werden. Fügen Sie danach das aktuelle YAML ein und laden Sie die Konfiguration erneut. Die neuen Entitäten werden dann ohne die alten Einträge registriert.",
|
||||
"step5Title": "5 · Lovelace-Dashboard",
|
||||
"step5Body": "Das YAML bildet eine <strong>vertical-stack</strong>-Karte mit Logo, Kennzahlen, System, VMs, Datenspeicher, Netzwerk und einer bedingten Problemkarte. Öffnen Sie Ihr Dashboard, wählen Sie den Stift, dann <em>Karte hinzufügen</em> und unten <em>Manuell</em>. Fügen Sie Folgendes ein:",
|
||||
"viewTipTitle": "Möchten Sie es als vollständige Dashboard-Ansicht anstelle einer einzelnen Karte?",
|
||||
"viewTipBody": "Öffnen Sie das Dreipunktmenü → <em>Rohkonfigurationseditor</em> und ergänzen Sie eine Ansicht mit diesem Kopf über der <code>cards:</code>-Liste:",
|
||||
"viewTipOutro": "Das gibt Ihnen eine dedizierte Registerkarte / Ansicht in Ihrem Dashboard mit einem eigenen Symbol und Titel anstelle einer langen Karte in einer vorhandenen Ansicht.",
|
||||
"altViewTitle": "Alternative — eine dedizierte Dashboard-Ansicht",
|
||||
"altViewIntro": "Für eine eigene Registerkarte innerhalb eines bestehenden Dashboards fügen Sie eine Ansicht mit dem folgenden YAML hinzu. Eine Ansicht ist ein Dashboard-Tab und kein neuer Eintrag in der Seitenleiste. Schritte:",
|
||||
"altViewSteps": [
|
||||
"Öffnen Sie das Dashboard, wo Sie den neuen Tab möchten.",
|
||||
"Klicken Sie oben rechts auf den Bleistift (Dashboard bearbeiten).",
|
||||
"Klicken Sie auf die Registerkarte <em>+</em> am Ende der vorhandenen Registerkarten, um eine neue Ansicht zu erstellen.",
|
||||
"Wechseln Sie im Dialog oben rechts zu <em>Code-Editor</em>, um zwischen visueller Ansicht und YAML umzuschalten.",
|
||||
"Fügen Sie die YAML unten ein.",
|
||||
"Speichern Sie. Die Ansicht <em>ProxMenux Monitor</em> erscheint als Registerkarte im Dashboard mit ihren Karten."
|
||||
],
|
||||
"twoEditorsTitle": "Zwei YAML-Editoren in HA - wählen Sie den richtigen",
|
||||
"twoEditorsIntro": "Home Assistant hat zwei YAML-Editoren, die ähnlich aussehen, aber unterschiedliche Formate erwarten:",
|
||||
"twoEditorsItems": [
|
||||
"<strong>Editor für eine Ansicht</strong> — über <em>+</em> oder <em>Ansicht bearbeiten → Code-Editor</em>. Erwartet eine einzelne Ansicht mit <code>title:</code>, <code>path:</code> und <code>cards:</code> auf oberster Ebene, ohne führenden Bindestrich.",
|
||||
"<strong>Rohkonfigurationseditor für das ganze Dashboard</strong> — über das Dreipunktmenü. Erwartet die vollständige <code>views:</code>-Liste mit jeder Ansicht als Listeneintrag, beginnend mit <code>-</code>."
|
||||
],
|
||||
"twoEditorsOutro": "Das falsche Format kann eine <em>Unbenannte Ansicht</em> und <code>cards: []</code> erzeugen. Das folgende YAML ist für den Editor einer einzelnen Ansicht; kopieren Sie es unverändert.",
|
||||
"viewImageAlt": "Eigene Home-Assistant-Ansicht für ProxMenux Monitor: picture-entity-Kopf, glance-Kennzahlen und Entitätskarten für System, VMs, Datenspeicher und Netzwerk in mehreren Spalten",
|
||||
"viewImageCaption": "Die Ansicht <em>ProxMenux Monitor</em> auf einem breiten Bildschirm. Masonry ordnet Karten automatisch in Spalten an; das Layout hängt vom eingestellten Ansichtstyp ab.",
|
||||
"twoColTipTitle": "Möchten Sie ein festes zweispaltiges Layout anstelle des Autolayouts?",
|
||||
"twoColTipBody": "Ersetzen Sie ein Kartenpaar, etwa <em>System</em> + <em>VMs</em> oder <em>Datenspeicher</em> + <em>Netzwerk</em>, durch einen gemeinsamen <code>horizontal-stack</code>. So stehen die Karten unabhängig von der Bildschirmbreite nebeneinander:",
|
||||
"twoColTipOutro": "Auf Mobilgeräten bleibt die Zeile zusammengedrückt. Das automatische HA-Layout ohne horizontal-stack passt sich schmalen Bildschirmen besser an.",
|
||||
"step6Title": "6 · Automatisierungen",
|
||||
"step6Body": "Drei Automatisierungen, die die häufigsten reaktiven Szenarien abdecken - ersetzen Sie <code>notify.mobile_app_<your_phone></code> durch den von Ihnen verwendeten Benachrichtigungsdienst:",
|
||||
"logoTitle": "Über das ProxMenux Logo",
|
||||
"logoBody": "Die picture-entity-Karte lädt das offizielle Logo von <a1>dashboardicons.com</a1>, einer kostenlosen Symbolsammlung für selbst gehostete Dashboards. Der Eintrag steht unter <a2>dashboardicons.com/icons/external/proxmenux</a2>. Home Assistant lädt die SVG beim ersten Anzeigen per HTTPS und speichert sie im Cache.",
|
||||
"logoBrokenTitle": "Wenn die Logokarte ein defektes Bild zeigt",
|
||||
"logoBrokenIntro": "Einige HA-Installationen (Firewalled-Netzwerke, Inhaltsblocker, Hosts ohne öffentliches Internet) können jsdelivr.net zum Renderzeitpunkt nicht erreichen. Der Fix ist eine lokale Kopie:",
|
||||
"logoBrokenSteps": [
|
||||
"Laden Sie die SVG von <a>cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg</a>.",
|
||||
"Speichern Sie es in <code>/config/www/icons/proxmenux.svg</code> auf Ihrem HA-Host.",
|
||||
"Ersetzen Sie im Lovelace YAML die <code>image:</code> URL durch <code>/local/icons/proxmenux.svg</code>. Speichern und neu laden - das Bild rendert aus der lokalen Datei, kein Internet erforderlich."
|
||||
],
|
||||
"scanTipTitle": "scan_interval Faustregel",
|
||||
"scanTipBody": "Für <code>/api/system</code> sind 30 s ein sinnvoller Startwert. <code>/api/health/full</code> liest normalerweise bis zu sechs Minuten gültige Hintergrunddaten; Abfragen alle 60 s umgehen diesen Cache nicht. Versuchen Sie fünf Minuten für <code>/api/storage/summary</code> und eine Stunde für <code>/api/proxmenux/update-status</code>. Passen Sie die Zeiten an Hardware und Hostanzahl an."
|
||||
},
|
||||
"grafana": {
|
||||
"heading": "Prometheus + Grafana",
|
||||
"promHref": "https://prometheus.io",
|
||||
"grafanaHref": "https://grafana.com",
|
||||
"intro": "ProxMenux Monitor stellt <code>GET /api/prometheus</code> im Prometheus-Textformat 0.0.4 bereit. Bei aktiver Authentifizierung ist ein Bearer-Token nötig. Lassen Sie Prometheus die Metriken sammeln und Grafana die Zeitreihendatenbank visualisieren.",
|
||||
"imageAlt": "Grafana-Dashboard mit ProxMenux-Metriken: CPU-Anzeige, Arbeitsspeicherverlauf, Anzahl laufender VMs und Netzwerkdurchsatz",
|
||||
"imageCaption": "Ein einfaches Grafana-Dashboard aus den von Prometheus gesammelten ProxMenux-Daten: CPU, Arbeitsspeicher, laufende VMs und Netzwerkdurchsatz. Den vollständigen Katalog finden Sie unter <link>API-Referenz → Prometheus-Metriken</link>.",
|
||||
"step1Title": "1 · Fügen Sie den Scrape Job zu Prometheus hinzu",
|
||||
"step1Body": "Geben Sie den API-Token über den nativen <code>authorization</code>-Block von Prometheus weiter (sauberer als benutzerdefinierte Header und funktioniert mit Secret Stores):",
|
||||
"step1After": "Laden Sie Prometheus mit <code>kill -HUP <PID></code> neu (PID durch seine Prozess-ID ersetzen), mit <code>systemctl reload prometheus</code>, sofern unterstützt, oder im Container mit <code>docker compose restart prometheus</code>. Unter <em>Status → Targets</em> sollte proxmenux innerhalb eines Intervalls UP zeigen. Das Label <code>node=\"<hostname>\"</code> unterscheidet Hosts.",
|
||||
"tokenTipTitle": "Token in einer separaten Datei speichern",
|
||||
"tokenTipBody": "Speichern Sie das Token im Produktivbetrieb getrennt von der Konfiguration. Mit <code>credentials_file: /etc/prometheus/secrets/proxmenux.token</code> liest Prometheus es aus einer Datei mit Berechtigung 0600.",
|
||||
"step2Title": "2 · Überprüfen Sie den Scrape mit ein paar Abfragen",
|
||||
"step2Body": "Prüfen Sie vor Grafana, ob Prometheus Daten enthält. Öffnen Sie <code>http://<prometheus-host>:9090</code>, wählen Sie <em>Query</em> und führen Sie eine der folgenden Abfragen aus. Sie sollten aktuelle Werte des Proxmox-Hosts erhalten:",
|
||||
"headerQuery": "Abfrage",
|
||||
"headerConfirms": "Was es bestätigt",
|
||||
"verifyRows": [
|
||||
{
|
||||
"query": "up{job=\"proxmenux\"}",
|
||||
"confirms": "Liefert <code>1</code>, wenn Prometheus erfolgreich Daten abruft, sonst <code>0</code>. Die schnellste erste Prüfung."
|
||||
},
|
||||
{
|
||||
"query": "proxmox_cpu_usage",
|
||||
"confirms": "Aktuelle CPU-Auslastung des Proxmox-Hosts in Prozent. Der Wert sollte sich bei Abfragen im Abstand einiger Sekunden ändern."
|
||||
},
|
||||
{
|
||||
"query": "proxmox_vms_running",
|
||||
"confirms": "Anzahl der laufenden Gäste. Vergleichen Sie mit dem, was Sie in der Proxmox UI sehen."
|
||||
},
|
||||
{
|
||||
"query": "proxmox_uptime_seconds / 86400",
|
||||
"confirms": "Host Uptime in Tagen. Sollte dem Wert entsprechen, den Sie in <code>uptime</code> auf der Proxmox-Shell sehen würden."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "Die 401, die Sie beim Klicken auf die Endpunkt-URL sehen können, ist in Ordnung",
|
||||
"calloutBody": "Bei aktiver Authentifizierung ruft der Browser über <em>Status → Targets</em> den Endpunkt <code>/api/prometheus</code> ohne Prometheus-Bearer-Header ab. Die Antwort kann <code>'{'\"error\":\"Authentication required\"'}'</code> enthalten. Prüfen Sie den tatsächlichen <em>State: UP</em>, um den erfolgreichen Abruf durch Prometheus zu bestätigen.",
|
||||
"step3Title": "3 · Hinzufügen von Prometheus als Grafana-Datenquelle",
|
||||
"step3Body": "Öffnen Sie in Grafana <em>Connections → Data sources → Add new → Prometheus</em>. Tragen Sie die Prometheus-URL ein, etwa <code>http://prometheus.lan:9090</code>, speichern und testen Sie. Eine vom Prometheus-Server verlangte Anmeldung wird hier separat eingerichtet. Das Monitor-Token gehört in den Prometheus-Abrufauftrag.",
|
||||
"step4Title": "4 · Erstellen Sie Panels mit diesen PromQL-Abfragen",
|
||||
"step4Body": "Ein Einstieg mit den typischen Kennzahlen eines Proxmox-Hosts:",
|
||||
"headerPanel": "Panel-Idee",
|
||||
"headerPromql": "PromQL-Abfrage",
|
||||
"panelRows": [
|
||||
{
|
||||
"panel": "CPU-Auslastungsanzeige je Host",
|
||||
"promql": "proxmox_cpu_usage"
|
||||
},
|
||||
{
|
||||
"panel": "Speichernutzungsmessgerät pro Host",
|
||||
"promql": "proxmox_memory_usage_percent"
|
||||
},
|
||||
{
|
||||
"panel": "Genutzter und gesamter Arbeitsspeicher (Zeitreihen)",
|
||||
"promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024"
|
||||
},
|
||||
{
|
||||
"panel": "Laufende VMs / CTs pro Host",
|
||||
"promql": "proxmox_vms_running"
|
||||
},
|
||||
{
|
||||
"panel": "CPU-Temperatur",
|
||||
"promql": "proxmox_cpu_temperature_celsius"
|
||||
},
|
||||
{
|
||||
"panel": "Netzdurchsatz RX (Bytes/s)",
|
||||
"promql": "rate(proxmox_interface_bytes_received_total[5m])"
|
||||
},
|
||||
{
|
||||
"panel": "Netzdurchsatz TX (Bytes/s)",
|
||||
"promql": "rate(proxmox_interface_bytes_sent_total[5m])"
|
||||
},
|
||||
{
|
||||
"panel": "Lastmittelwert (1 m)",
|
||||
"promql": "proxmox_load_average{period=\"1m\"}"
|
||||
},
|
||||
{
|
||||
"panel": "Belegter Speicherplatz je Einhängepunkt in Prozent",
|
||||
"promql": "proxmox_disk_usage_percent"
|
||||
},
|
||||
{
|
||||
"panel": "UPS Batterieladung",
|
||||
"promql": "proxmox_ups_battery_charge_percent"
|
||||
},
|
||||
{
|
||||
"panel": "GPU Temperatur pro Slot",
|
||||
"promql": "proxmox_gpu_temperature_celsius"
|
||||
}
|
||||
],
|
||||
"outro": "Fügen Sie jede Abfrage als Grafana-Panel hinzu, legen Sie die richtige Visualisierung fest (<em>Stat</em> für Messgeräte, <em>Time series</em> für Trends) und gruppieren Sie Panels in Zeilen nach Kategorie. Verwenden Sie das <code>node</code>-Label als Dashboard-Variable (<em>Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)</em>), um alle Panels nach Host zu filtern."
|
||||
},
|
||||
"uptimeKuma": {
|
||||
"heading": "Uptime Kuma und andere Statuschecker",
|
||||
"href": "https://github.com/louislam/uptime-kuma",
|
||||
"intro": "Für Schlüsselwortprüfungen nutzen Sie <code>GET /api/system-info</code>. Diese Route verlangt kein Token und liefert Hostname, Laufzeit und Zustand als <code>healthy</code>, <code>warning</code> oder <code>critical</code>. Sie ist öffentlich, anders als die geschützten detaillierten Zustandsendpunkte.",
|
||||
"kumaTitle": "Uptime Kuma — HTTP Keyword Monitor",
|
||||
"kumaSteps": [
|
||||
"Klicken Sie in Uptime Kuma auf <em>+ Neuen Monitor hinzufügen</em>.",
|
||||
"Monitortyp: <em>HTTP(s) - Keyword</em>.",
|
||||
"Freundlicher Name: <em>ProxMenux Monitor — pve01</em>.",
|
||||
"URL: <code>http://pve01.lan:8008/api/system-info</code>.",
|
||||
"Schlüsselwort: <code>healthy</code> (der Wert von <code>health.status</code>, wenn der Host in Ordnung ist).",
|
||||
"Heartbeat Intervall: 60 Sekunden sind genug.",
|
||||
"Speichern Sie. Die Route system-info benötigt keinen Bearer-Header."
|
||||
],
|
||||
"healthchecksTitle": "healthchecks.io / Pings nach Cron-Zeitplan",
|
||||
"healthchecksBody": "Ein Cronjob kann <code>/api/system-info</code> abfragen und <code>.health.status == \"healthy\"</code> prüfen. Erst nach erfolgreicher Prüfung sendet er einen Erfolgsping an seine Healthchecks.io-URL. Der Dienst empfängt Job-Pings und fragt den Monitor nicht selbst ab. HTTP 2xx allein beweist keinen gesunden Host.",
|
||||
"richTitle": "Möchten Sie reichhaltige Gesundheitsdaten",
|
||||
"richBody": "Für den vollständigen Zustand mit zehn Kategorien, aktiven und unterdrückten Fehlern nutzen Sie <code>GET /api/health/full</code>. Die Antwort enthält die Daten des Dashboard-Dialogs. Bei aktiver Authentifizierung ist ein Bearer-Token nötig."
|
||||
},
|
||||
"workflows": {
|
||||
"heading": "n8n, Zapier und eigene Skripte",
|
||||
"intro": "Workflow-Werkzeuge und Skripte können mit POST an <code>/api/notifications/send</code> Meldungen <em>senden</em>, etwa bei CI-Fehlern oder langen Cronjobs. Der direkte Versand umgeht Ereigniswarteschlange und Fingerprint-Sperrzeit. Kanalformatierung, optionale KI und Versand bleiben erhalten. Erforderliche Duplikatkontrolle übernimmt der Aufrufer.",
|
||||
"n8nBody": "Nutzen Sie in n8n einen <em>HTTP Request</em>-Knoten mit POST, obiger URL und demselben JSON wie curl. Wählen Sie generische Header-Auth-Zugangsdaten mit <em>Authorization</em> und <code>Bearer YOUR_API_TOKEN</code>; ersetzen Sie den Platzhalter. Ein Zeitplan, Webhook oder vorheriger Knoten löst die Anfrage aus.",
|
||||
"severityBody": "Schweregrade sind <code>INFO</code>, <code>WARNING</code> oder <code>CRITICAL</code> in Großbuchstaben. <code>data</code> liefert Kontext. Die KI nutzt gerenderten Titel und Text sowie unterstützte Ergänzungen; beliebige Felder erscheinen nicht garantiert in Prompt oder Ausgabe. Siehe <link>Benachrichtigungen → Ereigniskatalog</link>."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Nativer Proxmox-VE-Webhook (eingehend)",
|
||||
"intro1": "PVE erhielt sein Benachrichtigungssystem mit 8.1; native Webhook-Ziele erfordern Proxmox VE 8.3 oder neuer. <em>Benachrichtigungen aktivieren</em> in Einstellungen versucht, den Monitor als Ziel einzutragen. Dorthin geleitete PVE-Meldungen wie Sicherungs- oder Replikationsberichte gelangen in seinen Versandablauf. Die Einrichtung benötigt eine verfügbare, beschreibbare Konfiguration.",
|
||||
"intro2": "Ablauf, PVE-Nachrichtenvorlage, Einträge in <code>/etc/pve/notifications.cfg</code> und Clusterverhalten beschreibt <link>Benachrichtigungen → PVE-Webhook-Integration</link>."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "API-Referenz",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — alle Endpunkte mit Methode, Pfad und vollständigem Prometheus-Metrikkatalog."
|
||||
},
|
||||
{
|
||||
"label": "Benachrichtigungen",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — Ereignisquellen, Kanäle, Versandablauf und PVE-Webhook-Integration im Detail."
|
||||
},
|
||||
{
|
||||
"label": "KI-Assistent",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tail": " — optionale Überarbeitung von Vorlagentexten in verständliche Sprache vor dem Versand an Telegram, Discord, E-Mail oder Gotify."
|
||||
},
|
||||
{
|
||||
"label": "Zugriff und Authentifizierung",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — Erzeugen und Widerrufen der API-Token für diese Beispiele, Prüfprotokoll und TLS-Konfiguration."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,535 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Proxmox-Benachrichtigungen — Telegram, Discord, E-Mail, Gotify, Pushover, Apprise | ProxMenux Monitor",
|
||||
"description": "Senden Sie Proxmox VE-Benachrichtigungen an Telegram, Discord, E-Mail, Gotify, Pushover und ~80 zusätzliche Dienste über Apprise. ProxMenux Monitor verwandelt Ereignisse aus dem Health Monitor, dem Journal Watcher und dem Proxmox VE webhook in reichhaltige Nachrichten mit Deduplizierung, Cooldown, Burst-Aggregation, einer optionalen KI-Umschreibung und einer vollständigen Historie.",
|
||||
"ogTitle": "Proxmox-Benachrichtigungen — Telegram, Discord, E-Mail, Gotify, Pushover, Apprise",
|
||||
"ogDescription": "Senden Sie Proxmox VE-Benachrichtigungen an Telegram, Discord, E-Mail, Gotify, Pushover und ~80 zusätzliche Dienste über Apprise - mit Deduplizierung, Cooldown, Burst-Aggregation und einer optionalen KI-Umschreibung.",
|
||||
"twitterTitle": "Proxmox Benachrichtigungen | ProxMenux Monitor",
|
||||
"twitterDescription": "Senden Sie Proxmox VE-Benachrichtigungen an Telegram, Discord, E-Mail, Gotify, Pushover und ~80 zusätzliche Dienste über Apprise."
|
||||
},
|
||||
"header": {
|
||||
"title": "Benachrichtigungen",
|
||||
"description": "Verteilt Ereignisse der Monitor-Datensammler an Telegram, Discord, E-Mail, Gotify, Pushover und etwa 80 Dienste über Apprise. Mit Deduplizierung, Wartezeiten für Wiederholungen, Zusammenfassung von Ereignisspitzen, Ereignis-/Kanalfiltern, optionaler KI und abrufbarem Verlauf.",
|
||||
"section": "ProxMenux-Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Woher die Nachrichten kommen",
|
||||
"body": "Benachrichtigungen verteilen die Ereignisse bestehender Monitor-Quellen: <link>Health Monitor</link>, Systemjournal- und Aufgabenüberwachung, PVE-Webhook, regelmäßige Abfragen und direkte Aufrufe der ProxMenux-Skripte. Jedes Ereignis durchläuft denselben Versandprozess."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Wie es funktioniert",
|
||||
"intro": "Jede Benachrichtigung folgt dem gleichen Pfad durch den Monitor-Prozess. Ereignisse werden von einer Handvoll unabhängiger Sammler produziert, in eine strukturierte Nutzlast normalisiert, durch eine Versandpipeline geleitet, die entscheidet, ob und in welcher Form gesendet werden soll, optional von einem LLM umgeschrieben und schließlich auf die Kanäle aufgefächert, die der Benutzer konfiguriert hat.",
|
||||
"arrowLabel": "Ereignis",
|
||||
"caption": "Übersicht des Ablaufs. Tatsächliche Versandversuche werden bei Erfolg, Zusammenfassung oder Fehler im SQLite-Verlauf gespeichert. Durch Wartezeiten unterdrückte Ereignisse werden nicht protokolliert.",
|
||||
"nodes": {
|
||||
"sourcesLabel": "Quellen",
|
||||
"sourcesDetail": "Health Monitor\nSystemjournal-Überwachung\nAufgabenüberwachung\nPVE-Webhook\nRegelmäßige Abfragen\nDirekte Ereignisquellen",
|
||||
"dispatchLabel": "Versandablauf",
|
||||
"dispatchDetail": "Ereignisspitzen zusammenfassen\nFingerabdruck / Wartezeit prüfen\nGruppenlimits\nKanalsteuerung",
|
||||
"aiLabel": "KI-Überarbeitung (optional)",
|
||||
"aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(standardmäßig deaktiviert)",
|
||||
"channelsLabel": "Kanäle",
|
||||
"channelsDetail": "Telegram\nDiscord\nE-Mail (SMTP)\nGotify\nPushover\nApprise (~80 Dienste)"
|
||||
}
|
||||
},
|
||||
"enabling": {
|
||||
"heading": "Benachrichtigungen aktivieren",
|
||||
"intro": "Nach einer Neuinstallation zeigt die Karte unter Einstellungen <em>Deaktiviert</em> und die Schaltfläche <em>Benachrichtigungen aktivieren</em>. Zuvor wird nichts versendet und keine PVE-Konfiguration geändert.",
|
||||
"disabledAlt": "Benachrichtigungskarte nach Neuinstallation mit Status Deaktiviert und Schaltfläche zum Aktivieren",
|
||||
"disabledCaption": "Der erste Zustand - ein Klick zum Aktivieren.",
|
||||
"stepsIntro": "Das Drücken des Knopfes macht drei Dinge in der Reihenfolge:",
|
||||
"steps": [
|
||||
"Wechselt zu <em>Aktiv</em> und zeigt das Kanalformular an.",
|
||||
"Registriert ein Proxmox-Webhook-Ziel in <code>/etc/pve/notifications.cfg</code>. Ohne HTTPS verwendet es <code>POST http://127.0.0.1:8008/api/notifications/webhook</code>, mit HTTPS den lokalen HTTP-Empfänger auf Port 8009. PVE-Meldungen gelangen in den Versandprozess des Monitors. Siehe <pvelink>PVE-Webhook-Integration</pvelink>.",
|
||||
"Startet den Versandthread, der die Ereigniswarteschlange abfragt und jedes Ereignis verarbeitet."
|
||||
],
|
||||
"activeAlt": "Aktivierte Benachrichtigungskarte mit Kanälen, Anzeigename und aufklappbaren erweiterten KI-Einstellungen",
|
||||
"activeCaption": "Aktiv: Kanalregister oben (Telegram / Gotify / Discord / E-Mail / Pushover / Apprise), Anzeigename, Kanal-Kategorien und aufklappbarer Abschnitt <em>Erweitert: KI-Verbesserung</em>."
|
||||
},
|
||||
"sources": {
|
||||
"heading": "Ereignisquellen",
|
||||
"intro": "Sechs Quelltypen liefern Ereignisse: Hintergrundsammler, Webhook-Empfänger und direkte Quellen im Prozess. Sie erzeugen strukturierte <code>NotificationEvent</code>-Objekte.",
|
||||
"headerCollector": "Sammler",
|
||||
"headerWatches": "Überwacht",
|
||||
"headerEvents": "Typische Ereignisse",
|
||||
"rows": [
|
||||
{
|
||||
"collector": "Gesundheitsmonitor",
|
||||
"watches": "Zehn Kategorien, alle 5 Minuten",
|
||||
"events": "<code>new_error</code>, <code>error_resolved</code>, <code>error_escalated</code>, <code>health_degraded</code>, <code>health_persistent</code>."
|
||||
},
|
||||
{
|
||||
"collector": "Journal-Überwachung",
|
||||
"watches": "<code>journalctl --follow</code> mit Mustern für SSH-/Web-Anmeldefehler, Fail2Ban-Sperren bei installierter Jail, Kernel-E/A-Fehler, OOM und smartd-Ereignisse.",
|
||||
"events": "<code>auth_fail</code>, <code>ip_block</code>, <code>oom_kill</code>, <code>disk_io_error</code>, <code>service_fail</code>."
|
||||
},
|
||||
{
|
||||
"collector": "Aufgabenüberwachung",
|
||||
"watches": "Prüft <code>/var/log/pve/tasks/index</code> auf neue Aufgaben-UPIDs und verfolgt deren Protokolldateien.",
|
||||
"events": "<code>backup_start</code>, <code>backup_complete</code>, <code>backup_warning</code>, <code>backup_fail</code>, <code>migration_*</code>, <code>snapshot_complete</code>."
|
||||
},
|
||||
{
|
||||
"collector": "Proxmox-Webhook-Empfänger",
|
||||
"watches": "Empfängt <code>POST /api/notifications/webhook</code>. PVE-Versionen mit Webhook-Zielen können nach der Einrichtung Meldungen hierher senden; siehe <pvelink>unten</pvelink>.",
|
||||
"events": "Alles, was PVE aussendet - einschließlich Ereignisse, die der Monitor sonst verpassen würde (HA, Replikation, vzdump von der GUI)."
|
||||
},
|
||||
{
|
||||
"collector": "Regelmäßige Abfragen",
|
||||
"watches": "Regelmäßige Vergleiche von Cluster-Erreichbarkeit, Zertifikatsablauf, GPU-Passthrough und verfügbaren PVE-/ProxMenux-Updates.",
|
||||
"events": "<code>node_disconnect</code>, <code>node_reconnect</code>, <code>pve_update</code>, <code>proxmenux_update</code>, <code>gpu_mode_switch</code>, <code>pci_passthrough_conflict</code>."
|
||||
},
|
||||
{
|
||||
"collector": "In-Prozess-Emittenten",
|
||||
"watches": "Direkte Aufrufe aus ProxMenux-Skripten und dem Monitor selbst (<code>notification_manager.emit_event(...)</code>).",
|
||||
"events": "<code>system_startup</code>, <code>system_shutdown</code>, <code>system_reboot</code>, <code>ai_model_migrated</code>, benutzerdefinierte Testereignisse."
|
||||
}
|
||||
],
|
||||
"after1": "Jedes Ereignis trägt eine stabile <code>event_type</code> (der Katalog ist unten), eine <code>severity</code> (<code>INFO</code>, <code>WARNING</code>, <code>CRITICAL</code>), eine <code>category</code> (für Emoji-Anreicherung und Pro-Gruppen-Filter verwendet) und eine <code>data</code> Nutzlast mit allem, was die Vorlage benötigt (<code>vmid</code>, <code>device</code>, <code>source_ip</code>, <code>reason</code>...).",
|
||||
"after2": "Für jeden <code>event_type</code> erzeugt eine Vorlage in <code>notification_templates.py</code> den Nachrichtentext. Dieser durchläuft den Versand und kann bei aktivierter KI umgeschrieben werden. Die <ailink>Seite zum KI-Assistenten</ailink> beschreibt das Zusammenspiel."
|
||||
},
|
||||
"channels": {
|
||||
"heading": "Kanäle einrichten",
|
||||
"intro": "Derzeit werden sechs Kanäle unterstützt: Telegram, Discord, Gotify, Email (SMTP), Pushover und Apprise. Die ersten fünf sind native Integrationen mit eigenen Konfigurationsfeldern. Apprise ist ein allgemeiner Hub, der 80 zusätzliche Dienste (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost ...) über ein einziges URL-Feld hinzufügt. Sie sind alle Schritt für Schritt unten dokumentiert.",
|
||||
"credsTitle": "Speicherort der Zugangsdaten",
|
||||
"credsBody": "Tokens, Schlüssel, webhook-URLs und SMTP-Passwörter werden lokal in der SQLite-Datenbank des Monitors unter <code>/usr/local/share/proxmenux/</code> gespeichert. Sensible Werte werden in der Schnittstelle geschützt und maskiert. Sie verlassen den Gastgeber nie, außer um ihre jeweiligen Dienste zu erreichen. Eine Sicherung dieses Verzeichnisses reicht aus, um die konfigurierten Kanäle wiederherzustellen."
|
||||
},
|
||||
"telegram": {
|
||||
"heading": "Telegram",
|
||||
"intro": "Benötigt werden ein <strong>Bot-Token</strong>, das für mehrere Chats nutzbar ist, und eine <strong>Chat-ID</strong> für den Zielchat, eine Gruppe oder ein Supergruppen-Thema. Die integrierte Anleitung führt durch die Einrichtung; unten werden auch die ID-Formate erklärt.",
|
||||
"guideAlt": "Telegram-Einrichtung mit vier Schritten: BotFather, Bot-Token, Chat-ID und Gruppen oder Kanäle",
|
||||
"guideCaption": "Der Link <em>+ Einrichtungsanleitung</em> öffnet vier Schritte, mit denen der Bot und der Kanal in etwa zwei Minuten eingerichtet werden.",
|
||||
"step1Title": "1 · Erstellen Sie einen Bot mit BotFather",
|
||||
"step1Items": [
|
||||
"Öffnen Sie Telegram und starten Sie einen Chat mit <a>@BotFather</a> (derjenige mit dem blauen Verifizierungshaken - Kopien sind üblich).",
|
||||
"<code>/newbot</code> senden.",
|
||||
"Anzeigenamen wählen, etwa <em>ProxMenux Lab</em>. Später änderbar.",
|
||||
"Einen eindeutigen Telegram-Benutzernamen wählen, der mit <code>bot</code> endet, etwa <em>proxmenux_lab_bot</em>.",
|
||||
"BotFather antwortet mit einem Token wie <code>123456789:ABCdef…</code>. Dies ist das Bot-Token; wie ein Passwort behandeln."
|
||||
],
|
||||
"step2Title": "2 · Erhalten Sie die Chat-ID",
|
||||
"step2Intro": "Die Chat-ID bestimmt, <em>wohin</em> der Bot sendet. Je nach Ziel gibt es zwei Formen.",
|
||||
"privateLabel": "Privater Chat (Sie erhalten die Benachrichtigungen auf Ihrem eigenen Konto):",
|
||||
"privateItems": [
|
||||
"Dem neuen Bot eine Nachricht wie <code>/start</code> senden.",
|
||||
"Mit <a1>@userinfobot</a1> oder <a2>@myidbot</a2> chatten und <code>/start</code> senden. Die Antwort enthält Ihre numerische Benutzer-ID, zugleich die positive Chat-ID."
|
||||
],
|
||||
"privateAlt": "Telegram-Kanalformular gefüllt mit Bot Token (maskiert), positiver Chat-ID für einen privaten Chat und einem leeren optionalen Themen-ID-Feld",
|
||||
"privateCaption": "Privater Bot-Chat: Chat-ID ist die positive persönliche Benutzer-ID.",
|
||||
"groupLabel": "Gruppe oder Supergruppe mit Themen:",
|
||||
"groupItems": [
|
||||
"Bot als Mitglied hinzufügen; bei Bedarf Schreibrechte als Administrator erteilen.",
|
||||
"Senden Sie eine Nachricht in der Gruppe.",
|
||||
"Öffnen Sie <code>https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates</code> in einem Browser. Suchen Sie nach <code>chat.id</code> in der JSON-Antwort - für Gruppen ist es eine negative Zahl, für Supergruppen beginnt es mit <code>-100</code>.",
|
||||
"Bei Supergruppen mit <em>Themen</em> die gewünschte <code>message_thread_id</code> im optionalen Feld <em>Themen-ID</em> eintragen."
|
||||
],
|
||||
"groupAlt": "Telegram-Formular mit maskiertem Bot-Token, negativer Supergruppen-ID beginnend mit -100 und Themen-ID 3",
|
||||
"groupCaption": "Die Chat ID beginnt mit <code>-100…</code> und die optionale <em>Topic ID</em> zielt auf einen bestimmten Thread ab.",
|
||||
"step3Title": "3 · Speichern und Testen",
|
||||
"step3Body": "Bot-Token und Chat-ID eintragen, speichern und <em>Test senden</em> wählen. Die Nachricht sollte binnen einer Sekunde eintreffen. Bei Fehlern zeigt der Verlauf den Grund, etwa ungültiges Token, fehlende Gruppenmitgliedschaft oder Blockierung durch den Benutzer."
|
||||
},
|
||||
"discord": {
|
||||
"heading": "Discord",
|
||||
"intro": "Discord-Kanäle akzeptieren eingehende Nachrichten über einen <em>Webhook URL</em>, der an einen einzelnen Kanal gebunden ist. Der Monitor benötigt diese URL und nichts anderes.",
|
||||
"items": [
|
||||
"In Discord den Server öffnen und <em>Servereinstellungen → Integrationen → Webhooks</em> wählen.",
|
||||
"<em>Neuer Webhook</em> wählen, einen Namen wie <em>ProxMenux</em> vergeben und den Zielkanal wählen. Avatar optional.",
|
||||
"<em>Webhook-URL kopieren</em> wählen. Format: <code>https://discord.com/api/webhooks/<id>/<token></code>.",
|
||||
"Fügen Sie es in das Webhook URL-Feld des Discord-Tabs im Benachrichtigungsfeld ein und speichern Sie es."
|
||||
],
|
||||
"imageAlt": "Discord Kanalformular mit Webhook URL Feld beginnend mit https://discord.com/api/webhooks/",
|
||||
"imageCaption": "Discord — Fügen Sie die Webhook-URL aus <em>Server-Einstellungen → Integrationen → Webhooks</em> ein."
|
||||
},
|
||||
"gotify": {
|
||||
"heading": "Gotify",
|
||||
"intro": "Gotify ist ein selbst betriebener Push-Server. Benötigt werden seine Basis-URL und ein in der Verwaltung erzeugtes <em>Anwendungstoken</em>.",
|
||||
"items": [
|
||||
"Falls Gotify noch nicht läuft, folgen Sie der <a>offiziellen Installationsanleitung</a>.",
|
||||
"Als Administrator in Gotify <em>Apps</em> → <em>Anwendung erstellen</em> öffnen, einen Namen wie <em>ProxMenux</em> vergeben und das Token kopieren.",
|
||||
"Im Gotify-Kanal <em>Server-URL</em> auf die Basis-URL setzen, etwa <code>https://gotify.example.com</code>, und das Anwendungstoken einfügen.",
|
||||
"Speichern und <em>Test senden</em> wählen."
|
||||
],
|
||||
"imageAlt": "Gotify-Kanalformular mit Server-URL-Feld auf https://gotify.example.com und ein App-Token-Feld mit Platzhalter A_valid_gotify_token",
|
||||
"imageCaption": "Gotify - Server-URL Ihrer selbst gehosteten Instanz sowie das App-Token von der Gotify-Admin-Benutzeroberfläche."
|
||||
},
|
||||
"email": {
|
||||
"heading": "E-Mail (SMTP)",
|
||||
"intro": "E-Mail ist der flexibelste Kanal - und der mit den meisten Feldern. Sie benötigen einen SMTP-Server, einen Port, einen TLS-Modus, optional einen Benutzernamen und ein Passwort, eine Absenderadresse und mindestens einen Empfänger.",
|
||||
"imageAlt": "SMTP-Formular mit Host, Port, TLS-Modus, Benutzername, Passwort, Absender, durch Kommas getrennten Empfängern und Betreffpräfix",
|
||||
"imageCaption": "SMTP-Host, Port, TLS-Modus, optional Benutzername und Passwort, Absender, Empfänger und Betreffpräfix zum Filtern im Posteingang.",
|
||||
"appNote": "Der Monitor nutzt SMTP mit Passwort. Gmail kann ein <strong>App-Passwort</strong> verlangen. Bei Microsoft hängt die Unterstützung vom Dienst und den Mandantenrichtlinien ab; ein App-Passwort umgeht keine Sperre der Basisauthentifizierung. Zulässigkeit vorab prüfen.",
|
||||
"gmailTitle": "Gmail App Passwort",
|
||||
"gmailIntro": "Gmail-App-Passwörter benötigen aktive <strong>Bestätigung in zwei Schritten</strong>. Andernfalls ist <em>App-Passwörter</em> nicht verfügbar.",
|
||||
"gmailItems": [
|
||||
"Öffnen Sie <a>myaccount.google.com/security</a> und aktivieren Sie <em>2-Schritt-Verifizierung</em>, wenn es nicht bereits eingeschaltet ist.",
|
||||
"Gehen Sie zu <a>myaccount.google.com/apppasswords</a>.",
|
||||
"Einen Namen wie <em>ProxMenux</em> eingeben und <em>Erstellen</em> wählen. Das 16-stellige Passwort kopieren.",
|
||||
"Eintragen: <em>Host</em> <code>smtp.gmail.com</code>, <em>Port</em> <code>587</code>, <em>TLS-Modus</em> <code>STARTTLS</code>, <em>Benutzername</em> Ihre Gmail-Adresse, <em>Passwort</em> das 16-stellige App-Passwort."
|
||||
],
|
||||
"outlookTitle": "Microsoft / Outlook App Passwort",
|
||||
"outlookIntro": "Microsoft-App-Passwörter erfordern <strong>zweistufige Überprüfung</strong>, gewährleisten aber keine SMTP-Kompatibilität. Verlangt der Dienst oder Mandant OAuth2, kann sich der Passwort-SMTP-Client des Monitors nicht anmelden. Nutzen Sie ein Relay mit passender Authentifizierung zum Anbieter.",
|
||||
"outlookItems": [
|
||||
"Öffnen Sie <a>account.microsoft.com/security</a> und ermöglichen Sie eine zweistufige Verifizierung.",
|
||||
"Falls angeboten, unter <em>Erweiterte Sicherheitsoptionen</em> → <em>App-Passwörter</em> die Option <em>Neues App-Passwort erstellen</em> wählen. Das garantiert keine Unterstützung für SMTP mit Passwort.",
|
||||
"Falls ein App-Passwort erzeugt wird, kopieren und die SMTP-Zulässigkeit prüfen.",
|
||||
"Nur bei erlaubtem Passwort-SMTP die genehmigten Werte eintragen: <em>Host</em> <code>smtp.office365.com</code> für Exchange Online, <em>Port</em> <code>587</code>, <em>TLS-Modus</em> <code>STARTTLS</code>, <em>Benutzername</em> die Mailadresse und <em>Passwort</em> die erlaubte SMTP-Zugangsinformation. Persönliches Outlook.com hat andere Einstellungen und Anforderungen."
|
||||
],
|
||||
"relayTitle": "Selbst gehostetes SMTP-Relay",
|
||||
"relayBody": "Den Monitor auf ein eigenes SMTP-Relay wie Postfix richten. Das Relay authentifiziert sich beim Anbieter. Authentifizierung und TLS des Monitors müssen zum Relay passen; ein lokales Relay deaktiviert die Verschlüsselung nicht automatisch."
|
||||
},
|
||||
"pushover": {
|
||||
"heading": "Pushover",
|
||||
"intro": "Pushover ist ein mobiler Push-Service mit offiziellen Apps für iOS, Android und Desktop-Browser. Der dedizierte ProxMenux-Kanal spricht direkt mit dem <a>Pushover API</a>, so dass keine Apprise-URL erforderlich ist.",
|
||||
"stepsTitle": "Einrichtung",
|
||||
"steps": [
|
||||
"Ein <a>Pushover-Konto</a> erstellen, die App auf den gewünschten Empfängergeräten installieren und anmelden.",
|
||||
"Kopieren Sie den <em>User Key</em>, der auf Ihrem Pushover-Dashboard angezeigt wird. Ein Gruppenschlüssel kann stattdessen verwendet werden, wenn mehrere Personen oder Geräte die gleiche Warnung erhalten müssen.",
|
||||
"<a>Anwendung/API-Token erstellen</a> öffnen, eine Anwendung namens <em>ProxMenux</em> erstellen und ihr 30-stelliges API-Token kopieren.",
|
||||
"Unter <em>Einstellungen → Benachrichtigungen → Pushover</em> Benutzer- oder Gruppenschlüssel und API-Token eintragen. Gerät und Ton sind optional.",
|
||||
"Speichern und <em>Test senden</em> wählen. Die App sollte die Nachricht sofort empfangen."
|
||||
],
|
||||
"priorityTitle": "Prioritäre Zuordnung",
|
||||
"priorityBody": "Normale Meldungen verwenden Pushover-Priorität 0. Mit <strong>Hohe Priorität für kritische Warnungen</strong> verwenden CRITICAL-Ereignisse Priorität 1 und umgehen Pushover-Ruhezeiten. Notfallpriorität 2 mit wiederholten Meldungen und Bestätigung wird nicht verwendet.",
|
||||
"secretTitle": "Schützen Sie beide Werte",
|
||||
"secretBody": "Der Benutzer- oder Gruppenschlüssel und das Anwendungstoken API autorisieren beide die Nachrichtenzustellung. ProxMenux speichert sie als geschützte Benachrichtigungsgeheimnisse und maskiert sie in der Schnittstelle; Veröffentlichen Sie keinen Wert in Screenshots oder Support-Protokollen."
|
||||
},
|
||||
"apprise": {
|
||||
"heading": "Apprise (generischer Hub für ~ 80-Dienste)",
|
||||
"intro": "Apprise unterstützt etwa 80 Dienste über URLs. So erreichen Sie ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API und weitere Dienste ohne eigene Monitor-Integration. Auch Pushover ist möglich; für ein einzelnes Pushover-Ziel ist dessen eigener Kanal einfacher.",
|
||||
"listIntro": "Die vollständige Liste der unterstützten Dienste und das genaue URL-Format für jeden einzelnen finden Sie in der offiziellen Apprise-Dokumentation:",
|
||||
"listItems": [
|
||||
"<a>Apprise-Dokumentation der Dienste</a> — vollständige Liste.",
|
||||
"<a>URL-Grundlagen</a> — Aufbau der Apprise-URLs."
|
||||
],
|
||||
"stepsTitle": "Schritte",
|
||||
"steps": [
|
||||
"Wählen Sie den Zieldienst im <a>Apprise wiki</a> und kopieren Sie die URL-Vorlage dafür. Jede Serviceseite zeigt das genaue zu verwendende Schema (<code>ntfy://</code>, <code>matrix://</code>, <code>pover://</code>, <code>slack://</code>...) sowie alle erforderlichen Token, Kanäle oder Hostnamen.",
|
||||
"Füllen Sie die Platzhalter mit Ihren eigenen Anmeldeinformationen aus. Zum Beispiel sieht ein ntfy.sh-Thema aus wie <code>ntfy://ntfy.sh/my-topic</code>; eine Pushover-URL sieht aus wie <code>pover://user@token</code>; eine Matrix-URL sieht aus wie <code>matrix://user:pass@host:port/#room</code>.",
|
||||
"Fügen Sie die endgültige URL in das Feld <em>Apprise URL</em> im Apprise-Tab des Benachrichtigungsfelds ein und speichern Sie es.",
|
||||
"Drücken Sie <em>Send Test</em>, um zu überprüfen, ob die URL erreichbar ist und die Anmeldeinformationen akzeptiert werden."
|
||||
],
|
||||
"deliveredTitle": "Was geliefert wird",
|
||||
"deliveredBody": "Apprise erhält die gleiche Nutzlast wie die anderen Kanäle - Titel, Körper und Schweregrad (Info / Erfolg / Warnung / Misserfolg). Der Schweregrad wird dem zugeordnet, was der Zieldienst ausstellt (Icon, Priorität, Farbe). Rich-Message-Formatierung und die AI-Rewrite-Ebene laufen alle, bevor die URL aufgerufen wird, genau wie bei Telegram oder E-Mail.",
|
||||
"fanoutTitle": "Eine URL pro Apprise Kanal",
|
||||
"fanoutBody": "Der Monitor bietet ein URL-Feld pro Apprise-Kanal. Für mehrere Dienste, etwa ntfy.sh und Matrix, einen <a>Apprise-API-Server</a> mit markierter Konfiguration verwenden. Er verteilt den Monitor-Aufruf an alle URLs des gewählten Tags."
|
||||
},
|
||||
"rich": {
|
||||
"heading": "Formatierte Meldungen, Kategorien und Kanalfilter",
|
||||
"intro": "Jeder Kanal hat drei Steuerelemente: <em>Formatierte Meldungen</em> oben, elf aufklappbare <em>Benachrichtigungskategorien</em> mit Ereignisschaltern und <em>Test senden</em> unten.",
|
||||
"imageAlt": "Benachrichtigungskategorien-Panel mit Rich-Nachrichten-Master-Schalter oben hervorgehoben, zusammenklappbare Abschnitte für VM/CT, Backups, Ressourcen, Speicher, Netzwerk, Sicherheit, Cluster, Dienste, Gesundheitsmonitor, Updates jeweils mit Umschalt- und Ereignisanzahl und eine Send-Test-Schaltfläche",
|
||||
"imageCaption": "Der Pfeil markiert <em>Formatierte Meldungen</em>. Darunter liegen elf Kategorien mit Ereignisschaltern; <em>Test senden</em> steht unten.",
|
||||
"richTitle": "Formatierte Meldungen",
|
||||
"richIntro": "Mit <em>Formatierten Meldungen</em> erscheint ein Kategorie-Emoji und das native Kanalformat, etwa Telegram-HTML oder farbige Discord-Einbettungen. Ohne diese Option wird derselbe Inhalt als einfacher Text gesendet:",
|
||||
"plainHeader": "Einfacher Text — Formatierung aus",
|
||||
"richHeader": "Formatierter Text — Formatierung ein",
|
||||
"richOutro": "Jeder Kanal entscheidet separat. E-Mail kann einfach bleiben, während Telegram und Discord formatiert werden. Kanäle ohne unterstützte Formatierung wie einfache E-Mail oder Gotify erhalten Text.",
|
||||
"togglesTitle": "Per-Event Kategorien",
|
||||
"togglesIntro": "Jeder Kanal steuert Kategorien und Ereignisse unabhängig. Eine deaktivierte Kategorie unterdrückt ihre Ereignisse für diesen Kanal. Einzelne Schalter wirken innerhalb aktivierter Kategorien; im Dispatcher gibt es keinen globalen Ereignis-Hauptschalter.",
|
||||
"togglesItems": [
|
||||
"<strong>Kategorieschalter je Kanal.</strong> Eine deaktivierte VM/CT-Kategorie unterdrückt <code>vm_start</code> und verwandte Ereignisse. Gespeichert als <code><channel>.events.<group></code>.",
|
||||
"<strong>Ereignisschalter je Kanal.</strong> In einer aktiven Kategorie etwa <em><code>backup_complete</code> an Discord, aber nicht an Telegram senden</em>. Gespeichert als <code><channel>.event.<event_type></code>."
|
||||
],
|
||||
"togglesOutro": "Jede Kategorie zeigt <em>aktivierte Ereignisse</em> / <em>Gesamtzahl</em> und einen Schalter für die ganze Gruppe, etwa <code>info</code>-Sicherungen oder Update-Meldungen, ohne Aufklappen."
|
||||
},
|
||||
"quiet": {
|
||||
"heading": "Ruhezeiten",
|
||||
"intro": "Während der Ruhezeit eines Kanals passieren nur <strong>CRITICAL</strong>-Ereignisse. INFO, WARNING und Aktionen werden auf Datenträger gespeichert und nach Ende des Fensters zusammengefasst gesendet.",
|
||||
"imageAlt": "Kanaleinstellungen: Ruhezeit 22:00–07:00 mit Vorschau, darunter tägliche Zusammenfassung um 09:00 und Hinweis, dass diese CRITICAL und WARNING nicht verzögert",
|
||||
"imageCaption": "Zwei unabhängige Einstellungen je Kanal: Ruhezeiten oben, tägliche Zusammenfassung darunter.",
|
||||
"purposeTitle": "Wofür es ist",
|
||||
"purposeItems": [
|
||||
"<strong>Keine Update-Meldung um 03:00.</strong> Sicherungen, App-Updates, Optimierungen und andere INFO-Ereignisse wecken Sie nachts nicht.",
|
||||
"<strong>Kritische Ereignisse kommen weiterhin an.</strong> Nur als CRITICAL eingestufte Ereignisse umgehen Ruhezeiten. Der Name bestimmt den Schweregrad nicht: Die Journal-Überwachung meldet Fail2Ban-Sperren sowie Host-Abschaltung/Neustart als INFO; sie können daher gepuffert werden.",
|
||||
"<strong>Zurückgestellte Meldungen behalten.</strong> Sie werden bis zum Ende des Fensters in SQLite gepuffert."
|
||||
],
|
||||
"howTitle": "Wie es funktioniert",
|
||||
"howItems": [
|
||||
"<strong>Pro Kanal.</strong> Telegram kann von 22:00 bis 07:00 ruhen, während E-Mail rund um die Uhr empfängt.",
|
||||
"<strong>Beginn und Ende</strong> in lokaler Zeitzone: Beginn eingeschlossen, Ende ausgeschlossen. Das Fenster kann Mitternacht überschreiten, etwa 22:00–07:00.",
|
||||
"<strong>Aktuelle Vorschau.</strong> Unter den Feldern werden der aktive Zustand und der nächste Wechsel angezeigt.",
|
||||
"<strong>Während des Fensters:</strong> CRITICAL wird normal versendet. INFO und WARNING bleiben in der SQLite-Tabelle <code>quiet_pending</code>.",
|
||||
"<strong>Wenn sich das Fenster schließt:</strong> wird eine einzige gruppierte Benachrichtigung mit allem, was sich angesammelt hat, gesendet - eine Zeile pro gepuffertem Ereignis in chronologischer Reihenfolge. Der Puffer wird erst gelöscht, nachdem der Kanal die Lieferung bestätigt hat, so dass ein vorübergehender Telegram / SMTP-Ausfall den Nachtkontext nicht verliert.",
|
||||
"<strong>Über Neustarts hinweg.</strong> Der Puffer bleibt auf Datenträger. Nach einem Neustart erkennt der nächste Zyklus ausstehende Zeilen und versendet sie gegebenenfalls als Wiederherstellungszusammenfassung."
|
||||
],
|
||||
"criticalTitle": "Welche Ereignisse CRITICAL sind",
|
||||
"criticalBody": "Der Erzeuger legt den Schweregrad fest. Festplatten-, Abschalt- oder Sicherheitsereignisse sind nicht allein wegen ihres Namens CRITICAL. Die Journal-Überwachung erzeugt ip_block, system_shutdown und system_reboot als INFO. Der <link>Ereigniskatalog</link> nennt die Typen; den tatsächlichen Schweregrad bestimmen Erzeuger und empfangenes Ereignis."
|
||||
},
|
||||
"digest": {
|
||||
"heading": "Tägliche Zusammenfassung der INFO-Ereignisse",
|
||||
"intro1": "Die tägliche Zusammenfassung ist <strong>freiwillig aktivierbar</strong>. Geeignete INFO-Meldungen, etwa verfügbare Updates, werden um 09:00 oder zur gewählten Zeit gebündelt. Sicherungs-/Replikationsergebnisse und direkte Aktionen sind ausgenommen. Ruhezeiten verzögern nicht kritische Meldungen innerhalb eines Fensters.",
|
||||
"intro2": "Die Einstellung steht unter den Ruhezeiten in derselben Karte, siehe <link>Ruhezeiten</link>. Beide sind unabhängig aktivierbar.",
|
||||
"purposeTitle": "Wofür es ist",
|
||||
"purposeItems": [
|
||||
"<strong>Morgendlicher Überblick.</strong> Eine Zusammenfassung um 09:00 ersetzt etwa 20 einzelne Meldungen vom Vortag, ohne 20 Telegram-Nachrichten lesen zu müssen.",
|
||||
"<strong>Aktivität und Dringlichkeit unterscheiden.</strong> INFO beschreibt Geschehenes; CRITICAL und WARNING zeigen Handlungsbedarf. Geeignete INFO-Ereignisse werden gebündelt, andere behalten die direkte Zustellung."
|
||||
],
|
||||
"howTitle": "Wie es funktioniert",
|
||||
"howItems": [
|
||||
"<strong>Je Kanal aktivieren.</strong> Standardmäßig aus. Nur gewünschte Kanäle zusammenfassen; andere weiter direkt beliefern.",
|
||||
"<strong>Zustellzeit</strong> in lokaler Zeitzone, standardmäßig 09:00. Der Versand erfolgt etwa innerhalb von 60 s um diese Minute.",
|
||||
"<strong>Enthalten:</strong> geeignete allgemeine Ereignisse mit Schwere <strong>INFO</strong>, etwa <em>App-Update verfügbar</em>, <em>Tailscale-Update verfügbar</em>, <em>ProxMenux-Optimierungsupdate verfügbar</em>, <em>APT-Sicherheitsupdates ausstehend</em> oder <em>Meldung zur Versandbegrenzung</em>. Sicherungsergebnisse und ausgenommene Aktionen bleiben direkt.",
|
||||
"<strong>Was ist nie verzögert:</strong>",
|
||||
"<strong>Dauerhafte Speicherung.</strong> Ausstehende Ereignisse bleiben bis zur Zustellzeit in <code>digest_pending</code> in SQLite und überstehen Neustarts.",
|
||||
"<strong>Leere Tage sind still.</strong> Wenn nichts INFO-Level passiert ist, wird kein Digest gesendet - der Kanal bleibt ruhig, anstatt eine Nachricht \"keine Ereignisse zu melden\" zu erhalten."
|
||||
],
|
||||
"neverDelayedSub": [
|
||||
"<strong>CRITICAL</strong>-Ereignisse gehen immer sofort durch.",
|
||||
"<strong>WARNING</strong>-Ereignisse gehen immer sofort durch.",
|
||||
"VM/CT-Aktionen und Fehler, Sicherungsbeginn und -ergebnisse, Replikationsergebnisse sowie Host-Abschaltung/Neustart umgehen die tägliche Zusammenfassung auch als INFO. Ruhezeiten können nicht kritische Ereignisse weiterhin verzögern."
|
||||
],
|
||||
"comboTitle": "Kombinieren von ruhigen Stunden und täglichem Digest",
|
||||
"comboBody": "Ein Kanal kann <em>beides</em> verwenden: Ruhezeit 22:00–07:00 und Zusammenfassung um 09:00. Nicht kritische Ereignisse des Fensters werden um07:00 freigegeben; geeignete INFO-Ereignisse außerhalb gelangen in die Tageszusammenfassung. CRITICAL umgeht beides; WARNING nur die Tageszusammenfassung, nicht die Ruhezeit. Wählen Sie ein <em>Ruhefenster</em>, eine <em>Zusammenfassung zur festen Zeit</em> oder beides."
|
||||
},
|
||||
"displayName": {
|
||||
"heading": "Anzeigename",
|
||||
"intro": "Jede Meldung trägt einen <em>Anzeigenamen</em> für den Host, etwa <code>🏠 home-lab</code>, im Fuß der formatierten Meldung und im E-Mail-Betreffpräfix.",
|
||||
"imageAlt": "Anzeigename mit Beispiel amd; eigener Name möglich, leeres Feld verwendet Systemhostnamen",
|
||||
"imageCaption": "Anzeigename leer lassen, um den Systemhostnamen zu verwenden, oder einen eigenen Namen eintragen.",
|
||||
"outro": "Wenn das Feld leer ist, greift der Monitor auf den Systemhostnamen zurück. Der Override ist vor allem nützlich, wenn Sie mehrere ProxMenux-Hosts ausführen, die an denselben Telegram-Chat oder Posteingang senden - ein freundlicheres Label (<em>home-lab</em>, <em>office-pve</em>) ist einfacher zu lesen als <code>pve01.lan</code> oder <code>pmx-prod-01</code>."
|
||||
},
|
||||
"dispatch": {
|
||||
"heading": "Versandablauf",
|
||||
"intro": "Die Tabelle beschreibt drei Mechanismen. Tatsächlich folgen auf die Zusammenfassung von Ereignisspitzen Zustellreservierung, Wiederholungsprüfung und Gruppenlimit; danach Textaufbereitung und Kanalsteuerung:",
|
||||
"headerStage": "Phase",
|
||||
"headerWhat": "Was es tut",
|
||||
"headerTunable": "Anpassbar?",
|
||||
"rows": [
|
||||
{
|
||||
"stage": "Deduplizierung per Fingerabdruck",
|
||||
"what": "Jedes Ereignis wird in einen Fingerabdruck gehasht (<code>event_type + key fields from data</code>). Identische Fingerabdrücke innerhalb eines kurzen Fensters gelten als Duplikate des ersten.",
|
||||
"tunable": "Nein — interne Dispatcherlogik."
|
||||
},
|
||||
{
|
||||
"stage": "Wartezeit für Wiederholungen",
|
||||
"what": "Nach erfolgreichem Versand werden Wiederholungen unterdrückt; der Zustand steht in <code>notification_last_sent</code>. Basiswerte für <code>CRITICAL</code>, <code>WARNING</code>, <code>INFO</code>, <code>resources</code> und <code>updates</code>: 86400 s. Ausnahmen: 5 s für VM/CT-Aktionen und Host-Neustart/Abschaltung, 10 s für Sicherungs-/Replikationsergebnisse, 1800–3600 s für mehrere Gesundheitskategorien. Explizite Ereignis-/Gruppeneinstellungen haben Vorrang.",
|
||||
"tunable": "Ja — ausdrückliche Konfigurationswerte je Ereignis oder Gruppe überschreiben die Vorgaben."
|
||||
},
|
||||
{
|
||||
"stage": "Zusammenfassung von Ereignisspitzen",
|
||||
"what": "Wenn N-Ereignisse in einem kurzen Fenster ankommen (z. B. eine Brute-Force-Flut von SSH), werden sie zu einer einzigen <code>burst_*</code>-Nachricht mit einer Zählung und einer Stichprobe zusammengefasst.",
|
||||
"tunable": "Nein — Fenster und Schwellenwert sind pro Ereignistyp fest codiert."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "Versand im Hintergrundthread",
|
||||
"calloutBody": "Die Dispatchschleife läuft in einem eigenen Thread. Die HTTP-Anforderung, die ein Ereignis aussendet, kehrt zurück, sobald das Ereignis in der Warteschlange steht – sie wartet nicht auf Telegram, SMTP oder webhook RTT. Jedes Sendeergebnis wird zur retrospektiven Überprüfung in der Historientabelle erfasst."
|
||||
},
|
||||
"aiRewrite": {
|
||||
"heading": "Optionales AI-Rewrite",
|
||||
"body1": "Geeignete Ereignisse können vor dem Versand durch ein LLM umgeschrieben werden. backup_complete und backup_fail sind ausgenommen. KI ist standardmäßig aus und läuft im Versandthread. Bei Fehler oder Zeitüberschreitung wird der Vorlagentext verwendet.",
|
||||
"body2": "Unterstützt OpenAI, Anthropic, Google Gemini, Groq, OpenRouter und lokales Ollama. Pro Kanal: Detailgrad (<code>brief</code>, <code>standard</code>, <code>detailed</code>), Sprache, Anweisungsmodus (<code>default</code> oder <code>custom</code>) und eigene Anweisung. Anleitung und Beispiele unter <link>KI-Assistent</link>.",
|
||||
"privacyTitle": "Datenschutzerklärung",
|
||||
"privacyBody": "KI-Anfragen können Titel, Schweregrad, Text, System-/Benutzeranweisungen und Kontext mit Hostnamen, IPs, Benutzernamen, Fehlern und Journalzeilen enthalten. Sie gehen an den gewählten Endpunkt. Ollama bleibt nur mit lokalem Server und lokalem Modell lokal; entfernte Server oder Cloudmodelle übertragen Daten nach außen. Bei lokalen Anforderungen KI deaktivieren oder kontrollierten lokalen Server und Modell nutzen."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "PVE webhook Integration",
|
||||
"intro1": "Proxmox verwendet <em>Benachrichtigungsziele</em>: sendmail, Gotify, SMTP und auf unterstützten Versionen Webhook. Der Monitor registriert ein <code>webhook</code>-Ziel. PVE-Meldungen zu HA, Replikation und GUI-Sicherungen gelangen damit in denselben Versandprozess.",
|
||||
"intro2": "Das Ziel ist von der Proxmox GUI unter <em>Datacenter → Benachrichtigungen → Benachrichtigungsziele</em> sichtbar:",
|
||||
"imageAlt": "Proxmox VE Webhook-Dialog bearbeiten, der das automatisch erstellte proxmenux-webhook-Ziel mit der Methode POST, URL http://127.0.0.1:8008/api/notifications/webhook und einer JSON-Körpervorlage mit Escape-Titel, Escape-Nachricht, Escape-Schweregrad, Escape-Zeitstempel und json-Feldern zeigt",
|
||||
"imageCaption": "Das PVE-seitige webhook-Ziel, wie Proxmox es sieht (die GUI befindet sich im konfigurierten Gebietsschema des Hosts - Spanisch in diesem Beispiel). Gleiche Felder gelten in jeder Sprache.",
|
||||
"registeredIntro": "Was registriert wird:",
|
||||
"registeredItems": [
|
||||
"<strong>Methode und URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code> ohne Monitor-HTTPS; mit HTTPS der gesonderte lokale HTTP-Port 8009. Beide bleiben auf demselben Host.",
|
||||
"<strong>Nachrichtenvorlage.</strong> JSON mit nativen Handlebars-Helfern von PVE, in der Konfiguration als Base64 gespeichert. Dekodiert ergibt es:",
|
||||
"<strong>Matcher.</strong> Ein Begleiter <code>matcher: proxmenux-matcher</code> Block mit <code>mode all</code>, so dass jede PVE-Benachrichtigung das Ziel erreicht.",
|
||||
"<strong>Private Konfiguration.</strong> Einrichtung schreibt <code>webhook: proxmenux-webhook</code> in <code>/etc/pve/priv/notifications.cfg</code>, einschließlich Base64-kodiertem gemeinsamem Geheimnis. Das öffentliche Ziel nutzt es für X-Webhook-Secret. Der Block ist nicht leer."
|
||||
],
|
||||
"securityTitle": "Wie der Empfänger gesichert ist",
|
||||
"securityIntro": "Der webhook-Empfänger bei <code>POST /api/notifications/webhook</code> verwendet verschiedene Sicherheitsschichten, je nachdem, woher die Anforderung stammt:",
|
||||
"securityItems": [
|
||||
"<strong>Lokale Quellen (<code>127.0.0.1</code> / <code>::1</code>).</strong> Mengenbegrenzung gilt; entfernte Geheimnis-, Zeitstempel- und Wiederholungsprüfungen entfallen. Auch Adressen lokaler Host-Schnittstellen gelten als lokal. Das automatische PVE-Ziel verwendet Loopback.",
|
||||
"<strong>Entfernte Aufrufer.</strong> Zusätzlich zum Mengenlimit werden Geheimnis in <code>X-Webhook-Secret</code>, Zeitstempel in <code>X-ProxMenux-Timestamp</code> oder JSON, Wiederholungen und eine optionale IP-Liste geprüft. Das Geheimnis steht in SQLite und als Base64-Kopie in <code>/etc/pve/priv/notifications.cfg</code>, damit PVE den Header sendet."
|
||||
],
|
||||
"practiceTitle": "In der Praxis",
|
||||
"practiceBody": "PVE verwendet <code>http://127.0.0.1:8008</code> ohne HTTPS, sonst HTTP-Port 8009. Externe Integrationen an <code>https://<monitor-host>:<port>/api/notifications/webhook</code> müssen <code>X-Webhook-Secret</code> und aktuellen Zeitstempel liefern sowie Wiederholungs-/IP-Prüfungen bestehen. Nur der Geheimnis-Header reicht nicht.",
|
||||
"actionsIntro": "Der Monitor verwaltet dieses Ziel durch drei Aktionen auf der Registerkarte Einstellungen:",
|
||||
"actionsItems": [
|
||||
"<strong>Einrichten</strong> legt beim Aktivieren den Eintrag in <code>/etc/pve/notifications.cfg</code> an. Nur Änderungen werden geschrieben; die drei jüngsten Sicherungen bleiben unter <code>/usr/local/share/proxmenux/backups/pve-notifications/</code>. Solange <code>/etc/pve</code> nicht eingehängt ist, wird gewartet, bis <code>pve-cluster</code> wieder verfügbar ist.",
|
||||
"<strong>Bereinigen</strong> entfernt den Eintrag und behält die vorherige Sicherung.",
|
||||
"<strong>Konfiguration lesen</strong> zeigt Ziele und Zuordnungsregeln zur Kontrolle mehrerer PVE-Versandrouten."
|
||||
],
|
||||
"clusterTitle": "Clusterknoten",
|
||||
"clusterBody": "<code>/etc/pve/</code> samt Ziel-URL und Geheimnis wird im Cluster geteilt. Jeder Knoten ruft seinen <em>eigenen</em> Empfänger auf: <code>127.0.0.1:8008</code> ohne HTTPS, sonst HTTP 8009. Monitor auf jedem relevanten Knoten betreiben und das gemeinsame Ziel an alle Empfänger anpassen."
|
||||
},
|
||||
"catalogue": {
|
||||
"heading": "Ereigniskatalog",
|
||||
"intro": "Rund siebzig Ereignistypen sind in elf UI-Kategorien unterteilt. Das Benachrichtigungsfeld macht einen zusammenklappbaren Abschnitt pro Gruppe mit einem Umschalter für jedes Ereignis darin. Jedes Ereignis ist standardmäßig aktiviert, sofern nicht ausdrücklich anders gekennzeichnet.",
|
||||
"headerGroup": "Gruppe",
|
||||
"headerEvents": "Ereignisse",
|
||||
"rows": [
|
||||
{
|
||||
"group": "VM / CT",
|
||||
"events": "<code>vm_start</code>, <code>vm_start_warning</code>, <code>vm_stop</code>, <code>vm_shutdown</code>, <code>vm_fail</code>, <code>vm_restart</code>, plus die <code>ct_*</code> Äquivalente, <code>migration_start</code>, <code>migration_complete</code>, <code>migration_warning</code>, <code>migration_fail</code>, <code>replication_complete</code>, <code>replication_fail</code>."
|
||||
},
|
||||
{
|
||||
"group": "Sicherungen",
|
||||
"events": "<code>backup_start</code>, <code>backup_complete</code>, <code>backup_warning</code>, <code>backup_fail</code>, <code>snapshot_complete</code>, <code>snapshot_fail</code>."
|
||||
},
|
||||
{
|
||||
"group": "Ressourcen",
|
||||
"events": "<code>cpu_high</code>, <code>ram_high</code>, <code>temp_high</code>, <code>load_high</code>."
|
||||
},
|
||||
{
|
||||
"group": "Speicher",
|
||||
"events": "<code>disk_space_low</code>, <code>disk_io_error</code>, <code>storage_unavailable</code>, <code>smart_test_complete</code>, <code>smart_test_failed</code>."
|
||||
},
|
||||
{
|
||||
"group": "Netzwerk",
|
||||
"events": "<code>network_down</code>, <code>network_latency</code>."
|
||||
},
|
||||
{
|
||||
"group": "Sicherheit",
|
||||
"events": "<code>auth_fail</code>, <code>ip_block</code>, <code>firewall_issue</code>, <code>user_permission_change</code>."
|
||||
},
|
||||
{
|
||||
"group": "Cluster",
|
||||
"events": "<code>split_brain</code>, <code>node_disconnect</code>, <code>node_reconnect</code>."
|
||||
},
|
||||
{
|
||||
"group": "Dienste",
|
||||
"events": "<code>system_startup</code>, <code>system_shutdown</code>, <code>system_reboot</code>, <code>system_problem</code>, <code>service_fail</code>, <code>oom_kill</code>, <code>system_mail</code>."
|
||||
},
|
||||
{
|
||||
"group": "Gesundheitsmonitor",
|
||||
"events": "<code>new_error</code>, <code>error_resolved</code>, <code>error_escalated</code>, <code>health_degraded</code>, <code>health_persistent</code>, <code>health_issue_new</code>, <code>health_issue_resolved</code>."
|
||||
},
|
||||
{
|
||||
"group": "Aktualisierungen",
|
||||
"events": "<code>update_summary</code>, <code>update_available</code>, <code>pve_update</code>, <code>update_complete</code>, <code>proxmenux_update</code>."
|
||||
},
|
||||
{
|
||||
"group": "Hardware / GPU",
|
||||
"events": "<code>gpu_mode_switch</code>, <code>gpu_passthrough_blocked</code>, <code>pci_passthrough_conflict</code>, <code>ai_model_migrated</code>."
|
||||
}
|
||||
],
|
||||
"burstNote": "Eine Handvoll <code>burst_*</code>-Aggregationstypen (<code>burst_auth_fail</code>, <code>burst_ip_block</code>, <code>burst_disk_io</code> usw.) gibt es nur im Dispatcher — sie ersetzen einzelne Ereignisse durch eine einzige Zusammenfassungsnachricht und werden nicht als Umschaltungen in der Benutzeroberfläche angezeigt. Sie erben den Ein/Aus-Zustand ihres übergeordneten Ereignistyps.",
|
||||
"backupResults": {
|
||||
"heading": "Backup Ergebnisse",
|
||||
"intro": "Eine Benachrichtigung über einen Proxmox Backup-Job gibt an, wie der Job beendet wurde. Das Ergebnis wird aus dem Bericht gelesen, den Proxmox sendet, und setzt den Titel, das Symbol, das mit <em>Rich-Nachrichten</em> angezeigt wird, und die Statuszeile der E-Mail.",
|
||||
"headerIcon": "Icon",
|
||||
"headerResult": "Ergebnis",
|
||||
"headerWhen": "Wann",
|
||||
"rows": [
|
||||
{
|
||||
"icon": "💾✅",
|
||||
"result": "Backup vollständig",
|
||||
"when": "Alle Gäste wurden gesichert; der Bericht enthält keine Warnungen."
|
||||
},
|
||||
{
|
||||
"icon": "💾⚠️",
|
||||
"result": "Backup mit Warnungen abgeschlossen",
|
||||
"when": "Alle Gäste wurden gesichert; der Bericht enthält mindestens eine Warnung."
|
||||
},
|
||||
{
|
||||
"icon": "💾❌",
|
||||
"result": "Backup-Fehler gemeldet",
|
||||
"when": "Ein Gast scheiterte oder der Job endete mit einem Fehler."
|
||||
},
|
||||
{
|
||||
"icon": "💾❔",
|
||||
"result": "Backup-Ergebnis nicht bestätigt",
|
||||
"when": "Der Bericht ist unvollständig oder gibt kein Ergebnis für jeden Gast an."
|
||||
}
|
||||
],
|
||||
"items": [
|
||||
"<strong>Der Titel identifiziert den Auftrag.</strong> Er nennt Speicher sowie bei einem Gast dessen Typ, Name und ID. Bei einem Fehler wird der betroffene Gast genannt.",
|
||||
"<strong>Der Text listet jeden Gast</strong> mit Ergebnis, Größe, Dauer und Archiv sowie anschließend die Gesamtwerte auf.",
|
||||
"<strong>Warnungen und Fehler werden einmal aufgelistet.</strong> Wiederholte Zeilen werden ein einziges Mal mit der Hauptursache zuerst angezeigt; Nach acht Zeilen wird der Rest in einer Schlusszeile gezählt und bleibt im Proxmox-Taskprotokoll.",
|
||||
"<strong>Ein Fehler vor dem ersten Gast</strong> zeigt die Proxmox-Ursache, etwa einen nicht vorhandenen Speicher.",
|
||||
"<strong>Zusammenfassungen behalten das Ergebnis.</strong> Sicherungen in der Ruhezeit-Zusammenfassung behalten ihr Ergebnissymbol. Sicherungsergebnisse umgehen die Tageszusammenfassung."
|
||||
]
|
||||
}
|
||||
},
|
||||
"history": {
|
||||
"heading": "Verlauf",
|
||||
"body1": "Jeder tatsächliche <em>Versandversuch</em> steht in <code>notification_history</code>: Zeit <code>sent_at</code>, Kanal, Ereignis, Schwere, Titel, Text, <code>success</code> und bei Fehler <code>error_message</code>. Spitzen erscheinen als Typ <code>burst_*</code>. Durch Wartezeiten unterdrückte Ereignisse werden nicht protokolliert.",
|
||||
"body2": "Einstellungen → Benachrichtigungen enthält den standardmäßig geschlossenen <em>Benachrichtigungsverlauf</em> mit den letzten 20 Einträgen: Ergebnis, Kanal, Datum, Fehler und Status jedes Tageszusammenfassungslaufs. Die Seite bietet kein Löschen; Audit & Report prüft dieselben Zustelldaten.",
|
||||
"body3": "Die gleichen Daten werden bei <code>GET /api/notifications/history</code> mit optionalen <code>limit</code>, <code>offset</code>, <code>severity</code> und <code>channel</code> Abfrageparametern ausgesetzt und können mit <code>DELETE /api/notifications/history</code> gelöscht werden."
|
||||
},
|
||||
"api": {
|
||||
"heading": "API-Endpunkte",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerMethod": "Methode",
|
||||
"headerUse": "Verwenden",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/notifications/settings",
|
||||
"method": "GET / POST",
|
||||
"use": "Lesen oder schreiben Sie die vollständige Konfiguration (Kanäle, Per-Event-Toggles, AI-Rewriter, Display Name)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/test",
|
||||
"method": "POST",
|
||||
"use": "Sende eine Testbenachrichtigung an einen Kanal: <code>'{'\"channel\":\"telegram\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/test-ai",
|
||||
"method": "POST",
|
||||
"use": "Rendern und schreiben Sie ein Beispielereignis um, ohne es zu versenden."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/provider-models",
|
||||
"method": "POST",
|
||||
"use": "Listen Sie verfügbare Modelle für den ausgewählten AI-Anbieter auf."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/send",
|
||||
"method": "POST",
|
||||
"use": "Emittieren Sie ein Ereignis von außen (benutzerdefinierte Integrationen)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/history",
|
||||
"method": "GET / DELETE",
|
||||
"use": "Lesen Sie Geschichte mit Filtern; löschen Sie es."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/webhook",
|
||||
"method": "POST",
|
||||
"use": "Empfängt Proxmox-Meldungen. Lokale Quellen umgehen entfernte Authentifizierungsprüfungen, bleiben aber mengenbegrenzt. Entfernte Anfragen werden anhand <code>X-Webhook-Secret</code>, Zeitstempel in <code>X-ProxMenux-Timestamp</code> oder JSON, Wiederholungen und konfigurierter IP-Liste geprüft."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/setup-webhook",
|
||||
"method": "POST",
|
||||
"use": "Registrieren Sie den Monitor als Ziel in <code>/etc/pve/notifications.cfg</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/cleanup-webhook",
|
||||
"method": "POST",
|
||||
"use": "Entfernen Sie das Monitor-Ziel aus der Benachrichtigungskonfiguration von PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/read-cfg",
|
||||
"method": "GET",
|
||||
"use": "Zeigen Sie die aktuelle PVE-Benachrichtigungskonfiguration so an, wie PVE sie sieht."
|
||||
}
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Wohin als nächstes",
|
||||
"items": [
|
||||
{
|
||||
"label": "KI-Assistent",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tail": " — Anbieter, Modelle, Anweisungsmodi, Sprachen und Kanal-Detailgrad."
|
||||
},
|
||||
{
|
||||
"label": "Gesundheitsmonitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — wichtigste einzelne Ereignisquelle mit eigenen Wartezeiten je Kategorie."
|
||||
},
|
||||
{
|
||||
"label": "Architektur",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tailRich": " — Rolle der SQLite-Tabellen <code>notification_last_sent</code>, <code>notification_history</code> und des Versandthreads im Monitor."
|
||||
},
|
||||
{
|
||||
"label": "Zugriff und Authentifizierung",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tailRich": " — API-Tokens für Skripte erstellen, die <code>/api/notifications/send</code> aufrufen."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard → Systemprotokolle",
|
||||
"href": "/docs/monitor/dashboard/system-logs",
|
||||
"tail": " — Live-Ansicht des Systemjournals, das die Journal-Überwachung auswertet."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user