mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-01 10:22:08 +00:00
Describe the Monitor pages as the code behaves
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
"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."
|
||||
"outro": "Direktzugriff entspricht der Standard-systemd-Unit. Reverse-Proxy und Secure Gateway werden unten beschrieben. Das Vertrauen in Client-IPs aus <code>X-Forwarded-For</code> erfordert PROXMENUX_TRUST_PROXY=1 und einen von Ihnen kontrollierten Proxy. <code>X-Forwarded-Proto</code> oder <code>X-Forwarded-Host</code> allein aktivieren das Proxy-Vertrauen nicht. Auf den Ports 80/443 verwendet das Frontend relative <code>/api/*</code>-URLs; auf jedem anderen Port ruft es Port 8008 unter demselben Hostnamen auf."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Ablauf beim ersten Start",
|
||||
@@ -117,8 +117,8 @@
|
||||
"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:",
|
||||
"publicTitle": "Öffentliche Endpunkte (ohne Token)",
|
||||
"publicIntro": "Anmeldung, Authentifizierungsstatus, Ersteinrichtung und der leichte Endpunkt <code>/api/system-info</code> sind öffentlich:",
|
||||
"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."
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"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.",
|
||||
"algorithm": "Standard-TOTP (RFC 6238) mit Base32-kodiertem Geheimnis. Die acht Backup-Codes sind einmalig und werden als SHA-256-Hashes gespeichert.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
@@ -243,17 +243,17 @@
|
||||
}
|
||||
],
|
||||
"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.",
|
||||
"backupBody": "Bei Verlust des Authenticator-Geräts einen gesicherten Backup-Code verwenden oder die App aus einer zuvor eingerichteten Sicherung wiederherstellen. Cloud-Synchronisierung und lokale Exporte unterscheiden sich je nach App; prüfen Sie, ob die gewählte Methode die TOTP-Geheimnisse tatsächlich wiederherstellt. 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.",
|
||||
"setupImageCaption": "Der 2FA-Einrichtungsdialog zeigt QR-Code, Base32-Geheimnis zur manuellen Eingabe und nach der Überprüfung acht einmalige Backup-Codes. Die Codes vor dem Schließen des Dialogs 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>Registerkarte Sicherheit öffnen</strong> in der Seitenleiste des Dashboards, dann auf <strong>2FA aktivieren</strong> und <strong>Einrichtung starten</strong> klicken. Der Dialog zeigt QR-Code und manuellen Schlüssel; die acht Backup-Codes erscheinen, nachdem der Code überprüft wurde.",
|
||||
"<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>Backup-Codes sichern.</strong> Nach der Überprüfung alle acht sicher in einem Passwortmanager, einer verschlüsselten Notiz oder einem sicheren Ausdruck aufbewahren. Jeder funktioniert einmal, wenn der Authenticator nicht verfügbar ist.",
|
||||
"<strong>Fertig.</strong> 2FA ist aktiv. Bei der nächsten Anmeldung wird zuerst das Passwort und danach der aktuelle sechsstellige Code abgefragt."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
@@ -261,17 +261,17 @@
|
||||
"<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.",
|
||||
"testBody": "Die bestehende Sitzung geöffnet lassen und <em>sofort</em> nach der Einrichtung in einem privaten Fenster eine neue Anmeldung testen. Bei abgelehntem Code zuerst Server- und Telefonuhr prüfen, bevor Sie sich aus der funktionierenden Sitzung abmelden. Bei bereits verlorenem Zugang einen Backup-Code 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>Backup-Code verwenden.</strong> Einen der acht gesicherten Codes im TOTP-Feld eingeben. Er funktioniert einmal; unbenutzte Codes bleiben gültig. Nach der Anmeldung Sicherheit öffnen, zuerst <strong>2FA deaktivieren</strong> und danach <strong>2FA aktivieren</strong> wählen, 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.",
|
||||
"disableBody": "<strong>Sicherheit</strong> öffnen und <strong>2FA deaktivieren</strong> wählen. <code>POST /api/auth/totp/disable</code> benötigt das aktuelle Passwort und einen gültigen TOTP- oder Backup-Code. Dabei werden TOTP-Geheimnis und Backup-Codes gelöscht. Den alten Eintrag auch in der Authenticator-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": [
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"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."
|
||||
"body": "Die KI-Umschreibung ist standardmäßig aus. Aktivieren Sie sie unter <em>Einstellungen → Benachrichtigungen → Erweitert: KI-Verbesserung</em>. Schlagen Kontextanreicherung oder Umschreibung fehl, sendet der Dispatcher die ursprüngliche Vorlage. Umschreibungen in der Versandwarteschlange für Ereignisse haben ein Zeitlimit von 25 Sekunden; wird es erreicht, wird die Vorlage gesendet, statt weiter zu warten."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Wie es funktioniert",
|
||||
@@ -109,7 +109,7 @@
|
||||
],
|
||||
"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."
|
||||
"sizingBody": "Schätzen Sie den Verbrauch als umgeschriebene Ereignisse × KI-Kanäle × Eingabe- und Ausgabe-Token je Aufruf. Beispiel: 50 Ereignisse × ein Kanal × (2.000 Eingabe + 300 Ausgabe) ergeben etwa 115.000 Token täglich, da allein der Standard-Systemprompt rund 1.500 Token umfasst. Tatsächlicher Verbrauch und Kosten hängen von Modell, Kontext, Cache und Anbieterlimits ab. Der Abschnitt <link>Detailstufe pro Kanal</link> erklärt <code>brief</code> für Chats statt <code>standard</code>, bei weiterhin ausführlichen E-Mail-Berichten."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "KI-Anbieter",
|
||||
@@ -142,7 +142,7 @@
|
||||
"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."
|
||||
"Mitgelieferte Empfehlung: <strong><code>claude-haiku-4-5-20251001</code></strong>, ein fest angehefteter Snapshot statt eines wechselnden Alias."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
{
|
||||
"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."
|
||||
"use": "Erstellt eine vzdump-Sicherung einer VM oder eines LXC. Felder im Body, alle optional, sofern die Vorgaben zum Speicheraufbau passen: <code>storage</code> (ein PVE-Speicher), <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> 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",
|
||||
@@ -286,7 +286,7 @@
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Startet einen SMART-Selbsttest. Anfrageschema: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
"use": "Startet einen SMART-Selbsttest. Anfrageschema: <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
|
||||
@@ -73,13 +73,13 @@
|
||||
"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>Mitgelieferte Python-Pakete.</strong> Die Python-Pakete liegen im AppImage und laufen mit dem Python-Interpreter des Hosts, 3.11 (PVE 8) oder 3.13 (PVE 9), ohne dass etwas in das System-Python des Hosts installiert wird. Die Anwendung nutzt weiterhin Kernel-Schnittstellen des Hosts 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.",
|
||||
"intro": "<code>flask_server.py</code> erstellt eine <code>Flask(__name__)</code>-Instanz mit eingeschränkten CORS-Ursprüngen, registriert zehn Blueprints direkt und initialisiert Terminalrouten. Die Tabelle zeigt die Hauptmodule; die Blueprints für PBS, Monitor-Links, Audit und VM-Sicherung sind ebenfalls registriert. PVE-spezifische Vorwärmer laufen nur auf PVE-Hosts.",
|
||||
"headerBlueprint": "Blueprint / Modul",
|
||||
"headerPrefix": "Routenpräfix",
|
||||
"headerOwns": "Zuständigkeit",
|
||||
@@ -242,10 +242,10 @@
|
||||
"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.",
|
||||
"CPU: Auslastung und CPU-Temperatur im Vergleich zu den konfigurierbaren Schwellen; 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.",
|
||||
"afterIntro": "Befunde verwenden stabile <code>error_key</code>, Kategorie und Schweregrad. Vorhandene Einträge in <code>errors</code> werden an Ort und Stelle aktualisiert (<code>last_seen</code>, Schweregrad, Grund), statt dupliziert zu werden. Der Benachrichtigungsversand hat zudem eigene Regeln für 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": {
|
||||
@@ -264,9 +264,9 @@
|
||||
"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."
|
||||
"<strong>HTTPS-/WSS-Modus:</strong> Der TLS-Server verwendet <code>gevent.pywsgi.WSGIServer</code> mit dessen Standard-Handler; <code>flask-sock</code> verarbeitet WebSocket-Verbindungen ü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.",
|
||||
"outro": "Terminal-Kindprozesse erben <code>User=root</code> vom Dienst. Das Öffnen eines WebSockets erfordert ein kurzlebiges Einmalticket vom authentifizierten Terminal-Ticket-Endpunkt mit Verwaltungsrechten.",
|
||||
"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": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
}
|
||||
],
|
||||
"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.",
|
||||
"reportIntro": "Beide Modi haben neben der Zielauswahl eine Schaltfläche <strong>Bericht</strong>. Sie öffnet einen druckbaren Bericht der Messungen; speichern Sie ihn über den Druckdialog des Browsers als PDF und hängen Sie ihn an eine Störungsmeldung beim Internetanbieter an.",
|
||||
"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)",
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
"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."
|
||||
"calloutBody": "ProxMenux Monitor prüft die im Fail2Ban-Jail <code>proxmenux</code> gesperrten IPs auf <em>Anwendungsebene</em>, bevor Flask-Anfragen verarbeitet werden, und speichert das Ergebnis 30 Sekunden zwischen. Ohne Fail2Ban werden fehlgeschlagene Anmeldungen in <code>proxmenux-auth.log</code> protokolliert und der Login-Endpunkt ist auf 5 Versuche pro IP alle 5 Minuten begrenzt, es wird aber keine IP gesperrt."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Lynis-Sicherheitsprüfung",
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
},
|
||||
"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.",
|
||||
"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 unten erklärt Ausnahmen wie die kombinierte Swap-Regel.",
|
||||
"whatForTitle": "Wozu es dient",
|
||||
"whatForIntro": "Die Standardwerte sind ein Ausgangspunkt, aber jede Umgebung hat eigene Betriebsbedingungen:",
|
||||
"whatForItems": [
|
||||
@@ -85,7 +85,7 @@
|
||||
"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.",
|
||||
"whatForOutro": "Unterstützte Schwellenä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. Ausgewählte Anzeigen, darunter die Datenträgertemperatur, verwenden diese Werte; manche Kapazitätsbalken behalten eigene visuelle Grenzen.",
|
||||
"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",
|
||||
@@ -125,7 +125,7 @@
|
||||
"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."
|
||||
"gates": "RAM-Druck des Hosts."
|
||||
},
|
||||
{
|
||||
"section": "Swap (nur kritischer Schwellenwert)",
|
||||
@@ -185,7 +185,7 @@
|
||||
"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."
|
||||
"gates": "Nur PVE-Speicher der Typen LVM, LVM-thin, ZFS-pool, RBD, CephFS und PBS. Verzeichnis-, NFS- und CIFS-Speicher deckt die Zeile zum Host-Speicherplatz ab."
|
||||
},
|
||||
{
|
||||
"section": "ZFS-Pool",
|
||||
@@ -218,7 +218,7 @@
|
||||
"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."
|
||||
"purgeBody": "Das Abschalten entfernt sofort alle <code>type=lxc</code>-Einträge aus <code>/usr/local/share/proxmenux/managed_installs.json</code>. Die LXC-Updatezähler auf der Registerkarte VMs und LXCs verschwinden beim nächsten Neuladen des Dashboards. 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",
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"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>Systemkennzeichnung</strong> — orange Markierung für Laufwerke, die der Host verwendet: Systemeinhängepunkte (<code>/</code>, <code>/boot</code>, <code>/usr</code>, <code>/var</code>…), aktiver Swap, ZFS-Poolmitglieder, physische LVM-Volumes, aktive RAID-Mitglieder oder Bezeichnungen von Systempartitionen. 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.",
|
||||
@@ -112,7 +112,7 @@
|
||||
"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:",
|
||||
"pdfSectionsIntro": "Der Bericht enthält diese 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.",
|
||||
@@ -127,7 +127,7 @@
|
||||
"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>Herunterladen</strong> — speichert den JSON-Snapshot dieses Tests (Ausgabe von <code>smartctl -a --json</code> oder bei NVMe <code>nvme smart-log</code>, wenn smartctl fehlschlägt). 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",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"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."
|
||||
"description": "Die Registerkarte VMs und LXCs listet alle Gäste des Hosts mit CPU-, Arbeitsspeicher- und Datenträgernutzung in Echtzeit. Die Details je Gast zeigen Konfiguration, Ressourcen, Sicherungen, das Konsolenprotokoll von OCI-Containern, Notizen und die Steuerung Starten / Herunterfahren / Neustart / Stopp erzwingen."
|
||||
},
|
||||
"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.",
|
||||
"description": "Vollständiges Gastinventar des Knotens: vier Kennzahlen oben, eine sortierbare Liste aller VMs und LXCs darunter und Gastdetails mit Konfiguration, Ressourcen, Sicherungen, dem Konsolenprotokoll von OCI-Containern sowie den vier Lebenszyklus-Steuerungen (Starten / Herunterfahren / Neustart / Stopp erzwingen).",
|
||||
"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."
|
||||
"body": "Hier steuern Sie den Lebenszyklus der Gäste. Lebenszyklusaktionen laufen über <code>POST /api/vms/<vmid>/control</code>; bei Neustart und Stopp erzwingen geben Sie zur Bestätigung die VMID ein, und die Antwort wird in der Gastzeile angezeigt. Erzwungenes Ausschalten erfordert die eigene Schaltfläche Stopp erzwingen."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Obere Reihe: vier Stat-Karten",
|
||||
@@ -186,9 +186,9 @@
|
||||
"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": "OCI-Konsolenprotokoll (Registerkarte Logs)",
|
||||
"endpoint": "/api/lxc/<vmid>/console-log",
|
||||
"source": "Konsolenausgabe des Hauptprozesses des Images, gelesen aus <code>/var/log/proxmenux/oci/<vmid>.console.log</code> auf dem Host. Nur für OCI-Container angezeigt."
|
||||
},
|
||||
{
|
||||
"section": "Backups für Gäste verfügbar",
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
{
|
||||
"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."
|
||||
"events": "Konfigurierte Belegungsschwellen auf Root oder anderen überwachten Dateisystemen überschritten (standardmäßig 85% Warnung / 95% kritisch); nicht verfügbare PVE-Speicher; hängende oder unerwartet schreibgeschützte NFS-/CIFS-Einhängungen; LVM-thin- und andere Pool-Speicher, die dieselben Schwellen überschreiten."
|
||||
},
|
||||
{
|
||||
"category": "Platten und SMART",
|
||||
@@ -98,7 +98,7 @@
|
||||
{
|
||||
"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."
|
||||
"events": "Ausstehende Sicherheits- oder Kernelupdates; lange nicht aktualisiertes System. Die Kategorie Updates im Dialog zum Gesundheitszustand zeigt bei ausstehenden Updates die Schaltfläche <em>Jetzt aktualisieren</em>. Sie startet den vollständigen ProxMenux-Updateablauf direkt im Dialog; beim Schließen wird der Zustand mit <code>?refresh=1</code> neu abgefragt, damit die Anzeige den neuen Zustand ohne Warten auf den nächsten Zyklus widerspiegelt."
|
||||
},
|
||||
{
|
||||
"category": "Sicherheit & Zertifikate",
|
||||
@@ -158,7 +158,7 @@
|
||||
},
|
||||
"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:",
|
||||
"intro": "Manche Ereignisse bleiben naturgemäß lange bestehen: <em>Systemupdates: Updates verfügbar</em> gilt bis zur Aktualisierung des Hosts, und eine Nachricht alle fünf Minuten über eine ganze Woche ist nicht erwünscht. Die Schaltfläche <em>Jetzt aktualisieren</em> in der Kategorie Updates des Dialogs zum Gesundheitszustand behebt genau diesen Fall direkt. Für andere Fälle oder aufgeschobene Updates bietet die Zustandsüberwachung zudem 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.",
|
||||
@@ -187,7 +187,7 @@
|
||||
},
|
||||
{
|
||||
"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."
|
||||
"why": "Befunde zum ZFS-Poolzustand (DEGRADED, FAULTED, UNAVAIL) erlauben ausdrücklich die Bestätigung, ebenso Prüfungen der Poolbelegung. Bestätigen repariert keinen beeinträchtigten oder ausgefallenen Pool."
|
||||
},
|
||||
{
|
||||
"finding": "Festplatten-I/O-Fehler mit SMART FAILED",
|
||||
@@ -289,7 +289,7 @@
|
||||
},
|
||||
"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.",
|
||||
"intro": "Die Dialogaktionen sind auch per API für Skripte, eigene Dashboards und Chatbots verfügbar. Aufrufe benötigen ein gültiges Bearer-Token aus Anmeldung oder API-Tokenverwaltung. Änderungen wie das Bestätigen von Warnungen, das Speichern von Unterdrückungseinstellungen oder das Bereinigen verwaister Fehler erfordern den Bereich full_admin; read_only erhält 403.",
|
||||
"headerEndpoint": "Endpunkt",
|
||||
"headerMethod": "Methode",
|
||||
"headerUse": "Verwendung",
|
||||
@@ -297,7 +297,7 @@
|
||||
{
|
||||
"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."
|
||||
"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; der Client muss einen Bearer-Header senden."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
{
|
||||
"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."
|
||||
"description": "Browser-Shell für den Host und unterstützte VM-/CT-Konsolen über <code>xterm.js</code> und WebSockets. Sitzungen werden nicht pro Befehl protokolliert."
|
||||
},
|
||||
{
|
||||
"name": "Sicherheit",
|
||||
@@ -114,7 +114,7 @@
|
||||
"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.",
|
||||
"bearer": "Token werden als <code>Authorization: Bearer …</code> gesendet. Auch <code>/api/health</code> erwartet den Bearer-Header, daher benötigen Verfügbarkeitsprüfungen ein read_only-Token. Unter <code>/api/auth/*</code> liegen sowohl öffentliche Setup-/Login-/Statusrouten als auch geschützte Routen der 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": {
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
"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>."
|
||||
"severityBody": "Schweregrade sind <code>INFO</code>, <code>WARNING</code> oder <code>CRITICAL</code> in Großbuchstaben. Das Objekt <code>data</code> liefert Ereigniskontext und Vorlagenfelder. An diesem Endpunkt erhält die KI-Umschreibung nur Titel und Text; Felder in <code>data</code> werden nicht an den Anbieter gesendet. Zur Bedeutung der Ereignisse siehe <link>Benachrichtigungen → Ereigniskatalog</link>."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Nativer Proxmox-VE-Webhook (eingehend)",
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
"Ö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."
|
||||
"Nur wenn Ihr Anbieter Passwort-SMTP erlaubt, die genehmigten Werte eintragen: <em>SMTP-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> Ihre Postfachadresse und <em>Passwort</em> die erlaubte SMTP-Zugangsinformation. Persönliches Outlook.com hat andere Einstellungen und Authentifizierungsanforderungen; gehen Sie nicht davon aus, dass diese Zugangsdaten funktionieren."
|
||||
],
|
||||
"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."
|
||||
@@ -266,7 +266,7 @@
|
||||
"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>In der Zusammenfassung enthalten:</strong> geeignete allgemeine Ereignisse mit Schwere <strong>INFO</strong>. Beispiele sind <em>App-Update verfügbar</em>, <em>Tailscale-Update verfügbar</em>, <em>ProxMenux-Optimierungsupdate verfügbar</em> und <em>APT-Sicherheitsupdates ausstehend</em>. Sicherungsergebnisse und andere ausgenommene Aktionsereignisse 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."
|
||||
@@ -301,7 +301,7 @@
|
||||
{
|
||||
"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."
|
||||
"tunable": "Nur über die Einstellungs-API — ein Schlüssel <code>cooldown.<event_type></code> oder <code>cooldown.<group></code> überschreibt die Vorgaben; in der Oberfläche gibt es dafür kein Steuerelement."
|
||||
},
|
||||
{
|
||||
"stage": "Zusammenfassung von Ereignisspitzen",
|
||||
@@ -330,7 +330,7 @@
|
||||
"<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."
|
||||
"<strong>Private Konfiguration.</strong> Die Einrichtung schreibt den passenden Block <code>webhook: proxmenux-webhook</code> in <code>/etc/pve/priv/notifications.cfg</code> mit einem Base64-kodierten <code>secret</code>-Eintrag namens X-Webhook-Secret. Der öffentliche Zielblock enthält nur Body-Vorlage, Methode und URL. Der private Block ist kein leerer Platzhalter."
|
||||
],
|
||||
"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:",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"reaching": {
|
||||
"heading": "Reaching the dashboard",
|
||||
"intro": "ProxMenux Monitor binds to <code>0.0.0.0:8008</code>. There are three common ways to reach it:",
|
||||
"outro": "Direct access matches the default systemd unit. Reverse-proxy and Secure Gateway access are described below. Trust for client IPs in <code>X-Forwarded-For</code> requires PROXMENUX_TRUST_PROXY=1 and a proxy you control. The presence of <code>X-Forwarded-Proto</code> or <code>X-Forwarded-Host</code> alone does not enable proxy trust; the frontend builds API URLs from the browser’s origin."
|
||||
"outro": "Direct access matches the default systemd unit. Reverse-proxy and Secure Gateway access are described below. Trust for client IPs in <code>X-Forwarded-For</code> requires PROXMENUX_TRUST_PROXY=1 and a proxy you control. The presence of <code>X-Forwarded-Proto</code> or <code>X-Forwarded-Host</code> alone does not enable proxy trust. On ports 80/443 the frontend uses relative <code>/api/*</code> URLs; on any other port it calls port 8008 on the same host name."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "First-launch flow",
|
||||
@@ -117,8 +117,8 @@
|
||||
"loginImageCaption": "Once authentication is configured, every visit to the dashboard starts here. With 2FA enabled, the screen asks for the 6-digit code in a second step after the password is accepted.",
|
||||
"loginFlowTitle": "Login flow",
|
||||
"twofaIntro": "With 2FA enabled, the same call returns <code>requires_totp: true</code> first. Re-issue with the 6-digit code:",
|
||||
"publicTitle": "Public access and protected probes",
|
||||
"publicIntro": "Login and authentication status are public. Initial setup is available while no username and password are stored, including after declining protection. System-data probes require authentication when protection is enabled:",
|
||||
"publicTitle": "Public endpoints (no token)",
|
||||
"publicIntro": "Login, authentication status, initial setup and the lightweight <code>/api/system-info</code> endpoint are public:",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code> and <code>/api/auth/status</code> are public. <code>/api/auth/setup</code> creates the initial account and rejects attempts to overwrite existing credentials.",
|
||||
"<code>/api/system-info</code> is a public lightweight system-information endpoint, including <code>health.status</code>. It is not decorated with the token requirement. /api/auth/status is another public endpoint suitable for a reachability check."
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"asset": "2FA TOTP secret",
|
||||
"algorithm": "Standard TOTP (RFC 6238), with a base32-encoded secret. The eight recovery codes are single-use and stored as SHA-256 hashes.",
|
||||
"algorithm": "Standard TOTP (RFC 6238), with a base32-encoded secret. The eight backup codes are single-use and stored as SHA-256 hashes.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
@@ -243,17 +243,17 @@
|
||||
}
|
||||
],
|
||||
"backupTitle": "What \"backup\" really matters for",
|
||||
"backupBody": "If you lose the authenticator device, use a saved recovery code or restore the app from a backup you configured beforehand. Cloud sync and local exports differ by app; check that your chosen method actually restores the TOTP secrets. Root access to the host also allows recovery, as explained below. Keep a separate, secure backup.",
|
||||
"backupBody": "If you lose the authenticator device, use a saved backup code or restore the app from a backup you configured beforehand. Cloud sync and local exports differ by app; check that your chosen method actually restores the TOTP secrets. Root access to the host also allows recovery, as explained below. Keep a separate, secure backup.",
|
||||
"setupTitle": "Step-by-step setup from the dashboard",
|
||||
"setupImageAlt": "2FA setup screen with QR code and backup codes",
|
||||
"setupImageCaption": "The 2FA setup dialog shows a QR code, a Base32 secret for manual entry, and eight one-time recovery codes. Copy the codes before closing the dialog; they are not displayed again.",
|
||||
"setupImageCaption": "The 2FA setup dialog shows a QR code, a Base32 secret for manual entry and, after verification, eight one-time backup codes. Copy the codes before closing the dialog; they are not displayed again.",
|
||||
"setupSteps": [
|
||||
"<strong>Install the authenticator app on your phone</strong> (or open your password manager). One of the apps from the table above. You only need to do this once — the same app will hold codes for every service you protect.",
|
||||
"<strong>Log into the dashboard</strong> with your username and password.",
|
||||
"<strong>Open the Security tab</strong> in the dashboard sidebar, then click <strong>Enable 2FA</strong>. A dialog shows a QR code, the Base32 secret and eight recovery codes.",
|
||||
"<strong>Open the Security tab</strong> in the dashboard sidebar, then click <strong>Enable 2FA</strong> and <strong>Start setup</strong>. The dialog shows a QR code and the manual key; the eight backup codes appear after the code is verified.",
|
||||
"<strong>Add the entry to the authenticator app:</strong>",
|
||||
"<strong>Save the recovery codes.</strong> Store all eight safely in a password manager, encrypted note or secure printed copy. Each works once if your authenticator is unavailable.",
|
||||
"<strong>Confirm by typing the current 6-digit code</strong> from the app into the \"Verification code\" field of the setup dialog and submit. Codes refresh every 30 seconds, so if it expires while you're typing, just enter the next one.",
|
||||
"<strong>Save the backup codes.</strong> After verification, store all eight safely in a password manager, encrypted note or secure printed copy. Each works once if your authenticator is unavailable.",
|
||||
"<strong>Done.</strong> 2FA is now active. Next time you log in, the dashboard asks for the password first; once it's accepted it asks for the current 6-digit code."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
@@ -261,17 +261,17 @@
|
||||
"<em>Manual fallback</em> (when scanning isn't possible — e.g. setting up on the same phone you opened the dashboard with): tap <em>Add account</em> → <em>Enter setup key</em>. Type any name (e.g. <em>Proxmox Monitor</em>), paste the Base32 string from the dialog, leave <em>Type</em> as <em>Time-based</em>, save."
|
||||
],
|
||||
"testTitle": "Test before logging out",
|
||||
"testBody": "Keep your current session open and test a new login in a private window <em>immediately</em> after setup. If the code is rejected, check the server and phone clocks before logging out of the working session. If access is already lost, use a recovery code or edit <code>auth.json</code> from the host shell.",
|
||||
"testBody": "Keep your current session open and test a new login in a private window <em>immediately</em> after setup. If the code is rejected, check the server and phone clocks before logging out of the working session. If access is already lost, use a backup code or edit <code>auth.json</code> from the host shell.",
|
||||
"lostTitle": "Lost authenticator",
|
||||
"lostIntro": "Three escape hatches, in order of how disruptive they are:",
|
||||
"lostItems": [
|
||||
"<strong>Use a recovery code.</strong> Enter one of the eight saved codes in the TOTP field. It works once; unused codes remain valid. After logging in, set up 2FA again from Settings to obtain eight new codes.",
|
||||
"<strong>Use a backup code.</strong> Enter one of the eight saved codes in the TOTP field. It works once; unused codes remain valid. After logging in, open Security, choose <strong>Disable 2FA</strong> and then <strong>Enable 2FA</strong> to obtain eight new codes.",
|
||||
"<strong>Restore the authenticator from cloud / backup.</strong> If your app has a cloud sync (Google, Microsoft, Authy, Apple Passwords via iCloud Keychain, Ente, 2FAS) install it on a new device, sign in, and the entries reappear. If your app uses an encrypted export file (Aegis, Raivo, FreeOTP+), install the app on the new device and import the file.",
|
||||
"<strong>Disable 2FA from the host shell.</strong> When the previous options aren't available, edit <code>/root/.config/proxmenux-monitor/auth.json</code> on the Proxmox host (you need root SSH or console access), set <code>totp_enabled</code> to <code>false</code>, save, and restart the service:"
|
||||
],
|
||||
"lostShellOutro": "You can log in with username + password only, then re-enable 2FA from Settings.",
|
||||
"disableTitle": "Disable 2FA",
|
||||
"disableBody": "Open <strong>Security</strong> and choose <strong>Disable 2FA</strong>. <code>POST /api/auth/totp/disable</code> requires the current password and a valid TOTP or recovery code. It removes the TOTP secret and recovery codes. Remove the old entry from your authenticator app too.",
|
||||
"disableBody": "Open <strong>Security</strong> and choose <strong>Disable 2FA</strong>. <code>POST /api/auth/totp/disable</code> requires the current password and a valid TOTP or backup code. It removes the TOTP secret and backup codes. Remove the old entry from your authenticator app too.",
|
||||
"rejectedTitle": "The 6-digit code is always rejected",
|
||||
"rejectedIntro": "TOTP is time-based — server clock and phone clock must agree to within ~30 s. Two checks:",
|
||||
"rejectedItems": [
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "Off by default, single switch to enable",
|
||||
"body": "AI rewriting is off by default. Enable it in <em>Settings → Notifications → Advanced: AI Enhancement</em>. If enrichment or rewriting fails, the dispatcher sends the original template. Each rewrite has a 25-second dispatch timeout; reaching it falls back to the template instead of waiting indefinitely."
|
||||
"body": "AI rewriting is off by default. Enable it in <em>Settings → Notifications → Advanced: AI Enhancement</em>. If enrichment or rewriting fails, the dispatcher sends the original template. Rewrites in the event dispatch queue have a 25-second timeout; reaching it sends the template instead of waiting."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "How it works",
|
||||
@@ -109,7 +109,7 @@
|
||||
],
|
||||
"customNote": "Custom prompt mode uses a fixed cap of 500 output tokens regardless of detail level — the custom prompt is in your control and the cap protects against runaway responses.",
|
||||
"sizingTitle": "Practical sizing",
|
||||
"sizingBody": "Estimate usage as rewritten events × AI-enabled channels × input-plus-output tokens per call. For example, 50 events × one channel × (500 input + 300 output tokens) is 40,000 tokens per day, not a few thousand. Actual usage and charges depend on model, context, caching and provider limits. The <link>Detail level per channel</link> section shows how to use <code>brief</code> for chat instead of <code>standard</code>, while keeping detailed email reports."
|
||||
"sizingBody": "Estimate usage as rewritten events × AI-enabled channels × input-plus-output tokens per call. For example, 50 events × one channel × (2,000 input + 300 output tokens) is about 115,000 tokens per day, since the default system prompt alone is roughly 1,500 tokens. Actual usage and charges depend on model, context, caching and provider limits. The <link>Detail level per channel</link> section shows how to use <code>brief</code> for chat instead of <code>standard</code>, while keeping detailed email reports."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "AI providers",
|
||||
@@ -142,7 +142,7 @@
|
||||
"items": [
|
||||
"API key: <a>console.anthropic.com/settings/keys</a>",
|
||||
"Examples from the bundled model list: <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
|
||||
"Bundled recommendation: <strong><code>claude-haiku-4-5-20251001</code></strong>. This exact snapshot is the configured recommendation; the older Claude 3.5 entries shown in earlier documentation are no longer in the bundled list."
|
||||
"Bundled recommendation: <strong><code>claude-haiku-4-5-20251001</code></strong>, a pinned snapshot rather than a moving alias."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Create a vzdump backup of a VM or LXC. Body fields, all optional unless the defaults do not match the storage layout: <code>storage</code> (a PVE storage), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> or <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> or <code>none</code>), <code>protected</code> (<code>true</code> or <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> or <code>never</code>) and <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> or <code>data</code>). Returns the PVE task UPID."
|
||||
"use": "Create a vzdump backup of a VM or LXC. Body fields, all optional unless the defaults do not match the storage layout: <code>storage</code> (a PVE storage), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> or <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> or <code>none</code>), <code>protected</code> (<code>true</code> or <code>false</code>), <code>notes</code> and <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> or <code>data</code>). Returns the PVE task UPID."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
@@ -286,7 +286,7 @@
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Start a SMART self-test. Body schema: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
"use": "Start a SMART self-test. Body schema: <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
|
||||
@@ -73,13 +73,13 @@
|
||||
"intro": "The AppImage is a self-mounting filesystem. <code>AppRun</code> at the root sets up the environment and execs <code>flask_server.py</code>:",
|
||||
"consequencesIntro": "Two consequences of this layout:",
|
||||
"consequences": [
|
||||
"<strong>Bundled Python environment.</strong> The interpreter and Python packages are shipped inside the AppImage, avoiding installation into the host’s system Python environment. The application still uses host kernel interfaces and external host tools.",
|
||||
"<strong>Bundled Python packages.</strong> Python packages ship inside the AppImage and run on the host's own Python 3.11 (PVE 8) or 3.13 (PVE 9) interpreter, without installing anything into the host's system Python. The application still uses host kernel interfaces and external host tools.",
|
||||
"<strong>Hardware clients are bundled too.</strong> <code>ipmitool</code>, <code>lm-sensors</code> and <code>upsc</code> are included. Readings still depend on supported hardware, access to sensors and, for UPS data, a configured NUT server."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Flask app structure",
|
||||
"intro": "<code>flask_server.py</code> creates one <code>Flask(__name__)</code> instance with restricted CORS origins, registers nine blueprints directly and initializes terminal routes. The table highlights the main modules; audit, VM-backup and PBS blueprints are also registered. PVE-specific prewarmers run only on PVE hosts.",
|
||||
"intro": "<code>flask_server.py</code> creates one <code>Flask(__name__)</code> instance with restricted CORS origins, registers ten blueprints directly and initializes terminal routes. The table highlights the main modules; PBS, Monitor links, audit and VM-backup blueprints are also registered. PVE-specific prewarmers run only on PVE hosts.",
|
||||
"headerBlueprint": "Blueprint / module",
|
||||
"headerPrefix": "Routes prefix",
|
||||
"headerOwns": "Owns",
|
||||
@@ -242,10 +242,10 @@
|
||||
"Updates: pending package upgrades and security patches.",
|
||||
"Logs: persistent / spike / cascade pattern detection in the system journal.",
|
||||
"Memory: OOM killer activity, sustained high pressure.",
|
||||
"Temperature: CPU and disk readings checked against monitoring thresholds; available sensors depend on the hardware.",
|
||||
"CPU: usage and CPU temperature checked against the configurable thresholds; available sensors depend on the hardware.",
|
||||
"Security: authentication failures, ban events, fail2ban jail status."
|
||||
],
|
||||
"afterIntro": "Findings use a stable <code>error_key</code>, category and severity. Existing records in <code>errors</code> are updated with <code>last_seen</code> and occurrence counts rather than duplicated. Notification delivery also has its own fingerprint and cooldown rules.",
|
||||
"afterIntro": "Findings use a stable <code>error_key</code>, category and severity. Existing records in <code>errors</code> are updated in place (<code>last_seen</code>, severity, reason) rather than duplicated. Notification delivery also has its own fingerprint and cooldown rules.",
|
||||
"cycleEnd": "Cleanup can auto-resolve stale errors using category <em>Suppression Duration</em> values and state-based rules, remove orphan records for resources that were removed, and prune <code>events</code> older than 30 days. The categories and dashboard are described in <link>Dashboard → Health Monitor</link>."
|
||||
},
|
||||
"notifications": {
|
||||
@@ -264,9 +264,9 @@
|
||||
"intro": "The <em>Terminal</em> tab in the dashboard is a thin <code>xterm.js</code> client wired to a server-side PTY through a WebSocket. Two transport modes:",
|
||||
"items": [
|
||||
"<strong>HTTP mode (default):</strong> the built-in Flask server with <code>flask-sock</code> handles WebSocket upgrade requests.",
|
||||
"<strong>HTTPS / WSS mode:</strong> the TLS server uses <code>gevent.pywsgi.WSGIServer</code> with <code>geventwebsocket.handler.WebSocketHandler</code> for WebSocket connections over TLS."
|
||||
"<strong>HTTPS / WSS mode:</strong> the TLS server uses <code>gevent.pywsgi.WSGIServer</code> with its default handler; <code>flask-sock</code> handles WebSocket connections over TLS."
|
||||
],
|
||||
"outro": "Terminal child processes inherit <code>User=root</code> from the service. With authentication enabled, opening a WebSocket requires a short-lived, single-use ticket obtained from the authenticated terminal-ticket endpoint with administrative scope. When authentication is disabled or declined, the handshake follows that unauthenticated mode.",
|
||||
"outro": "Terminal child processes inherit <code>User=root</code> from the service. Opening a WebSocket requires a short-lived, single-use ticket obtained from the authenticated terminal-ticket endpoint with administrative scope.",
|
||||
"proxyNote": "If you access the Monitor through a reverse proxy, make sure WebSocket forwarding is enabled (the <code>Upgrade</code> and <code>Connection</code> headers). Without it the terminal won't work."
|
||||
},
|
||||
"proxy": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
}
|
||||
],
|
||||
"reportTitle": "Network Latency Report (PDF)",
|
||||
"reportIntro": "Both modes have a <strong>Report</strong> button beside the target selector. It generates a PDF of the measurements that you can attach to a troubleshooting request to your ISP.",
|
||||
"reportIntro": "Both modes have a <strong>Report</strong> button beside the target selector. It opens a printable report of the measurements; save it as PDF from the browser's print dialog and attach it to a troubleshooting request to your ISP.",
|
||||
"reportPreviewAlt": "First page of the Network Latency Report PDF — Executive Summary with the gauge, latency statistics, the latency graph and the threshold guide",
|
||||
"reportPreviewCaption": "The first page of the Network Latency Report contains the executive summary, gauge, main statistics, time-series latency graph and threshold guide. Page 2 onwards contains the per-sample table and methodology.",
|
||||
"downloadLabel": "Download sample Network Latency report (PDF)",
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
"configCaption": "Editing the sshd jail — pick a stricter <em>Max Retries</em> for SSH if you only ever log in from your own subnet, or extend <em>Ban Time</em> for the public-facing dashboard.",
|
||||
"outro": "The full <em>What it installs / how it's configured / how to uninstall</em> walkthrough — including the manual install path, the SSH MaxAuthTries side effect, and the relationship with the <code>proxmenux-auth.log</code> journal — is in <link>ProxMenux → Security → Fail2Ban</link>.",
|
||||
"calloutTitle": "Without Fail2Ban, this mechanism does not block IPs",
|
||||
"calloutBody": "ProxMenux Monitor checks Fail2Ban’s banned IPs at the <em>application level</em> before handling Flask requests. It queries fail2ban-client and caches the result for 30 seconds; it does not read a SQL bans table. Without Fail2Ban, failed logins are recorded in <code>proxmenux-auth.log</code>, but this mechanism does not actively block IPs."
|
||||
"calloutBody": "ProxMenux Monitor checks the IPs banned in Fail2Ban's <code>proxmenux</code> jail at the <em>application level</em> before handling Flask requests, caching the result for 30 seconds. Without Fail2Ban, failed logins are recorded in <code>proxmenux-auth.log</code> and the login endpoint is limited to 5 attempts per IP every 5 minutes, but no IP is banned."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Lynis Security Audit",
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Health Monitor Thresholds",
|
||||
"intro": "The previous card sets <em>how long to stay quiet after a dismiss</em>; this one sets <strong>the value at which an alert is raised</strong>. Most threshold-based checks have adjustable <strong>Warning</strong> and <strong>Critical</strong> values. The table below explains exceptions such as the combined swap rule and the current RAM detector.",
|
||||
"intro": "The previous card sets <em>how long to stay quiet after a dismiss</em>; this one sets <strong>the value at which an alert is raised</strong>. Most threshold-based checks have adjustable <strong>Warning</strong> and <strong>Critical</strong> values. The table below explains exceptions such as the combined swap rule.",
|
||||
"whatForTitle": "What it is for",
|
||||
"whatForIntro": "Defaults that ship with ProxMenux are sane for the average Proxmox host, but every environment has its own envelope:",
|
||||
"whatForItems": [
|
||||
@@ -85,7 +85,7 @@
|
||||
"Choose drive-temperature thresholds using the drive’s specifications and observed operating conditions. Passive versus forced-air cooling alone does not determine a universally lower or higher safe limit.",
|
||||
"A heavily-virtualized host that pegs CPU during builds should not page on every 80 % spike, but must still alert on sustained pressure."
|
||||
],
|
||||
"whatForOutro": "Supported threshold changes take effect <strong>on the next scan</strong>. The Health Monitor reads <code>/usr/local/share/proxmenux/health_thresholds.json</code> each cycle without a restart. Selected widgets, including disk temperature, use these values; some capacity bars retain separate visual cutoffs. See the RAM row below for a current runtime exception.",
|
||||
"whatForOutro": "Supported threshold changes take effect <strong>on the next scan</strong>. The Health Monitor reads <code>/usr/local/share/proxmenux/health_thresholds.json</code> each cycle without a restart. Selected widgets, including disk temperature, use these values; some capacity bars retain separate visual cutoffs.",
|
||||
"coloursTitle": "Status colours: how Warning and Critical render in the dashboard",
|
||||
"coloursIntro": "Widgets that use the configured Warning/Critical pair follow the three-state classification below. Some visual indicators, including the PVE storage capacity bars, use their own cutoffs; do not infer a Health Monitor alert solely from their colour.",
|
||||
"headerColour": "Colour",
|
||||
@@ -125,7 +125,7 @@
|
||||
"section": "Memory",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Host RAM pressure. The configurable Critical default shown here is 95 %, but the current detector uses a hard-coded 90 % sustained RAM rule; changing that setting does not currently change this runtime branch."
|
||||
"gates": "Host RAM pressure."
|
||||
},
|
||||
{
|
||||
"section": "Swap (critical only)",
|
||||
@@ -185,7 +185,7 @@
|
||||
"section": "PVE storage",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "PVE-managed storages, including LVM, LVM-thin, ZFS-pool, RBD/Ceph and PBS. These are not all block-storage backends."
|
||||
"gates": "Only PVE storages of type LVM, LVM-thin, ZFS-pool, RBD, CephFS and PBS. Directory, NFS and CIFS storages are covered by the host disk-space row."
|
||||
},
|
||||
{
|
||||
"section": "ZFS pool",
|
||||
@@ -218,7 +218,7 @@
|
||||
"toggleTitle": "Conditional notification toggle",
|
||||
"toggleBody": "The <code>lxc_updates_available</code> per-channel notification toggle in <strong>Notifications → Services</strong> only renders while detection is enabled. When you turn detection OFF, that row disappears from every channel's category list — but its stored preference is preserved in the DB, so re-enabling detection brings the toggle back at the value it had before.",
|
||||
"purgeTitle": "What gets purged when you disable detection",
|
||||
"purgeBody": "Turning the switch OFF immediately removes every <code>type=lxc</code> entry from <code>/usr/local/share/proxmenux/managed_installs.json</code>. LXC update counts on the Hardware tab clear on the next dashboard refresh. Turning it back ON repopulates the registry on the next detection cycle, or sooner with a manual API refresh."
|
||||
"purgeBody": "Turning the switch OFF immediately removes every <code>type=lxc</code> entry from <code>/usr/local/share/proxmenux/managed_installs.json</code>. LXC update counts in the VMs & LXCs tab clear on the next dashboard refresh. Turning it back ON repopulates the registry on the next detection cycle, or sooner with a manual API refresh."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Remote Storage Exclusions",
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"items": [
|
||||
"<strong>Device path</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Type badge</strong> — SATA / NVMe (and the relevant icon).",
|
||||
"<strong>System badge</strong> — orange tag for disks identified as hosting the OS. Detection uses the mountpoints of <code>/</code> and <code>/boot</code>; physical disks hosting them receive the <em>System</em> tag. A missing tag does not prove a disk is safe to erase or repurpose.",
|
||||
"<strong>System badge</strong> — orange tag for disks in use by the host: system mountpoints (<code>/</code>, <code>/boot</code>, <code>/usr</code>, <code>/var</code>…), active swap, ZFS pool members, LVM physical volumes, active RAID members or system partition labels. A missing tag does not prove a disk is safe to erase or repurpose.",
|
||||
"<strong>Model</strong> — vendor + model string from <code>smartctl -i</code>.",
|
||||
"<strong>Capacity</strong> — formatted human-readable.",
|
||||
"<strong>Temperature</strong> — current °C, coloured by the disk-type threshold (NVMe runs warmer than SATA).",
|
||||
@@ -112,7 +112,7 @@
|
||||
"pdfPreviewAlt": "First page of the generated SMART Health Report PDF — Executive Summary with the PASSED ring + Disk Information block",
|
||||
"pdfPreviewCaption": "First page of the SMART Health Report — Executive Summary with the PASSED ring and the full Disk Information block. The full PDF below has the SSD wear ring, every SMART attribute and the test history.",
|
||||
"pdfDownloadLabel": "Download sample SMART report (PDF)",
|
||||
"pdfSectionsIntro": "The report has six main sections:",
|
||||
"pdfSectionsIntro": "The report includes these main sections:",
|
||||
"pdfSections": [
|
||||
"<strong>Executive Summary</strong> — large PASSED / FAILED verdict, plain-language disk health assessment paragraph (\"your disk is healthy / showing signs of wear / failing\"), and four quick stats (report timestamp, last-test type, test result, attributes checked).",
|
||||
"<strong>Disk Information</strong> — model, serial, capacity, type (HDD / SSD / NVMe), family, form factor, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM support, current temperature with the optimal threshold, power-on time, power cycles, SMART status, plus the headline counters (pending sectors, CRC errors, reallocated sectors).",
|
||||
@@ -127,7 +127,7 @@
|
||||
"historyImageCaption": "History tab — every retained SMART test for this disk. Per row: type, timestamp, \"X days ago\" tag, latest marker, download (raw <code>smartctl</code> output) and delete actions.",
|
||||
"historyIntro": "The retained pool of SMART tests for this disk — both short and extended runs that completed. Each entry is the raw <code>smartctl</code> output captured at run time, plus the structured fields the Monitor parsed out for the dashboard. Per-row actions:",
|
||||
"historyItems": [
|
||||
"<strong>Download</strong> — saves the retained JSON snapshot with the <code>smartctl -a</code> data used by the report. Useful when vendor support needs the original diagnostic fields.",
|
||||
"<strong>Download</strong> — saves that test's JSON snapshot (<code>smartctl -a --json</code> output, or <code>nvme smart-log</code> on NVMe when smartctl fails). Useful when vendor support needs the original diagnostic fields.",
|
||||
"<strong>Delete</strong> — removes the test from history. The retention limit set in the Schedule tab (<em>Last 5 / 10 / 20</em>) deletes oldest-first automatically; this action is the manual override."
|
||||
],
|
||||
"scheduleTitle": "Tab 4 — Schedule",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: VMs & LXCs tab | ProxMenux Documentation",
|
||||
"description": "The VMs & LXCs tab inventories every guest on the host with live CPU / memory / disk usage. Per-guest details show configuration, resources, backups, recent Proxmox log results, notes, and Start / Shutdown / Reboot / Stop controls."
|
||||
"description": "The VMs & LXCs tab inventories every guest on the host with live CPU / memory / disk usage. Per-guest details show configuration, resources, backups, the console log of OCI containers, notes, and Start / Shutdown / Reboot / Force Stop controls."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: VMs & LXCs tab",
|
||||
"description": "The full inventory of guests on the node. Four headline metrics across the top, a sortable list of every VM and LXC below, and a drill-in per guest with config, resources, backups, logs and the four lifecycle controls (Start / Shutdown / Reboot / Stop).",
|
||||
"description": "The full inventory of guests on the node. Four headline metrics across the top, a sortable list of every VM and LXC below, and a drill-in per guest with config, resources, backups, the console log of OCI containers and the four lifecycle controls (Start / Shutdown / Reboot / Force Stop).",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "The control surface for guests",
|
||||
"body": "Use this tab to control guest lifecycles. Lifecycle actions go through <code>POST /api/vms/<vmid>/control</code> with an explicit confirmation and the response is reflected back in the guest’s row. Force shutdown requires the dedicated Force Stop button."
|
||||
"body": "Use this tab to control guest lifecycles. Lifecycle actions go through <code>POST /api/vms/<vmid>/control</code>; Reboot and Force Stop ask you to type the VMID to confirm, and the response is reflected back in the guest’s row. Force shutdown requires the dedicated Force Stop button."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Top row: four stat cards",
|
||||
@@ -186,9 +186,9 @@
|
||||
"source": "PVE RRD data (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) condensed to a chart-friendly shape."
|
||||
},
|
||||
{
|
||||
"section": "Recent Proxmox log results",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "<code>pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000</code>. A command failure returns an empty list; this does not provide complete in-guest system logs."
|
||||
"section": "OCI console log (Logs tab)",
|
||||
"endpoint": "/api/lxc/<vmid>/console-log",
|
||||
"source": "Console output of the image's main process, read from <code>/var/log/proxmenux/oci/<vmid>.console.log</code> on the host. Shown for OCI containers only."
|
||||
},
|
||||
{
|
||||
"section": "Backups available for guest",
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
{
|
||||
"category": "Storage",
|
||||
"checks": "Proxmox storages, root filesystem",
|
||||
"events": "Root or other monitored filesystems crossing configured space thresholds (85% warning / 95% critical by default); offline NFS export; CIFS authentication failure; full LVM-thin pool."
|
||||
"events": "Root or other monitored filesystems crossing configured space thresholds (85% warning / 95% critical by default); unavailable PVE storages; stale or unexpectedly read-only NFS/CIFS mounts; LVM-thin and other pool storages crossing the same thresholds."
|
||||
},
|
||||
{
|
||||
"category": "Disks & SMART",
|
||||
@@ -98,7 +98,7 @@
|
||||
{
|
||||
"category": "System Updates",
|
||||
"checks": "Pending updates, security updates, kernel / PVE version, system age",
|
||||
"events": "Pending security or running-kernel updates; a system not updated for a long time. The Overview header shows an <em>Update Now</em> button when updates are pending. It runs the full ProxMenux update flow inline; closing it refreshes health with <code>?refresh=1</code> so the badge reflects the new state without waiting for the next cycle."
|
||||
"events": "Pending security or running-kernel updates; a system not updated for a long time. The Updates category of the Health Status modal shows an <em>Update Now</em> button when updates are pending. It runs the full ProxMenux update flow inline; closing it refreshes health with <code>?refresh=1</code> so the badge reflects the new state without waiting for the next cycle."
|
||||
},
|
||||
{
|
||||
"category": "Security & Certificates",
|
||||
@@ -158,7 +158,7 @@
|
||||
},
|
||||
"dismiss": {
|
||||
"heading": "Dismissing alerts and the Suppression Duration",
|
||||
"intro": "Some events are noisy by nature — a <em>System Updates: pending updates available</em> stays true until you patch the host, and you don't want a notification every five minutes for a week. The <em>Update Now</em> button in the Overview header is the direct shortcut to resolve that specific case in place; for everything else, or when patching is deferred, the Health Monitor also offers two coupled silencing mechanisms:",
|
||||
"intro": "Some events are noisy by nature — a <em>System Updates: pending updates available</em> stays true until you patch the host, and you don't want a notification every five minutes for a week. The <em>Update Now</em> button in the Updates category of the Health Status modal is the direct shortcut to resolve that specific case in place; for everything else, or when patching is deferred, the Health Monitor also offers two coupled silencing mechanisms:",
|
||||
"step1": "<strong>Per-event Dismiss action</strong> in the modal. The Dismiss button opens a small dropdown with three options — <strong>24 hours</strong>, <strong>7 days</strong> or <strong>Permanently</strong> — letting you choose how long this specific alert stays silenced regardless of the category's default. Picking one calls <code>POST /api/health/acknowledge</code> with the <code>error_key</code> and the chosen <code>suppression_hours</code> (<code>-1</code> for permanent). The event moves to the Dismissed list with a timestamped <code>acknowledged_at</code>.",
|
||||
"dropdownImageAlt": "Dismiss dropdown on a Health Monitor alert — 24 hours, 7 days or Permanently",
|
||||
"dropdownImageCaption": "Per-event Dismiss dropdown. The chosen window applies to this single alert; without a per-event choice the category default is used. Permanent dismissals have an amber <em>Permanent</em> badge and normally do not re-fire. The critical CPU-temperature override described below is an exception.",
|
||||
@@ -187,7 +187,7 @@
|
||||
},
|
||||
{
|
||||
"finding": "ZFS pool DEGRADED / FAULTED",
|
||||
"why": "ZFS pool-capacity checks explicitly allow dismissal. Other pool findings follow their own flag. Acknowledgment does not repair a degraded or faulted pool."
|
||||
"why": "ZFS pool-state findings (DEGRADED, FAULTED, UNAVAIL) explicitly allow dismissal, as do pool-capacity checks. Acknowledgment does not repair a degraded or faulted pool."
|
||||
},
|
||||
{
|
||||
"finding": "Disk I/O errors with SMART FAILED",
|
||||
@@ -289,7 +289,7 @@
|
||||
},
|
||||
"rest": {
|
||||
"heading": "REST endpoints",
|
||||
"intro": "The modal actions are also available through the API for scripts, custom dashboards or chatbots. When Monitor authentication is enabled, calls need a valid bearer token, either from login or the API-token screen. Changes such as acknowledging alerts, saving suppression settings or cleaning orphan errors require full_admin scope; read_only receives 403. When authentication is disabled or declined, these decorators allow access without a token.",
|
||||
"intro": "The modal actions are also available through the API for scripts, custom dashboards or chatbots. Calls need a valid bearer token, either from login or the API-token screen. Changes such as acknowledging alerts, saving suppression settings or cleaning orphan errors require full_admin scope; read_only receives 403.",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerMethod": "Method",
|
||||
"headerUse": "Use",
|
||||
@@ -297,7 +297,7 @@
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Lightweight health probe returning JSON with <code>status</code>, <code>timestamp</code> and <code>version</code>. Suitable for Uptime Kuma keyword checks; when Monitor authentication is enabled, the client must send a bearer header."
|
||||
"use": "Lightweight health probe returning JSON with <code>status</code>, <code>timestamp</code> and <code>version</code>. Suitable for Uptime Kuma keyword checks; the client must send a bearer header."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"description": "Browser shell for the host and supported VM/CT console access, powered by <code>xterm.js</code> over WebSockets. It follows the configured authentication mode: when authentication is disabled or declined, reachable clients can open a session without login. This description does not imply per-command auditing."
|
||||
"description": "Browser shell for the host and supported VM/CT console access, powered by <code>xterm.js</code> over WebSockets. Sessions are not audited per command."
|
||||
},
|
||||
{
|
||||
"name": "Security",
|
||||
@@ -114,7 +114,7 @@
|
||||
"heading": "REST API and integrations",
|
||||
"intro": "The dashboard’s REST endpoints expose monitoring data as JSON over HTTP/HTTPS for Homepage widgets, Home Assistant sensors, Uptime Kuma probes and custom scripts. Grafana can use the separate Prometheus text exporter at <code>/api/prometheus</code>. Requests can be made with <code>curl</code>.",
|
||||
"tokens": "Long-lived API tokens (365 days) are generated from <strong>Settings → API Access Tokens</strong> or via <code>POST /api/auth/generate-api-token</code>.",
|
||||
"bearer": "Send tokens as <code>Authorization: Bearer …</code>. The public <code>/api/health</code> endpoint is suitable for external uptime probes without credentials. Routes under <code>/api/auth/*</code> include both public setup/login/status routes and protected account/token management routes; they are not all anonymous.",
|
||||
"bearer": "Send tokens as <code>Authorization: Bearer …</code>. <code>/api/health</code> also expects the bearer header, so uptime probes need a read_only token. Routes under <code>/api/auth/*</code> include both public setup/login/status routes and protected account/token management routes; they are not all anonymous.",
|
||||
"catalog": "The full endpoint catalog, token rotation guidance and security best-practices live in <linkApi>API Reference</linkApi>; ready-made examples for Homepage, Home Assistant, Grafana, Uptime Kuma and a generic cURL pattern are in <linkIntegrations>Integrations</linkIntegrations>."
|
||||
},
|
||||
"serviceControl": {
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
"heading": "n8n, Zapier and custom scripts",
|
||||
"intro": "Workflow tools and scripts can <em>send</em> notifications through a POST to <code>/api/notifications/send</code>, for example after a CI failure or an overlong cron job. This is a direct send: it bypasses the event queue and fingerprint cooldown. It still uses channel formatting, optional AI rewriting and delivery to configured channels. Apply any required duplicate control in the caller.",
|
||||
"n8nBody": "In n8n, use an <em>HTTP Request</em> node with POST, the URL above and the same JSON body as curl. Choose generic Header Auth credentials: set the header name to <em>Authorization</em> and its value to <code>Bearer YOUR_API_TOKEN</code>, replacing the placeholder. Connect a schedule, webhook or other preceding node to trigger the request.",
|
||||
"severityBody": "Severity values are <code>INFO</code>, <code>WARNING</code> or <code>CRITICAL</code> in uppercase. The <code>data</code> object supplies event context. AI rewriting uses the rendered title and message plus supported enrichment; arbitrary fields are not guaranteed to appear in its prompt or output. See <link>Notifications → Event catalogue</link> for event semantics."
|
||||
"severityBody": "Severity values are <code>INFO</code>, <code>WARNING</code> or <code>CRITICAL</code> in uppercase. The <code>data</code> object supplies event context and template fields. On this endpoint, AI rewriting receives only the title and message; fields in <code>data</code> are not sent to the provider. See <link>Notifications → Event catalogue</link> for event semantics."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Native Proxmox VE webhook (inbound)",
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
"Open <a>account.microsoft.com/security</a> and enable two-step verification.",
|
||||
"If your account offers <em>Advanced security options</em> → <em>App passwords</em>, choose <em>Create a new app password</em>. This option alone does not establish that your mail service accepts password-based SMTP.",
|
||||
"If Microsoft generates an app password, copy it and verify that your SMTP service accepts it.",
|
||||
"Only if your provider permits password-based SMTP, fill in its approved settings: <em>Host</em> <code>smtp.office365.com</code> for Exchange Online, <em>Port</em> <code>587</code>, <em>TLS Mode</em> <code>STARTTLS</code>, <em>Username</em> your mailbox address, and <em>Password</em> the permitted SMTP credential. Personal Outlook.com settings and authentication requirements are different; do not assume these credentials will work."
|
||||
"Only if your provider permits password-based SMTP, fill in its approved settings: <em>SMTP host</em> <code>smtp.office365.com</code> for Exchange Online, <em>Port</em> <code>587</code>, <em>TLS mode</em> <code>STARTTLS</code>, <em>Username</em> your mailbox address, and <em>Password</em> the permitted SMTP credential. Personal Outlook.com settings and authentication requirements are different; do not assume these credentials will work."
|
||||
],
|
||||
"relayTitle": "Self-hosted SMTP relay",
|
||||
"relayBody": "Point the Monitor at an SMTP relay you control, such as Postfix. The relay handles upstream authentication. Configure the Monitor’s authentication and TLS mode to match the relay; using a local relay does not itself disable encryption."
|
||||
@@ -266,7 +266,7 @@
|
||||
"howItems": [
|
||||
"<strong>Per-channel opt-in.</strong> Off by default — Telegram doesn't silently batch your alerts. You enable it on the channels where you want a digest, leaving others on live delivery.",
|
||||
"<strong>Delivery time</strong> in your local timezone. Defaults to 09:00 but you can pick any time; the dispatcher fires the digest within ~60 s of that minute.",
|
||||
"<strong>Included in the digest:</strong> eligible generic events with severity <strong>INFO</strong>. Examples include <em>application update available</em>, <em>Tailscale update available</em>, <em>ProxMenux optimisation update available</em>, <em>APT security updates pending</em> and <em>rate-limit notice</em>. Backup results and other exempt action events remain live.",
|
||||
"<strong>Included in the digest:</strong> eligible generic events with severity <strong>INFO</strong>. Examples include <em>application update available</em>, <em>Tailscale update available</em>, <em>ProxMenux optimisation update available</em> and <em>APT security updates pending</em>. Backup results and other exempt action events remain live.",
|
||||
"<strong>What is never delayed:</strong>",
|
||||
"<strong>Persistence.</strong> Pending events sit in a SQLite table (<code>digest_pending</code>) until the configured hour. The Monitor can restart freely without losing what the digest will eventually contain.",
|
||||
"<strong>Empty days are silent.</strong> If nothing INFO-level happened, no digest is sent — the channel stays quiet rather than receiving a \"no events to report\" message."
|
||||
@@ -301,7 +301,7 @@
|
||||
{
|
||||
"stage": "Cooldown",
|
||||
"what": "After successful delivery, repeated fingerprints are suppressed and the state is saved in <code>notification_last_sent</code>. Base defaults for <code>CRITICAL</code>, <code>WARNING</code> and <code>INFO</code> are 86 400 s, as are <code>resources</code> and <code>updates</code>. Exceptions include 5 s for VM/CT actions and host shutdown/reboot, 10 s for backup/replication results, and 1 800–3 600 s for several health-state categories. Explicit event/group settings can override these values.",
|
||||
"tunable": "Yes — explicit cooldown settings for an event type or group override the defaults; these are dispatcher configuration values."
|
||||
"tunable": "Only through the settings API — a <code>cooldown.<event_type></code> or <code>cooldown.<group></code> key overrides the defaults; there is no control in the UI."
|
||||
},
|
||||
{
|
||||
"stage": "Burst aggregation",
|
||||
@@ -330,7 +330,7 @@
|
||||
"<strong>Method and URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code> when Monitor HTTPS is off. With HTTPS enabled, the target uses the separate HTTP loopback listener on port 8009. Both stay on the same host.",
|
||||
"<strong>Body template.</strong> A JSON body using PVE's native Handlebars helpers — stored base64-encoded in the config file by PVE, but it expands to:",
|
||||
"<strong>Matcher.</strong> A companion <code>matcher: proxmenux-matcher</code> block with <code>mode all</code> so every PVE notification reaches the target.",
|
||||
"<strong>Private configuration.</strong> Setup writes the matching <code>webhook: proxmenux-webhook</code> block in <code>/etc/pve/priv/notifications.cfg</code>, including the shared secret encoded in base64. The public target references that secret to send X-Webhook-Secret. The block is not an empty stub."
|
||||
"<strong>Private configuration.</strong> Setup writes the matching <code>webhook: proxmenux-webhook</code> block in <code>/etc/pve/priv/notifications.cfg</code> with a <code>secret</code> entry named X-Webhook-Secret, encoded in base64. The public target block holds only the body template, method and URL. The private block is not an empty stub."
|
||||
],
|
||||
"securityTitle": "How the receiver is secured",
|
||||
"securityIntro": "The webhook receiver at <code>POST /api/notifications/webhook</code> applies different security layers depending on where the request comes from:",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"reaching": {
|
||||
"heading": "Cómo llegar al panel",
|
||||
"intro": "ProxMenux Monitor escucha en <code>0.0.0.0:8008</code>. Hay tres formas habituales de llegar a él:",
|
||||
"outro": "El acceso directo corresponde a la unidad systemd predeterminada. El proxy inverso y Secure Gateway se describen más abajo. Para confiar en la IP de <code>X-Forwarded-For</code> se requiere PROXMENUX_TRUST_PROXY=1 y un proxy que controles. La presencia de <code>X-Forwarded-Proto</code> o <code>X-Forwarded-Host</code> no activa esa confianza; el frontend construye las URL de la API a partir del origen del navegador."
|
||||
"outro": "El acceso directo corresponde a la unidad systemd predeterminada. El proxy inverso y Secure Gateway se describen más abajo. Para confiar en la IP de <code>X-Forwarded-For</code> se requiere PROXMENUX_TRUST_PROXY=1 y un proxy que controles. La presencia de <code>X-Forwarded-Proto</code> o <code>X-Forwarded-Host</code> no activa esa confianza. En los puertos 80/443 el frontend usa URL relativas <code>/api/*</code>; en cualquier otro puerto llama al puerto 8008 del mismo nombre de host."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Flujo de primer arranque",
|
||||
@@ -117,14 +117,14 @@
|
||||
"loginImageCaption": "Una vez configurada la autenticación, cada visita al panel empieza aquí. Con 2FA activado, la pantalla pide el código de 6 dígitos en un segundo paso tras aceptar la contraseña.",
|
||||
"loginFlowTitle": "Flujo de login",
|
||||
"twofaIntro": "Con 2FA activado, la misma llamada devuelve primero <code>requires_totp: true</code>. Reemite con el código de 6 dígitos:",
|
||||
"publicTitle": "Acceso público y sondas protegidas",
|
||||
"publicIntro": "El inicio de sesión y su estado son públicos. Puedes crear la cuenta mientras no haya usuario y contraseña guardados, incluso tras rechazar la protección. Las sondas de datos del sistema requieren autenticación cuando la protección está activa:",
|
||||
"publicTitle": "Endpoints públicos (sin token)",
|
||||
"publicIntro": "El inicio de sesión, su estado, la configuración inicial y el endpoint ligero <code>/api/system-info</code> son públicos:",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code> y <code>/api/auth/status</code> son públicos. <code>/api/auth/setup</code> crea la cuenta inicial y rechaza sobrescribir credenciales existentes.",
|
||||
"<code>/api/system-info</code> es un endpoint público de información básica del sistema, incluido <code>health.status</code>. No lleva el requisito de token. /api/auth/status también es público y sirve para comprobar disponibilidad."
|
||||
],
|
||||
"cryptoTitle": "Criptografía y almacenamiento",
|
||||
"cryptoIntro": "ProxMenux Monitor es código abierto — nada de esto es secreto. Documentar el stack aquí de forma explícita es una decisión deliberada: los operadores que guardan credenciales en su host merecen saber cómo se protegen esas credenciales antes de decidir confiar en ellas. Los algoritmos de abajo son los mismos que usa el código en <code>scripts/auth_manager.py</code>; esta sección es un contrato, no una promesa de marketing.",
|
||||
"cryptoIntro": "ProxMenux Monitor es código abierto — nada de esto es secreto. Documentar el stack aquí de forma explícita es una decisión deliberada: los usuarios que guardan credenciales en su host merecen saber cómo se protegen esas credenciales antes de decidir confiar en ellas. Los algoritmos de abajo son los mismos que usa el código en <code>scripts/auth_manager.py</code>; esta sección es un contrato, no una promesa de marketing.",
|
||||
"headerAsset": "Elemento",
|
||||
"headerAlgo": "Algoritmo",
|
||||
"headerWhere": "Ubicación",
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"asset": "Secret TOTP de 2FA",
|
||||
"algorithm": "TOTP estándar (RFC 6238), con secreto codificado en base32. Los ocho códigos de recuperación son de un solo uso y se almacenan como hashes SHA-256.",
|
||||
"algorithm": "TOTP estándar (RFC 6238), con secreto codificado en base32. Los ocho códigos de backup son de un solo uso y se almacenan como hashes SHA-256.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
@@ -158,9 +158,9 @@
|
||||
"authJsonTitle": "auth.json — qué contiene y cómo se protege",
|
||||
"authJsonBody": "Todo lo que ProxMenux Monitor necesita para autenticarte vive en un único archivo: <code>/root/.config/proxmenux-monitor/auth.json</code>, modo <code>0600</code>, propietario <code>root</code>. El archivo guarda <em>hashes</em> (PBKDF2) y <em>material de firma</em> (<code>jwt_secret</code>, <code>totp_secret</code>) — nunca una contraseña en texto plano. Trátalo como cualquier otro secreto de solo-root: si haces backup o replicas el host, cifra el destino y nunca lo subas a control de versiones.",
|
||||
"rotateTitle": "Rotar jwt_secret invalida todos los JWTs existentes",
|
||||
"rotateBody": "Si <code>auth.json</code> se regenera (borrado manual, reinstalación, restauración desde un backup con un secret distinto) el <code>jwt_secret</code> cambia y cada JWT previamente emitido — tanto sesiones interactivas como API tokens de larga duración — falla la verificación con \"Invalid or expired token\". La UI marca los API tokens afectados con un badge <strong>Invalid — regenerate</strong> para que el operador sepa que tiene que revocarlos y volver a emitirlos; Home Assistant / scripts / cualquier cliente externo necesita un token fresco después de eso.",
|
||||
"rotateBody": "Si <code>auth.json</code> se regenera (borrado manual, reinstalación, restauración desde un backup con un secret distinto) el <code>jwt_secret</code> cambia y cada JWT previamente emitido — tanto sesiones interactivas como API tokens de larga duración — falla la verificación con \"Invalid or expired token\". La UI marca los API tokens afectados con un badge <strong>Invalid — regenerate</strong> para que el usuario sepa que tiene que revocarlos y volver a emitirlos; Home Assistant / scripts / cualquier cliente externo necesita un token fresco después de eso.",
|
||||
"recoverTitle": "Recuperar una contraseña perdida",
|
||||
"recoverIntro": "No hay un flujo online de \"olvidé mi contraseña\" — por diseño, ya que el panel corre en el propio host del operador y el camino de recuperación es acceso shell a ese host. ProxMenux trae un reset guiado dentro del menú de configuración para que no tengas que editar a mano <code>auth.json</code>:",
|
||||
"recoverIntro": "No hay un flujo online de \"olvidé mi contraseña\" — por diseño, ya que el panel corre en el propio host del usuario y el camino de recuperación es acceso shell a ese host. ProxMenux trae un reset guiado dentro del menú de configuración para que no tengas que editar a mano <code>auth.json</code>:",
|
||||
"survivesTitle": "Qué sobrevive al reset",
|
||||
"survivesBody": "Solo el login interactivo se borra. El <code>jwt_secret</code> y los <code>api_tokens</code> registrados se preservan — así que Home Assistant y cualquier otro script que use un API token de larga duración siguen funcionando sin reconfiguración. Si quieres una pizarra totalmente limpia (también rotar el secret JWT), borra <code>auth.json</code> manualmente y reinicia el servicio. El siguiente arranque genera un secret fresco y todos los tokens viejos se vuelven inválidos.",
|
||||
"physicalTitle": "Prerrequisito de acceso físico",
|
||||
@@ -170,7 +170,7 @@
|
||||
"heading": "Autenticación de dos factores (TOTP)",
|
||||
"intro": "El 2FA añade un segundo factor encima de tu contraseña: un código de 6 dígitos que rota cada 30 segundos, generado en un móvil o gestor de contraseñas que controlas. Aunque alguien obtenga la contraseña, sigue sin poder entrar sin el código de tu dispositivo. ProxMenux Monitor implementa el protocolo estándar <strong>TOTP</strong> (RFC 6238), así que cualquier app autenticadora funciona.",
|
||||
"pickTitle": "Elige una app autenticadora",
|
||||
"pickIntro": "Si ya tienes una aplicación TOTP, puedes usarla aquí. La tabla recoge opciones habituales: algunas son gratuitas y otras requieren suscripción. También cambian las plataformas y los métodos de copia de seguridad.",
|
||||
"pickIntro": "Si ya tienes una aplicación TOTP, puedes usarla aquí. La tabla recoge opciones habituales: algunas son gratuitas y otras requieren suscripción. También cambian las plataformas y los métodos de backup.",
|
||||
"headerApp": "Aplicación",
|
||||
"headerPlatforms": "Plataformas",
|
||||
"headerAppNotes": "Notas",
|
||||
@@ -243,17 +243,17 @@
|
||||
}
|
||||
],
|
||||
"backupTitle": "Para qué importa realmente el \"backup\"",
|
||||
"backupBody": "Si pierdes el dispositivo autenticador, usa un código de recuperación guardado o restaura una copia que hubieras configurado previamente. La sincronización en la nube y las exportaciones varían según la aplicación; comprueba que restauren los secretos TOTP. El acceso root al host también permite recuperar el acceso, como se explica abajo. Conserva una copia separada y segura.",
|
||||
"backupBody": "Si pierdes el dispositivo autenticador, usa un código de backup guardado o restaura un backup de la app que hubieras configurado previamente. La sincronización en la nube y las exportaciones varían según la aplicación; comprueba que restauren los secretos TOTP. El acceso root al host también permite recuperar el acceso, como se explica abajo. Conserva un backup separado y seguro.",
|
||||
"setupTitle": "Configuración paso a paso desde el panel",
|
||||
"setupImageAlt": "Pantalla de configuración de 2FA con código QR y códigos de backup",
|
||||
"setupImageCaption": "El diálogo de 2FA muestra un código QR, el secreto Base32 para introducirlo manualmente y ocho códigos de recuperación de un solo uso. Cópialos antes de cerrar; no volverán a mostrarse.",
|
||||
"setupImageCaption": "El diálogo de 2FA muestra un código QR, el secreto Base32 para introducirlo manualmente y, tras la verificación, ocho códigos de backup de un solo uso. Cópialos antes de cerrar; no volverán a mostrarse.",
|
||||
"setupSteps": [
|
||||
"<strong>Instala la app autenticadora en tu móvil</strong> (o abre tu gestor de contraseñas). Una de las apps de la tabla de arriba. Solo necesitas hacerlo una vez — la misma app guardará códigos para cada servicio que protejas.",
|
||||
"<strong>Loguéate en el panel</strong> con tu usuario y contraseña.",
|
||||
"<strong>Abre la pestaña Seguridad</strong> en la barra lateral y pulsa <strong>Activar 2FA</strong>. El diálogo muestra un QR, el secreto Base32 y ocho códigos de recuperación.",
|
||||
"<strong>Abre la pestaña Seguridad</strong> en la barra lateral y pulsa <strong>Activar 2FA</strong> y <strong>Iniciar configuración</strong>. El diálogo muestra un QR y la clave manual; los ocho códigos de backup aparecen tras verificar el código.",
|
||||
"<strong>Añade la entrada a la app autenticadora:</strong>",
|
||||
"<strong>Guarda los códigos de recuperación.</strong> Conserva los ocho en un gestor de contraseñas, nota cifrada o copia impresa segura. Cada uno funciona una vez si no tienes el autenticador.",
|
||||
"<strong>Confirma escribiendo el código actual de 6 dígitos</strong> de la app en el campo \"Código de verificación\" del diálogo de setup y envía. Los códigos se refrescan cada 30 segundos, así que si caduca mientras escribes, simplemente introduce el siguiente.",
|
||||
"<strong>Confirma escribiendo el código actual de 6 dígitos</strong> de la app en el campo \"Código de verificación\" del diálogo de configuración y envía. Los códigos se renuevan cada 30 segundos, así que si caduca mientras escribes, introduce el siguiente.",
|
||||
"<strong>Guarda los códigos de backup.</strong> Tras la verificación, conserva los ocho en un gestor de contraseñas, nota cifrada o copia impresa segura. Cada uno funciona una vez si no tienes el autenticador.",
|
||||
"<strong>Hecho.</strong> El 2FA está ahora activo. La próxima vez que te logues, el panel pide primero la contraseña; una vez aceptada pide el código actual de 6 dígitos."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
@@ -261,17 +261,17 @@
|
||||
"<em>Plan B manual</em> (cuando escanear no es posible — p. ej. configurando en el mismo móvil con el que abriste el panel): pulsa <em>Añadir cuenta</em> → <em>Introducir clave de setup</em>. Escribe cualquier nombre (p. ej. <em>Proxmox Monitor</em>), pega la cadena Base32 del diálogo, deja <em>Tipo</em> como <em>Basado en tiempo</em>, guarda."
|
||||
],
|
||||
"testTitle": "Prueba antes de cerrar sesión",
|
||||
"testBody": "Mantén la sesión actual abierta y prueba un nuevo acceso en una ventana privada <em>inmediatamente</em> después de configurar 2FA. Si el código falla, comprueba los relojes del servidor y del móvil antes de cerrar la sesión válida. Si ya perdiste el acceso, usa un código de recuperación o edita <code>auth.json</code> desde la consola del host.",
|
||||
"testBody": "Mantén la sesión actual abierta y prueba un nuevo acceso en una ventana privada <em>inmediatamente</em> después de configurar 2FA. Si el código falla, comprueba los relojes del servidor y del móvil antes de cerrar la sesión válida. Si ya perdiste el acceso, usa un código de backup o edita <code>auth.json</code> desde la consola del host.",
|
||||
"lostTitle": "Autenticador perdido",
|
||||
"lostIntro": "Tres salidas de emergencia, en orden de cuán disruptivas son:",
|
||||
"lostItems": [
|
||||
"<strong>Usa un código de recuperación.</strong> Introduce uno de los ocho códigos guardados en el campo TOTP. Funciona una vez; los no usados siguen siendo válidos. Tras entrar, configura 2FA de nuevo desde Ajustes para obtener ocho códigos nuevos.",
|
||||
"<strong>Usa un código de backup.</strong> Introduce uno de los ocho códigos guardados en el campo TOTP. Funciona una vez; los no usados siguen siendo válidos. Tras entrar, abre Seguridad, elige <strong>Desactivar 2FA</strong> y después <strong>Activar 2FA</strong> para obtener ocho códigos nuevos.",
|
||||
"<strong>Restaura el autenticador desde la nube / backup.</strong> Si tu app tiene sync en la nube (Google, Microsoft, Authy, Apple Passwords vía iCloud Keychain, Ente, 2FAS) instálala en un dispositivo nuevo, loguéate y las entradas reaparecen. Si tu app usa un archivo de exportación cifrado (Aegis, Raivo, FreeOTP+), instala la app en el dispositivo nuevo e importa el archivo.",
|
||||
"<strong>Desactiva el 2FA desde la shell del host.</strong> Cuando las opciones anteriores no están disponibles, edita <code>/root/.config/proxmenux-monitor/auth.json</code> en el host Proxmox (necesitas SSH root o acceso por consola), pon <code>totp_enabled</code> a <code>false</code>, guarda y reinicia el servicio:"
|
||||
],
|
||||
"lostShellOutro": "Puedes loguearte con usuario + contraseña solo, luego reactivar el 2FA desde Settings.",
|
||||
"disableTitle": "Desactivar el 2FA",
|
||||
"disableBody": "Abre <strong>Seguridad</strong> y elige <strong>Desactivar 2FA</strong>. <code>POST /api/auth/totp/disable</code> exige la contraseña actual y un código TOTP o de recuperación válido. Elimina el secreto TOTP y los códigos de recuperación. Borra también la entrada antigua en la aplicación autenticadora.",
|
||||
"disableBody": "Abre <strong>Seguridad</strong> y elige <strong>Desactivar 2FA</strong>. <code>POST /api/auth/totp/disable</code> exige la contraseña actual y un código TOTP o de backup válido. Elimina el secreto TOTP y los códigos de backup. Elimina también la entrada antigua en la aplicación autenticadora.",
|
||||
"rejectedTitle": "El código de 6 dígitos se rechaza siempre",
|
||||
"rejectedIntro": "El TOTP está basado en tiempo — el reloj del servidor y el del móvil deben coincidir dentro de unos ~30 s. Dos comprobaciones:",
|
||||
"rejectedItems": [
|
||||
@@ -316,7 +316,7 @@
|
||||
"calloutBody": "Monitor puede usar un certificado gestionado por Proxmox o archivos de certificados propios. No emite certificados ACME. Para emitirlos y renovarlos automáticamente, usa ACME de Proxmox o un proxy inverso como Caddy, Traefik o Nginx y asegúrate de cargar los certificados renovados."
|
||||
},
|
||||
"gateway": {
|
||||
"heading": "Pasarela segura (Tailscale)",
|
||||
"heading": "Secure Gateway (Tailscale)",
|
||||
"intro": "Un proxy inverso es una opción de acceso remoto. <strong>Secure Gateway</strong> permite acceder sin exponer TCP 8008: despliega un LXC Alpine con <a>Tailscale</a> como router de subred. El acceso a la IP LAN del host depende de las rutas aprobadas y de las reglas de acceso de la tailnet.",
|
||||
"calloutTitle": "Por qué esto es cómodo",
|
||||
"calloutBody": "Usa la URL LAN <code>http://<proxmox-lan-ip>:8008</code> mediante la ruta de subred aprobada. Tailscale usa SNAT por defecto, por lo que Monitor suele ver la IP LAN de la pasarela, no la dirección <code>100.x.y.z</code> del cliente. Los registros y Fail2Ban identifican la dirección de origen que recibe el host.",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "Desactivado por defecto, un solo interruptor para activarlo",
|
||||
"body": "La reescritura con IA viene desactivada. Actívala en <em>Ajustes → Notificaciones → Avanzado: mejora con IA</em>. Si falla el enriquecimiento o la reescritura, se envía la plantilla original. Cada reescritura tiene un tiempo límite de 25 segundos; al alcanzarlo se usa la plantilla en lugar de esperar indefinidamente."
|
||||
"body": "La reescritura con IA viene desactivada. Actívala en <em>Ajustes → Notificaciones → Avanzado: mejora con IA</em>. Si falla el enriquecimiento o la reescritura, se envía la plantilla original. Las reescrituras de la cola de eventos tienen un tiempo límite de 25 segundos; al alcanzarlo se envía la plantilla en lugar de esperar."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Cómo funciona",
|
||||
@@ -83,7 +83,7 @@
|
||||
"intro1": "Cada proveedor comercial cobra por <em>token</em>, así que merece la pena entender qué es un token antes de elegir un plan. Un token son aproximadamente cuatro caracteres de texto en inglés o unas tres cuartas partes de una palabra. La frase <em>\"Backup completed on storage local-bak\"</em> son unos ocho tokens. Un extracto corto de journal de diez líneas puede ser 200-400 tokens según la densidad técnica.",
|
||||
"intro2": "Se facturan dos cosas en cada llamada:",
|
||||
"items": [
|
||||
"<strong>Tokens de entrada</strong>: incluyen las instrucciones del sistema y el mensaje de usuario: severidad, título, texto de la plantilla y contexto adicional. La cantidad depende del prompt y del evento. Cada canal reescrito puede consumir sus propios tokens de entrada; los informes de copia completada y fallida omiten la IA.",
|
||||
"<strong>Tokens de entrada</strong>: incluyen las instrucciones del sistema y el mensaje de usuario: severidad, título, texto de la plantilla y contexto adicional. La cantidad depende del prompt y del evento. Cada canal reescrito puede consumir sus propios tokens de entrada; los informes de backup completado y fallido omiten la IA.",
|
||||
"<strong>Tokens de salida</strong> — lo que el modelo escribe de vuelta. El Monitor lo limita con <code>max_tokens</code> (mira la tabla de abajo). El límite es un <em>tope</em>, no un cargo: si el modelo produce 250 tokens con un tope de 1500, pagas 250."
|
||||
],
|
||||
"capsIntro": "Estos son los topes reales que aplica el dispatcher, tomados directamente de <code>AI_DETAIL_TOKENS</code> en <code>notification_templates.py</code>:",
|
||||
@@ -109,7 +109,7 @@
|
||||
],
|
||||
"customNote": "El modo de prompt personalizado usa un tope fijo de 500 tokens de salida independientemente del nivel de detalle — el prompt personalizado está bajo tu control y el tope protege contra respuestas descontroladas.",
|
||||
"sizingTitle": "Dimensionamiento práctico",
|
||||
"sizingBody": "Estima el consumo como eventos reescritos × canales con IA × tokens de entrada y salida por llamada. Por ejemplo: 50 eventos × un canal × (500 de entrada + 300 de salida) son 40.000 tokens al día. El consumo y coste reales dependen del modelo, contexto, caché y límites del proveedor. <link>Nivel de detalle por canal</link> explica cómo usar <code>brief</code> para chat en lugar de <code>standard</code>, manteniendo informes detallados por correo."
|
||||
"sizingBody": "Estima el consumo como eventos reescritos × canales con IA × tokens de entrada y salida por llamada. Por ejemplo: 50 eventos × un canal × (2.000 de entrada + 300 de salida) son unos 115.000 tokens al día, porque el prompt de sistema predeterminado ya ocupa unos 1.500 tokens. El consumo y coste reales dependen del modelo, contexto, caché y límites del proveedor. <link>Nivel de detalle por canal</link> explica cómo usar <code>brief</code> para chat en lugar de <code>standard</code>, manteniendo informes detallados por correo."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "Proveedores de IA",
|
||||
@@ -142,7 +142,7 @@
|
||||
"items": [
|
||||
"Clave API: <a>console.anthropic.com/settings/keys</a>",
|
||||
"Ejemplos de la lista de modelos incluida: <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
|
||||
"Recomendación incluida: <strong><code>claude-haiku-4-5-20251001</code></strong>. Esta versión exacta figura como recomendada; los modelos Claude 3.5 de la documentación anterior ya no están en la lista incluida."
|
||||
"Recomendación incluida: <strong><code>claude-haiku-4-5-20251001</code></strong>, una versión fija y no un alias que cambie."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
@@ -215,7 +215,7 @@
|
||||
"shareTitle": "Compartir prompts con la comunidad",
|
||||
"shareIntro": "El botón <em>Export</em> escribe tu prompt personalizado actual en un archivo (<code>.txt</code> / <code>.md</code>) que puedes guardar como backup o pasar a otra persona. <em>Import</em> lo trae de vuelta. El tercer botón al lado enlaza con una galería comunitaria pública en GitHub:",
|
||||
"shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Comparte prompts personalizados para notificaciones de IA",
|
||||
"shareOutro": "Navega la discusión para ver qué han construido otros operadores — alertas escuetas tipo pager, reportes técnicos verbosos, variantes específicas por idioma. Si tuneas el tuyo y te gusta el resultado, publícalo allí: incluso una descripción de un párrafo de para qué optimiza tu prompt ayuda a la gente a elegir un buen punto de partida. El feedback sobre lo que funciona y lo que no es igualmente bienvenido."
|
||||
"shareOutro": "Navega la discusión para ver qué han construido otros usuarios — alertas escuetas tipo pager, reportes técnicos verbosos, variantes específicas por idioma. Si tuneas el tuyo y te gusta el resultado, publícalo allí: incluso una descripción de un párrafo de para qué optimiza tu prompt ayuda a la gente a elegir un buen punto de partida. El feedback sobre lo que funciona y lo que no es igualmente bienvenido."
|
||||
},
|
||||
"suggestions": {
|
||||
"heading": "Sugerencias de IA (BETA)",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "API de Proxmox Monitor — Referencia de integración | ProxMenux",
|
||||
"description": "Endpoints HTTP de ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios. Consulta el estado y ejecuta operaciones documentadas: control de VM, inicio de copias, notificaciones y confirmación de alertas.",
|
||||
"description": "Endpoints HTTP de ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios. Consulta el estado y ejecuta operaciones documentadas: control de VM, inicio de backups, notificaciones y confirmación de alertas.",
|
||||
"ogTitle": "API de Proxmox Monitor — Referencia de integración",
|
||||
"ogDescription": "Endpoints de ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios.",
|
||||
"twitterTitle": "API de Proxmox Monitor | ProxMenux",
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para qué es esta página",
|
||||
"body": "Esta página reúne endpoints para integraciones externas: datos de lectura y operaciones como iniciar copias, enviar avisos y confirmar alertas. La API usa el mismo proceso Flask que sirve el panel en TCP <strong>8008</strong>. La dirección de escucha y TLS se explican en <link>Acceso y autenticación</link>."
|
||||
"body": "Esta página reúne endpoints para integraciones externas: datos de lectura y operaciones como iniciar backups, enviar avisos y confirmar alertas. La API usa el mismo proceso Flask que sirve el panel en TCP <strong>8008</strong>. La dirección de escucha y TLS se explican en <link>Acceso y autenticación</link>."
|
||||
},
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerMethod": "Método",
|
||||
@@ -102,9 +102,9 @@
|
||||
},
|
||||
"actions": {
|
||||
"heading": "Acciones del sistema",
|
||||
"intro": "Estas acciones asíncronas se ejecutan en unidades systemd transitorias. Con autenticación activa, sus rutas de escritura exigen <code>full_admin</code>; <code>read_only</code> puede consultar <code>.../status</code>. El inicio aceptado devuelve HTTP 202 y estado; consulta <code>.../status</code> para el progreso. El control de invitados y las copias usan respuestas distintas, explicadas abajo.",
|
||||
"intro": "Estas acciones asíncronas se ejecutan en unidades systemd transitorias. Con autenticación activa, sus rutas de escritura exigen <code>full_admin</code>; <code>read_only</code> puede consultar <code>.../status</code>. El inicio aceptado devuelve HTTP 202 y estado; consulta <code>.../status</code> para el progreso. El control de invitados y los backups usan respuestas distintas, explicadas abajo.",
|
||||
"shapeTitle": "Formato de respuesta común",
|
||||
"shapeIntro": "Las acciones asíncronas del sistema comparten este objeto JSON de estado. El control de invitados y las copias tienen formatos distintos:",
|
||||
"shapeIntro": "Las acciones asíncronas del sistema comparten este objeto JSON de estado. El control de invitados y los backups tienen formatos distintos:",
|
||||
"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": "Concurrencia y cancelación",
|
||||
"concurrencyBody": "Iniciar otra ejecución de la misma acción activa devuelve HTTP 409. Solo se cancela si hay una ruta DELETE documentada, como en la actualización PVE. Su estado pasa a <code>cancelled</code> y conserva fechas. Los estados finales se guardan en memoria del proceso y pueden perderse al reiniciar Monitor.",
|
||||
@@ -162,7 +162,7 @@
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Crea una copia vzdump de una VM o LXC. Campos opcionales, ajustables según el almacenamiento: <code>storage</code> (destino PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> o <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> o <code>none</code>), <code>protected</code> (<code>true</code> o <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> o <code>never</code>) y <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> o <code>data</code>). Devuelve el UPID de la tarea PVE."
|
||||
"use": "Crea un backup vzdump de una VM o LXC. Campos opcionales, ajustables según el almacenamiento: <code>storage</code> (destino PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> o <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> o <code>none</code>), <code>protected</code> (<code>true</code> o <code>false</code>), <code>notes</code> y <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> o <code>data</code>). Devuelve el UPID de la tarea PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
@@ -171,7 +171,7 @@
|
||||
}
|
||||
],
|
||||
"syncVsAsyncTitle": "Dos tipos de acción",
|
||||
"syncVsAsyncBody": "Encendido, apagado y actualizaciones del host usan unidades systemd transitorias con <code>.../status</code>. Solo la actualización PVE tiene aquí una ruta de cancelación <code>DELETE</code>. El control VM/LXC devuelve una tarea que debe consultarse; la copia devuelve un UPID de trabajo en segundo plano. Aceptar la petición no equivale a terminarla. Autenticación y permisos dependen de la ruta.",
|
||||
"syncVsAsyncBody": "Encendido, apagado y actualizaciones del host usan unidades systemd transitorias con <code>.../status</code>. Solo la actualización PVE tiene aquí una ruta de cancelación <code>DELETE</code>. El control VM/LXC devuelve una tarea que debe consultarse; el backup devuelve un UPID de trabajo en segundo plano. Aceptar la petición no equivale a terminarla. Autenticación y permisos dependen de la ruta.",
|
||||
"curlTitle": "Ejemplo curl",
|
||||
"curlBody": "Inicia una actualización PVE y consulta hasta que termine: la secuencia que usaría una automatización Home Assistant o un playbook Ansible.",
|
||||
"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\"",
|
||||
@@ -286,7 +286,7 @@
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Inicia una prueba SMART. Esquema del cuerpo: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
"use": "Inicia una prueba SMART. Esquema del cuerpo: <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
@@ -356,7 +356,7 @@
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
"method": "GET",
|
||||
"use": "Copias de seguridad conservadas para este invitado."
|
||||
"use": "Backups conservados para este invitado."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/control",
|
||||
@@ -381,17 +381,17 @@
|
||||
]
|
||||
},
|
||||
"backups": {
|
||||
"heading": "Copias de seguridad",
|
||||
"heading": "Backups",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/backups",
|
||||
"method": "GET",
|
||||
"use": "Copias encontradas en almacenamientos dir, NFS, CIFS y PBS consultados desde el nodo local. No explora todos los nodos del clúster."
|
||||
"use": "Backups encontrados en almacenamientos dir, NFS, CIFS y PBS consultados desde el nodo local. No explora todos los nodos del clúster."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/backup-storages",
|
||||
"method": "GET",
|
||||
"use": "Almacenamientos que admiten copias de seguridad, con espacio libre."
|
||||
"use": "Almacenamientos que admiten backups, con espacio libre."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -73,13 +73,13 @@
|
||||
"intro": "AppImage es un sistema de archivos que se monta al ejecutarlo. <code>AppRun</code> en su raíz prepara el entorno y lanza <code>flask_server.py</code>:",
|
||||
"consequencesIntro": "Dos consecuencias de esta estructura:",
|
||||
"consequences": [
|
||||
"<strong>Entorno Python incluido.</strong> El intérprete y sus paquetes vienen en AppImage, evitando instalarlos en Python del host. La aplicación sigue usando interfaces del kernel y herramientas externas del host.",
|
||||
"<strong>Paquetes Python incluidos.</strong> Los paquetes Python vienen en la AppImage y se ejecutan con el intérprete Python 3.11 (PVE 8) o 3.13 (PVE 9) del propio host, sin instalar nada en su Python del sistema. La aplicación sigue usando interfaces del kernel y herramientas externas del host.",
|
||||
"<strong>Clientes de hardware incluidos.</strong> Contiene <code>ipmitool</code>, <code>lm-sensors</code> y <code>upsc</code>. Las lecturas dependen del hardware compatible, acceso a sensores y, para el SAI, un servidor NUT configurado."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Estructura de la aplicación Flask",
|
||||
"intro": "<code>flask_server.py</code> crea una instancia <code>Flask(__name__)</code> con CORS restringido, registra directamente nueve blueprints e inicializa el terminal. La tabla destaca módulos principales; también registra auditoría, copias VM y PBS. Las precargas PVE solo se ejecutan en hosts PVE.",
|
||||
"intro": "<code>flask_server.py</code> crea una instancia <code>Flask(__name__)</code> con CORS restringido, registra directamente diez blueprints e inicializa el terminal. La tabla destaca módulos principales; también registra PBS, enlaces del Monitor, auditoría y backups de VM. Las precargas PVE solo se ejecutan en hosts PVE.",
|
||||
"headerBlueprint": "Blueprint / módulo",
|
||||
"headerPrefix": "Prefijo de rutas",
|
||||
"headerOwns": "Responsabilidad",
|
||||
@@ -242,17 +242,17 @@
|
||||
"Actualizaciones: paquetes pendientes y parches de seguridad.",
|
||||
"Registros: patrones persistentes, picos y cascadas en el journal del sistema.",
|
||||
"Memoria: actividad del OOM killer y presión RAM sostenida.",
|
||||
"Temperatura: lecturas CPU y discos frente a umbrales de monitorización; los sensores disponibles dependen del hardware.",
|
||||
"CPU: uso y temperatura de la CPU frente a los umbrales configurables; los sensores disponibles dependen del hardware.",
|
||||
"Seguridad: fallos de acceso, bloqueos y estado del jail Fail2Ban."
|
||||
],
|
||||
"afterIntro": "Los hallazgos usan <code>error_key</code>, categoría y gravedad estables. Las filas de <code>errors</code> se actualizan con <code>last_seen</code> y recuentos, sin duplicarlas. El envío de avisos tiene además sus propias huellas y tiempos de espera.",
|
||||
"afterIntro": "Los hallazgos usan <code>error_key</code>, categoría y gravedad estables. Las filas de <code>errors</code> se actualizan en el sitio (<code>last_seen</code>, gravedad, motivo), sin duplicarlas. El envío de avisos tiene además sus propias huellas y tiempos de espera.",
|
||||
"cycleEnd": "La limpieza puede resolver errores obsoletos con la <em>duración de silenciamiento</em> por categoría y reglas de estado, retirar registros huérfanos de recursos eliminados y borrar <code>events</code> de más de 30 días. Las categorías se explican en <link>Panel → Health Monitor</link>."
|
||||
},
|
||||
"notifications": {
|
||||
"heading": "Motor de notificaciones",
|
||||
"intro": "<code>notification_manager.py</code> coordina el envío: carga canales, gestiona la cola y ofrece una API Python para Flask y Health Monitor, además de una entrada de consola para los hooks <code>.sh</code> de ProxMenux.",
|
||||
"items": [
|
||||
"Los <strong>observadores</strong> generan eventos: <code>JournalWatcher</code> sigue el journal, <code>TaskWatcher</code> consulta tareas Proxmox, <code>ProxmoxHookWatcher</code> recibe hooks de copias, replicación y snapshots, y <code>PollingCollector</code> gestiona fuentes lentas.",
|
||||
"Los <strong>observadores</strong> generan eventos: <code>JournalWatcher</code> sigue el journal, <code>TaskWatcher</code> consulta tareas Proxmox, <code>ProxmoxHookWatcher</code> recibe hooks de backups, replicación y snapshots, y <code>PollingCollector</code> gestiona fuentes lentas.",
|
||||
"Las <strong>plantillas</strong> convierten eventos en título y texto. El proveedor de IA configurado (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) puede reformularlos en lenguaje natural. Ambas versiones se guardan en <code>notification_history</code>.",
|
||||
"Los <strong>canales</strong> envían por Telegram, Discord, correo, Gotify, Pushover y Apprise, entre otros. Las implementaciones en <code>notification_channels.py</code> comparten <code>create_channel()</code> / <code>send()</code>.",
|
||||
"<strong>Cifrado.</strong> Los ajustes sensibles (<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>) se cifran con la clave de <code>.notification_key</code> antes de guardarse en la base de datos y se muestran enmascarados en la interfaz."
|
||||
@@ -264,9 +264,9 @@
|
||||
"intro": "La pestaña <em>Terminal</em> conecta un cliente ligero <code>xterm.js</code> a un PTY del servidor por WebSocket. Hay dos modos:",
|
||||
"items": [
|
||||
"<strong>Modo HTTP, predeterminado:</strong> el servidor Flask incluido y <code>flask-sock</code> gestionan el cambio de protocolo a WebSocket.",
|
||||
"<strong>Modo HTTPS / WSS:</strong> usa <code>gevent.pywsgi.WSGIServer</code> con <code>geventwebsocket.handler.WebSocketHandler</code> para conexiones WebSocket sobre TLS."
|
||||
"<strong>Modo HTTPS / WSS:</strong> usa <code>gevent.pywsgi.WSGIServer</code> con su gestor predeterminado; <code>flask-sock</code> atiende las conexiones WebSocket sobre TLS."
|
||||
],
|
||||
"outro": "Los procesos del terminal heredan <code>User=root</code>. Con autenticación activa, abrir WebSocket exige un ticket breve y de un solo uso, obtenido del endpoint de tickets autenticado con permisos administrativos. Si la autenticación está desactivada o se rechazó configurarla, la conexión sigue ese modo sin autenticación.",
|
||||
"outro": "Los procesos del terminal heredan <code>User=root</code>. Abrir WebSocket exige un ticket breve y de un solo uso, obtenido del endpoint de tickets autenticado con permisos administrativos.",
|
||||
"proxyNote": "Si usas un proxy inverso, permite el tráfico WebSocket y sus cabeceras <code>Upgrade</code> y <code>Connection</code>. El terminal necesita ese reenvío."
|
||||
},
|
||||
"proxy": {
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
{
|
||||
"icon": "fileText",
|
||||
"title": "Política: ¿qué se espera?",
|
||||
"body": "Declara qué invitados necesitan copia de seguridad o deben arrancar con el host, qué almacenamiento es esencial y los umbrales de las comprobaciones."
|
||||
"body": "Declara qué invitados necesitan backup o deben arrancar con el host, qué almacenamiento es esencial y los umbrales de las comprobaciones."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Política | Auditoría e informes",
|
||||
"description": "Política del nodo en Auditoría e informes: copias de seguridad, arranque automático y objetivo de recuperación de cada invitado, función de cada almacenamiento y umbrales de comprobación."
|
||||
"description": "Política del nodo en Auditoría e informes: backups, arranque automático y objetivo de recuperación de cada invitado, función de cada almacenamiento y umbrales de comprobación."
|
||||
},
|
||||
"header": {
|
||||
"title": "Política",
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
"<strong>Placa base</strong>: fabricante, modelo, versión y fecha de BIOS y UUID SMBIOS. Sirve para localizar la página de descarga correcta del fabricante al buscar firmware."
|
||||
],
|
||||
"memoryTitle": "Módulos de memoria",
|
||||
"memoryBody": "Una fila por ranura ocupada según <code>dmidecode</code>: etiqueta, capacidad del módulo, tipo (DDR4 / DDR5 / variantes ECC), velocidad configurada y nominal, fabricante, referencia y número de serie. Las ranuras vacías aparecen atenuadas para mostrar el margen de ampliación.",
|
||||
"memoryBody": "Una fila por slot ocupado según <code>dmidecode</code>: etiqueta, capacidad del módulo, tipo (DDR4 / DDR5 / variantes ECC), velocidad configurada y nominal, fabricante, referencia y número de serie. Los slots vacíos aparecen atenuados para mostrar el margen de ampliación.",
|
||||
"thermalTitle": "Monitoreo Térmico",
|
||||
"thermalIntro": "Siete bloques alimentados por <code>lm-sensors</code>, <code>sysfs</code> y lectores específicos de cada herramienta. Los sensores hwmon de almacenamiento se asocian al dispositivo de bloques físico, con su modelo y ruta <code>/dev/...</code>. Cada bloque se oculta si no hay sensores en su categoría.",
|
||||
"thermalItems": [
|
||||
@@ -52,7 +52,7 @@
|
||||
"lxcImageAlt": "Tarjetas gráficas: iGPU Intel UHD Graphics con i915 y NVIDIA Quadro P1000 con nvidia, ambas listas para contenedores LXC",
|
||||
"lxcImageCaption": "Mismo nodo después de devolver la tarjeta NVIDIA al driver nativo — ambas GPUs ahora Ready for LXC containers.",
|
||||
"realtimeTitle": "Ventana de monitorización en tiempo real",
|
||||
"realtimeBody": "Pulsa una GPU para abrir su monitorización por ranura, que consulta la herramienta del fabricante cada tres segundos. Muestra fabricante, tipo, ranura PCI, controlador, módulos del kernel, uso de motores (Render/3D, Video, Blitter, VideoEnhance), frecuencias de gráficos y memoria, temperatura, consumo si está disponible, VRAM y procesos activos con carga por proceso. Datos de <code>/api/gpu/<slot>/realtime</code>.",
|
||||
"realtimeBody": "Pulsa una GPU para abrir su monitorización por slot, que consulta la herramienta del fabricante cada tres segundos. Muestra fabricante, tipo, slot PCI, controlador, módulos del kernel, uso de motores (Render/3D, Video, Blitter, VideoEnhance), frecuencias de gráficos y memoria, temperatura, consumo si está disponible, VRAM y procesos activos con carga por proceso. Datos de <code>/api/gpu/<slot>/realtime</code>.",
|
||||
"toolsIntro": "Herramienta del fabricante usada para cada GPU:",
|
||||
"headerVendor": "Proveedor",
|
||||
"headerTool": "Herramienta",
|
||||
@@ -123,9 +123,9 @@
|
||||
"intro": "Todos los dispositivos de bloques conocidos por el kernel, agrupados por tipo. Cada disco muestra su nombre (<code>sda</code>, <code>nvme0n1</code>, <code>zram0</code>…), tipo (<em>SSD</em>, <em>HDD</em>, <em>NVMe SSD</em>), modelo y enlace negociado. Pulsa para abrir modelo, número de serie, capacidad, interfaz y velocidad actual y máxima.",
|
||||
"imageAlt": "Tarjeta Storage Summary listando once dispositivos de bloque (SSDs SATA, HDDs SATA, SSDs NVMe y zram) con cadenas de modelo y velocidades de enlace negociadas; los dos discos NVMe muestran 3.0 x4 con la velocidad actual resaltada",
|
||||
"imageCaption": "Once dispositivos en este nodo. Los enlaces SATA aparecen como <em>SATA <version>, <Gb/s> (current: ...)</em>; los NVMe como <em><PCIe gen> x<width></em>.",
|
||||
"nvmeBody": "La línea de cada NVMe compara el enlace negociado con el máximo admitido. Si difieren, como un SSD Gen3 x4 funcionando a <strong>3.0 x1</strong> en una ranura de un solo carril, el valor actual aparece en ámbar. Permite detectar enlaces limitados al investigar discos lentos o cambios de carriles tras actualizar BIOS.",
|
||||
"nvmeBody": "La línea de cada NVMe compara el enlace negociado con el máximo admitido. Si difieren, como un SSD Gen3 x4 funcionando a <strong>3.0 x1</strong> en un slot de un solo carril, el valor actual aparece en ámbar. Permite detectar enlaces limitados al investigar discos lentos o cambios de carriles tras actualizar BIOS.",
|
||||
"nvmeModalAlt": "Modal de detalle de disco NVMe para nvme0n1: tipo NVMe SSD, 953.9 GB de capacidad, velocidad actual de enlace 3.0 x1 resaltada en ámbar, velocidad máxima 3.0 x4, modelo WDC CL SN720, número de serie, interfaz PCIe/NVMe",
|
||||
"nvmeModalCaption": "Detalles NVMe con enlace limitado: el disco admite x4, pero la ranura está conectada a x1.",
|
||||
"nvmeModalCaption": "Detalles NVMe con enlace limitado: el disco admite x4, pero el slot está conectado a x1.",
|
||||
"outro": "Los datos SMART, autopruebas, historial e informe PDF están en <storageLink>Panel: Almacenamiento</storageLink>. Los mismos datos alimentan <smartLink>Salud y pruebas SMART de discos</smartLink>. Una prueba larga desde el script escribe el JSON mostrado por Monitor en <em>Almacenamiento → Historial</em>."
|
||||
},
|
||||
"pci": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
}
|
||||
],
|
||||
"reportTitle": "Informe de latencia de red (PDF)",
|
||||
"reportIntro": "Ambos modos tienen un botón <strong>Informe</strong> junto al selector de destino. Genera un PDF de las mediciones que puedes adjuntar a una solicitud de asistencia a tu proveedor de Internet.",
|
||||
"reportIntro": "Ambos modos tienen un botón <strong>Informe</strong> junto al selector de destino. Abre un informe imprimible de las mediciones; guárdalo como PDF desde el diálogo de impresión del navegador y adjúntalo a una solicitud de asistencia a tu proveedor de Internet.",
|
||||
"reportPreviewAlt": "Primera página del informe PDF de latencia: resumen ejecutivo, indicador, estadísticas, gráfico y guía de umbrales",
|
||||
"reportPreviewCaption": "La primera página contiene resumen ejecutivo, indicador, estadísticas principales, serie temporal de latencia y guía de umbrales. Desde la página 2 aparecen la tabla de muestras y la metodología.",
|
||||
"downloadLabel": "Descargar informe de ejemplo de latencia (PDF)",
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
"configCaption": "Edición del jail sshd: reduce <em>Max Retries</em> para SSH si solo accedes desde tu subred, o amplía <em>Ban Time</em> para el panel expuesto a Internet.",
|
||||
"outro": "La guía <em>Qué instala, cómo se configura y cómo desinstalar</em> incluye la instalación manual, el cambio de SSH MaxAuthTries y la relación con el registro <code>proxmenux-auth.log</code>. Consulta <link>ProxMenux → Seguridad → Fail2Ban</link>.",
|
||||
"calloutTitle": "Sin Fail2Ban, este mecanismo no bloquea las IP",
|
||||
"calloutBody": "ProxMenux Monitor comprueba las IP bloqueadas por Fail2Ban a <em>nivel de aplicación</em> antes de procesar las peticiones de Flask. Consulta fail2ban-client y guarda el resultado en caché durante 30 segundos; no lee ninguna tabla SQL de bloqueos. Sin Fail2Ban, los intentos fallidos se registran en <code>proxmenux-auth.log</code>, pero este mecanismo no bloquea IPs."
|
||||
"calloutBody": "ProxMenux Monitor comprueba las IP bloqueadas en la jaula <code>proxmenux</code> de Fail2Ban a <em>nivel de aplicación</em> antes de procesar las peticiones de Flask, con el resultado en caché durante 30 segundos. Sin Fail2Ban, los intentos fallidos se registran en <code>proxmenux-auth.log</code> y el inicio de sesión se limita a 5 intentos por IP cada 5 minutos, pero no se bloquea ninguna IP."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Auditoría de seguridad de Lynis",
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
},
|
||||
"navigationOrder": {
|
||||
"heading": "Orden de navegación",
|
||||
"intro": "Ordena los siete elementos principales: <strong>Resumen, Apps, VMs y LXCs, Nodo, Copias, Terminal y Administración</strong>. Pulsa <strong>Editar</strong>, arrastra las filas y guarda.",
|
||||
"intro": "Ordena los siete elementos principales: <strong>Resumen, Apps, VMs y LXCs, Nodo, Backup, Terminal y Administración</strong>. Pulsa <strong>Editar</strong>, arrastra las filas y guarda.",
|
||||
"items": [
|
||||
"Con el ratón, el arrastre empieza al pulsar. En pantallas táctiles requiere mantener la pulsación 250 ms para distinguirlo del desplazamiento.",
|
||||
"Los grupos <strong>Nodo</strong> y <strong>Administración</strong> se mueven completos; sus páginas internas conservan el orden establecido.",
|
||||
@@ -76,16 +76,16 @@
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Umbrales de Health Monitor",
|
||||
"intro": "La tarjeta anterior define <em>cuánto dura el silencio tras descartar</em>; esta define <strong>el valor que activa una alerta</strong>. La mayoría de controles tienen valores <strong>Aviso</strong> y <strong>Crítico</strong> ajustables. La tabla explica excepciones como la regla combinada de swap y el detector actual de RAM.",
|
||||
"intro": "La tarjeta anterior define <em>cuánto dura el silencio tras descartar</em>; esta define <strong>el valor que activa una alerta</strong>. La mayoría de controles tienen valores <strong>Aviso</strong> y <strong>Crítico</strong> ajustables. La tabla explica excepciones como la regla combinada de swap.",
|
||||
"whatForTitle": "Para qué sirve",
|
||||
"whatForIntro": "Los valores predeterminados sirven como punto de partida, pero cada entorno tiene sus propias condiciones:",
|
||||
"whatForItems": [
|
||||
"Un homelab con un único SSD puede avisar antes de llenarse, por ejemplo al 75/90 %, para dejar margen a las instantáneas.",
|
||||
"Un homelab con un único SSD puede avisar antes de llenarse, por ejemplo al 75/90 %, para dejar margen a los snapshots.",
|
||||
"Los umbrales de memoria deben reflejar las mediciones y la carga del host. La redundancia Ceph no justifica por sí sola relajar avisos, y el uso elevado de ARC de ZFS no equivale a memoria de trabajo irrecuperable.",
|
||||
"Elige umbrales de temperatura según las especificaciones del disco y sus condiciones reales. La refrigeración pasiva o forzada no determina por sí sola un límite seguro universalmente más bajo o más alto.",
|
||||
"Un host muy virtualizado puede alcanzar picos de CPU durante compilaciones sin necesitar avisos por cada pico del 80 %, pero debe seguir avisando de saturación sostenida."
|
||||
],
|
||||
"whatForOutro": "Los cambios admitidos se aplican <strong>en el siguiente análisis</strong>. Health Monitor lee <code>/usr/local/share/proxmenux/health_thresholds.json</code> cada ciclo sin reinicio. Algunos indicadores, como temperatura de disco, usan estos valores; ciertas barras de capacidad conservan sus propios cortes. La fila de RAM explica una excepción actual.",
|
||||
"whatForOutro": "Los cambios admitidos se aplican <strong>en el siguiente análisis</strong>. Health Monitor lee <code>/usr/local/share/proxmenux/health_thresholds.json</code> cada ciclo sin reinicio. Algunos indicadores, como temperatura de disco, usan estos valores; ciertas barras de capacidad conservan sus propios cortes.",
|
||||
"coloursTitle": "Colores de estado de Aviso y Crítico",
|
||||
"coloursIntro": "Los widgets que usan el par Aviso/Crítico siguen los tres estados siguientes. Algunos indicadores, como las barras de capacidad PVE, tienen límites propios; su color no basta para deducir una alerta de Health Monitor.",
|
||||
"headerColour": "Color",
|
||||
@@ -125,7 +125,7 @@
|
||||
"section": "Memoria",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Presión de RAM del host. La configuración muestra Crítico al 95 %, pero el detector actual usa una regla fija del 90 % sostenido; cambiar ese ajuste no modifica actualmente esa rama de ejecución."
|
||||
"gates": "Presión de RAM del host."
|
||||
},
|
||||
{
|
||||
"section": "Uso de swap (solo crítico)",
|
||||
@@ -185,7 +185,7 @@
|
||||
"section": "Almacenamiento PVE",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Almacenamientos gestionados por PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph y PBS. No todos son backends de bloques."
|
||||
"gates": "Solo almacenamientos PVE de tipo LVM, LVM-thin, ZFS-pool, RBD, CephFS y PBS. Los de tipo directorio, NFS y CIFS los cubre la fila de espacio en disco del host."
|
||||
},
|
||||
{
|
||||
"section": "Pool ZFS",
|
||||
@@ -218,7 +218,7 @@
|
||||
"toggleTitle": "Interruptor de aviso condicionado a la detección",
|
||||
"toggleBody": "El interruptor por canal <code>lxc_updates_available</code> en <strong>Notificaciones → Servicios</strong> solo aparece con la detección activa. Al desactivarla, la fila se oculta en todos los canales. Su preferencia se conserva en la base de datos y recupera el mismo valor al reactivarla.",
|
||||
"purgeTitle": "Qué se elimina al desactivar la detección",
|
||||
"purgeBody": "Desactivarlo elimina de inmediato las entradas <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Los contadores de actualizaciones LXC de Hardware desaparecen en el siguiente refresco. Al reactivarlo, el próximo ciclo de detección repuebla el registro, o antes con una actualización manual de la API."
|
||||
"purgeBody": "Desactivarlo elimina de inmediato las entradas <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Los contadores de actualizaciones LXC de la pestaña VM y LXC desaparecen en el siguiente refresco. Al reactivarlo, el próximo ciclo de detección repuebla el registro, o antes con una actualización manual de la API."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Exclusiones de almacenamiento remoto",
|
||||
@@ -226,7 +226,7 @@
|
||||
"imageCaption": "Controles <em>Estado</em> y <em>Alertas</em> por almacenamiento. Con ambos desactivados, deja de participar en Health Monitor y de enviar avisos. Sigue visible en Almacenamiento, marcado como excluido.",
|
||||
"intro": "Puedes excluir almacenamientos gestionados por Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / etc.) con dos controles independientes:",
|
||||
"items": [
|
||||
"<strong>Estado</strong> — al desactivar este control, el almacenamiento deja de contar en la categoría Almacenamiento de Health Monitor. Útil para volúmenes de archivo habitualmente desconectados o destinos remotos de copia que solo se encienden según un horario.",
|
||||
"<strong>Estado</strong> — al desactivar este control, el almacenamiento deja de contar en la categoría Almacenamiento de Health Monitor. Útil para volúmenes de archivo habitualmente desconectados o destinos remotos de backup que solo se encienden según un horario.",
|
||||
"<strong>Alertas</strong> — desactivarlo impide enviar avisos de este almacenamiento por los canales configurados, aunque los controles de estado sigan activos. Útil si quieres ver su estado en el panel sin recibir avisos."
|
||||
],
|
||||
"outro": "Los almacenamientos excluidos siguen en la <link>pestaña Almacenamiento</link> con la insignia morada <em>excluido</em>, para mantener visible el inventario. El estado se guarda en la tabla SQLite <code>excluded_storages</code>."
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"items": [
|
||||
"<strong>Ruta del dispositivo</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Etiqueta de tipo</strong>: SATA / NVMe y su icono.",
|
||||
"<strong>Etiqueta de sistema</strong>: marca naranja para los discos identificados como discos del SO. Se detectan mediante los montajes de <code>/</code> y <code>/boot</code> y reciben la etiqueta <em>System</em>. La ausencia de etiqueta no demuestra que se puedan borrar o reutilizar sin riesgo.",
|
||||
"<strong>Etiqueta de sistema</strong>: marca naranja para los discos en uso por el host: montajes del sistema (<code>/</code>, <code>/boot</code>, <code>/usr</code>, <code>/var</code>…), swap activa, miembros de pools ZFS, volúmenes físicos LVM, miembros de RAID activos o etiquetas de partición del sistema. La ausencia de etiqueta no demuestra que se puedan borrar o reutilizar sin riesgo.",
|
||||
"<strong>Modelo</strong>: fabricante y modelo de <code>smartctl -i</code>.",
|
||||
"<strong>Capacidad</strong>: expresada en unidades legibles.",
|
||||
"<strong>Temperatura</strong>: °C actuales, con color según el umbral del tipo de disco; NVMe admite umbrales más altos que SATA.",
|
||||
@@ -84,7 +84,7 @@
|
||||
},
|
||||
"external": {
|
||||
"heading": "Almacenamiento externo (USB)",
|
||||
"body": "Las unidades USB tienen una tarjeta propia, visible cuando hay alguna conectada. Muestra los mismos campos que los discos internos y una etiqueta naranja <strong>USB</strong>. Como suelen conectarse solo para copias o transferencias ocasionales, se conservan sus observaciones, pero los errores de E/S de una unidad USB desconectada no se escalan."
|
||||
"body": "Las unidades USB tienen una tarjeta propia, visible cuando hay alguna conectada. Muestra los mismos campos que los discos internos y una etiqueta naranja <strong>USB</strong>. Como suelen conectarse solo para backups o transferencias ocasionales, se conservan sus observaciones, pero los errores de E/S de una unidad USB desconectada no se escalan."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Diálogo de detalle del disco",
|
||||
@@ -112,14 +112,14 @@
|
||||
"pdfPreviewAlt": "Primera página del informe SMART: resumen ejecutivo con indicador PASSED e información del disco",
|
||||
"pdfPreviewCaption": "Primera página: resumen, indicador PASSED e información completa del disco. El PDF de ejemplo incluye desgaste SSD, todos los atributos SMART e historial de pruebas.",
|
||||
"pdfDownloadLabel": "Descargar informe SMART de ejemplo (PDF)",
|
||||
"pdfSectionsIntro": "El informe tiene seis secciones principales:",
|
||||
"pdfSectionsIntro": "El informe incluye estas secciones principales:",
|
||||
"pdfSections": [
|
||||
"<strong>Resumen ejecutivo</strong>: estado PASSED/FAILED, evaluación clara del disco —correcto, con desgaste o fallando— y cuatro datos: fecha del informe, tipo de última prueba, resultado y atributos comprobados.",
|
||||
"<strong>Información del disco</strong>: modelo, serie, capacidad, tipo HDD/SSD/NVMe, familia, formato, interfaz (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura y umbral óptimo, horas y ciclos de encendido, SMART, sectores pendientes y reasignados y errores CRC.",
|
||||
"<strong>Desgaste y vida útil SSD</strong> (solo SSD/NVMe): indicador de vida restante, atributo de origen, desgaste actual, datos escritos y horas de encendido.",
|
||||
"<strong>Atributos SMART completos</strong>: ID, nombre, valor, peor valor, umbral, valor bruto y estado de cada atributo. Los principales —Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, …— incluyen una explicación breve bajo su fila.",
|
||||
"<strong>Última autoprueba e historial completo</strong>: última prueba con tipo, resultado, mensaje final y horas de encendido en ese momento, más una tabla numerada de todas las pruebas conservadas.",
|
||||
"<strong>Recomendaciones</strong>: acciones según el resultado. Para discos correctos: <em>disco sano / pruebas periódicas / estrategia de copias</em>. Si los atributos salen de rango, incluye indicaciones de sustitución."
|
||||
"<strong>Recomendaciones</strong>: acciones según el resultado. Para discos correctos: <em>disco sano / pruebas periódicas / estrategia de backups</em>. Si los atributos salen de rango, incluye indicaciones de sustitución."
|
||||
],
|
||||
"pdfOutro": "El navegador crea el informe imprimible; Imprimir y Guardar como PDF abren su diálogo de impresión. Elige un nombre como <code>SMART-<short-id>.pdf</code>. Conserva copias fechadas para comparar cambios o compartirlas con el fabricante.",
|
||||
"historyTitle": "Pestaña 3 — Historial",
|
||||
@@ -127,7 +127,7 @@
|
||||
"historyImageCaption": "Historial de pruebas SMART del disco. Cada fila muestra tipo, fecha y hora, antigüedad, marca de última prueba y acciones de descarga de la salida <code>smartctl</code> y eliminación.",
|
||||
"historyIntro": "Pruebas cortas y extendidas completadas y conservadas para el disco. Cada entrada guarda la salida original de <code>smartctl</code> y los campos que Monitor interpreta para el panel. Acciones por fila:",
|
||||
"historyItems": [
|
||||
"<strong>Descargar</strong>: guarda la instantánea JSON con los datos de <code>smartctl -a</code> usados por el informe. Útil si el fabricante necesita los campos de diagnóstico originales.",
|
||||
"<strong>Descargar</strong>: guarda el snapshot JSON de esa prueba (salida de <code>smartctl -a --json</code>, o <code>nvme smart-log</code> en NVMe cuando falla smartctl). Útil si el fabricante necesita los campos de diagnóstico originales.",
|
||||
"<strong>Eliminar</strong>: borra una prueba del historial manualmente. La retención de Programación (<em>últimas 5 / 10 / 20</em>) elimina automáticamente las más antiguas."
|
||||
],
|
||||
"scheduleTitle": "Pestaña 4 — Programación",
|
||||
@@ -160,7 +160,7 @@
|
||||
"tempWhyTitle": "Por qué importa el historial",
|
||||
"tempWhyItems": [
|
||||
"<strong>Detectar tendencias.</strong> Una lectura aislada no revela que un disco lleva semanas calentándose, por ejemplo por fallos de ventilación, polvo o calor cercano. Las vistas de 7 y 30 días permiten ver la evolución.",
|
||||
"<strong>Relacionar picos.</strong> Si una copia de seguridad o reconstrucción elevó brevemente la temperatura por encima del umbral, las vistas de 1 y 24 horas muestran si fue puntual o recurrente.",
|
||||
"<strong>Relacionar picos.</strong> Si un backup o una reconstrucción elevó brevemente la temperatura por encima del umbral, las vistas de 1 y 24 horas muestran si fue puntual o recurrente.",
|
||||
"<strong>Ajustar umbrales.</strong> Antes de cambiarlos en <em>Ajustes → Umbrales de Health Monitor</em>, consulta el gráfico de 30 días para conocer el rango real de funcionamiento del disco."
|
||||
],
|
||||
"obsTitle": "Historial de observaciones en las pestañas",
|
||||
@@ -184,7 +184,7 @@
|
||||
],
|
||||
"obsDedupTitle": "Agrupación de duplicados y repetición de avisos",
|
||||
"obsDedupBody1": "Las observaciones se agrupan por <strong>firma</strong>, una huella estable del tipo de error, dispositivo y campos clave del mensaje. Las repeticiones aumentan <code>occurrence_count</code> en la fila existente. Una <strong>firma distinta</strong> crea otra observación y cuenta como evento nuevo para las notificaciones.",
|
||||
"obsDedupBody2": "Para evitar avisos en cascada, la primera combinación de disco, firma y gravedad notifica al operador. La misma combinación no vuelve a avisar hasta pasadas 24 horas, aunque aumente el contador. Un cambio de WARNING a CRITICAL interrumpe esa espera y avisa del empeoramiento.",
|
||||
"obsDedupBody2": "Para evitar avisos en cascada, la primera combinación de disco, firma y gravedad notifica al usuario. La misma combinación no vuelve a avisar hasta pasadas 24 horas, aunque aumente el contador. Un cambio de WARNING a CRITICAL interrumpe esa espera y avisa del empeoramiento.",
|
||||
"obsDismissTitle": "Historial permanente y errores activos",
|
||||
"obsDismissBody1": "Las observaciones no se pueden descartar, ocultar ni borrar. Cada firma tiene una tarjeta; si se repite, aumenta el contador y actualiza la última fecha. El historial sigue al número de serie: otro disco empieza vacío aunque use el mismo puerto, y un cambio de nombre del kernel no pierde el historial.",
|
||||
"obsDismissBody2": "Resolver o descartar un error activo en Health Monitor no modifica sus observaciones. Se conservan después de la resolución automática, de modo que un aviso transitorio de la semana pasada siga visible hoy. Consulta <link>Health Monitor</link> para gestionar los errores activos."
|
||||
@@ -218,7 +218,7 @@
|
||||
{
|
||||
"section": "Historial de autopruebas SMART",
|
||||
"endpoint": "/api/storage/smart/<disk>/history",
|
||||
"source": "Se guarda en <code>/usr/local/share/proxmenux/smart/<disk>/</code> como instantáneas JSON."
|
||||
"source": "Se guarda en <code>/usr/local/share/proxmenux/smart/<disk>/</code> como snapshots JSON."
|
||||
},
|
||||
{
|
||||
"section": "Observaciones permanentes",
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"<strong>Entradas totales</strong>: número de registros dentro del intervalo del filtro activo.",
|
||||
"<strong>Errores</strong>: número de entradas con severidad ≤ 3 (<code>err</code> / <code>crit</code> / <code>alert</code> / <code>emerg</code>).",
|
||||
"<strong>Advertencias</strong>: número de entradas con severidad 4 (<code>warning</code>).",
|
||||
"<strong>Copias de seguridad</strong>: número de entradas de tareas vzdump / PBS en el mismo intervalo."
|
||||
"<strong>Backups</strong>: número de entradas de tareas vzdump / PBS en el mismo intervalo."
|
||||
]
|
||||
},
|
||||
"subtabs": {
|
||||
@@ -49,7 +49,7 @@
|
||||
],
|
||||
"maxLevelStoreTitle": "MaxLevelStore de journald",
|
||||
"maxLevelStoreBody": "En una instalación nueva de Proxmox, journald usa por defecto <code>MaxLevelStore=warning</code>, que descarta los mensajes info. Monitor lo detecta al arrancar y añade un archivo de configuración complementario (<code>/etc/systemd/journald.conf.d/proxmenux-loglevel.conf</code>) con el umbral <code>info</code> para conservar los mensajes informativos y los de mayor gravedad. Esto no incluye debug.",
|
||||
"backupsTitle": "Copias de seguridad",
|
||||
"backupsTitle": "Backups",
|
||||
"backupsBody": "Historial de tareas de Proxmox filtrado a las entradas relacionadas con backup. Una fila por tarea (<code>vzdump</code>, transferencias PBS, Garbage Collect, Verify) con el estado (OK / WARNINGS / ERROR), el guest implicado, el almacenamiento de origen, la duración y el UPID. Pulsa una fila para cargar el log completo de la tarea vía <code>GET /api/task-log/<upid></code> — los mismos datos que Proxmox expone a través de <em>Datacenter → Tasks</em>, acotado a backups.",
|
||||
"notificationsTitle": "Notificaciones",
|
||||
"notificationsBody1": "Todas las notificaciones enviadas por Monitor: Telegram, Discord, correo electrónico, Gotify, ntfy, Slack, Teams y webhook. Cada fila muestra fecha y hora, canal, tipo de evento, severidad, título y cuerpo generados y, si la IA está activa, un selector para comparar su reescritura con el original.",
|
||||
@@ -72,12 +72,12 @@
|
||||
"source": "La misma consulta, devuelta como texto plano para grep / less."
|
||||
},
|
||||
{
|
||||
"subtab": "Copias de seguridad",
|
||||
"subtab": "Backups",
|
||||
"endpoint": "/api/backups",
|
||||
"source": "Historial de tareas PVE filtrado por <code>vzdump</code>, transferencias PBS, Garbage Collect, Verify."
|
||||
},
|
||||
{
|
||||
"subtab": "Detalles de una tarea de copia de seguridad",
|
||||
"subtab": "Detalles de una tarea de backup",
|
||||
"endpoint": "/api/task-log/<upid>",
|
||||
"source": "Log completo de la tarea en texto plano leído de <code>/var/log/pve/tasks/<index>/<upid></code>."
|
||||
},
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
"<strong>Paquetes del SO</strong> para contenedores Debian, Ubuntu y Alpine.",
|
||||
"Una sección por cada <strong>aplicación registrada</strong>, incluidos los registros que solo contienen enlaces.",
|
||||
"Una sección <strong>Docker</strong> cuando Docker está registrado, con Docker Engine y las imágenes etiquetadas dentro del mismo bloque.",
|
||||
"Una <strong>Actualización en bloque</strong> configurable, seguida de las opciones de copia, reinicio y programación."
|
||||
"Una <strong>Actualización en bloque</strong> configurable, seguida de las opciones de backup, reinicio y programación."
|
||||
]
|
||||
},
|
||||
"mechanisms": {
|
||||
"heading": "Cómo se selecciona el método",
|
||||
"lead": "La vía integrada de Proxmox VE Helper-Scripts sigue el mecanismo oficial <helper>update-apps</helper>. El resto de instalaciones usa el método de paquetes, Docker o el comando personalizado correspondiente.",
|
||||
"officialReference": "Referencia oficial: la <helper>documentación de update-apps de Proxmox VE Helper-Scripts</helper> explica los modos interactivo y desatendido, las copias de seguridad, la simulación, los recursos temporales de compilación, los registros y los códigos de salida.",
|
||||
"officialReference": "Referencia oficial: la <helper>documentación de update-apps de Proxmox VE Helper-Scripts</helper> explica los modos interactivo y desatendido, los backups, la simulación, los recursos temporales de compilación, los registros y los códigos de salida.",
|
||||
"colSource": "Origen",
|
||||
"colAction": "Acción mostrada",
|
||||
"colNotes": "Qué se ejecuta",
|
||||
@@ -126,10 +126,10 @@
|
||||
"callout": "La actualización en bloque no reemplaza los botones individuales. Es un acceso opcional para una selección que debe ejecutarse junta."
|
||||
},
|
||||
"options": {
|
||||
"heading": "Opciones de copia y reinicio",
|
||||
"heading": "Opciones de backup y reinicio",
|
||||
"lead": "Las mismas opciones se aplican a ejecuciones manuales, en bloque y programadas:",
|
||||
"items": [
|
||||
"<strong>Instantánea antes de aplicar</strong> crea una copia vzdump en el almacenamiento seleccionado. Si la copia solicitada falla, la actualización no comienza.",
|
||||
"<strong>Backup antes de aplicar</strong> crea un backup vzdump en el almacenamiento seleccionado. Si el backup solicitado falla, la actualización no comienza.",
|
||||
"<strong>Reiniciar después de aplicar</strong> reinicia el LXC únicamente tras una ejecución correcta.",
|
||||
"Las selecciones se guardan por LXC y son independientes de la lista de objetivos."
|
||||
]
|
||||
@@ -196,8 +196,8 @@
|
||||
"caption": "La sección del sistema operativo mantiene los paquetes separados de las acciones de aplicaciones y Docker."
|
||||
},
|
||||
"options": {
|
||||
"alt": "Opciones de actualización LXC con copia previa y reinicio posterior",
|
||||
"caption": "Las preferencias de copia y reinicio se aplican a ejecuciones manuales, en bloque y programadas."
|
||||
"alt": "Opciones de actualización LXC con backup previo y reinicio posterior",
|
||||
"caption": "Las preferencias de backup y reinicio se aplican a ejecuciones manuales, en bloque y programadas."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: VMs y LXCs | Documentación de ProxMenux",
|
||||
"description": "Inventario de todos los invitados con CPU, memoria y disco en vivo. Los detalles incluyen configuración, recursos, copias de seguridad, resultados recientes del log Proxmox, notas y controles Iniciar / Apagar / Reiniciar / Forzar parada."
|
||||
"description": "Inventario de todos los invitados con CPU, memoria y disco en vivo. Los detalles incluyen configuración, recursos, backups, el log de consola de los contenedores OCI, notas y controles Iniciar / Apagar / Reiniciar / Forzar parada."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: VMs y LXCs",
|
||||
"description": "Inventario completo de invitados del nodo: cuatro métricas arriba, lista ordenable de VM y LXC abajo y detalles por invitado con configuración, recursos, copias, logs y cuatro controles de ciclo de vida (Iniciar / Apagar / Reiniciar / Forzar parada).",
|
||||
"description": "Inventario completo de invitados del nodo: cuatro métricas arriba, lista ordenable de VM y LXC abajo y detalles por invitado con configuración, recursos, backups, el log de consola de los contenedores OCI y cuatro controles de ciclo de vida (Iniciar / Apagar / Reiniciar / Forzar parada).",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Controles de los invitados",
|
||||
"body": "Controla el ciclo de vida de los invitados desde esta pestaña. Las acciones pasan por <code>POST /api/vms/<vmid>/control</code> con confirmación explícita y actualizan la fila del invitado. El apagado forzado requiere el botón específico Forzar parada."
|
||||
"body": "Controla el ciclo de vida de los invitados desde esta pestaña. Las acciones pasan por <code>POST /api/vms/<vmid>/control</code>; Reiniciar y Forzar parada piden escribir el VMID para confirmar, y la respuesta se refleja en la fila del invitado. El apagado forzado requiere el botón específico Forzar parada."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Fila superior: cuatro tarjetas de estadísticas",
|
||||
@@ -108,16 +108,16 @@
|
||||
"mountsCalloutBody": "Una vista veraz y consciente de la capacidad de cada sitio donde el contenedor lee o escribe. Shares NFS o CIFS montados desde dentro del CT — invisibles para la UI web de Proxmox — aparecen aquí con el mismo aspecto y la misma sonda de salud que cualquier mount point configurado. Mounts remotos stale y zombie binds salen marcados antes de que muerdan durante un backup.",
|
||||
"logsTitle": "Pestaña 5 — Logs (solo contenedores OCI)",
|
||||
"logsBody": "Solo para contenedores de OCI manager Apps. Muestra la consola del proceso principal de la imagen, guardada en <code>/var/log/proxmenux/oci/VMID.console.log</code>: últimas 100, 500 o 1000 líneas, seguimiento en vivo mientras está activo, filtro y descarga. Relee el archivo al abrir y funciona detenido. Más en <ociLink>Contenedores OCI en ProxMenux Monitor</ociLink>.",
|
||||
"backupsTitle": "Pestaña 6 — Copias de seguridad",
|
||||
"backupsTitle": "Pestaña 6 — Backups",
|
||||
"backupsImageAlt": "Modal de vista en detalle por guest — pestaña Backups con la lista de backups disponibles, etiqueta de destino, tamaños y el botón Create Backup",
|
||||
"backupsImageCaption": "Todas las copias del invitado en almacenamientos Proxmox configurados, de más nueva a más antigua. La cabecera muestra su número.",
|
||||
"backupsIntro": "Lista las copias del invitado en almacenamientos Proxmox, empezando por la más reciente. El contador del título permite comprobar si tiene copias. Cada fila muestra:",
|
||||
"backupsImageCaption": "Todos los backups del invitado en almacenamientos Proxmox configurados, de más nueva a más antigua. La cabecera muestra su número.",
|
||||
"backupsIntro": "Lista los backups del invitado en almacenamientos Proxmox, empezando por la más reciente. El contador del título permite comprobar si tiene backups. Cada fila muestra:",
|
||||
"backupsItems": [
|
||||
"<strong>Fecha y hora</strong>: momento de la ejecución.",
|
||||
"<strong>Etiqueta de destino</strong> — el almacenamiento donde vive (PBS-Cloud, PBS-Local, NFS-Backup, …) coloreada por estado.",
|
||||
"<strong>Tamaño</strong>: tamaño final en disco de la copia."
|
||||
"<strong>Tamaño</strong>: tamaño final en disco del backup."
|
||||
],
|
||||
"backupsOutro": "<strong>+ Crear copia</strong> inicia una copia en el almacenamiento marcado «Backup target» en Proxmox. Para restaurar usa la interfaz web de Proxmox; Monitor muestra las copias recientes del invitado y permite crearlas.",
|
||||
"backupsOutro": "<strong>+ Crear backup</strong> inicia un backup en el almacenamiento marcado «Backup target» en Proxmox. Para restaurar usa la interfaz web de Proxmox; Monitor muestra los backups recientes del invitado y permite crearlos.",
|
||||
"firewallTitle": "Pestaña 7 — Cortafuegos",
|
||||
"firewallIntro": "Lee el registro del cortafuegos de cada invitado directamente del host, sin servicio extra ni consultas periódicas. La pestaña siempre aparece; el contenido depende de que el cortafuegos esté activado y de que alguna regla registre paquetes.",
|
||||
"firewallItems": [
|
||||
@@ -186,9 +186,9 @@
|
||||
"source": "Datos RRD de PVE (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) condensados a una forma amigable para gráficas."
|
||||
},
|
||||
{
|
||||
"section": "Resultados recientes del log Proxmox",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "<code>pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000</code>. Si el comando falla devuelve una lista vacía; no proporciona todos los logs internos del invitado."
|
||||
"section": "Log de consola OCI (pestaña Logs)",
|
||||
"endpoint": "/api/lxc/<vmid>/console-log",
|
||||
"source": "Salida de consola del proceso principal de la imagen, leída de <code>/var/log/proxmenux/oci/<vmid>.console.log</code> en el host. Solo para contenedores OCI."
|
||||
},
|
||||
{
|
||||
"section": "Backups disponibles para el guest",
|
||||
@@ -227,7 +227,7 @@
|
||||
{
|
||||
"label": "Referencia de la API",
|
||||
"href": "/docs/monitor/api",
|
||||
"tailRich": " — endpoints de VM y copias de seguridad."
|
||||
"tailRich": " — endpoints de VM y backups."
|
||||
},
|
||||
{
|
||||
"label": "Índice del panel",
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
{
|
||||
"category": "Almacenamiento",
|
||||
"checks": "Almacenamientos Proxmox, sistema de archivos raíz",
|
||||
"events": "Uso de espacio por encima de los umbrales configurados en la raíz u otros sistemas de archivos supervisados (85% aviso / 95% crítico por defecto); exportación NFS desconectada; fallo de autenticación CIFS; pool LVM-thin lleno."
|
||||
"events": "Uso de espacio por encima de los umbrales configurados en la raíz u otros sistemas de archivos supervisados (85% aviso / 95% crítico por defecto); almacenamientos PVE no disponibles; montajes NFS/CIFS bloqueados o en solo lectura inesperada; LVM-thin y otros almacenamientos de pool que superan los mismos umbrales."
|
||||
},
|
||||
{
|
||||
"category": "Discos y SMART",
|
||||
@@ -98,7 +98,7 @@
|
||||
{
|
||||
"category": "Actualizaciones del sistema",
|
||||
"checks": "Actualizaciones pendientes, actualizaciones de seguridad, kernel / versión de PVE, antigüedad del sistema",
|
||||
"events": "Actualizaciones pendientes de seguridad o del kernel en uso; sistema sin actualizar desde hace mucho tiempo. Si hay actualizaciones, la cabecera de Vista general muestra <em>Actualizar ahora</em>. Ejecuta todo el proceso de actualización de ProxMenux; al cerrarlo, consulta el estado con <code>?refresh=1</code> para actualizar el indicador sin esperar al próximo ciclo."
|
||||
"events": "Actualizaciones pendientes de seguridad o del kernel en uso; sistema sin actualizar desde hace mucho tiempo. Si hay actualizaciones, la categoría Actualizaciones de la ventana de estado de salud muestra <em>Actualizar ahora</em>. Ejecuta todo el proceso de actualización de ProxMenux; al cerrarlo, consulta el estado con <code>?refresh=1</code> para actualizar el indicador sin esperar al próximo ciclo."
|
||||
},
|
||||
{
|
||||
"category": "Seguridad y Certificados",
|
||||
@@ -158,7 +158,7 @@
|
||||
},
|
||||
"dismiss": {
|
||||
"heading": "Hacer dismiss de alertas y la Suppression Duration",
|
||||
"intro": "Algunos eventos son ruidosos por naturaleza — un <em>System Updates: actualizaciones pendientes disponibles</em> permanece cierto hasta que parches el host, y no quieres una notificación cada cinco minutos durante una semana. El botón <em>Update Now</em> de la cabecera de Overview es el atajo directo para resolver ese caso concreto en sitio; para todo lo demás, o cuando el parche se aplaza, el Monitor de salud ofrece además dos mecanismos de silenciamiento acoplados:",
|
||||
"intro": "Algunos eventos son ruidosos por naturaleza: <em>System Updates: actualizaciones pendientes disponibles</em> sigue activo hasta que actualices el host, y no quieres una notificación cada cinco minutos durante una semana. El botón <em>Actualizar ahora</em> de la categoría Actualizaciones de la ventana de estado de salud resuelve ese caso en el sitio; para todo lo demás, o si aplazas la actualización, el Monitor de salud ofrece además dos mecanismos de silenciado relacionados:",
|
||||
"step1": "<strong>Descartar un evento</strong> desde su ventana. El botón ofrece <strong>24 horas</strong>, <strong>7 días</strong> o <strong>Permanentemente</strong>, independientemente del valor de la categoría. Envía <code>POST /api/health/acknowledge</code> con el <code>error_key</code> y las <code>suppression_hours</code> elegidas (<code>-1</code> para permanente). El evento pasa a Descartados con su fecha <code>acknowledged_at</code>.",
|
||||
"dropdownImageAlt": "Menú para descartar una alerta: 24 horas, 7 días o permanentemente",
|
||||
"dropdownImageCaption": "La duración elegida se aplica solo a esta alerta; sin una elección individual, se usa el valor de la categoría. Los descartes permanentes llevan una etiqueta ámbar <em>Permanente</em> y normalmente no reaparecen. La excepción de temperatura crítica de CPU se explica más abajo.",
|
||||
@@ -187,7 +187,7 @@
|
||||
},
|
||||
{
|
||||
"finding": "Pool ZFS DEGRADED / FAULTED",
|
||||
"why": "Las comprobaciones de capacidad del pool ZFS permiten descartarse. Otros hallazgos del pool siguen su propio indicador. Confirmar no repara un pool degradado o averiado."
|
||||
"why": "Los hallazgos de estado del pool ZFS (DEGRADED, FAULTED, UNAVAIL) permiten descartarse, igual que las comprobaciones de capacidad del pool. Confirmar no repara un pool degradado o averiado."
|
||||
},
|
||||
{
|
||||
"finding": "Errores I/O de disco con SMART FAILED",
|
||||
@@ -289,7 +289,7 @@
|
||||
},
|
||||
"rest": {
|
||||
"heading": "Endpoints REST",
|
||||
"intro": "Las acciones de la ventana están disponibles por API para scripts, paneles o bots. Con la autenticación del Monitor activada, las llamadas necesitan un token Bearer válido, obtenido al iniciar sesión o en la pantalla de tokens API. Los cambios, como confirmar alertas, guardar ajustes o limpiar errores huérfanos, exigen full_admin; read_only recibe 403. Si la autenticación está desactivada o se rechazó, estos controles permiten acceder sin token.",
|
||||
"intro": "Las acciones de la ventana están disponibles por API para scripts, paneles o bots. Las llamadas necesitan un token Bearer válido, obtenido al iniciar sesión o en la pantalla de tokens API. Los cambios, como confirmar alertas, guardar ajustes o limpiar errores huérfanos, exigen full_admin; read_only recibe 403.",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerMethod": "Método",
|
||||
"headerUse": "Uso",
|
||||
@@ -297,7 +297,7 @@
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Comprobación ligera que devuelve JSON con <code>status</code>, <code>timestamp</code> y <code>version</code>. Sirve para comprobar palabras clave con Uptime Kuma; si la autenticación del Monitor está activa, el cliente debe enviar una cabecera Bearer."
|
||||
"use": "Comprobación ligera que devuelve JSON con <code>status</code>, <code>timestamp</code> y <code>version</code>. Sirve para comprobar palabras clave con Uptime Kuma; el cliente debe enviar una cabecera Bearer."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"description": "Shell del host y acceso a consolas VM/CT compatibles en el navegador mediante <code>xterm.js</code> y WebSockets. Sigue el modo de autenticación configurado: si está desactivada o rechazada, los clientes con acceso de red pueden abrir sesiones sin iniciar sesión. No implica auditoría de cada comando."
|
||||
"description": "Shell del host y acceso a consolas VM/CT compatibles en el navegador mediante <code>xterm.js</code> y WebSockets. Las sesiones no se auditan comando a comando."
|
||||
},
|
||||
{
|
||||
"name": "Seguridad",
|
||||
@@ -114,7 +114,7 @@
|
||||
"heading": "API REST e integraciones",
|
||||
"intro": "Los endpoints REST ofrecen datos de monitorización JSON por HTTP/HTTPS para widgets Homepage, sensores Home Assistant, pruebas Uptime Kuma y scripts. Grafana puede usar el exportador de texto Prometheus en <code>/api/prometheus</code>. Las peticiones se pueden hacer con <code>curl</code>.",
|
||||
"tokens": "Los tokens API de larga duración (365 días) se generan en <strong>Configuración → Tokens de acceso API</strong> o mediante <code>POST /api/auth/generate-api-token</code>.",
|
||||
"bearer": "Envía tokens con <code>Authorization: Bearer …</code>. El endpoint público <code>/api/health</code> permite pruebas de disponibilidad sin credenciales. Bajo <code>/api/auth/*</code> hay rutas públicas de configuración/inicio/estado y rutas protegidas de cuentas y tokens; no todas son anónimas.",
|
||||
"bearer": "Envía tokens con <code>Authorization: Bearer …</code>. <code>/api/health</code> también espera la cabecera Bearer, así que las pruebas de disponibilidad necesitan un token read_only. Bajo <code>/api/auth/*</code> hay rutas públicas de configuración/inicio/estado y rutas protegidas de cuentas y tokens; no todas son anónimas.",
|
||||
"catalog": "El catálogo de endpoints, rotación de tokens y prácticas de seguridad están en <linkApi>Referencia de la API</linkApi>. Los ejemplos para Homepage, Home Assistant, Grafana, Uptime Kuma y cURL están en <linkIntegrations>Integraciones</linkIntegrations>."
|
||||
},
|
||||
"serviceControl": {
|
||||
|
||||
@@ -220,11 +220,11 @@
|
||||
"heading": "n8n, Zapier y scripts propios",
|
||||
"intro": "Las herramientas de workflow y scripts pueden <em>enviar</em> notificaciones con un POST a <code>/api/notifications/send</code>, por ejemplo por un fallo de CI o un trabajo cron demasiado largo. Es un envío directo: omite la cola y la espera entre huellas de eventos. Conserva el formato por canal, la IA opcional y la entrega a los canales configurados. Controla los duplicados desde quien llama.",
|
||||
"n8nBody": "En n8n, usa un nodo <em>HTTP Request</em> con POST, la URL anterior y el mismo JSON que curl. Elige credenciales genéricas Header Auth: nombre <em>Authorization</em> y valor <code>Bearer YOUR_API_TOKEN</code>, sustituyendo el marcador. Conecta una programación, webhook u otro nodo para disparar la petición.",
|
||||
"severityBody": "La gravedad usa <code>INFO</code>, <code>WARNING</code> o <code>CRITICAL</code> en mayúsculas. El objeto <code>data</code> aporta contexto. La IA usa el título y mensaje renderizados más el enriquecimiento admitido; no se garantiza que todos los campos entren en el prompt o la salida. Consulta <link>Notificaciones → Catálogo de eventos</link>."
|
||||
"severityBody": "La gravedad usa <code>INFO</code>, <code>WARNING</code> o <code>CRITICAL</code> en mayúsculas. El objeto <code>data</code> aporta contexto del evento y campos de plantilla. En este endpoint, la IA solo recibe el título y el mensaje; los campos de <code>data</code> no se envían al proveedor. Consulta <link>Notificaciones → Catálogo de eventos</link>."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Webhook nativo de Proxmox VE (entrante)",
|
||||
"intro1": "El sistema de notificaciones llegó en PVE 8.1; los destinos webhook nativos requieren Proxmox VE 8.3 o posterior. <em>Activar notificaciones</em> en Ajustes intenta registrar el Monitor como destino. Los avisos que PVE enruta allí, como informes de copias o replicación, entran en su flujo de envío. El alta depende de que la configuración esté disponible y permita escritura.",
|
||||
"intro1": "El sistema de notificaciones llegó en PVE 8.1; los destinos webhook nativos requieren Proxmox VE 8.3 o posterior. <em>Activar notificaciones</em> en Ajustes intenta registrar el Monitor como destino. Los avisos que PVE enruta allí, como informes de backups o replicación, entran en su flujo de envío. El alta depende de que la configuración esté disponible y permita escritura.",
|
||||
"intro2": "La mecánica, la plantilla de body que PVE envía, las entradas escritas en <code>/etc/pve/notifications.cfg</code> y el comportamiento en clusters están documentados en <link>Notifications → Integración del webhook de PVE</link>."
|
||||
},
|
||||
"whereNext": {
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
"heading": "Configuración de los canales",
|
||||
"intro": "Actualmente se admiten seis canales: Telegram, Discord, Gotify, Email (SMTP), Pushover y Apprise. Los cinco primeros son integraciones nativas con sus propios campos de configuración. Apprise funciona como un concentrador genérico que añade unos 80 servicios adicionales (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost…) mediante una única URL. Todos están documentados paso a paso a continuación.",
|
||||
"credsTitle": "Dónde se guardan las credenciales",
|
||||
"credsBody": "Los tokens, las claves, las URL de webhook y las contraseñas SMTP se guardan localmente en la base de datos SQLite del Monitor dentro de <code>/usr/local/share/proxmenux/</code>. Los valores sensibles están protegidos y se ocultan en la interfaz. Solo salen del host para comunicarse con el servicio correspondiente. Una copia de ese directorio permite recuperar los canales configurados."
|
||||
"credsBody": "Los tokens, las claves, las URL de webhook y las contraseñas SMTP se guardan localmente en la base de datos SQLite del Monitor dentro de <code>/usr/local/share/proxmenux/</code>. Los valores sensibles están protegidos y se ocultan en la interfaz. Solo salen del host para comunicarse con el servicio correspondiente. Un backup de ese directorio permite recuperar los canales configurados."
|
||||
},
|
||||
"telegram": {
|
||||
"heading": "Telegram",
|
||||
@@ -120,7 +120,7 @@
|
||||
"Añade el bot al grupo como miembro (y hazlo admin si el grupo lo requiere para publicar).",
|
||||
"Envía cualquier mensaje en el grupo.",
|
||||
"Abre <code>https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates</code> en un navegador. Busca <code>chat.id</code> en la respuesta JSON — para grupos es un número negativo, para supergrupos empieza con <code>-100</code>.",
|
||||
"En supergrupos con <em>Temas</em>, anota el <code>message_thread_id</code> de destino e introdúcelo en el campo opcional <em>ID del tema</em>."
|
||||
"En supergrupos con <em>Temas</em>, anota el <code>message_thread_id</code> de destino e introdúcelo en el campo opcional <em>ID de tema</em>."
|
||||
],
|
||||
"groupAlt": "Formulario de canal Telegram con Bot Token (enmascarado), Chat ID negativo prefijado con -100 indicando un supergrupo, y Topic ID 3 configurado para entregar a un tema específico",
|
||||
"groupCaption": "Supergrupo — el Chat ID empieza con <code>-100…</code> y el <em>Topic ID</em> opcional apunta a un hilo específico.",
|
||||
@@ -171,7 +171,7 @@
|
||||
"Abre <a>account.microsoft.com/security</a> y activa la verificación en dos pasos.",
|
||||
"Si tu cuenta ofrece <em>Opciones avanzadas de seguridad</em> → <em>Contraseñas de aplicación</em>, elige <em>Crear una contraseña de aplicación</em>. Eso no garantiza que el correo admita autenticación SMTP con contraseña.",
|
||||
"Si Microsoft genera la contraseña, cópiala y comprueba que tu servicio SMTP la acepte.",
|
||||
"Solo si el proveedor admite SMTP con contraseña, usa sus ajustes autorizados: <em>Servidor</em> <code>smtp.office365.com</code> para Exchange Online, <em>Puerto</em> <code>587</code>, <em>Modo TLS</em> <code>STARTTLS</code>, <em>Usuario</em> tu dirección y <em>Contraseña</em> la credencial permitida. Outlook.com personal usa requisitos y ajustes distintos; no presupongas que estas credenciales funcionen."
|
||||
"Solo si el proveedor admite SMTP con contraseña, usa sus ajustes autorizados: <em>servidor SMTP</em> <code>smtp.office365.com</code> para Exchange Online, <em>Puerto</em> <code>587</code>, <em>modo TLS</em> <code>STARTTLS</code>, <em>Nombre de usuario</em> tu dirección y <em>Contraseña</em> la credencial permitida. Outlook.com personal usa requisitos y ajustes distintos; no presupongas que estas credenciales funcionen."
|
||||
],
|
||||
"relayTitle": "Relay SMTP autoalojado",
|
||||
"relayBody": "Usa un relay SMTP que controles, como Postfix. El relay gestiona la autenticación hacia el proveedor. Configura la autenticación y TLS de Monitor según lo que exija el relay; que sea local no desactiva el cifrado."
|
||||
@@ -215,7 +215,7 @@
|
||||
"rich": {
|
||||
"heading": "Mensajes enriquecidos, categorías y filtros por canal",
|
||||
"intro": "Cada canal tiene tres controles: <em>Mensajes enriquecidos</em> arriba, once secciones de <em>Categorías de notificación</em> con interruptores por evento y <em>Enviar prueba</em> abajo.",
|
||||
"imageAlt": "Categorías con Mensajes enriquecidos destacado, secciones de VM/CT, copias, recursos, almacenamiento, red, seguridad, clúster, servicios, salud y actualizaciones, con interruptores y contadores, y botón Enviar prueba",
|
||||
"imageAlt": "Categorías con Mensajes enriquecidos destacado, secciones de VM/CT, backups, recursos, almacenamiento, red, seguridad, clúster, servicios, salud y actualizaciones, con interruptores y contadores, y botón Enviar prueba",
|
||||
"imageCaption": "La flecha señala <em>Mensajes enriquecidos</em>. Debajo están las once categorías desplegables con controles por evento. <em>Enviar prueba</em> está al final.",
|
||||
"richTitle": "Mensajes enriquecidos",
|
||||
"richIntro": "Con <em>Mensajes enriquecidos</em>, cada aviso lleva un emoji de categoría y formato nativo del canal, como HTML en Telegram o tarjetas coloreadas en Discord. Desactivado, se envía el mismo contenido en texto simple:",
|
||||
@@ -228,7 +228,7 @@
|
||||
"<strong>Control de categoría por canal.</strong> Por ejemplo, desactivar VM/CT suprime <code>vm_start</code> y sus equivalentes para ese canal. Se guarda como <code><channel>.events.<group></code>.",
|
||||
"<strong>Control de evento por canal.</strong> En una categoría activa puedes elegir <em>enviar <code>backup_complete</code> a Discord pero no a Telegram</em>. Se guarda como <code><channel>.event.<event_type></code>."
|
||||
],
|
||||
"togglesOutro": "Cada categoría indica los eventos <em>activados</em> frente al <em>total</em> y permite activar o desactivar el grupo completo con un clic, por ejemplo copias <code>info</code> o avisos de actualización, sin abrirlo."
|
||||
"togglesOutro": "Cada categoría indica los eventos <em>activados</em> frente al <em>total</em> y permite activar o desactivar el grupo completo con un clic, por ejemplo backups <code>info</code> o avisos de actualización, sin abrirlo."
|
||||
},
|
||||
"quiet": {
|
||||
"heading": "Horas de silencio",
|
||||
@@ -255,7 +255,7 @@
|
||||
},
|
||||
"digest": {
|
||||
"heading": "Resumen diario de eventos INFO",
|
||||
"intro1": "El resumen diario es una opción <strong>que activas expresamente</strong>: agrupa avisos INFO aptos, como actualizaciones disponibles, a las 09:00 o a la hora elegida. Los resultados de copias y replicación y las acciones en directo están excluidos. Las horas de silencio aplazan los avisos no críticos durante un intervalo.",
|
||||
"intro1": "El resumen diario es una opción <strong>que activas expresamente</strong>: agrupa avisos INFO aptos, como actualizaciones disponibles, a las 09:00 o a la hora elegida. Los resultados de backups y replicación y las acciones en directo están excluidos. Las horas de silencio aplazan los avisos no críticos durante un intervalo.",
|
||||
"intro2": "Está debajo de las horas de silencio en la misma tarjeta; consulta la figura en <link>Horas de silencio</link>. Ambos se activan por separado.",
|
||||
"purposeTitle": "Para qué sirve",
|
||||
"purposeItems": [
|
||||
@@ -266,7 +266,7 @@
|
||||
"howItems": [
|
||||
"<strong>Activación por canal.</strong> Desactivado por defecto. Actívalo solo donde quieras resúmenes y deja los otros canales con avisos directos.",
|
||||
"<strong>Hora de entrega</strong> en tu zona horaria local. Por defecto 09:00 pero puedes elegir cualquier hora; el dispatcher dispara el digest dentro de ~60 s de ese minuto.",
|
||||
"<strong>Incluye:</strong> eventos generales aptos de nivel <strong>INFO</strong>, como <em>actualización de aplicación disponible</em>, <em>actualización de Tailscale disponible</em>, <em>actualización de optimización de ProxMenux disponible</em>, <em>actualizaciones de seguridad APT pendientes</em> y <em>aviso de límite de envíos</em>. Los resultados de copias y otras acciones excluidas siguen en directo.",
|
||||
"<strong>Incluye:</strong> eventos generales aptos de nivel <strong>INFO</strong>, como <em>actualización de aplicación disponible</em>, <em>actualización de Tailscale disponible</em>, <em>actualización de optimización de ProxMenux disponible</em> y <em>actualizaciones de seguridad APT pendientes</em>. Los resultados de backups y otras acciones excluidas siguen en directo.",
|
||||
"<strong>Qué nunca se retrasa:</strong>",
|
||||
"<strong>Persistencia.</strong> Los pendientes se guardan en SQLite, tabla <code>digest_pending</code>, hasta la hora elegida y sobreviven a reinicios.",
|
||||
"<strong>Sin eventos, sin resumen.</strong> Si no hay avisos INFO pendientes, no se envía ningún resumen vacío."
|
||||
@@ -274,7 +274,7 @@
|
||||
"neverDelayedSub": [
|
||||
"Los eventos <strong>CRITICAL</strong> siempre pasan inmediatamente.",
|
||||
"Los eventos <strong>WARNING</strong> siempre pasan inmediatamente.",
|
||||
"Las acciones de VM/CT, sus fallos, inicio y resultados de copias, resultados de replicación y apagado o reinicio del host evitan el resumen incluso con nivel INFO. Las horas de silencio sí pueden retrasarlas si no son críticas."
|
||||
"Las acciones de VM/CT, sus fallos, inicio y resultados de backups, resultados de replicación y apagado o reinicio del host evitan el resumen incluso con nivel INFO. Las horas de silencio sí pueden retrasarlas si no son críticas."
|
||||
],
|
||||
"comboTitle": "Combinar horas de silencio y resumen diario",
|
||||
"comboBody": "Puedes activar <em>ambos</em>: silencio de 22:00 a 07:00 y resumen a 09:00. Los avisos no críticos del intervalo se liberan en el resumen de 07:00; los INFO aptos de fuera van al resumen diario. CRITICAL evita ambos; WARNING evita el diario, pero espera durante el silencio. Elige un <em>intervalo sin avisos</em>, un <em>resumen a hora fija</em> o ambos."
|
||||
@@ -300,8 +300,8 @@
|
||||
},
|
||||
{
|
||||
"stage": "Intervalo de repetición",
|
||||
"what": "Tras un envío correcto se suprimen huellas repetidas y se guarda el estado en <code>notification_last_sent</code>. Las bases de <code>CRITICAL</code>, <code>WARNING</code> e <code>INFO</code> son 86400 s, igual que <code>resources</code> y <code>updates</code>. Excepciones: 5 s para acciones VM/CT y apagado/reinicio, 10 s para resultados de copias/replicación y 1800–3600 s para varias categorías de salud. Los ajustes explícitos por evento o grupo prevalecen.",
|
||||
"tunable": "Sí: los ajustes explícitos del distribuidor por evento o grupo sustituyen los valores predeterminados."
|
||||
"what": "Tras un envío correcto se suprimen huellas repetidas y se guarda el estado en <code>notification_last_sent</code>. Las bases de <code>CRITICAL</code>, <code>WARNING</code> e <code>INFO</code> son 86400 s, igual que <code>resources</code> y <code>updates</code>. Excepciones: 5 s para acciones VM/CT y apagado/reinicio, 10 s para resultados de backups/replicación y 1800–3600 s para varias categorías de salud. Los ajustes explícitos por evento o grupo prevalecen.",
|
||||
"tunable": "Solo mediante la API de ajustes: una clave <code>cooldown.<event_type></code> o <code>cooldown.<group></code> sustituye los valores predeterminados; no hay control en la interfaz."
|
||||
},
|
||||
{
|
||||
"stage": "Agrupación de ráfagas",
|
||||
@@ -321,7 +321,7 @@
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Integración del webhook de PVE",
|
||||
"intro1": "El sistema de notificaciones Proxmox tiene <em>destinos</em> sendmail, Gotify, SMTP y, en versiones compatibles, webhook. Monitor registra un destino <code>webhook</code> al activarse. Los avisos de PVE, como HA, replicación y copias desde la interfaz, entran así en el mismo proceso de envío.",
|
||||
"intro1": "El sistema de notificaciones Proxmox tiene <em>destinos</em> sendmail, Gotify, SMTP y, en versiones compatibles, webhook. Monitor registra un destino <code>webhook</code> al activarse. Los avisos de PVE, como HA, replicación y backups desde la interfaz, entran así en el mismo proceso de envío.",
|
||||
"intro2": "Puedes verlo en <em>Datacenter → Notificaciones → Destinos de notificación</em>.",
|
||||
"imageAlt": "Diálogo Proxmox VE Edit Webhook mostrando el destino proxmenux-webhook autocreado con método POST, URL http://127.0.0.1:8008/api/notifications/webhook y una plantilla JSON usando escape title, escape message, escape severity, escape timestamp y campos json",
|
||||
"imageCaption": "El destino webhook del lado PVE como Proxmox lo ve (la GUI está en el locale configurado del host — español en este ejemplo). Los mismos campos aplican en cualquier idioma.",
|
||||
@@ -330,7 +330,7 @@
|
||||
"<strong>Método y URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code> sin HTTPS en Monitor. Con HTTPS, usa el receptor HTTP local del puerto 8009. Ambos permanecen en el mismo host.",
|
||||
"<strong>Plantilla del cuerpo.</strong> JSON con funciones Handlebars de PVE, guardado como base64 en la configuración. Al expandirse resulta:",
|
||||
"<strong>Matcher.</strong> Un bloque compañero <code>matcher: proxmenux-matcher</code> con <code>mode all</code> para que cada notificación de PVE llegue al destino.",
|
||||
"<strong>Configuración privada.</strong> Se escribe <code>webhook: proxmenux-webhook</code> en <code>/etc/pve/priv/notifications.cfg</code>, con el secreto compartido en base64. El destino público lo referencia para enviar X-Webhook-Secret. El bloque contiene ese secreto."
|
||||
"<strong>Configuración privada.</strong> Se escribe el bloque <code>webhook: proxmenux-webhook</code> en <code>/etc/pve/priv/notifications.cfg</code> con una entrada <code>secret</code> llamada X-Webhook-Secret, codificada en base64. El bloque del destino público solo contiene la plantilla del cuerpo, el método y la URL. El bloque privado no está vacío."
|
||||
],
|
||||
"securityTitle": "Cómo se asegura el receptor",
|
||||
"securityIntro": "El receptor webhook en <code>POST /api/notifications/webhook</code> aplica distintas capas de seguridad según de dónde venga la petición:",
|
||||
@@ -360,7 +360,7 @@
|
||||
"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>, más los equivalentes <code>ct_*</code>, <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": "Copias de seguridad",
|
||||
"group": "Backups",
|
||||
"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>."
|
||||
},
|
||||
{
|
||||
@@ -403,7 +403,7 @@
|
||||
"burstNote": "Los tipos agrupados <code>burst_*</code> (<code>burst_auth_fail</code>, <code>burst_ip_block</code>, <code>burst_disk_io</code>, etc.) sustituyen ráfagas por un resumen. No tienen controles propios en la interfaz y heredan los del evento de origen.",
|
||||
"backupResults": {
|
||||
"heading": "Resultados de backup",
|
||||
"intro": "El informe de cada trabajo de copia determina su resultado, título, icono con <em>Mensajes enriquecidos</em> y fila de estado del correo.",
|
||||
"intro": "El informe de cada trabajo de backup determina su resultado, título, icono con <em>Mensajes enriquecidos</em> y fila de estado del correo.",
|
||||
"headerIcon": "Icon",
|
||||
"headerResult": "Resultado",
|
||||
"headerWhen": "Cuándo",
|
||||
@@ -434,7 +434,7 @@
|
||||
"<strong>El cuerpo detalla cada sistema invitado</strong>, con resultado, tamaño, duración y archivo, seguido de los totales.",
|
||||
"<strong>Las advertencias y los errores se listan una vez.</strong> Las líneas repetidas se muestran una sola vez con la causa principal primero; a partir de ocho líneas, el resto se cuenta en una línea de cierre y permanece en el log de la tarea de Proxmox.",
|
||||
"<strong>Un trabajo que falla antes del primer invitado</strong> muestra la causa indicada por Proxmox, por ejemplo un almacenamiento inexistente.",
|
||||
"<strong>Los resúmenes conservan el resultado.</strong> Una copia en el resumen de horas de silencio conserva su icono. Los resultados de copias evitan el resumen diario."
|
||||
"<strong>Los resúmenes conservan el resultado.</strong> Un backup en el resumen de horas de silencio conserva su icono. Los resultados de backups evitan el resumen diario."
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"reaching": {
|
||||
"heading": "Atteindre le tableau de bord",
|
||||
"intro": "Le ProxMenux Monitor se lie au <code>0.0.0.0:8008</code>. Il y a trois façons communes d'y parvenir:",
|
||||
"outro": "L’accès direct correspond à l’unité systemd par défaut. Le proxy inverse et Secure Gateway sont décrits ci-dessous. Les IP de <code>X-Forwarded-For</code> nécessitent PROXMENUX_TRUST_PROXY=1 et un proxy que vous contrôlez. <code>X-Forwarded-Proto</code> ou <code>X-Forwarded-Host</code> seuls n’activent pas cette confiance ; le frontend construit les URL API depuis l’origine du navigateur."
|
||||
"outro": "L’accès direct correspond à l’unité systemd par défaut. Le proxy inverse et Secure Gateway sont décrits ci-dessous. La confiance accordée aux IP clientes de <code>X-Forwarded-For</code> nécessite PROXMENUX_TRUST_PROXY=1 et un proxy que vous contrôlez. La seule présence de <code>X-Forwarded-Proto</code> ou <code>X-Forwarded-Host</code> n’active pas la confiance envers le proxy. Sur les ports 80/443, le frontend utilise des URL relatives <code>/api/*</code> ; sur tout autre port, il appelle le port 8008 du même nom d’hôte."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Premier démarrage",
|
||||
@@ -117,8 +117,8 @@
|
||||
"loginImageCaption": "Une fois l'authentification configurée, chaque visite au tableau de bord commence ici. Avec 2FA activé, l'écran demande le code à chiffres 6 dans une deuxième étape après l'acceptation du mot de passe.",
|
||||
"loginFlowTitle": "Flux de connexion",
|
||||
"twofaIntro": "Avec 2FA, le premier appel renvoie <code>requires_totp: true</code>. Répétez-le avec le code à six chiffres :",
|
||||
"publicTitle": "Accès public et sondes protégées",
|
||||
"publicIntro": "La connexion et son état sont publics. La création du compte reste possible tant qu’aucun identifiant et mot de passe ne sont enregistrés, même après un refus de protection. Les données système exigent une authentification lorsque la protection est active :",
|
||||
"publicTitle": "Points d’accès publics (sans jeton)",
|
||||
"publicIntro": "La connexion, l’état de l’authentification, la configuration initiale et le point d’accès léger <code>/api/system-info</code> sont publics :",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code> et <code>/api/auth/status</code> sont publics. <code>/api/auth/setup</code> crée le premier compte et refuse d’écraser des identifiants existants.",
|
||||
"<code>/api/system-info</code> est un endpoint public d’informations système légères, dont <code>health.status</code>. Il n’exige pas de jeton. /api/auth/status est également public et permet de vérifier la disponibilité."
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"asset": "Secret TOTP de 2FA",
|
||||
"algorithm": "TOTP standard (RFC 6238), avec secret encodé en base32. Les huit codes de récupération sont à usage unique et conservés sous forme de hachages SHA-256.",
|
||||
"algorithm": "TOTP standard (RFC 6238), avec secret encodé en base32. Les huit codes de secours sont à usage unique et conservés sous forme de hachages SHA-256.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
@@ -243,17 +243,17 @@
|
||||
}
|
||||
],
|
||||
"backupTitle": "Pourquoi les sauvegardes comptent",
|
||||
"backupBody": "Si vous perdez l’appareil, utilisez un code de récupération conservé ou restaurez une sauvegarde préparée auparavant. Synchronisation cloud et exports varient selon l’application : vérifiez que votre méthode restaure bien les secrets TOTP. L’accès root à l’hôte permet aussi une récupération, décrite ci-dessous. Gardez une sauvegarde distincte et sécurisée.",
|
||||
"backupBody": "Si vous perdez l’appareil d’authentification, utilisez un code de secours conservé ou restaurez l’application depuis une sauvegarde préparée auparavant. Synchronisation cloud et exports locaux varient selon l’application : vérifiez que votre méthode restaure bien les secrets TOTP. L’accès root à l’hôte permet aussi une récupération, décrite ci-dessous. Gardez une sauvegarde distincte et sécurisée.",
|
||||
"setupTitle": "Configuration étape par étape depuis le tableau de bord",
|
||||
"setupImageAlt": "Écran de configuration 2FA avec code QR et codes de sauvegarde",
|
||||
"setupImageCaption": "Le dialogue 2FA montre un QR code, le secret Base32 pour la saisie manuelle et huit codes de récupération à usage unique. Copiez-les avant de fermer : ils ne seront plus affichés.",
|
||||
"setupImageCaption": "Le dialogue de configuration 2FA montre un QR code, un secret Base32 pour la saisie manuelle et, après la vérification, huit codes de secours à usage unique. Copiez les codes avant de fermer le dialogue : ils ne seront plus affichés.",
|
||||
"setupSteps": [
|
||||
"<strong>Installez l'application authentificateur sur votre téléphone</strong> (ou ouvrez votre gestionnaire de mots de passe). Une des applications du tableau ci-dessus. Vous n'avez besoin de le faire qu'une seule fois — la même application contiendra des codes pour chaque service que vous protégez.",
|
||||
"<strong>Se connecter au tableau de bord</strong> avec votre nom d'utilisateur et votre mot de passe.",
|
||||
"<strong>Ouvrez l’onglet Sécurité</strong>, puis <strong>Activer 2FA</strong>. Le dialogue montre le QR code, le secret Base32 et huit codes de récupération.",
|
||||
"<strong>Ouvrez l’onglet Sécurité</strong> dans la barre latérale du tableau de bord, puis cliquez sur <strong>Activer 2FA</strong> et <strong>Démarrer la configuration</strong>. Le dialogue montre le QR code et la clé manuelle ; les huit codes de secours apparaissent après la vérification du code.",
|
||||
"<strong>Ajouter l'entrée à l'application authentificateur:</strong>",
|
||||
"<strong>Conservez les codes de récupération.</strong> Gardez les huit dans un gestionnaire de mots de passe, une note chiffrée ou une copie papier sécurisée. Chacun sert une fois si l’application est indisponible.",
|
||||
"<strong>Confirmez avec le code actuel à six chiffres</strong> de l’application dans le champ « Code de vérification », puis validez. Le code change toutes les 30 secondes ; s’il expire pendant la saisie, utilisez le suivant.",
|
||||
"<strong>Confirmez avec le code actuel à six chiffres</strong> de l’application dans le champ « Code de vérification » du dialogue de configuration, puis validez. Le code change toutes les 30 secondes ; s’il expire pendant la saisie, utilisez le suivant.",
|
||||
"<strong>Conservez les codes de secours.</strong> Après la vérification, gardez les huit en lieu sûr dans un gestionnaire de mots de passe, une note chiffrée ou une copie papier sécurisée. Chacun sert une fois si votre application d’authentification est indisponible.",
|
||||
"<strong>Terminé.</strong> 2FA est actif. La prochaine connexion demande d’abord le mot de passe, puis le code actuel à six chiffres."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
@@ -261,17 +261,17 @@
|
||||
"<em>Alternative manuelle</em> si le scan est impossible, notamment sur le même téléphone : <em>Ajouter un compte</em> → <em>Saisir une clé de configuration</em>. Choisissez un nom comme <em>Proxmox Monitor</em>, collez le secret Base32, laissez le <em>Type</em> sur <em>Basé sur le temps</em> et enregistrez."
|
||||
],
|
||||
"testTitle": "Tester avant de déconnecter",
|
||||
"testBody": "Gardez la session actuelle ouverte et testez une nouvelle connexion dans une fenêtre privée <em>immédiatement</em> après la configuration. Si le code échoue, vérifiez les horloges du serveur et du téléphone avant de fermer la session fonctionnelle. Si l’accès est perdu, utilisez un code de récupération ou modifiez <code>auth.json</code> depuis le shell de l’hôte.",
|
||||
"testBody": "Gardez la session actuelle ouverte et testez une nouvelle connexion dans une fenêtre privée <em>immédiatement</em> après la configuration. Si le code est refusé, vérifiez les horloges du serveur et du téléphone avant de vous déconnecter de la session fonctionnelle. Si l’accès est déjà perdu, utilisez un code de secours ou modifiez <code>auth.json</code> depuis le shell de l’hôte.",
|
||||
"lostTitle": "Authentificateur perdu",
|
||||
"lostIntro": "Trois méthodes de récupération, de la moins intrusive à la plus intrusive :",
|
||||
"lostItems": [
|
||||
"<strong>Utilisez un code de récupération.</strong> Saisissez un des huit codes dans le champ TOTP. Il sert une fois ; les autres restent valides. Après connexion, reconfigurez 2FA dans les paramètres pour obtenir huit nouveaux codes.",
|
||||
"<strong>Utilisez un code de secours.</strong> Saisissez un des huit codes enregistrés dans le champ TOTP. Il sert une fois ; les codes inutilisés restent valides. Après connexion, ouvrez Sécurité, choisissez <strong>Désactiver 2FA</strong> puis <strong>Activer 2FA</strong> pour obtenir huit nouveaux codes.",
|
||||
"<strong>Restaurer l'authentificateur à partir du cloud / sauvegarde.</strong> Si votre application a une synchronisation cloud (Google, Microsoft, Authy, Apple Passwords via iCloud Keychain, Ente, 2FAS) l'installe sur un nouvel appareil, se connecte et les entrées réapparaissent. Si votre application utilise un fichier d'exportation chiffré (Aegis, Raivo, FreeOTP+), installer l'application sur le nouvel appareil et importer le fichier.",
|
||||
"<strong>Désactivez 2FA depuis le shell de l'hôte.</strong> Lorsque les options précédentes ne sont pas disponibles, modifiez <code>/root/.config/proxmenux-monitor/auth.json</code> sur l'hôte Proxmox (vous avez besoin de root SSH ou d'un accès à la console), définissez <code>totp_enabled</code> sur <code>false</code>, enregistrez et redémarrez le service :"
|
||||
],
|
||||
"lostShellOutro": "Vous pouvez vous connecter avec le nom d'utilisateur + mot de passe seulement, puis réactiver 2FA depuis Paramètres.",
|
||||
"disableTitle": "Désactiver 2FA",
|
||||
"disableBody": "Ouvrez <strong>Sécurité</strong> et choisissez <strong>Désactiver 2FA</strong>. <code>POST /api/auth/totp/disable</code> exige le mot de passe actuel et un code TOTP ou de récupération valide. Le secret TOTP et les codes sont effacés. Retirez aussi l’ancienne entrée de l’application.",
|
||||
"disableBody": "Ouvrez <strong>Sécurité</strong> et choisissez <strong>Désactiver 2FA</strong>. <code>POST /api/auth/totp/disable</code> exige le mot de passe actuel et un code TOTP ou de secours valide. Le secret TOTP et les codes de secours sont effacés. Retirez aussi l’ancienne entrée de votre application d’authentification.",
|
||||
"rejectedTitle": "Le code à chiffres 6 est toujours rejeté",
|
||||
"rejectedIntro": "TOTP dépend du temps : les horloges du serveur et du téléphone doivent différer de moins d’environ 30 s. Deux contrôles :",
|
||||
"rejectedItems": [
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "Désactivé par défaut, un seul interrupteur pour l’activer",
|
||||
"body": "La reformulation IA est désactivée par défaut. Activez-la dans <em>Paramètres → Notifications → Avancé : amélioration IA</em>. Si l’enrichissement ou la reformulation échoue, le texte du modèle original est envoyé. Chaque reformulation a un délai maximal de 25 secondes ; au-delà, le modèle est utilisé sans attendre indéfiniment."
|
||||
"body": "La reformulation IA est désactivée par défaut. Activez-la dans <em>Paramètres → Notifications → Avancé : amélioration IA</em>. Si l’enrichissement ou la reformulation échoue, le répartiteur envoie le modèle original. Les reformulations de la file d’envoi des événements ont un délai maximal de 25 secondes ; une fois ce délai atteint, le modèle est envoyé au lieu d’attendre."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Comment ça marche",
|
||||
@@ -109,7 +109,7 @@
|
||||
],
|
||||
"customNote": "Le mode personnalisé fixe la sortie à 500 tokens, quel que soit le niveau de détail. Vous contrôlez les instructions ; le plafond évite les réponses trop longues.",
|
||||
"sizingTitle": "Taille pratique",
|
||||
"sizingBody": "Estimez la consommation : événements reformulés × canaux IA × tokens d’entrée et de sortie par appel. Exemple : 50 événements × un canal × (500 en entrée + 300 en sortie) = 40 000 tokens par jour. Les valeurs réelles dépendent du modèle, du contexte, du cache et des limites du fournisseur. <link>Détail par canal</link> explique comment utiliser <code>brief</code> pour le chat au lieu de <code>standard</code>, avec des e-mails détaillés."
|
||||
"sizingBody": "Estimez la consommation : événements reformulés × canaux avec IA × tokens d’entrée et de sortie par appel. Exemple : 50 événements × un canal × (2 000 en entrée + 300 en sortie) font environ 115 000 tokens par jour, car l’invite système par défaut compte à elle seule environ 1 500 tokens. La consommation et les coûts réels dépendent du modèle, du contexte, du cache et des limites du fournisseur. La section <link>Détail par canal</link> explique comment utiliser <code>brief</code> pour le chat au lieu de <code>standard</code>, tout en gardant des rapports e-mail détaillés."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "Fournisseurs d'IA",
|
||||
@@ -142,7 +142,7 @@
|
||||
"items": [
|
||||
"Clé API : <a>console.anthropic.com/settings/keys</a>",
|
||||
"Exemples de la liste de modèles fournie : <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
|
||||
"Recommandation fournie : <strong><code>claude-haiku-4-5-20251001</code></strong>. Cette version précise est recommandée ; les anciens modèles Claude 3.5 ne figurent plus dans la liste fournie."
|
||||
"Recommandation fournie : <strong><code>claude-haiku-4-5-20251001</code></strong>, un instantané figé plutôt qu’un alias évolutif."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Crée une sauvegarde vzdump de VM ou LXC. Champs facultatifs à adapter au stockage : <code>storage</code> (cible PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> ou <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> ou <code>none</code>), <code>protected</code> (<code>true</code> ou <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> ou <code>never</code>) et <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> ou <code>data</code>). Renvoie l’UPID de la tâche PVE."
|
||||
"use": "Crée une sauvegarde vzdump d’une VM ou d’un LXC. Champs du corps, tous facultatifs sauf si les valeurs par défaut ne correspondent pas à l’organisation du stockage : <code>storage</code> (un stockage PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> ou <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> ou <code>none</code>), <code>protected</code> (<code>true</code> ou <code>false</code>), <code>notes</code> et <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> ou <code>data</code>). Renvoie l’UPID de la tâche PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
@@ -286,7 +286,7 @@
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Lance un autotest SMART. Schéma du corps : <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
"use": "Lance un autotest SMART. Schéma du corps : <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
|
||||
@@ -73,13 +73,13 @@
|
||||
"intro": "L’AppImage contient un système de fichiers monté à l’exécution. <code>AppRun</code> à sa racine prépare l’environnement et lance <code>flask_server.py</code> :",
|
||||
"consequencesIntro": "Deux conséquences de cette disposition :",
|
||||
"consequences": [
|
||||
"<strong>Environnement Python fourni.</strong> Interpréteur et paquets sont dans l’AppImage, sans installation dans le Python système. L’application utilise toujours les interfaces du noyau et les outils externes de l’hôte.",
|
||||
"<strong>Paquets Python fournis.</strong> Les paquets Python sont livrés dans l’AppImage et s’exécutent avec l’interpréteur Python de l’hôte lui-même, 3.11 (PVE 8) ou 3.13 (PVE 9), sans rien installer dans le Python système de l’hôte. L’application utilise toujours les interfaces du noyau et les outils externes de l’hôte.",
|
||||
"<strong>Clients matériels inclus.</strong> L’AppImage fournit <code>ipmitool</code>, <code>lm-sensors</code> et <code>upsc</code>. Les mesures dépendent du matériel compatible, de l’accès aux capteurs et, pour l’onduleur, d’un serveur NUT configuré."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Structure de l’application Flask",
|
||||
"intro": "<code>flask_server.py</code> crée une instance <code>Flask(__name__)</code> avec CORS limité, enregistre directement neuf blueprints et initialise le terminal. Le tableau montre les modules principaux ; audit, sauvegarde VM et PBS sont aussi enregistrés. Les préchargements PVE ne tournent que sur les hôtes PVE.",
|
||||
"intro": "<code>flask_server.py</code> crée une instance <code>Flask(__name__)</code> avec des origines CORS restreintes, enregistre directement dix blueprints et initialise les routes du terminal. Le tableau montre les modules principaux ; les blueprints PBS, liens du Monitor, audit et sauvegarde VM sont aussi enregistrés. Les préchargements propres à PVE ne tournent que sur les hôtes PVE.",
|
||||
"headerBlueprint": "Blueprint / module",
|
||||
"headerPrefix": "Préfixe des itinéraires",
|
||||
"headerOwns": "Responsabilité",
|
||||
@@ -242,10 +242,10 @@
|
||||
"Mises à jour : paquets en attente et correctifs de sécurité.",
|
||||
"Journaux : motifs persistants, pics et cascades dans le journal système.",
|
||||
"Mémoire : interventions de l’OOM killer et pression mémoire prolongée.",
|
||||
"Température : mesures CPU et disques comparées aux seuils de surveillance ; les capteurs disponibles dépendent du matériel.",
|
||||
"CPU : utilisation et température CPU comparées aux seuils configurables ; les capteurs disponibles dépendent du matériel.",
|
||||
"Sécurité : échecs de connexion, blocages et état du jail Fail2Ban."
|
||||
],
|
||||
"afterIntro": "Les constats utilisent <code>error_key</code>, catégorie et gravité stables. Les lignes d’<code>errors</code> sont mises à jour avec <code>last_seen</code> et le compteur, sans duplication. L’envoi a aussi ses propres empreintes et temporisations.",
|
||||
"afterIntro": "Les constats utilisent <code>error_key</code>, catégorie et gravité stables. Les enregistrements existants d’<code>errors</code> sont mis à jour sur place (<code>last_seen</code>, gravité, motif), sans duplication. L’envoi des notifications a aussi ses propres règles d’empreinte et de temporisation.",
|
||||
"cycleEnd": "Le nettoyage peut résoudre les erreurs anciennes selon la <em>durée de suppression</em> par catégorie et des règles d’état, retirer les entrées orphelines des ressources supprimées et purger <code>events</code> après 30 jours. Voir <link>Tableau de bord → Health Monitor</link> pour les catégories."
|
||||
},
|
||||
"notifications": {
|
||||
@@ -264,9 +264,9 @@
|
||||
"intro": "L’onglet <em>Terminal</em> relie un client léger <code>xterm.js</code> à un PTY du serveur via WebSocket. Deux modes existent :",
|
||||
"items": [
|
||||
"<strong>Mode HTTP, par défaut :</strong> le serveur Flask intégré et <code>flask-sock</code> gèrent le passage au protocole WebSocket.",
|
||||
"<strong>Mode HTTPS / WSS :</strong> utilise <code>gevent.pywsgi.WSGIServer</code> avec <code>geventwebsocket.handler.WebSocketHandler</code> pour WebSocket sur TLS."
|
||||
"<strong>Mode HTTPS / WSS :</strong> le serveur TLS utilise <code>gevent.pywsgi.WSGIServer</code> avec son gestionnaire par défaut ; <code>flask-sock</code> gère les connexions WebSocket sur TLS."
|
||||
],
|
||||
"outro": "Les processus du terminal héritent de <code>User=root</code>. Avec authentification active, WebSocket exige un ticket bref à usage unique obtenu par le point d’accès authentifié avec droits administratifs. Si l’authentification est désactivée ou refusée, la connexion suit ce mode sans authentification.",
|
||||
"outro": "Les processus enfants du terminal héritent de <code>User=root</code> du service. L’ouverture d’un WebSocket exige un ticket bref à usage unique obtenu par le point d’accès authentifié des tickets de terminal avec droits administratifs.",
|
||||
"proxyNote": "Avec un proxy inverse, autorisez WebSocket et ses en-têtes <code>Upgrade</code> et <code>Connection</code>. Le terminal a besoin de ce transfert."
|
||||
},
|
||||
"proxy": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
}
|
||||
],
|
||||
"reportTitle": "Rapport de latence réseau (PDF)",
|
||||
"reportIntro": "Les deux modes ont un bouton <strong>Rapport</strong> près du sélecteur de cible. Il génère un PDF des mesures que vous pouvez joindre à une demande d’assistance auprès de votre FAI.",
|
||||
"reportIntro": "Les deux modes ont un bouton <strong>Rapport</strong> près du sélecteur de cible. Il ouvre un rapport imprimable des mesures ; enregistrez-le en PDF depuis la boîte de dialogue d’impression du navigateur et joignez-le à une demande d’assistance auprès de votre FAI.",
|
||||
"reportPreviewAlt": "Première page PDF du rapport de latence : synthèse, jauge, statistiques, graphique et guide des seuils",
|
||||
"reportPreviewCaption": "La première page contient la synthèse, la jauge, les statistiques principales, l’évolution de la latence et le guide des seuils. À partir de la page 2 figurent le tableau des mesures et la méthodologie.",
|
||||
"downloadLabel": "Télécharger un exemple de rapport de latence (PDF)",
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
"configCaption": "Modification du jail sshd : réduisez <em>Max Retries</em> si vous utilisez SSH uniquement depuis votre sous-réseau, ou augmentez <em>Ban Time</em> pour un tableau de bord exposé sur Internet.",
|
||||
"outro": "Le guide <em>Installation, configuration et désinstallation</em> couvre aussi l’installation manuelle, la modification de SSH MaxAuthTries et le journal <code>proxmenux-auth.log</code>. Consultez <link>ProxMenux → Sécurité → Fail2Ban</link>.",
|
||||
"calloutTitle": "Sans Fail2Ban, ce mécanisme ne bloque pas les IP",
|
||||
"calloutBody": "ProxMenux Monitor vérifie les IP bloquées par Fail2Ban au <em>niveau applicatif</em> avant de traiter les requêtes Flask. Il interroge fail2ban-client et conserve le résultat en cache pendant 30 secondes ; il ne lit pas de table SQL de blocages. Sans Fail2Ban, les échecs sont consignés dans <code>proxmenux-auth.log</code>, mais ce mécanisme ne bloque pas les IP."
|
||||
"calloutBody": "ProxMenux Monitor vérifie les IP bloquées dans la jail <code>proxmenux</code> de Fail2Ban au <em>niveau applicatif</em> avant de traiter les requêtes Flask, en gardant le résultat en cache pendant 30 secondes. Sans Fail2Ban, les échecs de connexion sont consignés dans <code>proxmenux-auth.log</code> et le point d’accès de connexion est limité à 5 tentatives par IP toutes les 5 minutes, mais aucune IP n’est bloquée."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Audit de sécurité Lynis",
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Seuils du Health Monitor",
|
||||
"intro": "La carte précédente définit <em>la durée de silence après un rejet</em> ; celle-ci règle <strong>la valeur qui déclenche une alerte</strong>. La plupart des contrôles ont des valeurs <strong>Avertissement</strong> et <strong>Critique</strong> réglables. Le tableau explique les exceptions, dont la règle combinée du swap et le détecteur RAM actuel.",
|
||||
"intro": "La carte précédente définit <em>la durée de silence après un rejet</em> ; celle-ci règle <strong>la valeur qui déclenche une alerte</strong>. La plupart des contrôles à seuil ont des valeurs <strong>Avertissement</strong> et <strong>Critique</strong> réglables. Le tableau ci-dessous explique les exceptions, comme la règle combinée du swap.",
|
||||
"whatForTitle": "À quoi cela sert",
|
||||
"whatForIntro": "Les valeurs par défaut sont un point de départ ; chaque environnement a ses propres conditions :",
|
||||
"whatForItems": [
|
||||
@@ -85,7 +85,7 @@
|
||||
"Choisissez les seuils de température selon les spécifications du disque et ses conditions réelles. Le refroidissement passif ou forcé ne définit pas seul une limite sûre universellement plus basse ou haute.",
|
||||
"Un hôte très virtualisé peut avoir des pics CPU pendant les compilations sans alerter à chaque pic de 80 %, mais doit signaler une saturation durable."
|
||||
],
|
||||
"whatForOutro": "Les modifications prises en charge s’appliquent <strong>à l’analyse suivante</strong>. Le Health Monitor lit <code>/usr/local/share/proxmenux/health_thresholds.json</code> à chaque cycle sans redémarrage. Certains indicateurs, comme la température des disques, utilisent ces valeurs ; des barres de capacité gardent leurs propres limites. La ligne RAM décrit une exception actuelle.",
|
||||
"whatForOutro": "Les modifications de seuils prises en charge s’appliquent <strong>à l’analyse suivante</strong>. Le Health Monitor lit <code>/usr/local/share/proxmenux/health_thresholds.json</code> à chaque cycle sans redémarrage. Certains indicateurs, dont la température des disques, utilisent ces valeurs ; certaines barres de capacité gardent leurs propres limites visuelles.",
|
||||
"coloursTitle": "Couleurs des états Avertissement et Critique",
|
||||
"coloursIntro": "Les widgets utilisant Avertissement/Critique suivent les trois états ci-dessous. D’autres indicateurs, comme les barres de capacité PVE, ont leurs propres limites ; leur couleur seule n’indique pas une alerte Health Monitor.",
|
||||
"headerColour": "Couleur",
|
||||
@@ -125,7 +125,7 @@
|
||||
"section": "Mémoire",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Pression RAM de l’hôte. Le réglage affiche Critique à 95 %, mais le détecteur actuel utilise une règle fixe de 90 % soutenus ; ce réglage ne modifie pas actuellement cette branche d’exécution."
|
||||
"gates": "Pression RAM de l’hôte."
|
||||
},
|
||||
{
|
||||
"section": "Swap (seuil critique uniquement)",
|
||||
@@ -185,7 +185,7 @@
|
||||
"section": "Stockage PVE",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Stockages gérés par PVE : LVM, LVM-thin, ZFS-pool, RBD/Ceph et PBS. Tous ne sont pas des stockages en blocs."
|
||||
"gates": "Uniquement les stockages PVE de type LVM, LVM-thin, ZFS-pool, RBD, CephFS et PBS. Les stockages répertoire, NFS et CIFS relèvent de la ligne d’espace disque de l’hôte."
|
||||
},
|
||||
{
|
||||
"section": "Pool ZFS",
|
||||
@@ -218,7 +218,7 @@
|
||||
"toggleTitle": "Interrupteur de notification lié à la détection",
|
||||
"toggleBody": "L’interrupteur <code>lxc_updates_available</code> par canal dans <strong>Notifications → Services</strong> n’apparaît que si la détection est active. La désactiver masque la ligne pour tous les canaux. Le choix reste dans la base et retrouve sa valeur à la réactivation.",
|
||||
"purgeTitle": "Ce qui est supprimé à la désactivation",
|
||||
"purgeBody": "La désactivation retire aussitôt les entrées <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Les compteurs de mises à jour LXC de Matériel disparaissent à l’actualisation suivante. La réactivation remplit le registre au prochain cycle, ou plus tôt par actualisation manuelle de l’API."
|
||||
"purgeBody": "La désactivation retire aussitôt toutes les entrées <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Les compteurs de mises à jour LXC de l’onglet VM et LXC disparaissent à l’actualisation suivante du tableau de bord. La réactivation remplit le registre au prochain cycle de détection, ou plus tôt par actualisation manuelle de l’API."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Exclusions de stockage distant",
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"items": [
|
||||
"<strong>Chemin du périphérique</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Étiquette de type</strong> — SATA / NVMe et icône associée.",
|
||||
"<strong>Étiquette système</strong> — marque orange pour les disques identifiés comme hébergeant le système. La détection utilise les montages <code>/</code> et <code>/boot</code> et applique l’étiquette <em>System</em>. Son absence ne prouve pas qu’un disque peut être effacé ou réutilisé sans risque.",
|
||||
"<strong>Étiquette système</strong> — marque orange pour les disques utilisés par l’hôte : points de montage système (<code>/</code>, <code>/boot</code>, <code>/usr</code>, <code>/var</code>…), swap actif, membres de pools ZFS, volumes physiques LVM, membres RAID actifs ou étiquettes de partitions système. Son absence ne prouve pas qu’un disque peut être effacé ou réutilisé sans risque.",
|
||||
"<strong>Modèle</strong> — fabricant et modèle de <code>smartctl -i</code>.",
|
||||
"<strong>Capacité</strong> — exprimée en unités lisibles.",
|
||||
"<strong>Température</strong> — valeur actuelle en °C, colorée selon le type de disque ; les seuils NVMe sont plus élevés que SATA.",
|
||||
@@ -112,7 +112,7 @@
|
||||
"pdfPreviewAlt": "Première page du rapport SMART avec synthèse, indicateur PASSED et informations sur le disque",
|
||||
"pdfPreviewCaption": "Première page : synthèse, indicateur PASSED et informations complètes du disque. L’exemple PDF contient l’usure SSD, tous les attributs SMART et l’historique des tests.",
|
||||
"pdfDownloadLabel": "Télécharger un exemple de rapport SMART (PDF)",
|
||||
"pdfSectionsIntro": "Le rapport comporte six sections principales :",
|
||||
"pdfSectionsIntro": "Le rapport comporte ces sections principales :",
|
||||
"pdfSections": [
|
||||
"<strong>Synthèse</strong> — état PASSED/FAILED, évaluation claire du disque — sain, usé ou défaillant — et quatre données : date du rapport, dernier type de test, résultat et attributs vérifiés.",
|
||||
"<strong>Informations sur le disque</strong> — modèle, série, capacité, type HDD/SSD/NVMe, famille, format, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM, température et seuil optimal, heures de fonctionnement, cycles d’alimentation, SMART, secteurs en attente/réalloués et erreurs CRC.",
|
||||
@@ -127,7 +127,7 @@
|
||||
"historyImageCaption": "Historique SMART du disque. Chaque ligne affiche type, date, ancienneté, repère du dernier test et actions de téléchargement de la sortie <code>smartctl</code> et suppression.",
|
||||
"historyIntro": "Tests courts et étendus terminés et conservés pour le disque. Chaque entrée contient la sortie originale <code>smartctl</code> et les champs interprétés par Monitor pour le tableau de bord. Actions par ligne :",
|
||||
"historyItems": [
|
||||
"<strong>Télécharger</strong> — enregistre l’instantané JSON contenant les données <code>smartctl -a</code> utilisées par le rapport. Utile si le support demande les champs de diagnostic originaux.",
|
||||
"<strong>Télécharger</strong> — enregistre l’instantané JSON de ce test (sortie de <code>smartctl -a --json</code>, ou <code>nvme smart-log</code> sur NVMe si smartctl échoue). Utile si le support du fabricant demande les champs de diagnostic originaux.",
|
||||
"<strong>Supprimer</strong> — retire manuellement un test de l’historique. La conservation de Planification (<em>5 / 10 / 20 derniers</em>) supprime automatiquement les plus anciens."
|
||||
],
|
||||
"scheduleTitle": "Onglet 4 — Planification",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Tableau de bord : VM et LXC | Documentation ProxMenux",
|
||||
"description": "Inventaire des invités avec CPU, mémoire et disque en direct. Les détails montrent configuration, ressources, sauvegardes, résultats récents du journal Proxmox, notes et Démarrer / Éteindre / Redémarrer / Forcer l'arrêt."
|
||||
"description": "L’onglet VM et LXC inventorie tous les invités de l’hôte avec l’utilisation CPU, mémoire et disque en direct. Les détails de chaque invité montrent configuration, ressources, sauvegardes, journal de console des conteneurs OCI, notes et commandes Démarrer / Éteindre / Redémarrer / Forcer l'arrêt."
|
||||
},
|
||||
"header": {
|
||||
"title": "Tableau de bord : VM et LXC",
|
||||
"description": "Inventaire complet du nœud : quatre mesures en haut, une liste triable des VM et LXC et les détails par invité avec configuration, ressources, sauvegardes, journaux et commandes Démarrer / Éteindre / Redémarrer / Forcer l'arrêt.",
|
||||
"description": "Inventaire complet des invités du nœud : quatre mesures en haut, une liste triable de chaque VM et LXC en dessous et les détails par invité avec configuration, ressources, sauvegardes, journal de console des conteneurs OCI et les quatre commandes de cycle de vie (Démarrer / Éteindre / Redémarrer / Forcer l'arrêt).",
|
||||
"section": "ProxMenux Monitor · Tableau de bord"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Commandes des systèmes invités",
|
||||
"body": "Cet onglet contrôle le cycle de vie des invités. Les actions passent par <code>POST /api/vms/<vmid>/control</code> avec confirmation explicite et actualisent la ligne de l'invité. L'arrêt forcé nécessite le bouton dédié Forcer l'arrêt."
|
||||
"body": "Cet onglet contrôle le cycle de vie des invités. Les actions de cycle de vie passent par <code>POST /api/vms/<vmid>/control</code> ; Redémarrer et Forcer l'arrêt demandent de saisir le VMID pour confirmer, et la réponse est reflétée dans la ligne de l’invité. L’arrêt forcé nécessite le bouton dédié Forcer l'arrêt."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Ligne supérieure : quatre cartes statistiques",
|
||||
@@ -186,9 +186,9 @@
|
||||
"source": "Les données PVE RRD (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) sont condensées à une forme facile à tracer."
|
||||
},
|
||||
{
|
||||
"section": "Résultats récents du journal Proxmox",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "<code>pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000</code>. Un échec renvoie une liste vide ; ces données ne constituent pas les journaux système complets de l'invité."
|
||||
"section": "Journal de console OCI (onglet Logs)",
|
||||
"endpoint": "/api/lxc/<vmid>/console-log",
|
||||
"source": "Sortie console du processus principal de l’image, lue depuis <code>/var/log/proxmenux/oci/<vmid>.console.log</code> sur l’hôte. Affiché uniquement pour les conteneurs OCI."
|
||||
},
|
||||
{
|
||||
"section": "Sauvegardes disponibles pour les invités",
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
{
|
||||
"category": "Stockage",
|
||||
"checks": "Stockages Proxmox, système de fichiers racine",
|
||||
"events": "Seuils d’occupation dépassés sur la racine ou un autre système de fichiers surveillé (85% avertissement / 95% critique par défaut) ; export NFS indisponible ; échec d’authentification CIFS ; pool LVM-thin plein."
|
||||
"events": "Seuils d’occupation dépassés sur la racine ou un autre système de fichiers surveillé (85% avertissement / 95% critique par défaut) ; stockages PVE indisponibles ; montages NFS/CIFS figés ou passés en lecture seule de façon inattendue ; stockages LVM-thin et autres pools dépassant les mêmes seuils."
|
||||
},
|
||||
{
|
||||
"category": "Disques & SMART",
|
||||
@@ -98,7 +98,7 @@
|
||||
{
|
||||
"category": "Mises à jour du système",
|
||||
"checks": "Mises à jour en attente, mises à jour de sécurité, version noyau / PVE, âge du système",
|
||||
"events": "Mises à jour de sécurité ou du noyau utilisé en attente ; système non mis à jour depuis longtemps. Le bouton <em>Mettre à jour maintenant</em> apparaît dans l’aperçu lorsque des mises à jour sont disponibles. Il lance la procédure complète ProxMenux ; sa fermeture actualise l’état avec <code>?refresh=1</code> sans attendre le cycle suivant."
|
||||
"events": "Mises à jour de sécurité ou du noyau utilisé en attente ; système non mis à jour depuis longtemps. La catégorie Mises à jour de la fenêtre État de santé affiche un bouton <em>Mettre à jour maintenant</em> lorsque des mises à jour sont en attente. Il lance la procédure complète de mise à jour ProxMenux dans la fenêtre ; sa fermeture actualise l’état avec <code>?refresh=1</code> afin que l’indicateur reflète le nouvel état sans attendre le cycle suivant."
|
||||
},
|
||||
{
|
||||
"category": "Sécurité et certificats",
|
||||
@@ -158,7 +158,7 @@
|
||||
},
|
||||
"dismiss": {
|
||||
"heading": "Masquer les alertes et choisir la durée de mise en sourdine",
|
||||
"intro": "Certains événements persistent, comme <em>Mises à jour système : mises à jour disponibles</em> tant que l’hôte n’est pas mis à jour. Une notification toutes les cinq minutes serait inutile. Le bouton <em>Mettre à jour maintenant</em> de l’aperçu permet de résoudre ce cas directement. Pour les autres cas ou les mises à jour reportées, deux mécanismes liés permettent de masquer les alertes :",
|
||||
"intro": "Certains événements persistent par nature, comme <em>Mises à jour système : mises à jour disponibles</em> tant que l’hôte n’est pas mis à jour, et une notification toutes les cinq minutes pendant une semaine serait inutile. Le bouton <em>Mettre à jour maintenant</em> de la catégorie Mises à jour de la fenêtre État de santé permet de résoudre ce cas directement. Pour les autres cas ou les mises à jour reportées, la surveillance offre aussi deux mécanismes liés pour masquer les alertes :",
|
||||
"step1": "<strong>Masquer un événement</strong> dans la fenêtre. Le menu propose <strong>24 heures</strong>, <strong>7 jours</strong> ou <strong>Définitivement</strong>, indépendamment de la catégorie. Le choix envoie <code>POST /api/health/acknowledge</code> avec <code>error_key</code> et <code>suppression_hours</code> (<code>-1</code> pour une durée permanente). L’événement passe dans la liste masquée avec l’horodatage <code>acknowledged_at</code>.",
|
||||
"dropdownImageAlt": "Menu pour masquer une alerte : 24 heures, 7 jours ou définitivement",
|
||||
"dropdownImageCaption": "La durée choisie ne concerne que cette alerte ; sans choix individuel, la valeur de la catégorie s’applique. Les alertes masquées définitivement portent un badge ambre <em>Permanent</em> et ne se déclenchent normalement plus. La température CPU critique constitue l’exception décrite plus bas.",
|
||||
@@ -187,7 +187,7 @@
|
||||
},
|
||||
{
|
||||
"finding": "ZFS pool DEGRADED / FAULTED",
|
||||
"why": "Les contrôles de capacité des pools ZFS autorisent l’acquittement. Les autres constats suivent leur propre indicateur. Acquitter ne répare pas un pool dégradé ou défaillant."
|
||||
"why": "Les constats d’état des pools ZFS (DEGRADED, FAULTED, UNAVAIL) autorisent explicitement l’acquittement, tout comme les contrôles de capacité des pools. Acquitter ne répare pas un pool dégradé ou défaillant."
|
||||
},
|
||||
{
|
||||
"finding": "Erreurs d'entrée/sortie du disque avec SMART FAILED",
|
||||
@@ -289,7 +289,7 @@
|
||||
},
|
||||
"rest": {
|
||||
"heading": "Points d’accès REST",
|
||||
"intro": "Les actions de la fenêtre sont accessibles par API pour scripts, tableaux de bord ou bots. Si l’authentification du Monitor est activée, un jeton Bearer valide issu de la connexion ou de l’écran des jetons API est requis. Les modifications, comme acquitter, enregistrer ou nettoyer les erreurs orphelines, exigent full_admin ; read_only reçoit 403. Si l’authentification est désactivée ou refusée, ces contrôles autorisent l’accès sans jeton.",
|
||||
"intro": "Les actions de la fenêtre sont aussi accessibles par API pour scripts, tableaux de bord personnalisés ou bots. Les appels exigent un jeton Bearer valide, issu de la connexion ou de l’écran des jetons API. Les modifications, comme acquitter des alertes, enregistrer les réglages de suppression ou nettoyer les erreurs orphelines, exigent la portée full_admin ; read_only reçoit 403.",
|
||||
"headerEndpoint": "Point d’accès",
|
||||
"headerMethod": "Méthode",
|
||||
"headerUse": "Utilisation",
|
||||
@@ -297,7 +297,7 @@
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Contrôle léger renvoyant du JSON avec <code>status</code>, <code>timestamp</code> et <code>version</code>. Convient aux contrôles de mots-clés Uptime Kuma ; si l’authentification du Monitor est activée, le client doit envoyer un en-tête Bearer."
|
||||
"use": "Contrôle léger renvoyant du JSON avec <code>status</code>, <code>timestamp</code> et <code>version</code>. Convient aux contrôles de mots-clés Uptime Kuma ; le client doit envoyer un en-tête Bearer."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"description": "Shell de l’hôte et consoles VM/CT compatibles dans le navigateur via <code>xterm.js</code> et WebSockets. Le mode d’authentification configuré s’applique : désactivé ou refusé, il permet aux clients ayant accès au réseau d’ouvrir une session sans connexion. Cela n’implique pas un audit de chaque commande."
|
||||
"description": "Shell de l’hôte et consoles VM/CT compatibles dans le navigateur via <code>xterm.js</code> et WebSockets. Les sessions ne sont pas auditées commande par commande."
|
||||
},
|
||||
{
|
||||
"name": "Sécurité",
|
||||
@@ -114,7 +114,7 @@
|
||||
"heading": "REST API et intégrations",
|
||||
"intro": "Les points d’accès REST exposent les mesures en JSON par HTTP/HTTPS pour Homepage, Home Assistant, Uptime Kuma et les scripts. Grafana peut utiliser l’exporteur texte Prometheus séparé sur <code>/api/prometheus</code>. Les requêtes peuvent être faites avec <code>curl</code>.",
|
||||
"tokens": "Les jetons API à longue durée de vie (365 jours) sont générés à partir de <strong>Paramètres → API Tokens</strong> ou via <code>POST /api/auth/generate-api-token</code>.",
|
||||
"bearer": "Envoyez les jetons via <code>Authorization: Bearer …</code>. Le point public <code>/api/health</code> convient aux sondes de disponibilité sans identifiants. Sous <code>/api/auth/*</code>, certaines routes de configuration/connexion/état sont publiques, mais celles de gestion du compte et des jetons sont protégées.",
|
||||
"bearer": "Envoyez les jetons via <code>Authorization: Bearer …</code>. <code>/api/health</code> attend aussi l’en-tête Bearer : les sondes de disponibilité ont donc besoin d’un jeton read_only. Sous <code>/api/auth/*</code> se trouvent à la fois des routes publiques de configuration/connexion/état et des routes protégées de gestion du compte et des jetons ; elles ne sont pas toutes anonymes.",
|
||||
"catalog": "Le catalogue complet des points d'accès, les conseils de rotation des jetons et les bonnes pratiques de sécurité se trouvent dans la <linkApi>référence API</linkApi>. Des exemples pour Homepage, Home Assistant, Grafana et Uptime Kuma, ainsi qu'un modèle générique cURL, sont proposés dans les <linkIntegrations>intégrations</linkIntegrations>."
|
||||
},
|
||||
"serviceControl": {
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
"heading": "n8n, Zapier et scripts personnalisés",
|
||||
"intro": "Les workflows et scripts peuvent <em>envoyer</em> des notifications par POST vers <code>/api/notifications/send</code>, par exemple après un échec CI ou une tâche trop longue. Cet envoi direct contourne la file et le délai entre empreintes d’événements. Il conserve le format par canal, l’IA facultative et la livraison. Gérez les doublons dans l’appelant.",
|
||||
"n8nBody": "Dans n8n, utilisez un nœud <em>HTTP Request</em> avec POST, l’URL ci-dessus et le même JSON que curl. Choisissez les identifiants génériques Header Auth : nom <em>Authorization</em> et valeur <code>Bearer YOUR_API_TOKEN</code>, en remplaçant le marqueur. Reliez un planning, webhook ou autre nœud pour déclencher la requête.",
|
||||
"severityBody": "La gravité utilise <code>INFO</code>, <code>WARNING</code> ou <code>CRITICAL</code> en majuscules. L’objet <code>data</code> apporte du contexte. L’IA reçoit le titre et le message rendus avec les enrichissements pris en charge ; tous les champs ne sont pas garantis dans ses instructions ou sa sortie. Voir <link>Notifications → Catalogue des événements</link>."
|
||||
"severityBody": "La gravité utilise <code>INFO</code>, <code>WARNING</code> ou <code>CRITICAL</code> en majuscules. L’objet <code>data</code> apporte le contexte de l’événement et les champs du modèle. Sur ce point d’accès, la reformulation IA ne reçoit que le titre et le message ; les champs de <code>data</code> ne sont pas envoyés au fournisseur. Voir <link>Notifications → Catalogue des événements</link> pour la signification des événements."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Webhook natif Proxmox VE (entrant)",
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
"Ouvrez <a>account.microsoft.com/security</a> et activez la vérification en deux étapes.",
|
||||
"Si votre compte propose <em>Options de sécurité avancées</em> → <em>Mots de passe d’application</em>, choisissez <em>Créer un mot de passe d’application</em>. Cela ne garantit pas l’acceptation de SMTP avec mot de passe.",
|
||||
"Si Microsoft crée ce mot de passe, copiez-le et vérifiez son acceptation par le service SMTP.",
|
||||
"Uniquement si SMTP avec mot de passe est autorisé, utilisez les paramètres approuvés : <em>Serveur</em> <code>smtp.office365.com</code> pour Exchange Online, <em>Port</em> <code>587</code>, <em>Mode TLS</em> <code>STARTTLS</code>, <em>Identifiant</em> votre adresse et <em>Mot de passe</em> la valeur autorisée. Outlook.com personnel a d’autres paramètres et exigences."
|
||||
"Uniquement si votre fournisseur autorise SMTP avec mot de passe, saisissez ses paramètres approuvés : <em>Hôte SMTP</em> <code>smtp.office365.com</code> pour Exchange Online, <em>Port</em> <code>587</code>, <em>Mode TLS</em> <code>STARTTLS</code>, <em>Nom d'utilisateur</em> l’adresse de votre boîte aux lettres et <em>Mot de passe</em> l’identifiant SMTP autorisé. Les paramètres et exigences d’authentification d’Outlook.com personnel sont différents ; ne supposez pas que ces identifiants fonctionneront."
|
||||
],
|
||||
"relayTitle": "Relais SMTP auto-hébergé",
|
||||
"relayBody": "Dirigez Monitor vers un relais SMTP contrôlé, par exemple Postfix. Le relais gère l’authentification du fournisseur. Configurez authentification et TLS selon le relais ; son caractère local ne désactive pas le chiffrement."
|
||||
@@ -266,7 +266,7 @@
|
||||
"howItems": [
|
||||
"<strong>Activation par canal.</strong> Désactivé par défaut. Activez-le seulement là où vous voulez un résumé ; les autres canaux restent en direct.",
|
||||
"<strong>Heure de livraison</strong> locale, 09:00 par défaut. L’envoi se déclenche à environ 60 s près.",
|
||||
"<strong>Inclus :</strong> événements génériques admissibles de niveau <strong>INFO</strong>, comme <em>mise à jour d’application disponible</em>, <em>mise à jour Tailscale disponible</em>, <em>mise à jour d’optimisation ProxMenux disponible</em>, <em>mises à jour de sécurité APT en attente</em> et <em>avis de limitation d’envoi</em>. Résultats de sauvegarde et actions exemptées restent en direct.",
|
||||
"<strong>Inclus dans le résumé :</strong> événements génériques admissibles de niveau <strong>INFO</strong>. Exemples : <em>mise à jour d’application disponible</em>, <em>mise à jour Tailscale disponible</em>, <em>mise à jour d’optimisation ProxMenux disponible</em> et <em>mises à jour de sécurité APT en attente</em>. Les résultats de sauvegarde et les autres événements d’action exemptés restent en direct.",
|
||||
"<strong>Ce qui n'est jamais retardé:</strong>",
|
||||
"<strong>Persistance.</strong> Les événements restent dans SQLite, table <code>digest_pending</code>, jusqu’à l’heure prévue, même après redémarrage.",
|
||||
"<strong>Sans événement, sans résumé.</strong> Aucun résumé vide n’est envoyé si aucun INFO n’attend."
|
||||
@@ -301,7 +301,7 @@
|
||||
{
|
||||
"stage": "Délai de répétition",
|
||||
"what": "Après livraison réussie, les répétitions sont supprimées ; l’état est dans <code>notification_last_sent</code>. Base pour <code>CRITICAL</code>, <code>WARNING</code>, <code>INFO</code>, <code>resources</code> et <code>updates</code> : 86400 s. Exceptions : 5 s pour actions VM/CT et arrêt/redémarrage, 10 s pour résultats sauvegarde/réplication, 1800–3600 s pour plusieurs états de santé. Les réglages explicites d’événement/groupe prévalent.",
|
||||
"tunable": "Oui : des valeurs explicites par événement ou groupe remplacent les valeurs du répartiteur."
|
||||
"tunable": "Uniquement via l’API des paramètres : une clé <code>cooldown.<event_type></code> ou <code>cooldown.<group></code> remplace les valeurs par défaut ; aucun contrôle n’existe dans l’interface."
|
||||
},
|
||||
{
|
||||
"stage": "Regroupement des rafales",
|
||||
@@ -330,7 +330,7 @@
|
||||
"<strong>Méthode et URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code> sans HTTPS Monitor ; avec HTTPS, récepteur HTTP local séparé sur 8009. Les deux restent sur l’hôte.",
|
||||
"<strong>Modèle du corps.</strong> JSON avec aides Handlebars natives de PVE, stocké en base64 dans la configuration. Une fois décodé :",
|
||||
"<strong>Matcher.</strong> Un bloc d'accompagnement <code>matcher: proxmenux-matcher</code> avec <code>mode all</code> afin que chaque notification PVE atteigne la cible.",
|
||||
"<strong>Configuration privée.</strong> La configuration écrit <code>webhook: proxmenux-webhook</code> dans <code>/etc/pve/priv/notifications.cfg</code> avec le secret partagé en base64. La cible publique le référence pour envoyer X-Webhook-Secret. Le bloc n’est pas vide."
|
||||
"<strong>Configuration privée.</strong> La configuration écrit le bloc correspondant <code>webhook: proxmenux-webhook</code> dans <code>/etc/pve/priv/notifications.cfg</code> avec une entrée <code>secret</code> nommée X-Webhook-Secret, encodée en base64. Le bloc public de la cible ne contient que le modèle du corps, la méthode et l’URL. Le bloc privé n’est pas une ébauche vide."
|
||||
],
|
||||
"securityTitle": "Comment le récepteur est sécurisé",
|
||||
"securityIntro": "Le récepteur webhook de <code>POST /api/notifications/webhook</code> applique différentes couches de sécurité selon l'origine de la demande:",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"reaching": {
|
||||
"heading": "Raggiungere la dashboard",
|
||||
"intro": "ProxMenux Monitor si lega a <code>0.0.0.0:8008</code>. Ci sono tre modi comuni per raggiungerlo:",
|
||||
"outro": "L’accesso diretto corrisponde all’unità systemd predefinita. Proxy inverso e Secure Gateway sono descritti più avanti. Per usare l’IP in <code>X-Forwarded-For</code> servono PROXMENUX_TRUST_PROXY=1 e un proxy sotto il tuo controllo. <code>X-Forwarded-Proto</code> o <code>X-Forwarded-Host</code> da soli non attivano tale fiducia; il frontend costruisce gli URL API dall’origine del browser."
|
||||
"outro": "L’accesso diretto corrisponde all’unità systemd predefinita. Proxy inverso e Secure Gateway sono descritti più avanti. Per fidarsi degli IP client in <code>X-Forwarded-For</code> servono PROXMENUX_TRUST_PROXY=1 e un proxy sotto il tuo controllo. La sola presenza di <code>X-Forwarded-Proto</code> o <code>X-Forwarded-Host</code> non attiva la fiducia nel proxy. Sulle porte 80/443 il frontend usa URL <code>/api/*</code> relativi; su qualsiasi altra porta chiama la porta 8008 sullo stesso nome host."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Procedura al primo avvio",
|
||||
@@ -117,8 +117,8 @@
|
||||
"loginImageCaption": "Dopo la configurazione, l’accesso inizia da questa schermata. Con 2FA viene richiesto il codice a sei cifre dopo l’accettazione della password.",
|
||||
"loginFlowTitle": "Flusso di accesso",
|
||||
"twofaIntro": "Con 2FA, la prima chiamata restituisce <code>requires_totp: true</code>. Ripetila con il codice a sei cifre:",
|
||||
"publicTitle": "Accesso pubblico e controlli protetti",
|
||||
"publicIntro": "Accesso e stato dell’autenticazione sono pubblici. La creazione dell’account è possibile finché non sono salvati nome e password, anche dopo aver rifiutato la protezione. I dati di sistema richiedono autenticazione quando la protezione è attiva:",
|
||||
"publicTitle": "Endpoint pubblici (senza token)",
|
||||
"publicIntro": "Accesso, stato dell’autenticazione, configurazione iniziale e l’endpoint leggero <code>/api/system-info</code> sono pubblici:",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code> e <code>/api/auth/status</code> sono pubblici. <code>/api/auth/setup</code> crea il primo account e rifiuta di sovrascrivere credenziali esistenti.",
|
||||
"<code>/api/system-info</code> è un endpoint pubblico con informazioni di base sul sistema, incluso <code>health.status</code>. Non richiede un token. Anche /api/auth/status è pubblico e consente di verificare la raggiungibilità."
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"asset": "Segreto TOTP della 2FA",
|
||||
"algorithm": "TOTP standard (RFC 6238), con segreto in base32. Gli otto codici di recupero sono monouso e vengono salvati come hash SHA-256.",
|
||||
"algorithm": "TOTP standard (RFC 6238), con segreto in base32. Gli otto codici di backup sono monouso e vengono salvati come hash SHA-256.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
@@ -243,17 +243,17 @@
|
||||
}
|
||||
],
|
||||
"backupTitle": "Perché servono i backup",
|
||||
"backupBody": "Se perdi il dispositivo, usa un codice di recupero salvato oppure ripristina un backup configurato in precedenza. Sincronizzazione cloud ed esportazioni variano per app: verifica che ripristinino davvero i segreti TOTP. L’accesso root all’host permette anche il recupero descritto sotto. Conserva una copia separata e sicura.",
|
||||
"backupBody": "Se perdi il dispositivo di autenticazione, usa un codice di backup salvato oppure ripristina l’app da un backup configurato in precedenza. Sincronizzazione cloud ed esportazioni locali variano per app: verifica che il metodo scelto ripristini davvero i segreti TOTP. L’accesso root all’host permette anche il recupero descritto sotto. Conserva un backup separato e sicuro.",
|
||||
"setupTitle": "Impostazione passo passo dal cruscotto",
|
||||
"setupImageAlt": "Schermo di configurazione 2FA con codice QR e codici di backup",
|
||||
"setupImageCaption": "La finestra 2FA mostra QR, segreto Base32 per inserimento manuale e otto codici di recupero monouso. Copiali prima di chiudere: non saranno mostrati di nuovo.",
|
||||
"setupImageCaption": "La finestra di configurazione 2FA mostra un QR, un segreto Base32 per l’inserimento manuale e, dopo la verifica, otto codici di backup monouso. Copia i codici prima di chiudere la finestra: non saranno mostrati di nuovo.",
|
||||
"setupSteps": [
|
||||
"<strong>Installa l’app di autenticazione sul telefono</strong> o apri il gestore di password. Basta farlo una volta: la stessa app può conservare i codici di tutti i servizi protetti.",
|
||||
"<strong>Accedi alla dashboard</strong> con nome utente e password.",
|
||||
"<strong>Apri la scheda Sicurezza</strong> e scegli <strong>Abilita 2FA</strong>. Il dialogo mostra QR, segreto Base32 e otto codici di recupero.",
|
||||
"<strong>Apri la scheda Sicurezza</strong> nella barra laterale della dashboard, poi fai clic su <strong>Abilita 2FA</strong> e <strong>Avvia la configurazione</strong>. Il dialogo mostra il QR e la chiave manuale; gli otto codici di backup compaiono dopo la verifica del codice.",
|
||||
"<strong>Aggiungi la voce all’app di autenticazione:</strong>",
|
||||
"<strong>Salva i codici di recupero.</strong> Conserva tutti e otto in un gestore di password, nota cifrata o copia cartacea sicura. Ciascuno funziona una volta se l’app non è disponibile.",
|
||||
"<strong>Conferma inserendo il codice attuale a sei cifre</strong> dell’app nel campo \"Codice di verifica\" e invia. Cambia ogni 30 secondi: se scade mentre lo scrivi, usa il successivo.",
|
||||
"<strong>Conferma inserendo il codice attuale a sei cifre</strong> dell’app nel campo \"Codice di verifica\" della finestra di configurazione e invia. Cambia ogni 30 secondi: se scade mentre lo scrivi, usa il successivo.",
|
||||
"<strong>Salva i codici di backup.</strong> Dopo la verifica, conserva tutti e otto in modo sicuro in un gestore di password, nota cifrata o copia cartacea sicura. Ciascuno funziona una volta se l’app di autenticazione non è disponibile.",
|
||||
"<strong>Fatto.</strong> 2FA è attivo. Al prossimo accesso verrà richiesta prima la password, poi il codice attuale a sei cifre."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
@@ -261,17 +261,17 @@
|
||||
"<em>Alternativa manuale</em> se non puoi scansionare, ad esempio sullo stesso telefono: <em>Aggiungi account</em> → <em>Inserisci chiave di configurazione</em>. Scegli un nome come <em>Proxmox Monitor</em>, incolla il segreto Base32, lascia <em>Tipo</em> su <em>Basato sul tempo</em> e salva."
|
||||
],
|
||||
"testTitle": "Prova prima di uscire",
|
||||
"testBody": "Mantieni la sessione attuale aperta e prova un nuovo accesso in una finestra privata <em>subito</em> dopo la configurazione. Se il codice fallisce, controlla gli orologi di server e telefono prima di chiudere la sessione valida. Se hai già perso l’accesso, usa un codice di recupero o modifica <code>auth.json</code> dalla shell dell’host.",
|
||||
"testBody": "Mantieni la sessione attuale aperta e prova un nuovo accesso in una finestra privata <em>subito</em> dopo la configurazione. Se il codice viene rifiutato, controlla gli orologi di server e telefono prima di uscire dalla sessione valida. Se hai già perso l’accesso, usa un codice di backup o modifica <code>auth.json</code> dalla shell dell’host.",
|
||||
"lostTitle": "Autenticatore perso",
|
||||
"lostIntro": "Tre metodi di recupero, dal meno al più invasivo:",
|
||||
"lostItems": [
|
||||
"<strong>Usa un codice di recupero.</strong> Inserisci uno degli otto nel campo TOTP. Funziona una volta; gli altri restano validi. Dopo l’accesso, riconfigura 2FA dalle impostazioni per ottenere otto nuovi codici.",
|
||||
"<strong>Usa un codice di backup.</strong> Inserisci uno degli otto codici salvati nel campo TOTP. Funziona una volta; i codici non usati restano validi. Dopo l’accesso apri Sicurezza, scegli <strong>Disattiva 2FA</strong> e poi <strong>Abilita 2FA</strong> per ottenere otto nuovi codici.",
|
||||
"<strong>Ripristina l’app da cloud o backup.</strong> Con sincronizzazione configurata, installala sul nuovo dispositivo e accedi: Google, Microsoft, Authy, Apple Passwords tramite Portachiavi iCloud, Ente o 2FAS. Con un file esportato da Aegis, Raivo o FreeOTP+, installa l’app e importa il file.",
|
||||
"<strong>Disattiva 2FA dalla shell dell’host.</strong> Se gli altri metodi non sono disponibili, modifica <code>/root/.config/proxmenux-monitor/auth.json</code> come root via SSH o console, imposta <code>totp_enabled</code> su <code>false</code>, salva e riavvia il servizio:"
|
||||
],
|
||||
"lostShellOutro": "È possibile accedere solo con nome utente + password, quindi abilitare 2FA da Impostazioni.",
|
||||
"disableTitle": "Disabilita 2FA",
|
||||
"disableBody": "Apri <strong>Sicurezza</strong> e scegli <strong>Disattiva 2FA</strong>. <code>POST /api/auth/totp/disable</code> richiede password attuale e codice TOTP o di recupero valido. Elimina segreto TOTP e codici di recupero. Rimuovi la vecchia voce anche dall’app.",
|
||||
"disableBody": "Apri <strong>Sicurezza</strong> e scegli <strong>Disattiva 2FA</strong>. <code>POST /api/auth/totp/disable</code> richiede la password attuale e un codice TOTP o di backup valido. Elimina il segreto TOTP e i codici di backup. Rimuovi la vecchia voce anche dall’app di autenticazione.",
|
||||
"rejectedTitle": "Il codice a sei cifre viene sempre rifiutato",
|
||||
"rejectedIntro": "TOTP dipende dall’ora: gli orologi di server e telefono devono differire di meno di circa 30 s. Due controlli:",
|
||||
"rejectedItems": [
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "Off per impostazione predefinita, singolo interruttore per abilitare",
|
||||
"body": "La riscrittura IA è disattivata per impostazione predefinita. Attivala in <em>Impostazioni → Notifiche → Avanzate: miglioramento IA</em>. Se il contesto aggiuntivo o la riscrittura falliscono, viene inviato il modello originale. Ogni riscrittura ha un tempo limite di 25 secondi; allo scadere si usa il modello senza attendere indefinitamente."
|
||||
"body": "La riscrittura IA è disattivata per impostazione predefinita. Attivala in <em>Impostazioni → Notifiche → Avanzate: miglioramento IA</em>. Se il contesto aggiuntivo o la riscrittura falliscono, il processo di invio manda il modello originale. Le riscritture nella coda di invio degli eventi hanno un tempo limite di 25 secondi; allo scadere si invia il modello invece di attendere."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Come funziona",
|
||||
@@ -109,7 +109,7 @@
|
||||
],
|
||||
"customNote": "La modalità con prompt personalizzato limita l’uscita a 500 token, indipendentemente dal livello di dettaglio. Il prompt è sotto il tuo controllo e il limite evita risposte eccessive.",
|
||||
"sizingTitle": "Pratico dimensionamento",
|
||||
"sizingBody": "Stima il consumo come eventi riscritti × canali IA × token in ingresso e uscita per chiamata. Esempio: 50 eventi × un canale × (500 in ingresso + 300 in uscita) = 40.000 token al giorno. Consumi e costi dipendono da modello, contesto, cache e limiti del provider. <link>Dettaglio per canale</link> spiega come usare <code>brief</code> nelle chat invece di <code>standard</code>, mantenendo e-mail dettagliate."
|
||||
"sizingBody": "Stima il consumo come eventi riscritti × canali con IA × token in ingresso e uscita per chiamata. Esempio: 50 eventi × un canale × (2.000 in ingresso + 300 in uscita) sono circa 115.000 token al giorno, perché il prompt di sistema predefinito da solo occupa circa 1.500 token. Consumi e costi reali dipendono da modello, contesto, cache e limiti del provider. La sezione <link>Dettaglio per canale</link> spiega come usare <code>brief</code> nelle chat invece di <code>standard</code>, mantenendo report e-mail dettagliati."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "Fornitori di AI",
|
||||
@@ -142,7 +142,7 @@
|
||||
"items": [
|
||||
"Chiave API: <a>console.anthropic.com/settings/keys</a>",
|
||||
"Esempi dall’elenco di modelli incluso: <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
|
||||
"Raccomandazione inclusa: <strong><code>claude-haiku-4-5-20251001</code></strong>. Questa versione precisa è configurata come consigliata; le vecchie voci Claude 3.5 non sono più nella lista inclusa."
|
||||
"Raccomandazione inclusa: <strong><code>claude-haiku-4-5-20251001</code></strong>, uno snapshot fisso anziché un alias variabile."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Crea un backup vzdump di VM o LXC. Campi facoltativi da adattare allo storage: <code>storage</code> (destinazione PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> o <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> o <code>none</code>), <code>protected</code> (<code>true</code> o <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> o <code>never</code>) e <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> o <code>data</code>). Restituisce l’UPID della task PVE."
|
||||
"use": "Crea un backup vzdump di una VM o di un LXC. Campi del corpo, tutti facoltativi salvo che i valori predefiniti non corrispondano alla struttura dello storage: <code>storage</code> (uno storage PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> o <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> o <code>none</code>), <code>protected</code> (<code>true</code> o <code>false</code>), <code>notes</code> e <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> o <code>data</code>). Restituisce l’UPID della task PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
@@ -286,7 +286,7 @@
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Avvia un autotest SMART. Schema del corpo: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
"use": "Avvia un autotest SMART. Schema del corpo: <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
|
||||
@@ -73,13 +73,13 @@
|
||||
"intro": "L’AppImage contiene un filesystem montato all’esecuzione. <code>AppRun</code> alla radice prepara l’ambiente e avvia <code>flask_server.py</code>:",
|
||||
"consequencesIntro": "Due conseguenze di questo layout:",
|
||||
"consequences": [
|
||||
"<strong>Ambiente Python incluso.</strong> Interprete e pacchetti sono nell’AppImage, senza installazione nel Python di sistema. L’app usa comunque interfacce del kernel e strumenti esterni dell’host.",
|
||||
"<strong>Pacchetti Python inclusi.</strong> I pacchetti Python sono distribuiti nell’AppImage e girano sull’interprete Python dell’host stesso, 3.11 (PVE 8) o 3.13 (PVE 9), senza installare nulla nel Python di sistema dell’host. L’app usa comunque interfacce del kernel e strumenti esterni dell’host.",
|
||||
"<strong>Client hardware inclusi.</strong> Sono presenti <code>ipmitool</code>, <code>lm-sensors</code> e <code>upsc</code>. Le letture richiedono hardware compatibile, accesso ai sensori e, per l’UPS, un server NUT configurato."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Struttura dell’applicazione Flask",
|
||||
"intro": "<code>flask_server.py</code> crea un’istanza <code>Flask(__name__)</code> con CORS limitato, registra direttamente nove blueprint e inizializza il terminale. La tabella mostra moduli principali; registra anche audit, backup VM e PBS. I precaricamenti PVE si eseguono solo sugli host PVE.",
|
||||
"intro": "<code>flask_server.py</code> crea un’istanza <code>Flask(__name__)</code> con origini CORS limitate, registra direttamente dieci blueprint e inizializza le rotte del terminale. La tabella mostra i moduli principali; sono registrati anche i blueprint di PBS, collegamenti del Monitor, audit e backup VM. I precaricamenti specifici di PVE si eseguono solo sugli host PVE.",
|
||||
"headerBlueprint": "Blueprint / modulo",
|
||||
"headerPrefix": "Prefisso delle rotte",
|
||||
"headerOwns": "Responsabilità",
|
||||
@@ -242,10 +242,10 @@
|
||||
"Aggiornamenti: pacchetti in attesa e patch di sicurezza.",
|
||||
"Log: schemi persistenti, picchi e sequenze a cascata nel journal di sistema.",
|
||||
"Memoria: interventi dell’OOM killer e pressione RAM prolungata.",
|
||||
"Temperatura: letture CPU e dischi rispetto alle soglie di monitoraggio; i sensori disponibili dipendono dall’hardware.",
|
||||
"CPU: utilizzo e temperatura della CPU rispetto alle soglie configurabili; i sensori disponibili dipendono dall’hardware.",
|
||||
"Sicurezza: errori di accesso, blocchi e stato del jail Fail2Ban."
|
||||
],
|
||||
"afterIntro": "I risultati usano <code>error_key</code>, categoria e gravità stabili. Le righe in <code>errors</code> vengono aggiornate con <code>last_seen</code> e contatori, senza duplicarle. L’invio delle notifiche ha anche impronte e intervalli propri.",
|
||||
"afterIntro": "I risultati usano <code>error_key</code>, categoria e gravità stabili. I record esistenti in <code>errors</code> vengono aggiornati sul posto (<code>last_seen</code>, gravità, motivo), senza duplicarli. L’invio delle notifiche ha anche regole proprie di impronta e intervallo.",
|
||||
"cycleEnd": "La pulizia può risolvere errori obsoleti con la <em>durata del silenziamento</em> per categoria e regole di stato, rimuovere voci orfane di risorse eliminate e cancellare <code>events</code> oltre 30 giorni. Le categorie sono in <link>Pannello → Health Monitor</link>."
|
||||
},
|
||||
"notifications": {
|
||||
@@ -264,9 +264,9 @@
|
||||
"intro": "La scheda <em>Terminale</em> collega un client leggero <code>xterm.js</code> a un PTY del server via WebSocket. Esistono due modalità:",
|
||||
"items": [
|
||||
"<strong>Modalità HTTP, predefinita:</strong> il server Flask integrato con <code>flask-sock</code> gestisce il passaggio al protocollo WebSocket.",
|
||||
"<strong>Modalità HTTPS / WSS:</strong> usa <code>gevent.pywsgi.WSGIServer</code> con <code>geventwebsocket.handler.WebSocketHandler</code> per WebSocket su TLS."
|
||||
"<strong>Modalità HTTPS / WSS:</strong> il server TLS usa <code>gevent.pywsgi.WSGIServer</code> con il suo gestore predefinito; <code>flask-sock</code> gestisce le connessioni WebSocket su TLS."
|
||||
],
|
||||
"outro": "I processi del terminale ereditano <code>User=root</code>. Con autenticazione attiva, WebSocket richiede un ticket breve monouso ottenuto dall’endpoint autenticato con permessi amministrativi. Se l’autenticazione è disattivata o rifiutata, la connessione segue quella modalità senza autenticazione.",
|
||||
"outro": "I processi figli del terminale ereditano <code>User=root</code> dal servizio. Aprire un WebSocket richiede un ticket breve monouso ottenuto dall’endpoint autenticato dei ticket del terminale con permessi amministrativi.",
|
||||
"proxyNote": "Con un proxy inverso, abilita WebSocket e le intestazioni <code>Upgrade</code> e <code>Connection</code>. Il terminale richiede questo inoltro."
|
||||
},
|
||||
"proxy": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
}
|
||||
],
|
||||
"reportTitle": "Rapporto sulla latenza di rete (PDF)",
|
||||
"reportIntro": "Entrambe le modalità hanno un pulsante <strong>Rapporto</strong> accanto alla destinazione. Genera un PDF delle misurazioni da allegare a una richiesta di assistenza al provider Internet.",
|
||||
"reportIntro": "Entrambe le modalità hanno un pulsante <strong>Rapporto</strong> accanto alla destinazione. Apre un report stampabile delle misurazioni; salvalo in PDF dalla finestra di stampa del browser e allegalo a una richiesta di assistenza al provider Internet.",
|
||||
"reportPreviewAlt": "Prima pagina PDF del rapporto di latenza: sintesi, indicatore, statistiche, grafico e guida alle soglie",
|
||||
"reportPreviewCaption": "La prima pagina contiene sintesi, indicatore, statistiche principali, andamento della latenza e guida alle soglie. Dalla pagina 2 seguono la tabella delle misurazioni e la metodologia.",
|
||||
"downloadLabel": "Scarica un rapporto di latenza di esempio (PDF)",
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
"configCaption": "Modifica del jail sshd: riduci <em>Max Retries</em> se accedi a SSH solo dalla tua sottorete, oppure aumenta <em>Ban Time</em> per la dashboard esposta a Internet.",
|
||||
"outro": "La guida <em>Installazione, configurazione e disinstallazione</em> include anche l’installazione manuale, la modifica di SSH MaxAuthTries e il registro <code>proxmenux-auth.log</code>. Vedi <link>ProxMenux → Sicurezza → Fail2Ban</link>.",
|
||||
"calloutTitle": "Senza Fail2Ban, questo meccanismo non blocca gli IP",
|
||||
"calloutBody": "ProxMenux Monitor controlla gli IP bloccati da Fail2Ban a <em>livello applicativo</em> prima di elaborare le richieste Flask. Interroga fail2ban-client e conserva il risultato in cache per 30 secondi; non legge una tabella SQL dei blocchi. Senza Fail2Ban, gli accessi falliti sono registrati in <code>proxmenux-auth.log</code>, ma questo meccanismo non blocca gli IP."
|
||||
"calloutBody": "ProxMenux Monitor controlla gli IP bloccati nella jail <code>proxmenux</code> di Fail2Ban a <em>livello applicativo</em> prima di elaborare le richieste Flask, conservando il risultato in cache per 30 secondi. Senza Fail2Ban, gli accessi falliti sono registrati in <code>proxmenux-auth.log</code> e l’endpoint di login è limitato a 5 tentativi per IP ogni 5 minuti, ma nessun IP viene bloccato."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Audit di sicurezza Lynis",
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Soglie di Health Monitor",
|
||||
"intro": "La scheda precedente imposta <em>il silenzio dopo aver ignorato un avviso</em>; questa regola <strong>il valore che attiva un avviso</strong>. La maggior parte dei controlli ha valori <strong>Avviso</strong> e <strong>Critico</strong> modificabili. La tabella spiega eccezioni come la regola combinata dello swap e il rilevatore RAM attuale.",
|
||||
"intro": "La scheda precedente imposta <em>il silenzio dopo aver ignorato un avviso</em>; questa regola <strong>il valore che attiva un avviso</strong>. La maggior parte dei controlli a soglia ha valori <strong>Avviso</strong> e <strong>Critico</strong> modificabili. La tabella sotto spiega eccezioni come la regola combinata dello swap.",
|
||||
"whatForTitle": "A cosa serve",
|
||||
"whatForIntro": "I valori predefiniti sono un punto di partenza, ma ogni ambiente ha condizioni proprie:",
|
||||
"whatForItems": [
|
||||
@@ -85,7 +85,7 @@
|
||||
"Scegli le soglie di temperatura secondo le specifiche del disco e le condizioni reali. Il raffreddamento passivo o forzato non determina da solo un limite sicuro universalmente più basso o alto.",
|
||||
"Un host molto virtualizzato può avere picchi CPU durante le compilazioni senza avvisare a ogni picco dell’80%, ma deve segnalare una saturazione prolungata."
|
||||
],
|
||||
"whatForOutro": "Le modifiche supportate valgono <strong>dall’analisi successiva</strong>. Health Monitor legge <code>/usr/local/share/proxmenux/health_thresholds.json</code> a ogni ciclo senza riavvio. Alcuni indicatori, come la temperatura dei dischi, usano questi valori; alcune barre di capacità hanno limiti propri. La riga RAM descrive un’eccezione attuale.",
|
||||
"whatForOutro": "Le modifiche supportate alle soglie valgono <strong>dall’analisi successiva</strong>. Health Monitor legge <code>/usr/local/share/proxmenux/health_thresholds.json</code> a ogni ciclo senza riavvio. Alcuni indicatori, tra cui la temperatura dei dischi, usano questi valori; alcune barre di capacità mantengono limiti visivi propri.",
|
||||
"coloursTitle": "Colori degli stati Avviso e Critico",
|
||||
"coloursIntro": "I widget che usano Avviso/Critico seguono i tre stati sotto. Altri indicatori, come le barre di capacità PVE, hanno limiti propri; il loro colore da solo non dimostra un avviso Health Monitor.",
|
||||
"headerColour": "Colore",
|
||||
@@ -125,7 +125,7 @@
|
||||
"section": "Memoria",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Pressione RAM dell’host. Il valore configurabile mostra Critico al 95%, ma il rilevatore attuale usa una regola fissa del 90% prolungato; cambiare l’impostazione non modifica attualmente quel ramo."
|
||||
"gates": "Pressione RAM dell’host."
|
||||
},
|
||||
{
|
||||
"section": "Swap (solo soglia critica)",
|
||||
@@ -185,7 +185,7 @@
|
||||
"section": "Storage PVE",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Storage gestiti da PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph e PBS. Non sono tutti backend a blocchi."
|
||||
"gates": "Solo gli storage PVE di tipo LVM, LVM-thin, ZFS-pool, RBD, CephFS e PBS. Gli storage directory, NFS e CIFS sono coperti dalla riga dello spazio su disco dell’host."
|
||||
},
|
||||
{
|
||||
"section": "Pool ZFS",
|
||||
@@ -218,7 +218,7 @@
|
||||
"toggleTitle": "Opzione di notifica legata al rilevamento",
|
||||
"toggleBody": "L’opzione <code>lxc_updates_available</code> per canale in <strong>Notifiche → Servizi</strong> appare solo con rilevamento attivo. Disattivandolo, la riga scompare da tutti i canali. La preferenza resta nel database e ritorna al valore precedente alla riattivazione.",
|
||||
"purgeTitle": "Cosa viene rimosso disattivando il rilevamento",
|
||||
"purgeBody": "Disattivandolo si rimuovono subito le voci <code>type=lxc</code> da <code>/usr/local/share/proxmenux/managed_installs.json</code>. I contatori degli aggiornamenti LXC in Hardware spariscono al prossimo aggiornamento. Riattivandolo, il ciclo successivo ripopola il registro, o prima tramite aggiornamento manuale dell’API."
|
||||
"purgeBody": "Disattivandolo si rimuovono subito tutte le voci <code>type=lxc</code> da <code>/usr/local/share/proxmenux/managed_installs.json</code>. I contatori degli aggiornamenti LXC nella scheda VM e LXC spariscono al prossimo aggiornamento della dashboard. Riattivandolo, il ciclo di rilevamento successivo ripopola il registro, o prima tramite aggiornamento manuale dell’API."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Esclusioni storage remoto",
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"items": [
|
||||
"<strong>Percorso del dispositivo</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Etichetta del tipo</strong> — SATA / NVMe e relativa icona.",
|
||||
"<strong>Etichetta di sistema</strong> — indicatore arancione dei dischi identificati come dischi del sistema operativo. Il rilevamento usa i montaggi <code>/</code> e <code>/boot</code> e assegna <em>System</em>. L’assenza dell’etichetta non dimostra che il disco possa essere cancellato o riutilizzato senza rischi.",
|
||||
"<strong>Etichetta di sistema</strong> — indicatore arancione dei dischi usati dall’host: punti di montaggio di sistema (<code>/</code>, <code>/boot</code>, <code>/usr</code>, <code>/var</code>…), swap attivo, membri di pool ZFS, volumi fisici LVM, membri RAID attivi o etichette di partizioni di sistema. L’assenza dell’etichetta non dimostra che il disco possa essere cancellato o riutilizzato senza rischi.",
|
||||
"<strong>Modello</strong> — produttore e modello da <code>smartctl -i</code>.",
|
||||
"<strong>Capacità</strong> — espressa in unità leggibili.",
|
||||
"<strong>Temperatura</strong> — valore attuale in °C, colorato secondo il tipo di disco; NVMe usa soglie più alte di SATA.",
|
||||
@@ -112,7 +112,7 @@
|
||||
"pdfPreviewAlt": "Prima pagina del rapporto SMART con sintesi, indicatore PASSED e informazioni sul disco",
|
||||
"pdfPreviewCaption": "Prima pagina: sintesi, indicatore PASSED e informazioni complete del disco. Il PDF di esempio include usura SSD, tutti gli attributi SMART e cronologia dei test.",
|
||||
"pdfDownloadLabel": "Scarica un rapporto SMART di esempio (PDF)",
|
||||
"pdfSectionsIntro": "Il rapporto ha sei sezioni principali:",
|
||||
"pdfSectionsIntro": "Il rapporto include queste sezioni principali:",
|
||||
"pdfSections": [
|
||||
"<strong>Sintesi</strong> — stato PASSED/FAILED, valutazione chiara del disco — regolare, usurato o guasto — e quattro dati: data del rapporto, ultimo tipo di test, risultato e attributi controllati.",
|
||||
"<strong>Informazioni sul disco</strong> — modello, serie, capacità, tipo HDD/SSD/NVMe, famiglia, formato, interfaccia (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura e soglia ottimale, ore e cicli di accensione, SMART, settori in attesa/riallocati ed errori CRC.",
|
||||
@@ -127,7 +127,7 @@
|
||||
"historyImageCaption": "Cronologia SMART del disco. Ogni riga mostra tipo, data e ora, anzianità, indicatore dell’ultimo test e azioni di download dell’output <code>smartctl</code> ed eliminazione.",
|
||||
"historyIntro": "Test brevi ed estesi completati e conservati per il disco. Ogni voce contiene l’output originale <code>smartctl</code> e i campi interpretati da Monitor per la dashboard. Azioni per riga:",
|
||||
"historyItems": [
|
||||
"<strong>Scarica</strong> — salva lo snapshot JSON con i dati <code>smartctl -a</code> usati dal rapporto. Utile se il supporto richiede i campi diagnostici originali.",
|
||||
"<strong>Scarica</strong> — salva lo snapshot JSON di quel test (output di <code>smartctl -a --json</code>, o <code>nvme smart-log</code> su NVMe quando smartctl fallisce). Utile se il supporto del produttore richiede i campi diagnostici originali.",
|
||||
"<strong>Elimina</strong> — rimuove manualmente un test dalla cronologia. La conservazione in Pianificazione (<em>ultimi 5 / 10 / 20</em>) elimina automaticamente i più vecchi."
|
||||
],
|
||||
"scheduleTitle": "Scheda 4 — Pianificazione",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Pannello: VM e LXC | Documentazione ProxMenux",
|
||||
"description": "Inventario dei guest con CPU, memoria e disco in tempo reale. I dettagli includono configurazione, risorse, backup, risultati recenti del log Proxmox, note e Avvia / Spegni / Riavvia / Forza arresto."
|
||||
"description": "La scheda VM e LXC elenca ogni guest dell’host con utilizzo di CPU, memoria e disco in tempo reale. I dettagli per guest includono configurazione, risorse, backup, log della console dei container OCI, note e i comandi Avvia / Spegni / Riavvia / Forza arresto."
|
||||
},
|
||||
"header": {
|
||||
"title": "Pannello: VM e LXC",
|
||||
"description": "Inventario completo dei guest del nodo: quattro metriche in alto, elenco ordinabile di VM e LXC e dettagli per guest con configurazione, risorse, backup, log e comandi Avvia / Spegni / Riavvia / Forza arresto.",
|
||||
"description": "Inventario completo dei guest del nodo: quattro metriche in alto, elenco ordinabile di ogni VM e LXC sotto e dettagli per guest con configurazione, risorse, backup, log della console dei container OCI e i quattro comandi del ciclo di vita (Avvia / Spegni / Riavvia / Forza arresto).",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Controlli dei sistemi guest",
|
||||
"body": "Questa scheda controlla il ciclo di vita dei guest. Le azioni passano da <code>POST /api/vms/<vmid>/control</code> con conferma esplicita e aggiornano la riga del guest. L'arresto forzato richiede il pulsante dedicato Forza arresto."
|
||||
"body": "Questa scheda controlla il ciclo di vita dei guest. Le azioni del ciclo di vita passano da <code>POST /api/vms/<vmid>/control</code>; Riavvia e Forza arresto chiedono di digitare il VMID per confermare, e la risposta si riflette nella riga del guest. L’arresto forzato richiede il pulsante dedicato Forza arresto."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Riga superiore: quattro schede statistiche",
|
||||
@@ -186,9 +186,9 @@
|
||||
"source": "Dati RRD PVE (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) adattati alla visualizzazione in grafico."
|
||||
},
|
||||
{
|
||||
"section": "Risultati recenti del log Proxmox",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "<code>pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000</code>. Se il comando fallisce restituisce uno elenco vuoto; non fornisce tutti i log interni del guest."
|
||||
"section": "Log della console OCI (scheda Log)",
|
||||
"endpoint": "/api/lxc/<vmid>/console-log",
|
||||
"source": "Output della console del processo principale dell’immagine, letto da <code>/var/log/proxmenux/oci/<vmid>.console.log</code> sull’host. Mostrato solo per i container OCI."
|
||||
},
|
||||
{
|
||||
"section": "Backup disponibili per gli ospiti",
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
{
|
||||
"category": "Archiviazione",
|
||||
"checks": "Archivi Proxmox, filesystem radice",
|
||||
"events": "Soglie di spazio superate sulla radice o su altri filesystem monitorati (85% avviso / 95% critico per impostazione predefinita); esportazione NFS offline; autenticazione CIFS fallita; pool LVM-thin pieno."
|
||||
"events": "Soglie di spazio superate sulla radice o su altri filesystem monitorati (85% avviso / 95% critico per impostazione predefinita); storage PVE non disponibili; montaggi NFS/CIFS bloccati o inaspettatamente in sola lettura; storage LVM-thin e altri pool che superano le stesse soglie."
|
||||
},
|
||||
{
|
||||
"category": "Disco e SMART",
|
||||
@@ -98,7 +98,7 @@
|
||||
{
|
||||
"category": "Aggiornamenti di sistema",
|
||||
"checks": "Aggiornamenti di attesa, aggiornamenti di sicurezza, versione kernel / PVE, età del sistema",
|
||||
"events": "Aggiornamenti di sicurezza o del kernel in uso in attesa; sistema non aggiornato da molto tempo. Nell’intestazione della panoramica appare <em>Aggiorna ora</em> quando ci sono aggiornamenti. Avvia l’intera procedura ProxMenux; alla chiusura aggiorna lo stato con <code>?refresh=1</code> senza attendere il ciclo successivo."
|
||||
"events": "Aggiornamenti di sicurezza o del kernel in uso in attesa; sistema non aggiornato da molto tempo. La categoria Aggiornamenti della finestra Stato di salute mostra il pulsante <em>Aggiorna ora</em> quando ci sono aggiornamenti in attesa. Avvia l’intera procedura di aggiornamento ProxMenux nella finestra stessa; alla chiusura aggiorna lo stato con <code>?refresh=1</code>, così l’indicatore riflette il nuovo stato senza attendere il ciclo successivo."
|
||||
},
|
||||
{
|
||||
"category": "Sicurezza e certificati",
|
||||
@@ -158,7 +158,7 @@
|
||||
},
|
||||
"dismiss": {
|
||||
"heading": "Silenziare gli avvisi e scegliere la durata",
|
||||
"intro": "Alcuni eventi persistono, come <em>Aggiornamenti di sistema: aggiornamenti disponibili</em> finché non aggiorni l’host. Non serve una notifica ogni cinque minuti. Il pulsante <em>Aggiorna ora</em> nella panoramica risolve direttamente questo caso. Per gli altri casi o gli aggiornamenti rimandati sono disponibili due meccanismi collegati per silenziare gli avvisi:",
|
||||
"intro": "Alcuni eventi persistono per natura, come <em>Aggiornamenti di sistema: aggiornamenti disponibili</em> finché non aggiorni l’host, e una notifica ogni cinque minuti per una settimana non serve. Il pulsante <em>Aggiorna ora</em> nella categoria Aggiornamenti della finestra Stato di salute risolve direttamente questo caso. Per gli altri casi o gli aggiornamenti rimandati il monitor offre anche due meccanismi collegati per silenziare gli avvisi:",
|
||||
"step1": "<strong>Silenziare un singolo evento</strong> nella finestra. Il menu offre <strong>24 ore</strong>, <strong>7 giorni</strong> o <strong>Permanentemente</strong>, indipendentemente dalla categoria. La scelta invia <code>POST /api/health/acknowledge</code> con <code>error_key</code> e <code>suppression_hours</code> (<code>-1</code> per permanente). L’evento passa tra i silenziati con data <code>acknowledged_at</code>.",
|
||||
"dropdownImageAlt": "Menu per silenziare un avviso: 24 ore, 7 giorni o permanentemente",
|
||||
"dropdownImageCaption": "La durata scelta vale solo per questo avviso; senza scelta individuale si usa il valore della categoria. Gli avvisi silenziati permanentemente hanno un’etichetta ambra <em>Permanente</em> e normalmente non si riattivano. La temperatura critica della CPU è l’eccezione descritta sotto.",
|
||||
@@ -187,7 +187,7 @@
|
||||
},
|
||||
{
|
||||
"finding": "ZFS pool DEGRADED / FAULTED",
|
||||
"why": "I controlli di capacità dei pool ZFS consentono il silenziamento. Gli altri rilevamenti seguono il proprio indicatore. Il riconoscimento non ripara un pool degradato o guasto."
|
||||
"why": "I rilevamenti sullo stato dei pool ZFS (DEGRADED, FAULTED, UNAVAIL) consentono esplicitamente il silenziamento, così come i controlli di capacità dei pool. Il riconoscimento non ripara un pool degradato o guasto."
|
||||
},
|
||||
{
|
||||
"finding": "Errori del disco I/O con SMART FAILED",
|
||||
@@ -289,7 +289,7 @@
|
||||
},
|
||||
"rest": {
|
||||
"heading": "Endpoint REST",
|
||||
"intro": "Le azioni della finestra sono disponibili via API per script, dashboard o bot. Con autenticazione del Monitor attiva serve un token Bearer valido, ottenuto con l’accesso o nella schermata dei token API. Le modifiche, come riconoscere avvisi, salvare o pulire errori orfani, richiedono full_admin; read_only riceve 403. Con autenticazione disattivata o rifiutata, questi controlli consentono accesso senza token.",
|
||||
"intro": "Le azioni della finestra sono disponibili anche via API per script, dashboard personalizzate o bot. Le chiamate richiedono un token Bearer valido, ottenuto con l’accesso o nella schermata dei token API. Le modifiche, come riconoscere avvisi, salvare le impostazioni di soppressione o pulire errori orfani, richiedono l’ambito full_admin; read_only riceve 403.",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerMethod": "Metodo",
|
||||
"headerUse": "Uso",
|
||||
@@ -297,7 +297,7 @@
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Controllo leggero che restituisce JSON con <code>status</code>, <code>timestamp</code> e <code>version</code>. Adatto ai controlli per parola chiave Uptime Kuma; con autenticazione del Monitor attiva il client deve inviare un’intestazione Bearer."
|
||||
"use": "Controllo leggero che restituisce JSON con <code>status</code>, <code>timestamp</code> e <code>version</code>. Adatto ai controlli per parola chiave Uptime Kuma; il client deve inviare un’intestazione Bearer."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Terminale",
|
||||
"description": "Shell host e console VM/CT supportate nel browser tramite <code>xterm.js</code> e WebSocket. Segue l’autenticazione configurata: se disabilitata o rifiutata, i client con accesso di rete possono aprire sessioni senza login. Non implica un audit di ogni comando."
|
||||
"description": "Shell host e console VM/CT supportate nel browser tramite <code>xterm.js</code> e WebSocket. Le sessioni non sono sottoposte ad audit per singolo comando."
|
||||
},
|
||||
{
|
||||
"name": "Sicurezza",
|
||||
@@ -114,7 +114,7 @@
|
||||
"heading": "REST API e integrazioni",
|
||||
"intro": "Gli endpoint REST espongono dati di monitoraggio JSON via HTTP/HTTPS per Homepage, Home Assistant, Uptime Kuma e script. Grafana può usare l’esportatore testuale Prometheus separato su <code>/api/prometheus</code>. Le richieste possono usare <code>curl</code>.",
|
||||
"tokens": "I token API a lunga durata (365 giorni) vengono generati in <strong>Impostazioni → Token di accesso API</strong> o tramite <code>POST /api/auth/generate-api-token</code>.",
|
||||
"bearer": "Invia i token con <code>Authorization: Bearer …</code>. L’endpoint pubblico <code>/api/health</code> serve ai controlli di disponibilità senza credenziali. Sotto <code>/api/auth/*</code> ci sono rotte pubbliche di configurazione/login/stato e rotte protette per account e token; non sono tutte anonime.",
|
||||
"bearer": "Invia i token con <code>Authorization: Bearer …</code>. Anche <code>/api/health</code> richiede l’intestazione Bearer, quindi i controlli di disponibilità necessitano di un token read_only. Sotto <code>/api/auth/*</code> ci sono sia rotte pubbliche di configurazione/login/stato sia rotte protette per account e token; non sono tutte anonime.",
|
||||
"catalog": "Catalogo degli endpoint, rotazione dei token e sicurezza sono nel <linkApi>Riferimento API</linkApi>; esempi per Homepage, Home Assistant, Grafana, Uptime Kuma e cURL sono in <linkIntegrations>Integrazioni</linkIntegrations>."
|
||||
},
|
||||
"serviceControl": {
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
"heading": "n8n, Zapier e script personalizzati",
|
||||
"intro": "Workflow e script possono <em>inviare</em> notifiche con POST a <code>/api/notifications/send</code>, per esempio dopo un errore CI o un’attività troppo lunga. L’invio diretto salta coda e intervallo tra impronte degli eventi. Mantiene formato per canale, IA facoltativa e consegna. Gestisci gli eventuali duplicati nel chiamante.",
|
||||
"n8nBody": "In n8n usa un nodo <em>HTTP Request</em> con POST, URL sopra e lo stesso JSON di curl. Scegli credenziali generiche Header Auth: nome <em>Authorization</em> e valore <code>Bearer YOUR_API_TOKEN</code>, sostituendo il segnaposto. Collega una pianificazione, webhook o altro nodo per avviare la richiesta.",
|
||||
"severityBody": "La gravità usa <code>INFO</code>, <code>WARNING</code> o <code>CRITICAL</code> in maiuscolo. L’oggetto <code>data</code> fornisce contesto. L’IA usa titolo e messaggio prodotti con gli arricchimenti supportati; non tutti i campi sono garantiti nel prompt o nell’output. Vedi <link>Notifiche → Catalogo eventi</link>."
|
||||
"severityBody": "La gravità usa <code>INFO</code>, <code>WARNING</code> o <code>CRITICAL</code> in maiuscolo. L’oggetto <code>data</code> fornisce il contesto dell’evento e i campi del modello. Su questo endpoint la riscrittura IA riceve solo titolo e messaggio; i campi in <code>data</code> non vengono inviati al provider. Vedi <link>Notifiche → Catalogo eventi</link> per il significato degli eventi."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Webhook nativo Proxmox VE (in ingresso)",
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
"Apri <a>account.microsoft.com/security</a> e attiva la verifica in due passaggi.",
|
||||
"Se disponibile, apri <em>Opzioni di sicurezza avanzate</em> → <em>Password per le app</em> → <em>Crea una nuova password per app</em>. La sua presenza non prova che il servizio accetti SMTP con password.",
|
||||
"Se Microsoft genera una password per app, copiala e verifica che il servizio SMTP la accetti.",
|
||||
"Solo se è consentito SMTP con password, usa i parametri approvati: <em>Server</em> <code>smtp.office365.com</code> per Exchange Online, <em>Porta</em> <code>587</code>, <em>Modalità TLS</em> <code>STARTTLS</code>, <em>Nome utente</em> con l’indirizzo email e <em>Password</em> con la credenziale consentita. Outlook.com personale ha requisiti differenti; non presumere che funzioni."
|
||||
"Solo se il provider consente SMTP con password, inserisci i parametri approvati: <em>Host SMTP</em> <code>smtp.office365.com</code> per Exchange Online, <em>Porta</em> <code>587</code>, <em>Modalità TLS</em> <code>STARTTLS</code>, <em>Nome utente</em> con l’indirizzo della casella e <em>Password</em> con la credenziale SMTP consentita. Outlook.com personale ha impostazioni e requisiti di autenticazione differenti; non presumere che queste credenziali funzionino."
|
||||
],
|
||||
"relayTitle": "Relay SMTP gestito da te",
|
||||
"relayBody": "Puoi usare un relay SMTP sotto il tuo controllo, come Postfix, che gestisca l’autenticazione a monte. Imposta credenziali e TLS di Monitor in base al relay: usare un relay locale non disattiva di per sé la cifratura."
|
||||
@@ -266,7 +266,7 @@
|
||||
"howItems": [
|
||||
"<strong>Attivazione per canale.</strong> Disattivato inizialmente. Attivalo solo sui canali dove desideri un riepilogo; gli altri mantengono gli invii immediati.",
|
||||
"<strong>Ora di invio</strong> nel fuso locale, inizialmente 09:00. Puoi cambiarla; il processo invia entro circa 60 secondi dal minuto impostato.",
|
||||
"<strong>Nel riepilogo:</strong> eventi generici idonei di livello <strong>INFO</strong>, come <em>aggiornamenti applicazioni</em>, <em>aggiornamenti Tailscale</em>, <em>aggiornamenti ottimizzazioni ProxMenux</em>, <em>aggiornamenti di sicurezza APT</em> e <em>avvisi di limite di frequenza</em>. Risultati backup e altre azioni escluse restano immediati.",
|
||||
"<strong>Nel riepilogo:</strong> eventi generici idonei di livello <strong>INFO</strong>. Ad esempio <em>aggiornamenti applicazioni</em>, <em>aggiornamenti Tailscale</em>, <em>aggiornamenti ottimizzazioni ProxMenux</em> e <em>aggiornamenti di sicurezza APT</em>. Risultati backup e altri eventi di azione esclusi restano immediati.",
|
||||
"<strong>Che cosa non è mai ritardato:</strong>",
|
||||
"<strong>Persistenza.</strong> Gli eventi restano in SQLite, nella tabella <code>digest_pending</code>, fino all’ora scelta e sopravvivono ai riavvii di Monitor.",
|
||||
"<strong>Nessun evento, nessun riepilogo.</strong> Non invia messaggi vuoti quando non ci sono eventi INFO da riepilogare."
|
||||
@@ -301,7 +301,7 @@
|
||||
{
|
||||
"stage": "Intervallo fra invii",
|
||||
"what": "Dopo un invio riuscito, sopprime le ripetizioni e salva lo stato in <code>notification_last_sent</code>. Valori base: 86 400 s per <code>CRITICAL</code>, <code>WARNING</code>, <code>INFO</code>, <code>resources</code> e <code>updates</code>. Eccezioni: 5 s per azioni VM/CT e spegnimento/riavvio host, 10 s per risultati backup/replica, 1 800–3 600 s per varie categorie di integrità. Impostazioni esplicite per evento/gruppo prevalgono.",
|
||||
"tunable": "Sì: le impostazioni esplicite dell’intervallo per evento o gruppo sostituiscono i valori predefiniti del processo di invio."
|
||||
"tunable": "Solo tramite l’API delle impostazioni: una chiave <code>cooldown.<event_type></code> o <code>cooldown.<group></code> sostituisce i valori predefiniti; nell’interfaccia non c’è alcun controllo."
|
||||
},
|
||||
{
|
||||
"stage": "Aggregazione eventi ravvicinati",
|
||||
@@ -330,7 +330,7 @@
|
||||
"<strong>Metodo e URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code> senza HTTPS Monitor. Con HTTPS usa il listener HTTP locale separato sulla porta 8009. Entrambi restano sullo stesso host.",
|
||||
"<strong>Modello del corpo.</strong> Usa gli helper Handlebars di PVE. PVE lo salva codificato in base64; il contenuto JSON è:",
|
||||
"<strong>Matcher.</strong> Un compagno blocco <code>matcher: proxmenux-matcher</code> con <code>mode all</code> così ogni notifica PVE raggiunge l'obiettivo.",
|
||||
"<strong>Configurazione privata.</strong> Crea il blocco <code>webhook: proxmenux-webhook</code> in <code>/etc/pve/priv/notifications.cfg</code> con il segreto condiviso in base64. Il destinatario pubblico lo usa per X-Webhook-Secret. Il blocco non è vuoto."
|
||||
"<strong>Configurazione privata.</strong> La configurazione scrive il blocco corrispondente <code>webhook: proxmenux-webhook</code> in <code>/etc/pve/priv/notifications.cfg</code> con una voce <code>secret</code> chiamata X-Webhook-Secret, codificata in base64. Il blocco pubblico del destinatario contiene solo modello del corpo, metodo e URL. Il blocco privato non è uno stub vuoto."
|
||||
],
|
||||
"securityTitle": "Come il ricevitore è protetto",
|
||||
"securityIntro": "Il ricevitore webhook a <code>POST /api/notifications/webhook</code> applica diversi livelli di sicurezza a seconda di dove proviene la richiesta:",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"reaching": {
|
||||
"heading": "Alcançar o painel",
|
||||
"intro": "ProxMenux Monitor liga-se a <code>0.0.0.0:8008</code>. Há três maneiras comuns de alcançá-lo:",
|
||||
"outro": "O acesso direto corresponde à unidade systemd predefinida. O proxy inverso e o Secure Gateway são descritos abaixo. Os IP em <code>X-Forwarded-For</code> exigem PROXMENUX_TRUST_PROXY=1 e um proxy sob o seu controlo. <code>X-Forwarded-Proto</code> ou <code>X-Forwarded-Host</code> não ativam essa confiança por si só; o frontend constrói os URL API a partir da origem do navegador."
|
||||
"outro": "O acesso direto corresponde à unidade systemd predefinida. O proxy inverso e o Secure Gateway são descritos abaixo. Confiar nos IP de cliente em <code>X-Forwarded-For</code> exige PROXMENUX_TRUST_PROXY=1 e um proxy sob o seu controlo. A simples presença de <code>X-Forwarded-Proto</code> ou <code>X-Forwarded-Host</code> não ativa a confiança no proxy. Nas portas 80/443, o frontend usa URL <code>/api/*</code> relativos; em qualquer outra porta, chama a porta 8008 no mesmo nome de anfitrião."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Procedimento do primeiro arranque",
|
||||
@@ -117,8 +117,8 @@
|
||||
"loginImageCaption": "Uma vez configurada a autenticação, cada visita ao painel começa aqui. Com o 2FA ativado, a tela pede o código 6 dígitos em um segundo passo após a senha ser aceita.",
|
||||
"loginFlowTitle": "Fluxo de login",
|
||||
"twofaIntro": "Com 2FA ativo, a primeira chamada devolve <code>requires_totp: true</code>. Repita-a com o código de seis dígitos:",
|
||||
"publicTitle": "Acesso público e verificações protegidas",
|
||||
"publicIntro": "O início de sessão e o estado da autenticação são públicos. Pode criar a conta enquanto não houver utilizador e palavra-passe guardados, mesmo após recusar a proteção. Os dados do sistema exigem autenticação quando a proteção está ativa:",
|
||||
"publicTitle": "Endpoints públicos (sem token)",
|
||||
"publicIntro": "O início de sessão, o estado da autenticação, a configuração inicial e o endpoint leve <code>/api/system-info</code> são públicos:",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code> e <code>/api/auth/status</code> são públicos. <code>/api/auth/setup</code> cria a primeira conta e recusa substituir credenciais existentes.",
|
||||
"<code>/api/system-info</code> é um endpoint público com informações básicas do sistema, incluindo <code>health.status</code>. Não exige token. /api/auth/status também é público e permite verificar a disponibilidade."
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"asset": "Segredo TOTP de 2FA",
|
||||
"algorithm": "TOTP padrão (RFC 6238), com segredo codificado em base32. Os oito códigos de recuperação são de utilização única e guardados como hashes SHA-256.",
|
||||
"algorithm": "TOTP padrão (RFC 6238), com segredo codificado em base32. Os oito códigos de backup são de utilização única e guardados como hashes SHA-256.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
@@ -243,17 +243,17 @@
|
||||
}
|
||||
],
|
||||
"backupTitle": "Porque são importantes as cópias de segurança",
|
||||
"backupBody": "Se perder o dispositivo, use um código de recuperação guardado ou restaure uma cópia configurada previamente. A sincronização na nuvem e as exportações variam por aplicação: verifique se restauram os segredos TOTP. O acesso root ao anfitrião também permite a recuperação descrita abaixo. Guarde uma cópia separada e segura.",
|
||||
"backupBody": "Se perder o dispositivo autenticador, use um código de backup guardado ou restaure a aplicação a partir de uma cópia configurada previamente. A sincronização na nuvem e as exportações locais variam por aplicação: verifique se o método escolhido restaura de facto os segredos TOTP. O acesso root ao anfitrião também permite a recuperação descrita abaixo. Guarde uma cópia separada e segura.",
|
||||
"setupTitle": "Configuração passo a passo do painel",
|
||||
"setupImageAlt": "Tela de configuração 2FA com código QR e códigos de backup",
|
||||
"setupImageCaption": "O diálogo 2FA mostra um QR, o segredo Base32 para introdução manual e oito códigos de recuperação de utilização única. Copie-os antes de fechar: não serão apresentados novamente.",
|
||||
"setupImageCaption": "O diálogo de configuração 2FA mostra um QR, um segredo Base32 para introdução manual e, após a verificação, oito códigos de backup de utilização única. Copie os códigos antes de fechar o diálogo: não serão apresentados novamente.",
|
||||
"setupSteps": [
|
||||
"<strong>Instale o aplicativo autenticador no telefone</strong> (ou abra o gerenciador de senhas). Um dos aplicativos da tabela acima. Você só precisa fazer isso uma vez — o mesmo aplicativo irá conter códigos para cada serviço que você protege.",
|
||||
"<strong>Fazer login no painel</strong> com seu nome de usuário e senha.",
|
||||
"<strong>Abra o separador Segurança</strong> e escolha <strong>Ativar 2FA</strong>. O diálogo mostra QR, segredo Base32 e oito códigos de recuperação.",
|
||||
"<strong>Abra o separador Segurança</strong> na barra lateral do painel e clique em <strong>Ativar 2FA</strong> e em <strong>Iniciar configuração</strong>. O diálogo mostra o QR e a chave manual; os oito códigos de backup aparecem depois de o código ser verificado.",
|
||||
"<strong>Adicione a entrada ao aplicativo autenticador:</strong>",
|
||||
"<strong>Guarde os códigos de recuperação.</strong> Conserve os oito num gestor de palavras-passe, nota cifrada ou cópia impressa segura. Cada um funciona uma vez se a aplicação estiver indisponível.",
|
||||
"<strong>Confirme com o código atual de seis dígitos</strong> da aplicação no campo \"Código de verificação\" e envie. Muda a cada 30 segundos; se expirar durante a escrita, use o seguinte.",
|
||||
"<strong>Confirme com o código atual de seis dígitos</strong> da aplicação no campo \"Código de verificação\" do diálogo de configuração e envie. Muda a cada 30 segundos; se expirar durante a escrita, use o seguinte.",
|
||||
"<strong>Guarde os códigos de backup.</strong> Depois da verificação, conserve os oito em segurança num gestor de palavras-passe, nota cifrada ou cópia impressa segura. Cada um funciona uma vez se o autenticador estiver indisponível.",
|
||||
"<strong>Concluído.</strong> 2FA está ativo. O próximo início de sessão pede primeiro a palavra-passe e depois o código atual de seis dígitos."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
@@ -261,17 +261,17 @@
|
||||
"<em>Alternativa manual</em>, se não puder ler o QR, por exemplo no mesmo telefone: <em>Adicionar conta</em> → <em>Introduzir chave de configuração</em>. Escolha um nome como <em>Proxmox Monitor</em>, cole o segredo Base32, mantenha <em>Tipo</em> em <em>Baseado no tempo</em> e guarde."
|
||||
],
|
||||
"testTitle": "Teste antes de sair",
|
||||
"testBody": "Mantenha a sessão atual aberta e teste outro início de sessão numa janela privada <em>imediatamente</em> após configurar. Se o código falhar, verifique os relógios do servidor e do telefone antes de terminar a sessão válida. Se já perdeu o acesso, use um código de recuperação ou edite <code>auth.json</code> na shell do anfitrião.",
|
||||
"testBody": "Mantenha a sessão atual aberta e teste outro início de sessão numa janela privada <em>imediatamente</em> após configurar. Se o código for rejeitado, verifique os relógios do servidor e do telefone antes de terminar a sessão válida. Se já perdeu o acesso, use um código de backup ou edite <code>auth.json</code> na shell do anfitrião.",
|
||||
"lostTitle": "Autenticador perdido",
|
||||
"lostIntro": "Três métodos de recuperação, do menos ao mais intrusivo:",
|
||||
"lostItems": [
|
||||
"<strong>Use um código de recuperação.</strong> Introduza um dos oito no campo TOTP. Funciona uma vez; os restantes continuam válidos. Depois de entrar, configure novamente 2FA nas definições para obter oito códigos novos.",
|
||||
"<strong>Use um código de backup.</strong> Introduza um dos oito códigos guardados no campo TOTP. Funciona uma vez; os códigos não usados continuam válidos. Depois de entrar, abra Segurança, escolha <strong>Desativar 2FA</strong> e depois <strong>Ativar 2FA</strong> para obter oito códigos novos.",
|
||||
"<strong>Restaure a aplicação da nuvem ou de uma cópia.</strong> Com sincronização configurada, instale-a no novo dispositivo e inicie sessão: Google, Microsoft, Authy, Apple Passwords via Porta-chaves iCloud, Ente ou 2FAS. Com um ficheiro exportado por Aegis, Raivo ou FreeOTP+, instale a aplicação e importe o ficheiro.",
|
||||
"<strong>Desativar 2FA do shell do host.</strong> Quando as opções anteriores não estiverem disponíveis, edite <code>/root/.config/proxmenux-monitor/auth.json</code> no host Proxmox (você precisa de acesso raiz SSH ou console), defina <code>totp_enabled</code> para <code>false</code>, salve e reinicie o serviço:"
|
||||
],
|
||||
"lostShellOutro": "Você pode fazer login com nome de usuário + senha apenas, em seguida, habilitar de configurações 2FA.",
|
||||
"disableTitle": "Desativar 2FA",
|
||||
"disableBody": "Abra <strong>Segurança</strong> e escolha <strong>Desativar 2FA</strong>. <code>POST /api/auth/totp/disable</code> exige palavra-passe atual e código TOTP ou de recuperação válido. Elimina o segredo TOTP e os códigos. Remova também a entrada antiga da aplicação.",
|
||||
"disableBody": "Abra <strong>Segurança</strong> e escolha <strong>Desativar 2FA</strong>. <code>POST /api/auth/totp/disable</code> exige a palavra-passe atual e um código TOTP ou de backup válido. Elimina o segredo TOTP e os códigos de backup. Remova também a entrada antiga da aplicação autenticadora.",
|
||||
"rejectedTitle": "O código de seis dígitos é sempre rejeitado",
|
||||
"rejectedIntro": "O TOTP depende da hora: os relógios do servidor e do telefone devem diferir menos de cerca de 30 s. Duas verificações:",
|
||||
"rejectedItems": [
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "Desligado por omissão, comutador único para activar",
|
||||
"body": "A reformulação por IA vem desativada. Ative-a em <em>Definições → Notificações → Avançado: melhoria por IA</em>. Se o enriquecimento ou a reformulação falhar, é enviado o modelo original. Cada reformulação tem um limite de espera de 25 segundos; ao atingi-lo, utiliza-se o modelo sem esperar indefinidamente."
|
||||
"body": "A reformulação por IA vem desativada por predefinição. Ative-a em <em>Definições → Notificações → Avançado: melhoria por IA</em>. Se o enriquecimento ou a reformulação falhar, o processo de envio envia o modelo original. As reformulações na fila de envio de eventos têm um limite de espera de 25 segundos; ao atingi-lo, envia-se o modelo em vez de esperar."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Como funciona",
|
||||
@@ -109,7 +109,7 @@
|
||||
],
|
||||
"customNote": "O modo de prompt personalizado limita a saída a 500 tokens, independentemente do detalhe. O prompt é controlado por si e o limite evita respostas excessivas.",
|
||||
"sizingTitle": "Tamanho prático",
|
||||
"sizingBody": "Estime o consumo: eventos reformulados × canais IA × tokens de entrada e saída por chamada. Exemplo: 50 eventos × um canal × (500 de entrada + 300 de saída) = 40.000 tokens por dia. O consumo e custo reais dependem do modelo, contexto, cache e limites do fornecedor. <link>Detalhe por canal</link> explica o uso de <code>brief</code> no chat em vez de <code>standard</code>, mantendo e-mails detalhados."
|
||||
"sizingBody": "Estime o consumo como eventos reformulados × canais com IA × tokens de entrada e saída por chamada. Por exemplo, 50 eventos × um canal × (2.000 de entrada + 300 de saída) são cerca de 115.000 tokens por dia, já que só o prompt de sistema predefinido tem cerca de 1.500 tokens. O consumo e o custo reais dependem do modelo, contexto, cache e limites do fornecedor. A secção <link>Detalhe por canal</link> explica o uso de <code>brief</code> no chat em vez de <code>standard</code>, mantendo relatórios de e-mail detalhados."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "Prestadores de IA",
|
||||
@@ -142,7 +142,7 @@
|
||||
"items": [
|
||||
"Chave API: <a>console.anthropic.com/settings/keys</a>",
|
||||
"Exemplos da lista de modelos incluída: <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
|
||||
"Recomendação incluída: <strong><code>claude-haiku-4-5-20251001</code></strong>. Esta versão exata está configurada como recomendada; as antigas entradas Claude 3.5 já não constam da lista incluída."
|
||||
"Recomendação incluída: <strong><code>claude-haiku-4-5-20251001</code></strong>, um snapshot fixo em vez de um alias variável."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Cria uma cópia vzdump de VM ou LXC. Campos opcionais a adaptar ao armazenamento: <code>storage</code> (destino PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> ou <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> ou <code>none</code>), <code>protected</code> (<code>true</code> ou <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> ou <code>never</code>) e <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> ou <code>data</code>). Devolve o UPID da tarefa PVE."
|
||||
"use": "Cria uma cópia vzdump de uma VM ou LXC. Campos do corpo, todos opcionais exceto se as predefinições não corresponderem à organização do armazenamento: <code>storage</code> (um armazenamento PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> ou <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> ou <code>none</code>), <code>protected</code> (<code>true</code> ou <code>false</code>), <code>notes</code> e <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> ou <code>data</code>). Devolve o UPID da tarefa PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
@@ -286,7 +286,7 @@
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Inicia um autoteste SMART. Esquema do corpo: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
"use": "Inicia um autoteste SMART. Esquema do corpo: <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
|
||||
@@ -73,13 +73,13 @@
|
||||
"intro": "O AppImage contém um sistema de ficheiros montado ao executar. <code>AppRun</code> na raiz prepara o ambiente e inicia <code>flask_server.py</code>:",
|
||||
"consequencesIntro": "Duas consequências deste layout:",
|
||||
"consequences": [
|
||||
"<strong>Ambiente Python incluído.</strong> O interpretador e os pacotes estão no AppImage, sem instalação no Python do sistema. A aplicação continua a usar interfaces do kernel e ferramentas externas do anfitrião.",
|
||||
"<strong>Pacotes Python incluídos.</strong> Os pacotes Python vêm no AppImage e correm no interpretador Python do próprio anfitrião, 3.11 (PVE 8) ou 3.13 (PVE 9), sem instalar nada no Python do sistema do anfitrião. A aplicação continua a usar interfaces do kernel e ferramentas externas do anfitrião.",
|
||||
"<strong>Clientes de hardware incluídos.</strong> Contém <code>ipmitool</code>, <code>lm-sensors</code> e <code>upsc</code>. As leituras dependem do hardware compatível, acesso aos sensores e, para a UPS, de um servidor NUT configurado."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Estrutura da aplicação Flask",
|
||||
"intro": "<code>flask_server.py</code> cria uma instância <code>Flask(__name__)</code> com CORS limitado, regista diretamente nove blueprints e inicia o terminal. A tabela destaca módulos principais; regista também auditoria, cópias VM e PBS. As pré-cargas PVE só funcionam em anfitriões PVE.",
|
||||
"intro": "<code>flask_server.py</code> cria uma instância <code>Flask(__name__)</code> com origens CORS restritas, regista diretamente dez blueprints e inicia as rotas do terminal. A tabela destaca os módulos principais; também são registados os blueprints de PBS, ligações do Monitor, auditoria e cópias VM. As pré-cargas específicas de PVE só funcionam em anfitriões PVE.",
|
||||
"headerBlueprint": "Blueprint / módulo",
|
||||
"headerPrefix": "Prefixo das rotas",
|
||||
"headerOwns": "Responsabilidade",
|
||||
@@ -242,10 +242,10 @@
|
||||
"Atualizações: pacotes pendentes e correções de segurança.",
|
||||
"Registos: padrões persistentes, picos e cascatas no journal do sistema.",
|
||||
"Memória: intervenções do OOM killer e pressão RAM prolongada.",
|
||||
"Temperatura: leituras CPU e discos face aos limites de monitorização; os sensores disponíveis dependem do hardware.",
|
||||
"CPU: utilização e temperatura da CPU face aos limites configuráveis; os sensores disponíveis dependem do hardware.",
|
||||
"Segurança: falhas de acesso, bloqueios e estado do jail Fail2Ban."
|
||||
],
|
||||
"afterIntro": "Os resultados usam <code>error_key</code>, categoria e gravidade estáveis. As linhas de <code>errors</code> recebem <code>last_seen</code> e contagens, sem duplicação. O envio de notificações tem também impressões e intervalos próprios.",
|
||||
"afterIntro": "Os resultados usam <code>error_key</code>, categoria e gravidade estáveis. Os registos existentes em <code>errors</code> são atualizados no local (<code>last_seen</code>, gravidade, motivo), sem duplicação. O envio de notificações tem também regras próprias de impressões e intervalos.",
|
||||
"cycleEnd": "A limpeza pode resolver erros antigos com a <em>duração de silenciamento</em> por categoria e regras de estado, retirar registos órfãos de recursos removidos e apagar <code>events</code> com mais de 30 dias. As categorias estão em <link>Painel → Health Monitor</link>."
|
||||
},
|
||||
"notifications": {
|
||||
@@ -264,9 +264,9 @@
|
||||
"intro": "A aba <em>Terminal</em> liga um cliente leve <code>xterm.js</code> a um PTY do servidor por WebSocket. Existem dois modos:",
|
||||
"items": [
|
||||
"<strong>Modo HTTP, predefinido:</strong> o servidor Flask incluído e <code>flask-sock</code> tratam a mudança de protocolo para WebSocket.",
|
||||
"<strong>Modo HTTPS / WSS:</strong> usa <code>gevent.pywsgi.WSGIServer</code> com <code>geventwebsocket.handler.WebSocketHandler</code> para WebSocket sobre TLS."
|
||||
"<strong>Modo HTTPS / WSS:</strong> o servidor TLS usa <code>gevent.pywsgi.WSGIServer</code> com o seu handler predefinido; <code>flask-sock</code> trata as ligações WebSocket sobre TLS."
|
||||
],
|
||||
"outro": "Os processos do terminal herdam <code>User=root</code>. Com autenticação ativa, WebSocket exige um ticket breve de uso único obtido pelo endpoint autenticado com permissões administrativas. Se a autenticação estiver desativada ou recusada, a ligação segue esse modo sem autenticação.",
|
||||
"outro": "Os processos filhos do terminal herdam <code>User=root</code> do serviço. Abrir um WebSocket exige um ticket breve de uso único obtido pelo endpoint autenticado de tickets do terminal com permissões administrativas.",
|
||||
"proxyNote": "Num proxy inverso, permita WebSocket e os cabeçalhos <code>Upgrade</code> e <code>Connection</code>. O terminal precisa desse encaminhamento."
|
||||
},
|
||||
"proxy": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
}
|
||||
],
|
||||
"reportTitle": "Relatório de latência da rede (PDF)",
|
||||
"reportIntro": "Ambos os modos têm um botão <strong>Relatório</strong> junto ao seletor de destino. Gera um PDF das medições que pode anexar a um pedido de assistência ao fornecedor de Internet.",
|
||||
"reportIntro": "Ambos os modos têm um botão <strong>Relatório</strong> junto ao seletor de destino. Abre um relatório imprimível das medições; guarde-o em PDF a partir da janela de impressão do navegador e anexe-o a um pedido de assistência ao fornecedor de Internet.",
|
||||
"reportPreviewAlt": "Primeira página PDF do relatório de latência: resumo executivo, indicador, estatísticas, gráfico e guia dos limites",
|
||||
"reportPreviewCaption": "A primeira página contém resumo executivo, indicador, estatísticas principais, evolução da latência e guia dos limites. A partir da página 2 surgem a tabela de medições e a metodologia.",
|
||||
"downloadLabel": "Transferir relatório de latência de exemplo (PDF)",
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
"configCaption": "Edição da jail sshd: reduza <em>Max Retries</em> se usar SSH apenas a partir da sua sub-rede, ou aumente <em>Ban Time</em> para um painel exposto à Internet.",
|
||||
"outro": "O guia <em>Instalação, configuração e desinstalação</em> inclui a instalação manual, a alteração de SSH MaxAuthTries e a relação com o registo <code>proxmenux-auth.log</code>. Consulte <link>ProxMenux → Segurança → Fail2Ban</link>.",
|
||||
"calloutTitle": "Sem Fail2Ban, este mecanismo não bloqueia IPs",
|
||||
"calloutBody": "O ProxMenux Monitor verifica os IP bloqueados pelo Fail2Ban ao <em>nível da aplicação</em> antes de processar pedidos Flask. Consulta fail2ban-client e guarda o resultado em cache durante 30 segundos; não lê uma tabela SQL de bloqueios. Sem Fail2Ban, as tentativas falhadas são registadas em <code>proxmenux-auth.log</code>, mas este mecanismo não bloqueia IPs."
|
||||
"calloutBody": "O ProxMenux Monitor verifica os IP bloqueados na jail <code>proxmenux</code> do Fail2Ban ao <em>nível da aplicação</em> antes de processar pedidos Flask, guardando o resultado em cache durante 30 segundos. Sem Fail2Ban, as tentativas falhadas são registadas em <code>proxmenux-auth.log</code> e o endpoint de início de sessão fica limitado a 5 tentativas por IP a cada 5 minutos, mas nenhum IP é bloqueado."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Auditoria de segurança Lynis",
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Limites do Health Monitor",
|
||||
"intro": "O cartão anterior define <em>o silêncio após dispensar um alerta</em>; este regula <strong>o valor que desencadeia um alerta</strong>. A maioria das verificações tem valores <strong>Aviso</strong> e <strong>Crítico</strong> ajustáveis. A tabela explica exceções como a regra combinada de swap e o detetor atual de RAM.",
|
||||
"intro": "O cartão anterior define <em>o silêncio após dispensar um alerta</em>; este regula <strong>o valor que desencadeia um alerta</strong>. A maioria das verificações por limiar tem valores <strong>Aviso</strong> e <strong>Crítico</strong> ajustáveis. A tabela abaixo explica exceções como a regra combinada de swap.",
|
||||
"whatForTitle": "Para que serve",
|
||||
"whatForIntro": "Os valores predefinidos são um ponto de partida, mas cada ambiente tem condições próprias:",
|
||||
"whatForItems": [
|
||||
@@ -85,7 +85,7 @@
|
||||
"Escolha os limites de temperatura conforme as especificações do disco e as condições reais. A refrigeração passiva ou forçada não determina só por si um limite seguro universalmente inferior ou superior.",
|
||||
"Um anfitrião muito virtualizado pode ter picos de CPU durante compilações sem avisar por cada pico de 80%, mas deve alertar para saturação prolongada."
|
||||
],
|
||||
"whatForOutro": "As alterações suportadas aplicam-se <strong>na próxima análise</strong>. O Health Monitor lê <code>/usr/local/share/proxmenux/health_thresholds.json</code> em cada ciclo sem reinício. Alguns indicadores, como a temperatura dos discos, usam estes valores; certas barras de capacidade têm limites próprios. A linha RAM descreve uma exceção atual.",
|
||||
"whatForOutro": "As alterações de limiares suportadas aplicam-se <strong>na próxima análise</strong>. O Health Monitor lê <code>/usr/local/share/proxmenux/health_thresholds.json</code> em cada ciclo sem reinício. Alguns indicadores, incluindo a temperatura dos discos, usam estes valores; certas barras de capacidade mantêm limites visuais próprios.",
|
||||
"coloursTitle": "Cores dos estados Aviso e Crítico",
|
||||
"coloursIntro": "Os widgets que usam Aviso/Crítico seguem os três estados abaixo. Outros indicadores, como as barras de capacidade PVE, têm limites próprios; a cor por si só não indica um alerta Health Monitor.",
|
||||
"headerColour": "Cor",
|
||||
@@ -125,7 +125,7 @@
|
||||
"section": "Memória",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Pressão RAM do anfitrião. A definição mostra Crítico a 95%, mas o detetor atual usa uma regra fixa de 90% sustentados; alterar a definição não muda atualmente esse ramo."
|
||||
"gates": "Pressão RAM do anfitrião."
|
||||
},
|
||||
{
|
||||
"section": "Swap (apenas nível crítico)",
|
||||
@@ -185,7 +185,7 @@
|
||||
"section": "Armazenamento PVE",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Armazenamentos geridos por PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph e PBS. Nem todos são backends de blocos."
|
||||
"gates": "Apenas armazenamentos PVE do tipo LVM, LVM-thin, ZFS-pool, RBD, CephFS e PBS. Os armazenamentos de diretório, NFS e CIFS são cobertos pela linha de espaço em disco do anfitrião."
|
||||
},
|
||||
{
|
||||
"section": "Conjunto ZFS",
|
||||
@@ -218,7 +218,7 @@
|
||||
"toggleTitle": "Opção de notificação ligada à deteção",
|
||||
"toggleBody": "A opção <code>lxc_updates_available</code> por canal em <strong>Notificações → Serviços</strong> só aparece com a deteção ativa. Desativá-la oculta a linha em todos os canais. A preferência fica na base de dados e recupera o mesmo valor ao reativar.",
|
||||
"purgeTitle": "O que é removido ao desativar a deteção",
|
||||
"purgeBody": "Desativar remove de imediato as entradas <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Os contadores de atualizações LXC em Hardware desaparecem na próxima atualização. Reativar preenche o registo no próximo ciclo, ou antes por atualização manual da API."
|
||||
"purgeBody": "Desativar remove de imediato todas as entradas <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Os contadores de atualizações LXC no separador VMs e LXCs desaparecem na próxima atualização do painel. Reativar preenche o registo no próximo ciclo de deteção, ou antes por atualização manual da API."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Exclusões de armazenamento remoto",
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"items": [
|
||||
"<strong>Caminho do dispositivo</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Etiqueta de tipo</strong> — SATA / NVMe e respetivo ícone.",
|
||||
"<strong>Etiqueta de sistema</strong> — marca laranja dos discos identificados como discos do sistema operativo. A deteção usa as montagens <code>/</code> e <code>/boot</code> e atribui <em>System</em>. A ausência da etiqueta não prova que o disco possa ser apagado ou reutilizado sem risco.",
|
||||
"<strong>Etiqueta de sistema</strong> — marca laranja dos discos usados pelo anfitrião: pontos de montagem do sistema (<code>/</code>, <code>/boot</code>, <code>/usr</code>, <code>/var</code>…), swap ativo, membros de pools ZFS, volumes físicos LVM, membros RAID ativos ou etiquetas de partições do sistema. A ausência da etiqueta não prova que o disco possa ser apagado ou reutilizado sem risco.",
|
||||
"<strong>Modelo</strong> — fabricante e modelo de <code>smartctl -i</code>.",
|
||||
"<strong>Capacidade</strong> — expressa em unidades legíveis.",
|
||||
"<strong>Temperatura</strong> — valor atual em °C, com cor conforme o tipo de disco; NVMe usa limites mais altos que SATA.",
|
||||
@@ -112,7 +112,7 @@
|
||||
"pdfPreviewAlt": "Primeira página do relatório SMART com resumo executivo, indicador PASSED e informações do disco",
|
||||
"pdfPreviewCaption": "Primeira página: resumo, indicador PASSED e informações completas do disco. O PDF de exemplo inclui desgaste SSD, todos os atributos SMART e histórico de testes.",
|
||||
"pdfDownloadLabel": "Transferir relatório SMART de exemplo (PDF)",
|
||||
"pdfSectionsIntro": "O relatório tem seis secções principais:",
|
||||
"pdfSectionsIntro": "O relatório inclui estas secções principais:",
|
||||
"pdfSections": [
|
||||
"<strong>Resumo executivo</strong> — estado PASSED/FAILED, avaliação clara do disco — saudável, com desgaste ou a falhar — e quatro dados: data do relatório, último tipo de teste, resultado e atributos verificados.",
|
||||
"<strong>Informações do disco</strong> — modelo, série, capacidade, tipo HDD/SSD/NVMe, família, formato, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura e limite ideal, horas e ciclos de funcionamento, SMART, setores pendentes/realocados e erros CRC.",
|
||||
@@ -127,7 +127,7 @@
|
||||
"historyImageCaption": "Histórico SMART do disco. Cada linha mostra tipo, data e hora, antiguidade, marca do último teste e ações de transferência da saída <code>smartctl</code> e eliminação.",
|
||||
"historyIntro": "Testes curtos e alargados concluídos e guardados para o disco. Cada entrada contém a saída original <code>smartctl</code> e os campos interpretados pelo Monitor para o painel. Ações por linha:",
|
||||
"historyItems": [
|
||||
"<strong>Transferir</strong> — guarda a cópia JSON com os dados <code>smartctl -a</code> usados pelo relatório. Útil se o suporte pedir os campos de diagnóstico originais.",
|
||||
"<strong>Transferir</strong> — guarda a cópia JSON desse teste (saída de <code>smartctl -a --json</code>, ou <code>nvme smart-log</code> em NVMe quando o smartctl falha). Útil se o suporte do fabricante pedir os campos de diagnóstico originais.",
|
||||
"<strong>Eliminar</strong> — remove manualmente um teste do histórico. A retenção em Agendamento (<em>últimos 5 / 10 / 20</em>) elimina automaticamente os mais antigos."
|
||||
],
|
||||
"scheduleTitle": "Separador 4 — Agendamento",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Painel: VM e LXC | Documentação ProxMenux",
|
||||
"description": "Inventário dos sistemas convidados com CPU, memória e disco em direto. Os detalhes mostram configuração, recursos, cópias de segurança, resultados recentes do registo Proxmox, notas e Iniciar / Desligar / Reiniciar / Forçar paragem."
|
||||
"description": "O separador VMs e LXCs inventaria todos os sistemas convidados do anfitrião com utilização de CPU, memória e disco em direto. Os detalhes de cada um mostram configuração, recursos, cópias de segurança, o registo de consola dos contentores OCI, notas e Iniciar / Desligar / Reiniciar / Forçar paragem."
|
||||
},
|
||||
"header": {
|
||||
"title": "Painel: VM e LXC",
|
||||
"description": "Inventário completo dos sistemas convidados: quatro métricas no topo, lista ordenável de VM e LXC e detalhes com configuração, recursos, cópias de segurança, registos e controlos Iniciar / Desligar / Reiniciar / Forçar paragem.",
|
||||
"description": "Inventário completo dos sistemas convidados do nó: quatro métricas no topo, lista ordenável de cada VM e LXC por baixo e detalhes com configuração, recursos, cópias de segurança, o registo de consola dos contentores OCI e os quatro controlos de ciclo de vida (Iniciar / Desligar / Reiniciar / Forçar paragem).",
|
||||
"section": "ProxMenux Monitor · Painel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Controlos dos sistemas convidados",
|
||||
"body": "Este separador controla o ciclo de vida dos sistemas convidados. As ações passam por <code>POST /api/vms/<vmid>/control</code> com confirmação explícita e atualizam a linha do sistema. O desligamento forçado exige o botão específico Forçar paragem."
|
||||
"body": "Este separador controla o ciclo de vida dos sistemas convidados. As ações de ciclo de vida passam por <code>POST /api/vms/<vmid>/control</code>; Reiniciar e Forçar paragem pedem que escreva o VMID para confirmar, e a resposta reflete-se na linha do sistema. O desligamento forçado exige o botão específico Forçar paragem."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Linha superior: quatro cartas estatísticas",
|
||||
@@ -186,9 +186,9 @@
|
||||
"source": "Dados PVE RRD (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) condensados a uma forma amigável a gráficos."
|
||||
},
|
||||
{
|
||||
"section": "Resultados recentes do registo Proxmox",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "<code>pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000</code>. Uma falha devolve uma lista vazia; não fornece todos os registos internos do sistema convidado."
|
||||
"section": "Registo de consola OCI (separador Logs)",
|
||||
"endpoint": "/api/lxc/<vmid>/console-log",
|
||||
"source": "Saída de consola do processo principal da imagem, lida de <code>/var/log/proxmenux/oci/<vmid>.console.log</code> no anfitrião. Mostrado apenas para contentores OCI."
|
||||
},
|
||||
{
|
||||
"section": "Backups disponíveis para hóspedes",
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
{
|
||||
"category": "Armazenamento",
|
||||
"checks": "Armazenamento do Proxmox, sistema de arquivos raiz",
|
||||
"events": "Limiares de ocupação ultrapassados na raiz ou noutros sistemas de ficheiros monitorizados (85% aviso / 95% crítico por predefinição); exportação NFS indisponível; falha de autenticação CIFS; pool LVM-thin cheio."
|
||||
"events": "Limiares de ocupação ultrapassados na raiz ou noutros sistemas de ficheiros monitorizados (85% aviso / 95% crítico por predefinição); armazenamentos PVE indisponíveis; montagens NFS/CIFS bloqueadas ou inesperadamente só de leitura; armazenamentos LVM-thin e outros pools que ultrapassam os mesmos limiares."
|
||||
},
|
||||
{
|
||||
"category": "Discos e SMART",
|
||||
@@ -98,7 +98,7 @@
|
||||
{
|
||||
"category": "Atualizações do sistema",
|
||||
"checks": "Atualizações pendentes, atualizações de segurança, kernel / versão PVE, idade do sistema",
|
||||
"events": "Atualizações de segurança ou do kernel em uso pendentes; sistema sem atualizar há muito tempo. O cabeçalho da vista geral apresenta <em>Atualizar agora</em> quando há atualizações. O botão executa todo o processo ProxMenux; ao fechar, atualiza o estado com <code>?refresh=1</code> sem esperar pelo ciclo seguinte."
|
||||
"events": "Atualizações de segurança ou do kernel em uso pendentes; sistema sem atualizar há muito tempo. A categoria Atualizações da janela Estado de saúde apresenta o botão <em>Atualizar agora</em> quando há atualizações pendentes. Executa todo o processo de atualização ProxMenux na própria janela; ao fechar, atualiza o estado com <code>?refresh=1</code> para que o indicador mostre o novo estado sem esperar pelo ciclo seguinte."
|
||||
},
|
||||
{
|
||||
"category": "Segurança e Certificados",
|
||||
@@ -158,7 +158,7 @@
|
||||
},
|
||||
"dismiss": {
|
||||
"heading": "Silenciar alertas e definir a duração da supressão",
|
||||
"intro": "Alguns eventos persistem, como <em>Atualizações do sistema: atualizações disponíveis</em> até atualizar o anfitrião. Uma notificação a cada cinco minutos seria desnecessária. O botão <em>Atualizar agora</em> na vista geral resolve diretamente esse caso. Para os restantes casos ou atualizações adiadas, há dois mecanismos ligados de silenciamento:",
|
||||
"intro": "Alguns eventos persistem por natureza, como <em>Atualizações do sistema: atualizações disponíveis</em> até atualizar o anfitrião, e uma notificação a cada cinco minutos durante uma semana seria desnecessária. O botão <em>Atualizar agora</em> na categoria Atualizações da janela Estado de saúde resolve diretamente esse caso. Para os restantes casos ou atualizações adiadas, a monitorização oferece também dois mecanismos ligados de silenciamento:",
|
||||
"step1": "<strong>Silenciar um evento</strong> na janela. O menu oferece <strong>24 horas</strong>, <strong>7 dias</strong> ou <strong>Permanentemente</strong>, independentemente da categoria. A escolha envia <code>POST /api/health/acknowledge</code> com <code>error_key</code> e <code>suppression_hours</code> (<code>-1</code> para permanente). O evento passa aos suprimidos com a data <code>acknowledged_at</code>.",
|
||||
"dropdownImageAlt": "Menu para silenciar um alerta: 24 horas, 7 dias ou permanentemente",
|
||||
"dropdownImageCaption": "A duração escolhida aplica-se só a este alerta; sem escolha individual, usa-se o valor da categoria. Os alertas silenciados permanentemente têm uma etiqueta âmbar <em>Permanente</em> e normalmente não reaparecem. A temperatura crítica da CPU é a exceção descrita abaixo.",
|
||||
@@ -187,7 +187,7 @@
|
||||
},
|
||||
{
|
||||
"finding": "ZFS pool DEGRADED / FAULTED",
|
||||
"why": "As verificações de capacidade dos pools ZFS permitem a supressão. As restantes ocorrências seguem o seu próprio indicador. Reconhecer não repara um pool degradado ou avariado."
|
||||
"why": "As ocorrências de estado dos pools ZFS (DEGRADED, FAULTED, UNAVAIL) permitem explicitamente a supressão, tal como as verificações de capacidade dos pools. Reconhecer não repara um pool degradado ou avariado."
|
||||
},
|
||||
{
|
||||
"finding": "Erros de E/S de disco com SMART FAILED",
|
||||
@@ -289,7 +289,7 @@
|
||||
},
|
||||
"rest": {
|
||||
"heading": "Endpoints REST",
|
||||
"intro": "As ações da janela estão disponíveis pela API para scripts, painéis ou bots. Com a autenticação do Monitor ativa, é necessário um token Bearer válido, obtido no início de sessão ou no ecrã de tokens API. As alterações, como reconhecer alertas, guardar ou limpar erros órfãos, exigem full_admin; read_only recebe 403. Com autenticação desativada ou recusada, estes controlos permitem acesso sem token.",
|
||||
"intro": "As ações da janela também estão disponíveis pela API para scripts, painéis personalizados ou bots. As chamadas exigem um token Bearer válido, obtido no início de sessão ou no ecrã de tokens API. As alterações, como reconhecer alertas, guardar definições de supressão ou limpar erros órfãos, exigem o âmbito full_admin; read_only recebe 403.",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerMethod": "Método",
|
||||
"headerUse": "Utilização",
|
||||
@@ -297,7 +297,7 @@
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Verificação leve que devolve JSON com <code>status</code>, <code>timestamp</code> e <code>version</code>. Serve para verificações de palavras-chave Uptime Kuma; com autenticação do Monitor ativa, o cliente tem de enviar um cabeçalho Bearer."
|
||||
"use": "Verificação leve que devolve JSON com <code>status</code>, <code>timestamp</code> e <code>version</code>. Serve para verificações de palavras-chave Uptime Kuma; o cliente tem de enviar um cabeçalho Bearer."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"description": "Shell do host e consolas VM/CT suportadas no navegador via <code>xterm.js</code> e WebSockets. Segue a autenticação configurada: desativada ou recusada, permite sessões sem início de sessão a clientes com acesso de rede. Não implica auditoria de cada comando."
|
||||
"description": "Shell do host e consolas VM/CT suportadas no navegador via <code>xterm.js</code> e WebSockets. As sessões não são auditadas por comando."
|
||||
},
|
||||
{
|
||||
"name": "Segurança",
|
||||
@@ -114,7 +114,7 @@
|
||||
"heading": "REST API e integrações",
|
||||
"intro": "Os endpoints REST expõem dados de monitorização JSON por HTTP/HTTPS para Homepage, Home Assistant, Uptime Kuma e scripts. Grafana pode usar o exportador de texto Prometheus separado em <code>/api/prometheus</code>. As chamadas podem usar <code>curl</code>.",
|
||||
"tokens": "Tokens API de longa duração (365 dias) são gerados em <strong>Configurações → API Tokens de acesso</strong> ou via <code>POST /api/auth/generate-api-token</code>.",
|
||||
"bearer": "Envie tokens com <code>Authorization: Bearer …</code>. O endpoint público <code>/api/health</code> serve a testes de disponibilidade sem credenciais. Em <code>/api/auth/*</code> existem rotas públicas de configuração/início/estado e rotas protegidas de contas e tokens; nem todas são anónimas.",
|
||||
"bearer": "Envie tokens com <code>Authorization: Bearer …</code>. <code>/api/health</code> também espera o cabeçalho Bearer, pelo que os testes de disponibilidade precisam de um token read_only. Em <code>/api/auth/*</code> existem tanto rotas públicas de configuração/início/estado como rotas protegidas de contas e tokens; nem todas são anónimas.",
|
||||
"catalog": "O catálogo de endpoints, rotação de tokens e segurança estão na <linkApi>Referência da API</linkApi>; exemplos para Homepage, Home Assistant, Grafana, Uptime Kuma e cURL estão em <linkIntegrations>Integrações</linkIntegrations>."
|
||||
},
|
||||
"serviceControl": {
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
"heading": "n8n, Zapier e scripts personalizados",
|
||||
"intro": "Workflows e scripts podem <em>enviar</em> notificações por POST para <code>/api/notifications/send</code>, por exemplo após falha CI ou tarefa demasiado longa. O envio direto ignora a fila e o intervalo entre impressões digitais dos eventos. Mantém a formatação, IA opcional e entrega por canal. Controle os duplicados na origem.",
|
||||
"n8nBody": "No n8n use um nó <em>HTTP Request</em> com POST, o URL acima e o mesmo JSON do curl. Escolha credenciais genéricas Header Auth: nome <em>Authorization</em> e valor <code>Bearer YOUR_API_TOKEN</code>, substituindo o marcador. Ligue um agendamento, webhook ou outro nó para iniciar o pedido.",
|
||||
"severityBody": "A gravidade usa <code>INFO</code>, <code>WARNING</code> ou <code>CRITICAL</code> em maiúsculas. O objeto <code>data</code> fornece contexto. A IA usa título e mensagem gerados e os enriquecimentos suportados; nem todos os campos entram necessariamente no prompt ou resultado. Veja <link>Notificações → Catálogo de eventos</link>."
|
||||
"severityBody": "A gravidade usa <code>INFO</code>, <code>WARNING</code> ou <code>CRITICAL</code> em maiúsculas. O objeto <code>data</code> fornece o contexto do evento e os campos do modelo. Neste endpoint, a reformulação por IA recebe apenas o título e a mensagem; os campos de <code>data</code> não são enviados ao fornecedor. Veja <link>Notificações → Catálogo de eventos</link> para o significado dos eventos."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Webhook nativo Proxmox VE (entrada)",
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
"Abra o <a>account.microsoft.com/security</a> e habilite a verificação em duas etapas.",
|
||||
"Se disponível, abra <em>Opções de segurança avançadas</em> → <em>Palavras-passe de aplicações</em> → <em>Criar nova palavra-passe de aplicação</em>. A sua existência não prova que o serviço aceite SMTP por palavra-passe.",
|
||||
"Se Microsoft gerar uma palavra-passe de aplicação, copie-a e verifique se o serviço SMTP a aceita.",
|
||||
"Só se SMTP por palavra-passe for permitido, use os parâmetros aprovados: <em>Servidor</em> <code>smtp.office365.com</code> para Exchange Online, <em>Porta</em> <code>587</code>, <em>Modo TLS</em> <code>STARTTLS</code>, <em>Utilizador</em> com o endereço email e <em>Palavra-passe</em> com a credencial permitida. Outlook.com pessoal tem requisitos diferentes; não presuma que funcione."
|
||||
"Só se o seu fornecedor permitir SMTP por palavra-passe, preencha os parâmetros aprovados: <em>Host SMTP</em> <code>smtp.office365.com</code> para Exchange Online, <em>Porta</em> <code>587</code>, <em>Modo TLS</em> <code>STARTTLS</code>, <em>Utilizador</em> com o endereço da caixa de correio e <em>Palavra-passe</em> com a credencial SMTP permitida. O Outlook.com pessoal tem definições e requisitos de autenticação diferentes; não presuma que estas credenciais funcionem."
|
||||
],
|
||||
"relayTitle": "Relay SMTP gerido por si",
|
||||
"relayBody": "Pode usar um relay SMTP sob o seu controlo, como Postfix, que trate da autenticação a montante. Configure credenciais e TLS do Monitor conforme o relay: usar um relay local não desativa por si só a encriptação."
|
||||
@@ -266,7 +266,7 @@
|
||||
"howItems": [
|
||||
"<strong>Ativação por canal.</strong> Desativado por predefinição. Ative só nos canais onde pretende um resumo; os restantes mantêm envios imediatos.",
|
||||
"<strong>Hora de envio</strong> no fuso local, inicialmente 09:00. Pode alterá-la; o processo envia até cerca de 60 segundos após o minuto definido.",
|
||||
"<strong>No resumo:</strong> eventos genéricos elegíveis de nível <strong>INFO</strong>, como <em>atualizações de aplicações</em>, <em>atualizações Tailscale</em>, <em>atualizações de otimizações ProxMenux</em>, <em>atualizações de segurança APT</em> e <em>avisos de limite de frequência</em>. Resultados de cópias e outras ações excluídas continuam imediatos.",
|
||||
"<strong>No resumo:</strong> eventos genéricos elegíveis de nível <strong>INFO</strong>. Por exemplo, <em>atualizações de aplicações</em>, <em>atualizações Tailscale</em>, <em>atualizações de otimizações ProxMenux</em> e <em>atualizações de segurança APT</em>. Resultados de cópias e outros eventos de ações excluídas continuam imediatos.",
|
||||
"<strong>O que nunca é atrasado:</strong>",
|
||||
"<strong>Persistência.</strong> Os eventos permanecem em SQLite, na tabela <code>digest_pending</code>, até à hora escolhida e sobrevivem aos reinícios do Monitor.",
|
||||
"<strong>Sem eventos, sem resumo.</strong> Não envia mensagens vazias quando não existem eventos INFO a resumir."
|
||||
@@ -301,7 +301,7 @@
|
||||
{
|
||||
"stage": "Intervalo entre envios",
|
||||
"what": "Após envio bem-sucedido suprime repetições e guarda o estado em <code>notification_last_sent</code>. Valores base: 86 400 s para <code>CRITICAL</code>, <code>WARNING</code>, <code>INFO</code>, <code>resources</code> e <code>updates</code>. Exceções: 5 s para ações VM/CT e encerramento/reinício do anfitrião, 10 s para resultados de cópias/replicação, 1 800–3 600 s para várias categorias de saúde. Definições explícitas por evento/grupo prevalecem.",
|
||||
"tunable": "Sim: definições explícitas do intervalo por evento ou grupo substituem os valores predefinidos do processo de envio."
|
||||
"tunable": "Apenas através da API de definições: uma chave <code>cooldown.<event_type></code> ou <code>cooldown.<group></code> substitui os valores predefinidos; não existe nenhum controlo na interface."
|
||||
},
|
||||
{
|
||||
"stage": "Agregação de eventos próximos",
|
||||
@@ -330,7 +330,7 @@
|
||||
"<strong>Método e URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code> sem HTTPS do Monitor. Com HTTPS usa o listener HTTP local separado na porta 8009. Ambos permanecem no mesmo anfitrião.",
|
||||
"<strong>Modelo do corpo.</strong> Usa os auxiliares Handlebars do PVE. O PVE guarda-o codificado em base64; o conteúdo JSON é:",
|
||||
"<strong>Matcher.</strong> Um bloco <code>matcher: proxmenux-matcher</code> companheiro com <code>mode all</code> para que cada notificação PVE atinja o alvo.",
|
||||
"<strong>Configuração privada.</strong> Cria o bloco <code>webhook: proxmenux-webhook</code> em <code>/etc/pve/priv/notifications.cfg</code> com o segredo partilhado em base64. O destino público usa-o para X-Webhook-Secret. O bloco não está vazio."
|
||||
"<strong>Configuração privada.</strong> A configuração escreve o bloco correspondente <code>webhook: proxmenux-webhook</code> em <code>/etc/pve/priv/notifications.cfg</code> com uma entrada <code>secret</code> chamada X-Webhook-Secret, codificada em base64. O bloco público do destino contém apenas o modelo do corpo, o método e o URL. O bloco privado não é um esboço vazio."
|
||||
],
|
||||
"securityTitle": "Como o receptor está seguro",
|
||||
"securityIntro": "O receptor webhook em <code>POST /api/notifications/webhook</code> aplica diferentes camadas de segurança, dependendo de onde o pedido vem:",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"reaching": {
|
||||
"heading": "Prístup k panelu",
|
||||
"intro": "ProxMenux Monitor sa viaže na <code>0.0.0.0:8008</code>. Existujú tri bežné spôsoby, ako ju dosiahnuť:",
|
||||
"outro": "Priamy prístup zodpovedá predvolenej jednotke systemd. Reverzný proxy a Secure Gateway sú opísané nižšie. IP z <code>X-Forwarded-For</code> vyžadujú PROXMENUX_TRUST_PROXY=1 a proxy pod vašou kontrolou. Samotné <code>X-Forwarded-Proto</code> alebo <code>X-Forwarded-Host</code> túto dôveru nezapnú; frontend zostavuje URL API z pôvodu prehliadača."
|
||||
"outro": "Priamy prístup zodpovedá predvolenej jednotke systemd. Reverzný proxy a Secure Gateway sú opísané nižšie. Dôvera v IP klientov z <code>X-Forwarded-For</code> vyžaduje PROXMENUX_TRUST_PROXY=1 a proxy pod vašou kontrolou. Samotná prítomnosť <code>X-Forwarded-Proto</code> alebo <code>X-Forwarded-Host</code> dôveru v proxy nezapne. Na portoch 80/443 frontend používa relatívne URL <code>/api/*</code>; na akomkoľvek inom porte volá port 8008 na rovnakom názve hostiteľa."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Postup pri prvom spustení",
|
||||
@@ -117,8 +117,8 @@
|
||||
"loginImageCaption": "Po nastavení overenia sa tu začína prihlásenie. Pri zapnutom 2FA sa po prijatí hesla vyžiada šesťmiestny kód.",
|
||||
"loginFlowTitle": "Prihlasovací tok",
|
||||
"twofaIntro": "Pri 2FA prvé volanie vráti <code>requires_totp: true</code>. Zopakujte ho so šesťmiestnym kódom:",
|
||||
"publicTitle": "Verejný prístup a chránené kontroly",
|
||||
"publicIntro": "Prihlásenie a stav overenia sú verejné. Účet možno vytvoriť, kým nie sú uložené meno a heslo, aj po odmietnutí ochrany. Pri zapnutej ochrane vyžadujú systémové údaje overenie:",
|
||||
"publicTitle": "Verejné koncové body (bez tokenu)",
|
||||
"publicIntro": "Prihlásenie, stav overenia, počiatočné nastavenie a ľahký koncový bod <code>/api/system-info</code> sú verejné:",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code> a <code>/api/auth/status</code> sú verejné. <code>/api/auth/setup</code> vytvorí prvý účet a odmietne prepísať existujúce prihlasovacie údaje.",
|
||||
"<code>/api/system-info</code> je verejný endpoint so základnými údajmi systému vrátane <code>health.status</code>. Nevyžaduje token. Aj /api/auth/status je verejný a hodí sa na kontrolu dostupnosti."
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"asset": "Tajný kľúč TOTP pre 2FA",
|
||||
"algorithm": "Štandardný TOTP (RFC 6238) s tajným kľúčom v base32. Osem jednorazových obnovovacích kódov sa ukladá ako hashe SHA-256.",
|
||||
"algorithm": "Štandardný TOTP (RFC 6238) s tajným kľúčom v base32. Osem jednorazových záložných kódov sa ukladá ako hashe SHA-256.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
@@ -243,17 +243,17 @@
|
||||
}
|
||||
],
|
||||
"backupTitle": "Prečo sú zálohy dôležité",
|
||||
"backupBody": "Pri strate zariadenia použite uložený obnovovací kód alebo obnovte vopred nastavenú zálohu. Cloudová synchronizácia a exporty sa líšia podľa aplikácie; overte, že obnovia aj tajné kľúče TOTP. Prístup root na hostiteľovi umožňuje aj obnovu opísanú nižšie. Uchovajte samostatnú bezpečnú zálohu.",
|
||||
"backupBody": "Pri strate overovacieho zariadenia použite uložený záložný kód alebo obnovte aplikáciu z vopred nastavenej zálohy. Cloudová synchronizácia a lokálne exporty sa líšia podľa aplikácie; overte, že zvolený spôsob naozaj obnoví tajné kľúče TOTP. Prístup root na hostiteľovi umožňuje aj obnovu opísanú nižšie. Uchovajte samostatnú bezpečnú zálohu.",
|
||||
"setupTitle": "Nastavenie krok za krokom z panelu",
|
||||
"setupImageAlt": "Nastavovacia obrazovka 2FA s QR kódom a záložnými kódmi",
|
||||
"setupImageCaption": "Dialóg 2FA zobrazuje QR, tajný kľúč Base32 na ručné zadanie a osem jednorazových obnovovacích kódov. Pred zatvorením ich skopírujte; už sa nezobrazia.",
|
||||
"setupImageCaption": "Dialóg nastavenia 2FA zobrazuje QR, tajný kľúč Base32 na ručné zadanie a po overení osem jednorazových záložných kódov. Kódy skopírujte pred zatvorením dialógu; už sa nezobrazia.",
|
||||
"setupSteps": [
|
||||
"<strong>Nainštalujte autentifikačnú aplikáciu do telefónu</strong> alebo otvorte správcu hesiel. Stačí raz; rovnaká aplikácia môže uchovávať kódy pre všetky chránené služby.",
|
||||
"<strong>Prihláste sa do panelu</strong> menom a heslom.",
|
||||
"<strong>Otvorte kartu Zabezpečenie</strong> a vyberte <strong>Zapnúť 2FA</strong>. Dialóg zobrazí QR, tajný kľúč Base32 a osem obnovovacích kódov.",
|
||||
"<strong>Otvorte kartu Zabezpečenie</strong> v bočnom paneli dashboardu a kliknite na <strong>Zapnúť 2FA</strong> a <strong>Spustiť nastavenie</strong>. Dialóg zobrazí QR a ručný kľúč; osem záložných kódov sa zobrazí po overení kódu.",
|
||||
"<strong>Pridajte položku do autentifikačnej aplikácie:</strong>",
|
||||
"<strong>Uložte obnovovacie kódy.</strong> Všetkých osem bezpečne uložte do správcu hesiel, šifrovanej poznámky alebo na papier. Každý funguje raz, keď aplikácia nie je dostupná.",
|
||||
"<strong>Potvrďte aktuálnym šesťmiestnym kódom</strong> z aplikácie v poli \"Overovací kód\" a odošlite. Mení sa každých 30 sekúnd; ak počas písania vyprší, použite ďalší.",
|
||||
"<strong>Potvrďte aktuálnym šesťmiestnym kódom</strong> z aplikácie v poli \"Overovací kód\" dialógu nastavenia a odošlite. Mení sa každých 30 sekúnd; ak počas písania vyprší, použite ďalší.",
|
||||
"<strong>Uložte záložné kódy.</strong> Po overení všetkých osem bezpečne uložte do správcu hesiel, šifrovanej poznámky alebo na zabezpečenú tlačenú kópiu. Každý funguje raz, keď overovacia aplikácia nie je dostupná.",
|
||||
"<strong>Hotovo.</strong> 2FA je aktívne. Ďalšie prihlásenie vyžiada najprv heslo a potom aktuálny šesťmiestny kód."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
@@ -261,17 +261,17 @@
|
||||
"<em>Ručná alternatíva</em>, ak nemožno skenovať, napríklad na rovnakom telefóne: <em>Pridať účet</em> → <em>Zadať nastavovací kľúč</em>. Zvoľte názov ako <em>Proxmox Monitor</em>, vložte tajný kľúč Base32, nechajte <em>Typ</em> nastavený na <em>Časový</em> a uložte."
|
||||
],
|
||||
"testTitle": "Test pred odhlásením",
|
||||
"testBody": "Aktuálnu reláciu nechajte otvorenú a <em>hneď</em> po nastavení otestujte nové prihlásenie v súkromnom okne. Ak kód nefunguje, pred odhlásením skontrolujte hodiny servera a telefónu. Ak je prístup už stratený, použite obnovovací kód alebo upravte <code>auth.json</code> zo shellu hostiteľa.",
|
||||
"testBody": "Aktuálnu reláciu nechajte otvorenú a <em>hneď</em> po nastavení otestujte nové prihlásenie v súkromnom okne. Ak je kód odmietnutý, pred odhlásením z funkčnej relácie skontrolujte hodiny servera a telefónu. Ak je prístup už stratený, použite záložný kód alebo upravte <code>auth.json</code> zo shellu hostiteľa.",
|
||||
"lostTitle": "Stratený autentifikátor",
|
||||
"lostIntro": "Tri spôsoby obnovy, od najmenšieho po najväčší zásah:",
|
||||
"lostItems": [
|
||||
"<strong>Použite obnovovací kód.</strong> Jeden z ôsmich zadajte do poľa TOTP. Funguje raz; nepoužité kódy zostanú platné. Po prihlásení nastavte 2FA znova v nastaveniach a získajte osem nových kódov.",
|
||||
"<strong>Použite záložný kód.</strong> Jeden z ôsmich uložených kódov zadajte do poľa TOTP. Funguje raz; nepoužité kódy zostanú platné. Po prihlásení otvorte Zabezpečenie, vyberte <strong>Vypnúť 2FA</strong> a potom <strong>Zapnúť 2FA</strong> a získajte osem nových kódov.",
|
||||
"<strong>Obnovte aplikáciu z cloudu alebo zálohy.</strong> Pri nastavenej synchronizácii ju nainštalujte na nové zariadenie a prihláste sa: Google, Microsoft, Authy, Apple Passwords cez iCloud Kľúčenku, Ente alebo 2FAS. Pri exporte z Aegis, Raivo alebo FreeOTP+ nainštalujte aplikáciu a importujte súbor.",
|
||||
"<strong>Vypnite 2FA zo shellu hostiteľa.</strong> Ak iné možnosti nie sú dostupné, upravte <code>/root/.config/proxmenux-monitor/auth.json</code> ako root cez SSH alebo konzolu. Nastavte <code>totp_enabled</code> na <code>false</code>, uložte a reštartujte službu:"
|
||||
],
|
||||
"lostShellOutro": "Môžete sa prihlásiť iba s užívateľským menom + heslom a potom znovu zapnúť 2FA z Nastavenia.",
|
||||
"disableTitle": "Vypnúť 2FA",
|
||||
"disableBody": "Otvorte <strong>Zabezpečenie</strong> a vyberte <strong>Vypnúť 2FA</strong>. <code>POST /api/auth/totp/disable</code> vyžaduje aktuálne heslo a platný TOTP alebo obnovovací kód. Odstráni tajný kľúč aj obnovovacie kódy. Starú položku odstráňte aj z aplikácie.",
|
||||
"disableBody": "Otvorte <strong>Zabezpečenie</strong> a vyberte <strong>Vypnúť 2FA</strong>. <code>POST /api/auth/totp/disable</code> vyžaduje aktuálne heslo a platný TOTP alebo záložný kód. Odstráni tajný kľúč TOTP aj záložné kódy. Starú položku odstráňte aj z overovacej aplikácie.",
|
||||
"rejectedTitle": "Šesťmiestny kód je vždy odmietnutý",
|
||||
"rejectedIntro": "TOTP závisí od času. Rozdiel hodín servera a telefónu má byť najviac približne 30 s. Dve kontroly:",
|
||||
"rejectedItems": [
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "Predvolene vypnuté, zapnutie jedným prepínačom",
|
||||
"body": "Prepis AI je predvolene vypnutý. Zapnite ho v <em>Nastavenia → Oznámenia → Pokročilé: vylepšenie AI</em>. Pri chybe doplnenia kontextu alebo prepisu sa odošle pôvodná šablóna. Každý prepis má časový limit 25 sekúnd; po jeho uplynutí sa použije šablóna bez neobmedzeného čakania."
|
||||
"body": "Prepis AI je predvolene vypnutý. Zapnite ho v <em>Nastavenia → Oznámenia → Pokročilé: vylepšenie AI</em>. Pri chybe doplnenia kontextu alebo prepisu odosielač pošle pôvodnú šablónu. Prepisy vo fronte odosielania udalostí majú časový limit 25 sekúnd; po jeho dosiahnutí sa namiesto čakania odošle šablóna."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Ako to funguje",
|
||||
@@ -109,7 +109,7 @@
|
||||
],
|
||||
"customNote": "Režim vlastného promptu má pevný limit 500 výstupných tokenov bez ohľadu na úroveň detailov. Prompt ovládate vy a limit bráni neprimerane dlhým odpovediam.",
|
||||
"sizingTitle": "Praktická veľkosť",
|
||||
"sizingBody": "Spotrebu odhadnite ako prepísané udalosti × kanály AI × vstupné a výstupné tokeny na volanie. Napríklad 50 udalostí × jeden kanál × (500 vstupných + 300 výstupných) = 40 000 tokenov denne. Skutočná spotreba a cena závisia od modelu, kontextu, cache a limitov poskytovateľa. Časť <link>Detaily podľa kanála</link> opisuje <code>brief</code> pre chat namiesto <code>standard</code> pri zachovaní podrobných e-mailov."
|
||||
"sizingBody": "Spotrebu odhadnite ako prepísané udalosti × kanály s AI × vstupné a výstupné tokeny na volanie. Napríklad 50 udalostí × jeden kanál × (2 000 vstupných + 300 výstupných) je asi 115 000 tokenov denne, pretože samotný predvolený systémový prompt má približne 1 500 tokenov. Skutočná spotreba a cena závisia od modelu, kontextu, cache a limitov poskytovateľa. Časť <link>Detaily podľa kanála</link> opisuje <code>brief</code> pre chat namiesto <code>standard</code> pri zachovaní podrobných e-mailových správ."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "Poskytovatelia AI",
|
||||
@@ -142,7 +142,7 @@
|
||||
"items": [
|
||||
"Kľúč API: <a>console.anthropic.com/settings/keys</a>",
|
||||
"Príklady z dodaného zoznamu modelov: <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
|
||||
"Dodané odporúčanie: <strong><code>claude-haiku-4-5-20251001</code></strong>. Odporúčaná je táto presná verzia; staršie položky Claude 3.5 už v dodanom zozname nie sú."
|
||||
"Dodané odporúčanie: <strong><code>claude-haiku-4-5-20251001</code></strong>, pevne určená snímka namiesto premenlivého aliasu."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Vytvorí zálohu vzdump VM alebo LXC. Voliteľné polia prispôsobte úložisku: <code>storage</code> (cieľ PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> alebo <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> alebo <code>none</code>), <code>protected</code> (<code>true</code> alebo <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> alebo <code>never</code>) a <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> alebo <code>data</code>). Vráti UPID úlohy PVE."
|
||||
"use": "Vytvorí zálohu vzdump VM alebo LXC. Polia tela, všetky voliteľné, ak predvolené hodnoty zodpovedajú rozloženiu úložiska: <code>storage</code> (úložisko PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> alebo <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> alebo <code>none</code>), <code>protected</code> (<code>true</code> alebo <code>false</code>), <code>notes</code> a <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> alebo <code>data</code>). Vráti UPID úlohy PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
@@ -286,7 +286,7 @@
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Spustí autotest SMART. Schéma tela: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
"use": "Spustí autotest SMART. Schéma tela: <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
|
||||
@@ -73,13 +73,13 @@
|
||||
"intro": "AppImage obsahuje súborový systém pripojený pri spustení. <code>AppRun</code> v koreni pripraví prostredie a spustí <code>flask_server.py</code>:",
|
||||
"consequencesIntro": "Dva dôsledky tohto usporiadania:",
|
||||
"consequences": [
|
||||
"<strong>Pribalené prostredie Python.</strong> Interpret a balíky sú v AppImage, bez inštalácie do systémového Pythonu. Aplikácia naďalej používa rozhrania jadra a externé nástroje hostiteľa.",
|
||||
"<strong>Pribalené balíky Python.</strong> Balíky Python sú súčasťou AppImage a bežia na vlastnom interpretri Python hostiteľa 3.11 (PVE 8) alebo 3.13 (PVE 9), bez inštalácie čohokoľvek do systémového Pythonu hostiteľa. Aplikácia naďalej používa rozhrania jadra hostiteľa a externé nástroje hostiteľa.",
|
||||
"<strong>Pribalení klienti hardvéru.</strong> Obsahuje <code>ipmitool</code>, <code>lm-sensors</code> a <code>upsc</code>. Merania vyžadujú podporovaný hardvér, prístup k senzorom a pre UPS nastavený server NUT."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Štruktúra aplikácie Flask",
|
||||
"intro": "<code>flask_server.py</code> vytvorí inštanciu <code>Flask(__name__)</code> s obmedzeným CORS, priamo registruje deväť blueprintov a inicializuje terminál. Tabuľka uvádza hlavné moduly; registrované sú aj audit, zálohy VM a PBS. Prednačítavanie PVE beží iba na hostiteľoch PVE.",
|
||||
"intro": "<code>flask_server.py</code> vytvorí jednu inštanciu <code>Flask(__name__)</code> s obmedzenými pôvodmi CORS, priamo registruje desať blueprintov a inicializuje trasy terminálu. Tabuľka uvádza hlavné moduly; registrované sú aj blueprinty PBS, odkazov Monitora, auditu a záloh VM. Prednačítavanie špecifické pre PVE beží iba na hostiteľoch PVE.",
|
||||
"headerBlueprint": "Blueprint / modul",
|
||||
"headerPrefix": "Predpona ciest",
|
||||
"headerOwns": "Zodpovednosť",
|
||||
@@ -242,10 +242,10 @@
|
||||
"Aktualizácie: čakajúce balíky a bezpečnostné opravy.",
|
||||
"Protokoly: trvalé vzory, špičky a kaskády v systémovom denníku.",
|
||||
"Pamäť: zásahy OOM killer a dlhodobý tlak na RAM.",
|
||||
"Teplota: hodnoty CPU a diskov sa porovnávajú s monitorovacími prahmi; dostupné senzory závisia od hardvéru.",
|
||||
"CPU: využitie a teplota CPU sa porovnávajú s nastaviteľnými prahmi; dostupné senzory závisia od hardvéru.",
|
||||
"Bezpečnosť: zlyhania prihlásenia, blokovania a stav jailu Fail2Ban."
|
||||
],
|
||||
"afterIntro": "Nálezy používajú stabilné <code>error_key</code>, kategóriu a závažnosť. Riadky v <code>errors</code> sa aktualizujú cez <code>last_seen</code> a počty bez duplicít. Odosielanie oznámení má aj vlastné odtlačky a časové odstupy.",
|
||||
"afterIntro": "Nálezy používajú stabilné <code>error_key</code>, kategóriu a závažnosť. Existujúce záznamy v <code>errors</code> sa aktualizujú na mieste (<code>last_seen</code>, závažnosť, dôvod) namiesto duplikovania. Odosielanie oznámení má aj vlastné pravidlá odtlačkov a časových odstupov.",
|
||||
"cycleEnd": "Čistenie môže vyriešiť staré chyby podľa <em>trvania potlačenia</em> kategórie a stavových pravidiel, odstrániť osirelé záznamy zrušených prostriedkov a vymazať <code>events</code> staršie než 30 dní. Kategórie opisuje <link>Panel → Health Monitor</link>."
|
||||
},
|
||||
"notifications": {
|
||||
@@ -264,9 +264,9 @@
|
||||
"intro": "Karta <em>Terminál</em> prepája ľahkého klienta <code>xterm.js</code> s PTY servera cez WebSocket. Existujú dva režimy:",
|
||||
"items": [
|
||||
"<strong>Režim HTTP, predvolený:</strong> vstavaný server Flask s <code>flask-sock</code> spracúva prechod na protokol WebSocket.",
|
||||
"<strong>Režim HTTPS / WSS:</strong> používa <code>gevent.pywsgi.WSGIServer</code> s <code>geventwebsocket.handler.WebSocketHandler</code> na spojenia WebSocket cez TLS."
|
||||
"<strong>Režim HTTPS / WSS:</strong> server TLS používa <code>gevent.pywsgi.WSGIServer</code> s jeho predvoleným handlerom; <code>flask-sock</code> spracúva spojenia WebSocket cez TLS."
|
||||
],
|
||||
"outro": "Procesy terminálu dedia <code>User=root</code>. Pri zapnutom overovaní WebSocket vyžaduje krátkodobý jednorazový lístok získaný z overeného koncového bodu so správcovským oprávnením. Pri vypnutom alebo odmietnutom overovaní spojenie používa tento neoverovaný režim.",
|
||||
"outro": "Podriadené procesy terminálu dedia <code>User=root</code> zo služby. Otvorenie WebSocketu vyžaduje krátkodobý jednorazový lístok získaný z overeného koncového bodu lístkov terminálu so správcovským oprávnením.",
|
||||
"proxyNote": "Pri reverznom proxy povoľte WebSocket a hlavičky <code>Upgrade</code> a <code>Connection</code>. Terminál potrebuje toto preposielanie."
|
||||
},
|
||||
"proxy": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
}
|
||||
],
|
||||
"reportTitle": "Správa o latencii siete (PDF)",
|
||||
"reportIntro": "Oba režimy majú pri výbere cieľa tlačidlo <strong>Správa</strong>. Vytvorí PDF meraní, ktoré môžete priložiť k žiadosti o podporu u poskytovateľa internetu.",
|
||||
"reportIntro": "Oba režimy majú pri výbere cieľa tlačidlo <strong>Správa</strong>. Otvorí tlačiteľnú správu z meraní; uložte ju ako PDF cez dialóg tlače prehliadača a priložte ju k žiadosti o podporu u poskytovateľa internetu.",
|
||||
"reportPreviewAlt": "Prvá strana správy PDF o odozve: súhrn, ukazovateľ, štatistiky, graf a vysvetlenie prahov",
|
||||
"reportPreviewCaption": "Prvá strana obsahuje súhrn, ukazovateľ, hlavné štatistiky, časový priebeh odozvy a vysvetlenie prahov. Od strany 2 nasleduje tabuľka meraní a metodika.",
|
||||
"downloadLabel": "Stiahnuť príklad správy o odozve (PDF)",
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
"configCaption": "Úprava jailu sshd: znížte <em>Max Retries</em>, ak SSH používate iba z vlastnej podsiete, alebo predĺžte <em>Ban Time</em> pre prehľad dostupný z internetu.",
|
||||
"outro": "Návod <em>Inštalácia, nastavenie a odinštalovanie</em> opisuje aj ručnú inštaláciu, zmenu SSH MaxAuthTries a súvislosť so záznamom <code>proxmenux-auth.log</code>. Pozrite <link>ProxMenux → Zabezpečenie → Fail2Ban</link>.",
|
||||
"calloutTitle": "Bez Fail2Ban tento mechanizmus neblokuje IP adresy",
|
||||
"calloutBody": "ProxMenux Monitor kontroluje IP adresy blokované Fail2Ban na <em>aplikačnej úrovni</em> pred spracovaním požiadaviek Flask. Volá fail2ban-client a výsledok ukladá do vyrovnávacej pamäte na 30 sekúnd; nečíta tabuľku blokovaní SQL. Bez Fail2Ban sa neúspešné prihlásenia zapisujú do <code>proxmenux-auth.log</code>, ale tento mechanizmus IP adresy neblokuje."
|
||||
"calloutBody": "ProxMenux Monitor kontroluje IP adresy zablokované v jail <code>proxmenux</code> nástroja Fail2Ban na <em>aplikačnej úrovni</em> pred spracovaním požiadaviek Flask a výsledok uchováva vo vyrovnávacej pamäti 30 sekúnd. Bez Fail2Ban sa neúspešné prihlásenia zapisujú do <code>proxmenux-auth.log</code> a koncový bod prihlásenia je obmedzený na 5 pokusov z jednej IP za 5 minút, ale žiadna IP adresa sa nezablokuje."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Bezpečnostný audit Lynis",
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Prahy Health Monitor",
|
||||
"intro": "Predchádzajúca karta určuje <em>trvanie stíšenia po potlačení</em>; táto nastavuje <strong>hodnotu spustenia výstrahy</strong>. Väčšina kontrol má nastaviteľný <strong>varovný</strong> a <strong>kritický</strong> prah. Tabuľka vysvetľuje výnimky, napríklad kombinované pravidlo swapu a aktuálny detektor RAM.",
|
||||
"intro": "Predchádzajúca karta určuje <em>trvanie stíšenia po potlačení</em>; táto nastavuje <strong>hodnotu spustenia výstrahy</strong>. Väčšina prahových kontrol má nastaviteľný <strong>varovný</strong> a <strong>kritický</strong> prah. Tabuľka nižšie vysvetľuje výnimky, napríklad kombinované pravidlo swapu.",
|
||||
"whatForTitle": "Na čo slúži",
|
||||
"whatForIntro": "Predvolené hodnoty sú východiskom, ale každé prostredie má vlastné podmienky:",
|
||||
"whatForItems": [
|
||||
@@ -85,7 +85,7 @@
|
||||
"Teplotné prahy vyberte podľa špecifikácií disku a skutočných podmienok. Pasívne alebo nútené chladenie samo neurčuje univerzálne nižší či vyšší bezpečný limit.",
|
||||
"Silne virtualizovaný hostiteľ môže pri zostavovaní dosiahnuť špičky CPU bez výstrahy pri každom 80 % výkyve, ale musí upozorniť na trvalé preťaženie."
|
||||
],
|
||||
"whatForOutro": "Podporované zmeny platia <strong>pri ďalšej kontrole</strong>. Health Monitor číta <code>/usr/local/share/proxmenux/health_thresholds.json</code> v každom cykle bez reštartu. Niektoré ukazovatele, napríklad teplota diskov, používajú tieto hodnoty; niektoré kapacitné pruhy majú vlastné hranice. Riadok RAM vysvetľuje aktuálnu výnimku.",
|
||||
"whatForOutro": "Podporované zmeny prahov platia <strong>pri ďalšej kontrole</strong>. Health Monitor číta <code>/usr/local/share/proxmenux/health_thresholds.json</code> v každom cykle bez reštartu. Vybrané ukazovatele vrátane teploty diskov používajú tieto hodnoty; niektoré kapacitné pruhy si ponechávajú vlastné vizuálne hranice.",
|
||||
"coloursTitle": "Farby stavov Varovanie a Kritické",
|
||||
"coloursIntro": "Widgety s nastavenou dvojicou Varovanie/Kritické používajú tri stavy nižšie. Iné ukazovatele, napríklad kapacitné pruhy PVE, majú vlastné hranice; samotná farba nedokazuje výstrahu Health Monitor.",
|
||||
"headerColour": "Farba",
|
||||
@@ -125,7 +125,7 @@
|
||||
"section": "Pamäť",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Tlak na RAM hostiteľa. Nastavenie uvádza kritický prah 95 %, ale aktuálny detektor používa pevné pravidlo trvalých 90 %; zmena nastavenia teraz nemení túto vetvu."
|
||||
"gates": "Tlak na RAM hostiteľa."
|
||||
},
|
||||
{
|
||||
"section": "Swap (iba kritická hranica)",
|
||||
@@ -185,7 +185,7 @@
|
||||
"section": "PVE úložisko",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Úložiská spravované PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph a PBS. Nie všetky sú blokové úložiská."
|
||||
"gates": "Iba úložiská PVE typu LVM, LVM-thin, ZFS-pool, RBD, CephFS a PBS. Úložiská typu adresár, NFS a CIFS pokrýva riadok miesta na disku hostiteľa."
|
||||
},
|
||||
{
|
||||
"section": "ZFS pool",
|
||||
@@ -218,7 +218,7 @@
|
||||
"toggleTitle": "Prepínač oznámení pri zapnutej detekcii",
|
||||
"toggleBody": "Prepínač <code>lxc_updates_available</code> pre každý kanál v <strong>Oznámenia → Služby</strong> sa zobrazuje iba pri zapnutej detekcii. Vypnutie skryje riadok vo všetkých kanáloch. Voľba zostáva v databáze a po zapnutí sa obnoví pôvodná hodnota.",
|
||||
"purgeTitle": "Čo sa odstráni pri vypnutí detekcie",
|
||||
"purgeBody": "Vypnutie ihneď odstráni záznamy <code>type=lxc</code> z <code>/usr/local/share/proxmenux/managed_installs.json</code>. Po obnovení Hardvér prestane zobrazovať počty aktualizácií LXC. Po zapnutí register naplní ďalší cyklus, prípadne skoršie ručné obnovenie cez API."
|
||||
"purgeBody": "Vypnutie ihneď odstráni všetky záznamy <code>type=lxc</code> z <code>/usr/local/share/proxmenux/managed_installs.json</code>. Počty aktualizácií LXC na karte VM a LXC zmiznú pri ďalšom obnovení dashboardu. Po zapnutí register naplní ďalší cyklus detekcie, prípadne skoršie ručné obnovenie cez API."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Vylúčené vzdialené úložiská",
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"items": [
|
||||
"<strong>Trasa zariadenia</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Štítok typu</strong> — SATA / NVMe a príslušná ikona.",
|
||||
"<strong>Systémový štítok</strong> — oranžové označenie diskov rozpoznaných ako disky operačného systému. Detekcia používa pripojenia <code>/</code> a <code>/boot</code> a pridelí štítok <em>System</em>. Chýbajúci štítok nedokazuje, že disk možno bezpečne vymazať alebo použiť inak.",
|
||||
"<strong>Systémový štítok</strong> — oranžové označenie diskov, ktoré používa hostiteľ: systémové body pripojenia (<code>/</code>, <code>/boot</code>, <code>/usr</code>, <code>/var</code>…), aktívny swap, členovia poolov ZFS, fyzické zväzky LVM, aktívni členovia RAID alebo menovky systémových oddielov. Chýbajúci štítok nedokazuje, že disk možno bezpečne vymazať alebo použiť inak.",
|
||||
"<strong>Model</strong> — výrobca a model z <code>smartctl -i</code>.",
|
||||
"<strong>Kapacita</strong> — zobrazená v zrozumiteľných jednotkách.",
|
||||
"<strong>Teplota</strong> — aktuálna hodnota v °C s farbou podľa typu disku; NVMe používa vyššie prahy než SATA.",
|
||||
@@ -112,7 +112,7 @@
|
||||
"pdfPreviewAlt": "Prvá strana správy SMART so súhrnom, ukazovateľom PASSED a informáciami o disku",
|
||||
"pdfPreviewCaption": "Prvá strana: súhrn, ukazovateľ PASSED a úplné informácie o disku. Príklad PDF obsahuje opotrebovanie SSD, všetky atribúty SMART a históriu testov.",
|
||||
"pdfDownloadLabel": "Stiahnuť príklad správy SMART (PDF)",
|
||||
"pdfSectionsIntro": "Správa má šesť hlavných častí:",
|
||||
"pdfSectionsIntro": "Správa obsahuje tieto hlavné časti:",
|
||||
"pdfSections": [
|
||||
"<strong>Súhrn</strong> — stav PASSED/FAILED, zrozumiteľné hodnotenie disku — v poriadku, opotrebovaný alebo zlyhávajúci — a štyri údaje: čas správy, posledný typ testu, výsledok a overené atribúty.",
|
||||
"<strong>Informácie o disku</strong> — model, sériové číslo, kapacita, typ HDD/SSD/NVMe, rodina, formát, rozhranie (SATA 3.3 · 6.0 Gb/s, …), TRIM, teplota a optimálny prah, hodiny prevádzky, zapnutia, SMART, čakajúce/prerozdelené sektory a chyby CRC.",
|
||||
@@ -127,7 +127,7 @@
|
||||
"historyImageCaption": "História testov SMART disku. Každý riadok ukazuje typ, čas, vek, označenie posledného testu a možnosti stiahnutia výstupu <code>smartctl</code> a odstránenia.",
|
||||
"historyIntro": "Dokončené a uchované krátke aj rozšírené testy disku. Každý záznam obsahuje pôvodný výstup <code>smartctl</code> a polia spracované Monitorom pre prehľad. Akcie v riadku:",
|
||||
"historyItems": [
|
||||
"<strong>Stiahnuť</strong> — uloží snímku JSON s údajmi <code>smartctl -a</code> použitými v správe. Užitočné, ak podpora potrebuje pôvodné diagnostické polia.",
|
||||
"<strong>Stiahnuť</strong> — uloží snímku JSON daného testu (výstup <code>smartctl -a --json</code>, alebo <code>nvme smart-log</code> pri NVMe, keď smartctl zlyhá). Užitočné, ak podpora výrobcu potrebuje pôvodné diagnostické polia.",
|
||||
"<strong>Odstrániť</strong> — ručne vymaže test z histórie. Uchovávanie v Plánovaní (<em>posledných 5 / 10 / 20</em>) automaticky maže najstaršie."
|
||||
],
|
||||
"scheduleTitle": "Karta 4 — Plánovanie",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: VM a LXC | Dokumentácia ProxMenux",
|
||||
"description": "Inventár hosťovských systémov so živými údajmi CPU, pamäte a disku. Podrobnosti obsahujú konfiguráciu, zdroje, zálohy, nedávne výsledky záznamu Proxmox, poznámky a Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie."
|
||||
"description": "Karta VM a LXC eviduje všetky hosťovské systémy na hostiteľovi so živým využitím CPU, pamäte a disku. Podrobnosti každého systému zobrazujú konfiguráciu, zdroje, zálohy, záznam konzoly kontajnerov OCI, poznámky a ovládanie Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: VM a LXC",
|
||||
"description": "Úplný inventár hosťovských systémov uzla: štyri metriky hore, triediteľný zoznam VM a LXC a podrobnosti s konfiguráciou, zdrojmi, zálohami, záznamami a ovládaním Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie.",
|
||||
"description": "Úplný inventár hosťovských systémov uzla: štyri metriky hore, triediteľný zoznam všetkých VM a LXC pod nimi a podrobnosti s konfiguráciou, zdrojmi, zálohami, záznamom konzoly kontajnerov OCI a štyrmi ovládacími prvkami životného cyklu (Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie).",
|
||||
"section": "ProxMenux Monitor · Prehľad"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Ovládanie hosťovských systémov",
|
||||
"body": "Táto karta ovláda životný cyklus hosťovských systémov. Akcie idú cez <code>POST /api/vms/<vmid>/control</code> s výslovným potvrdením a aktualizujú riadok systému. Nútené vypnutie vyžaduje samostatné tlačidlo Vynútiť vypnutie."
|
||||
"body": "Táto karta ovláda životný cyklus hosťovských systémov. Akcie životného cyklu idú cez <code>POST /api/vms/<vmid>/control</code>; Reštartovať a Vynútiť vypnutie vás požiadajú o zadanie VMID na potvrdenie a odpoveď sa prejaví v riadku systému. Nútené vypnutie vyžaduje samostatné tlačidlo Vynútiť vypnutie."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Horný riadok: štyri štatistické karty",
|
||||
@@ -186,9 +186,9 @@
|
||||
"source": "Dáta RRD PVE (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) upravené do formátu pre graf."
|
||||
},
|
||||
{
|
||||
"section": "Nedávne výsledky záznamu Proxmox",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "<code>pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000</code>. Pri zlyhaní príkazu vráti prázdny zoznam; nejde o úplné systémové záznamy vnútri hosťovského systému."
|
||||
"section": "Záznam konzoly OCI (karta Logy)",
|
||||
"endpoint": "/api/lxc/<vmid>/console-log",
|
||||
"source": "Výstup konzoly hlavného procesu obrazu, čítaný z <code>/var/log/proxmenux/oci/<vmid>.console.log</code> na hostiteľovi. Zobrazuje sa iba pre kontajnery OCI."
|
||||
},
|
||||
{
|
||||
"section": "Zálohy k dispozícii pre hostí",
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
{
|
||||
"category": "Úložisko",
|
||||
"checks": "Proxmox úložiská, koreňový súborový systém",
|
||||
"events": "Prekročenie nastavených prahov využitia koreňového alebo iného sledovaného súborového systému (predvolene 85% upozornenie / 95% kritický stav); nedostupný export NFS; zlyhanie overenia CIFS; plný pool LVM-thin."
|
||||
"events": "Prekročenie nastavených prahov využitia koreňového alebo iného sledovaného súborového systému (predvolene 85% upozornenie / 95% kritický stav); nedostupné úložiská PVE; zaseknuté pripojenia NFS/CIFS alebo pripojenia nečakane len na čítanie; úložiská LVM-thin a iné poolové úložiská prekračujúce rovnaké prahy."
|
||||
},
|
||||
{
|
||||
"category": "Disky & SMART",
|
||||
@@ -98,7 +98,7 @@
|
||||
{
|
||||
"category": "Aktualizácie systému",
|
||||
"checks": "Nevybavené aktualizácie, aktualizácie zabezpečenia, verzia jadra / PVE, systémový vek",
|
||||
"events": "Čakajúce bezpečnostné aktualizácie alebo aktualizácie používaného jadra; dlho neaktualizovaný systém. Ak sú dostupné aktualizácie, hlavička prehľadu zobrazí <em>Aktualizovať teraz</em>. Tlačidlo spustí celý postup ProxMenux; po zatvorení obnoví stav cez <code>?refresh=1</code> bez čakania na ďalší cyklus."
|
||||
"events": "Čakajúce bezpečnostné aktualizácie alebo aktualizácie používaného jadra; dlho neaktualizovaný systém. Kategória Aktualizácie v okne Stav systému zobrazí tlačidlo <em>Aktualizovať teraz</em>, keď čakajú aktualizácie. Spustí celý postup aktualizácie ProxMenux priamo v okne; po zatvorení obnoví stav cez <code>?refresh=1</code>, aby indikátor ukázal nový stav bez čakania na ďalší cyklus."
|
||||
},
|
||||
{
|
||||
"category": "Bezpečnosť a certifikáty",
|
||||
@@ -158,7 +158,7 @@
|
||||
},
|
||||
"dismiss": {
|
||||
"heading": "Potlačenie upozornení a jeho trvanie",
|
||||
"intro": "Niektoré udalosti pretrvávajú, napríklad <em>Aktualizácie systému: dostupné aktualizácie</em>, kým hostiteľa neaktualizujete. Oznámenie každých päť minút nie je potrebné. Tlačidlo <em>Aktualizovať teraz</em> v prehľade tento prípad rieši priamo. Pre ostatné prípady alebo odložené aktualizácie sú dostupné dva prepojené spôsoby potlačenia:",
|
||||
"intro": "Niektoré udalosti z povahy veci pretrvávajú, napríklad <em>Aktualizácie systému: dostupné aktualizácie</em>, kým hostiteľa neaktualizujete, a oznámenie každých päť minút počas celého týždňa nie je žiaduce. Tlačidlo <em>Aktualizovať teraz</em> v kategórii Aktualizácie okna Stav systému tento prípad rieši priamo. Pre ostatné prípady alebo odložené aktualizácie ponúka Monitor stavu aj dva prepojené spôsoby potlačenia:",
|
||||
"step1": "<strong>Potlačiť jednotlivú udalosť</strong> v okne. Ponuka obsahuje <strong>24 hodín</strong>, <strong>7 dní</strong> alebo <strong>Natrvalo</strong> bez ohľadu na predvolenú dobu kategórie. Voľba odošle <code>POST /api/health/acknowledge</code> s <code>error_key</code> a zvolenými <code>suppression_hours</code> (<code>-1</code> pre trvalé potlačenie). Udalosť sa presunie medzi potlačené s časom <code>acknowledged_at</code>.",
|
||||
"dropdownImageAlt": "Ponuka potlačenia upozornenia: 24 hodín, 7 dní alebo natrvalo",
|
||||
"dropdownImageCaption": "Zvolená doba platí iba pre toto upozornenie; bez individuálnej voľby sa použije hodnota kategórie. Trvalo potlačené upozornenia majú jantárový odznak <em>Natrvalo</em> a bežne sa neobnovujú. Výnimkou je kritická teplota CPU opísaná nižšie.",
|
||||
@@ -187,7 +187,7 @@
|
||||
},
|
||||
{
|
||||
"finding": "ZFS pool DEGRADED / FAULTED",
|
||||
"why": "Kontroly kapacity poolu ZFS výslovne umožňujú potlačenie. Ostatné zistenia používajú vlastný príznak. Potvrdenie neopraví degradovaný ani chybný pool."
|
||||
"why": "Zistenia o stave poolu ZFS (DEGRADED, FAULTED, UNAVAIL) výslovne umožňujú potlačenie, rovnako ako kontroly kapacity poolu. Potvrdenie neopraví degradovaný ani chybný pool."
|
||||
},
|
||||
{
|
||||
"finding": "Chyba disku I/O s SMART FAILED",
|
||||
@@ -289,7 +289,7 @@
|
||||
},
|
||||
"rest": {
|
||||
"heading": "Koncové body REST",
|
||||
"intro": "Činnosti okna sú dostupné cez API pre skripty, panely či botov. Pri zapnutom overovaní Monitora treba platný Bearer token z prihlásenia alebo obrazovky API tokenov. Zmeny, ako potvrdenie upozornení, uloženie či čistenie osirelých chýb, vyžadujú full_admin; read_only dostane 403. Pri vypnutom alebo odmietnutom overovaní tieto kontroly umožnia prístup bez tokenu.",
|
||||
"intro": "Činnosti okna sú dostupné aj cez API pre skripty, vlastné panely či botov. Volania vyžadujú platný Bearer token z prihlásenia alebo obrazovky API tokenov. Zmeny, ako potvrdenie upozornení, uloženie nastavení potlačenia či čistenie osirelých chýb, vyžadujú rozsah full_admin; read_only dostane 403.",
|
||||
"headerEndpoint": "Koncový bod",
|
||||
"headerMethod": "Metóda",
|
||||
"headerUse": "Použitie",
|
||||
@@ -297,7 +297,7 @@
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Ľahká kontrola vracajúca JSON s <code>status</code>, <code>timestamp</code> a <code>version</code>. Vhodná pre kontroly kľúčových slov Uptime Kuma; pri zapnutom overovaní Monitora musí klient poslať hlavičku Bearer."
|
||||
"use": "Ľahká kontrola vracajúca JSON s <code>status</code>, <code>timestamp</code> a <code>version</code>. Vhodná pre kontroly kľúčových slov Uptime Kuma; klient musí poslať hlavičku Bearer."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Terminál",
|
||||
"description": "Shell hostiteľa a podporované konzoly VM/CT v prehliadači cez <code>xterm.js</code> a WebSockets. Používa nastavený režim overovania: pri vypnutí alebo odmietnutí môžu klienti s prístupom zo siete otvoriť reláciu bez prihlásenia. Neznamená to audit každého príkazu."
|
||||
"description": "Shell hostiteľa a podporované konzoly VM/CT v prehliadači cez <code>xterm.js</code> a WebSockets. Relácie sa neauditujú po jednotlivých príkazoch."
|
||||
},
|
||||
{
|
||||
"name": "Zabezpečenie",
|
||||
@@ -114,7 +114,7 @@
|
||||
"heading": "REST API a integrácie",
|
||||
"intro": "Endpointy REST poskytujú monitorovacie dáta JSON cez HTTP/HTTPS pre Homepage, Home Assistant, Uptime Kuma a skripty. Grafana môže použiť samostatný textový exportér Prometheus na <code>/api/prometheus</code>. Požiadavky možno posielať cez <code>curl</code>.",
|
||||
"tokens": "Tokeny API s dlhou životnosťou (365 dni) sa generujú z <strong>Nastavenia → API prístupových tokenov</strong> alebo prostredníctvom <code>POST /api/auth/generate-api-token</code>.",
|
||||
"bearer": "Tokeny posielajte ako <code>Authorization: Bearer …</code>. Verejný <code>/api/health</code> je vhodný na kontroly dostupnosti bez poverení. Pod <code>/api/auth/*</code> sú verejné trasy nastavenia/prihlásenia/stavu aj chránená správa účtov/tokenov; nie všetky sú anonymné.",
|
||||
"bearer": "Tokeny posielajte ako <code>Authorization: Bearer …</code>. Aj <code>/api/health</code> očakáva hlavičku Bearer, takže kontroly dostupnosti potrebujú token read_only. Pod <code>/api/auth/*</code> sú verejné trasy nastavenia/prihlásenia/stavu aj chránené trasy správy účtov/tokenov; nie všetky sú anonymné.",
|
||||
"catalog": "Katalóg endpointov, rotácia tokenov a zabezpečenie sú v <linkApi>Referenčnej príručke API</linkApi>; príklady pre Homepage, Home Assistant, Grafana, Uptime Kuma a cURL sú v <linkIntegrations>Integrácie</linkIntegrations>."
|
||||
},
|
||||
"serviceControl": {
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
"heading": "n8n, Zapier a vlastné skripty",
|
||||
"intro": "Workflow nástroje a skripty môžu <em>odosielať</em> oznámenia cez POST na <code>/api/notifications/send</code>, napríklad pri zlyhaní CI alebo dlhej úlohe cron. Priame odoslanie obíde front aj časový odstup podľa odtlačku udalosti. Zachová formátovanie kanálov, voliteľnú AI a doručenie. Duplicity musí riešiť volajúci.",
|
||||
"n8nBody": "V n8n použite uzol <em>HTTP Request</em> s POST, uvedenou URL a rovnakým JSON ako curl. Zvoľte všeobecné údaje Header Auth: názov <em>Authorization</em> a hodnotu <code>Bearer YOUR_API_TOKEN</code>, pričom nahraďte zástupný text. Požiadavku spustí plán, webhook alebo predchádzajúci uzol.",
|
||||
"severityBody": "Závažnosť používa <code>INFO</code>, <code>WARNING</code> alebo <code>CRITICAL</code> veľkými písmenami. Objekt <code>data</code> poskytuje kontext. AI používa vytvorený nadpis, správu a podporované doplnenia; nie je zaručené, že ľubovoľné polia zahrnie do promptu či výstupu. Pozri <link>Oznámenia → Katalóg udalostí</link>."
|
||||
"severityBody": "Závažnosť používa <code>INFO</code>, <code>WARNING</code> alebo <code>CRITICAL</code> veľkými písmenami. Objekt <code>data</code> poskytuje kontext udalosti a polia šablóny. Na tomto koncovom bode dostane prepis AI iba nadpis a správu; polia v <code>data</code> sa poskytovateľovi neposielajú. Význam udalostí pozri v <link>Oznámenia → Katalóg udalostí</link>."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Natívny webhook Proxmox VE (prichádzajúci)",
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
"Otvorte <a>account.microsoft.com/security</a> a povoľte dvojstupňové overovanie.",
|
||||
"Ak účet ponúka <em>Rozšírené možnosti zabezpečenia</em> → <em>Heslá aplikácií</em>, vyberte <em>Vytvoriť heslo aplikácie</em>. Samotná voľba nezaručuje podporu SMTP s heslom.",
|
||||
"Ak Microsoft vytvorí heslo, skopírujte ho a overte jeho prijatie službou SMTP.",
|
||||
"Len ak poskytovateľ dovoľuje SMTP s heslom, použite schválené hodnoty: <em>Server</em> <code>smtp.office365.com</code> pre Exchange Online, <em>Port</em> <code>587</code>, <em>Režim TLS</em> <code>STARTTLS</code>, <em>Meno</em> adresu schránky a <em>Heslo</em> povolený údaj. Osobné Outlook.com má iné nastavenia a požiadavky."
|
||||
"Len ak poskytovateľ dovoľuje SMTP s heslom, vyplňte jeho schválené hodnoty: <em>Server</em> <code>smtp.office365.com</code> pre Exchange Online, <em>Port</em> <code>587</code>, <em>Režim TLS</em> <code>STARTTLS</code>, <em>Používateľské meno</em> adresu vašej schránky a <em>Heslo</em> povolený prihlasovací údaj SMTP. Osobné Outlook.com má iné nastavenia a požiadavky na overenie; nepredpokladajte, že tieto údaje budú fungovať."
|
||||
],
|
||||
"relayTitle": "SMTP relay na vlastnom serveri",
|
||||
"relayBody": "Nasmerujte Monitor na vlastný SMTP relay, napríklad Postfix. Ten rieši overenie voči poskytovateľovi. Overenie a TLS Monitora nastavte podľa relaya; miestny relay automaticky nevypína šifrovanie."
|
||||
@@ -266,7 +266,7 @@
|
||||
"howItems": [
|
||||
"<strong>Zapnutie pre každý kanál.</strong> Predvolene vypnuté. Zapnite iba tam, kde chcete súhrn; ostatné kanály nechajte priame.",
|
||||
"<strong>Čas doručenia</strong> v miestnom čase, predvolene 09:00. Odosielač ho spustí približne do 60 s od danej minúty.",
|
||||
"<strong>Obsah súhrnu:</strong> vhodné všeobecné udalosti <strong>INFO</strong>, napríklad <em>dostupná aktualizácia aplikácie</em>, <em>dostupná aktualizácia Tailscale</em>, <em>dostupná aktualizácia optimalizácie ProxMenux</em>, <em>čakajúce bezpečnostné aktualizácie APT</em> a <em>oznámenie o limite odosielania</em>. Výsledky záloh a vyňaté akcie zostanú priame.",
|
||||
"<strong>Obsah súhrnu:</strong> vhodné všeobecné udalosti so závažnosťou <strong>INFO</strong>. Napríklad <em>dostupná aktualizácia aplikácie</em>, <em>dostupná aktualizácia Tailscale</em>, <em>dostupná aktualizácia optimalizácie ProxMenux</em> a <em>čakajúce bezpečnostné aktualizácie APT</em>. Výsledky záloh a ďalšie vyňaté udalosti akcií zostanú priame.",
|
||||
"<strong>Čo sa nikdy neodkladá:</strong>",
|
||||
"<strong>Trvalé uloženie.</strong> Udalosti čakajú v tabuľke SQLite <code>digest_pending</code> do nastaveného času a prežijú reštart.",
|
||||
"<strong>Bez udalostí nie je súhrn.</strong> Ak nečakajú INFO, prázdna správa sa neposiela."
|
||||
@@ -301,7 +301,7 @@
|
||||
{
|
||||
"stage": "Interval opakovania",
|
||||
"what": "Po úspešnom odoslaní sa opakované odtlačky potlačia; stav je v <code>notification_last_sent</code>. Základ pre <code>CRITICAL</code>, <code>WARNING</code>, <code>INFO</code>, <code>resources</code> a <code>updates</code> je 86400 s. Výnimky: 5 s pre akcie VM/CT a vypnutie/reštart, 10 s pre výsledky záloh/replikácie, 1800–3600 s pre viaceré zdravotné stavy. Výslovné nastavenia udalosti/skupiny majú prednosť.",
|
||||
"tunable": "Áno — konfiguračné hodnoty pre udalosť či skupinu prepisujú predvolené intervaly."
|
||||
"tunable": "Len cez API nastavení — kľúč <code>cooldown.<event_type></code> alebo <code>cooldown.<group></code> prepíše predvolené hodnoty; v rozhraní na to nie je žiadny ovládací prvok."
|
||||
},
|
||||
{
|
||||
"stage": "Zoskupovanie nárazových udalostí",
|
||||
@@ -330,7 +330,7 @@
|
||||
"<strong>Metóda a URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code> bez HTTPS Monitora; s HTTPS samostatný miestny HTTP port 8009. Obe zostávajú na hostiteľovi.",
|
||||
"<strong>Šablóna správy.</strong> JSON s funkciami Handlebars PVE, uložený v konfigurácii ako base64. Po dekódovaní:",
|
||||
"<strong>Pravidlo priradenia.</strong> Blok <code>matcher: proxmenux-matcher</code> s <code>mode all</code> posiela všetky oznámenia PVE do cieľa.",
|
||||
"<strong>Súkromná konfigurácia.</strong> Nastavenie zapíše <code>webhook: proxmenux-webhook</code> do <code>/etc/pve/priv/notifications.cfg</code> so zdieľaným tajomstvom v base64. Verejný cieľ ho použije pre X-Webhook-Secret. Blok nie je prázdny."
|
||||
"<strong>Súkromná konfigurácia.</strong> Nastavenie zapíše zodpovedajúci blok <code>webhook: proxmenux-webhook</code> do <code>/etc/pve/priv/notifications.cfg</code> s položkou <code>secret</code> s názvom X-Webhook-Secret, zakódovanou v base64. Verejný blok cieľa obsahuje iba šablónu tela, metódu a URL. Súkromný blok nie je prázdny zástupný záznam."
|
||||
],
|
||||
"securityTitle": "Ako je prijímač zabezpečený",
|
||||
"securityIntro": "Prijímač webhook na <code>POST /api/notifications/webhook</code> používa rôzne bezpečnostné vrstvy v závislosti od toho, odkiaľ pochádza žiadosť:",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"reaching": {
|
||||
"heading": "Öppna instrumentpanelen",
|
||||
"intro": "ProxMenux Monitor binder till <code>0.0.0.0:8008</code>. Det finns tre vanliga sätt att nå den:",
|
||||
"outro": "Direktåtkomst motsvarar standardenheten för systemd. Omvänd proxy och Secure Gateway beskrivs nedan. Klient-IP från <code>X-Forwarded-For</code> kräver PROXMENUX_TRUST_PROXY=1 och en proxy du kontrollerar. Enbart <code>X-Forwarded-Proto</code> eller <code>X-Forwarded-Host</code> aktiverar inte detta förtroende; frontend bygger API-URL:er från webbläsarens ursprung."
|
||||
"outro": "Direktåtkomst motsvarar standardenheten för systemd. Omvänd proxy och Secure Gateway beskrivs nedan. Förtroende för klient-IP i <code>X-Forwarded-For</code> kräver PROXMENUX_TRUST_PROXY=1 och en proxy du kontrollerar. Enbart förekomsten av <code>X-Forwarded-Proto</code> eller <code>X-Forwarded-Host</code> aktiverar inte proxyförtroende. På portarna 80/443 använder frontend relativa <code>/api/*</code>-URL:er; på alla andra portar anropas port 8008 på samma värdnamn."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Första starten",
|
||||
@@ -117,8 +117,8 @@
|
||||
"loginImageCaption": "När autentiseringen är konfigurerad börjar varje besök på instrumentbrädan här. Med 2FA aktiverad ber skärmen om 6-siffrig kod i ett andra steg efter att lösenordet accepteras.",
|
||||
"loginFlowTitle": "Inloggningsflöde",
|
||||
"twofaIntro": "Med 2FA returnerar första anropet <code>requires_totp: true</code>. Upprepa det med den sexsiffriga koden:",
|
||||
"publicTitle": "Offentlig åtkomst och skyddade kontroller",
|
||||
"publicIntro": "Inloggning och autentiseringsstatus är offentliga. Kontot kan skapas så länge användarnamn och lösenord inte sparats, även efter att skydd avböjts. Systemdata kräver autentisering när skyddet är aktivt:",
|
||||
"publicTitle": "Offentliga slutpunkter (utan token)",
|
||||
"publicIntro": "Inloggning, autentiseringsstatus, första konfigurationen och den lätta slutpunkten <code>/api/system-info</code> är offentliga:",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code> och <code>/api/auth/status</code> är offentliga. <code>/api/auth/setup</code> skapar första kontot och vägrar skriva över befintliga inloggningsuppgifter.",
|
||||
"<code>/api/system-info</code> är en offentlig ändpunkt med grundläggande systeminformation, inklusive <code>health.status</code>. Den kräver ingen token. Även /api/auth/status är offentlig och passar för en tillgänglighetskontroll."
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"asset": "TOTP-hemlighet för 2FA",
|
||||
"algorithm": "Standard-TOTP (RFC 6238) med base32-kodad hemlighet. De åtta engångskoderna för återställning lagras som SHA-256-hashar.",
|
||||
"algorithm": "Standard-TOTP (RFC 6238) med base32-kodad hemlighet. De åtta reservkoderna är engångskoder och lagras som SHA-256-hashar.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
@@ -243,17 +243,17 @@
|
||||
}
|
||||
],
|
||||
"backupTitle": "Varför säkerhetskopior behövs",
|
||||
"backupBody": "Om enheten försvinner, använd en sparad återställningskod eller återställ en säkerhetskopia som du ordnat i förväg. Molnsynkronisering och exporter skiljer sig mellan appar; kontrollera att TOTP-hemligheterna kan återställas. Root-åtkomst på värden möjliggör också återställning enligt nedan. Spara en separat, säker kopia.",
|
||||
"backupBody": "Om autentiseringsenheten försvinner, använd en sparad reservkod eller återställ appen från en säkerhetskopia som du ordnat i förväg. Molnsynkronisering och lokala exporter skiljer sig mellan appar; kontrollera att den valda metoden verkligen återställer TOTP-hemligheterna. Root-åtkomst på värden möjliggör också återställning enligt nedan. Spara en separat, säker kopia.",
|
||||
"setupTitle": "Ställ in steg för steg från panelen",
|
||||
"setupImageAlt": "2FA-inställning med QR-kod och återställningskoder",
|
||||
"setupImageCaption": "2FA-dialogen visar QR-kod, Base32-hemlighet för manuell inmatning och åtta engångskoder för återställning. Kopiera dem innan dialogen stängs; de visas inte igen.",
|
||||
"setupImageCaption": "Installationsdialogen för 2FA visar en QR-kod, en Base32-hemlighet för manuell inmatning och, efter verifieringen, åtta reservkoder för engångsbruk. Kopiera koderna innan dialogen stängs; de visas inte igen.",
|
||||
"setupSteps": [
|
||||
"<strong>Installera autentiseringsappen på din telefon</strong> (eller öppna din lösenordshanterare). En av apparna från tabellen ovan. Du behöver bara göra det en gång - samma app kommer att hålla koder för varje tjänst du skyddar.",
|
||||
"<strong>Logga in på panelen</strong> med användarnamn och lösenord.",
|
||||
"<strong>Öppna fliken Säkerhet</strong> och välj <strong>Aktivera 2FA</strong>. Dialogen visar QR-kod, Base32-hemlighet och åtta återställningskoder.",
|
||||
"<strong>Öppna fliken Säkerhet</strong> i instrumentpanelens sidofält och klicka sedan på <strong>Aktivera 2FA</strong> och <strong>Starta installationen</strong>. Dialogen visar en QR-kod och den manuella nyckeln; de åtta reservkoderna visas när koden har verifierats.",
|
||||
"<strong>Lägg till posten i autentiseringsappen:</strong>",
|
||||
"<strong>Spara återställningskoderna.</strong> Förvara alla åtta i en lösenordshanterare, krypterad anteckning eller säker papperskopia. Varje kod fungerar en gång när appen är otillgänglig.",
|
||||
"<strong>Bekräfta med den aktuella sexsiffriga koden</strong> från appen i fältet \"Verifieringskod\" och skicka. Koden ändras var 30:e sekund; använd nästa om den hinner löpa ut.",
|
||||
"<strong>Bekräfta med den aktuella sexsiffriga koden</strong> från appen i fältet \"Verifieringskod\" i installationsdialogen och skicka. Koden ändras var 30:e sekund; använd nästa om den hinner löpa ut medan du skriver.",
|
||||
"<strong>Spara reservkoderna.</strong> Förvara efter verifieringen alla åtta säkert i en lösenordshanterare, krypterad anteckning eller säker papperskopia. Varje kod fungerar en gång om autentiseringsappen är otillgänglig.",
|
||||
"<strong>Klart.</strong> 2FA är aktivt. Nästa inloggning frågar först efter lösenord och sedan den aktuella sexsiffriga koden."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
@@ -261,17 +261,17 @@
|
||||
"<em>Manuellt alternativ</em> när skanning inte är möjlig, exempelvis på samma telefon: <em>Lägg till konto</em> → <em>Ange inställningsnyckel</em>. Välj ett namn som <em>Proxmox Monitor</em>, klistra in Base32-hemligheten, lämna <em>Typ</em> som <em>Tidsbaserad</em> och spara."
|
||||
],
|
||||
"testTitle": "Test innan du loggar ut",
|
||||
"testBody": "Behåll den nuvarande sessionen och testa en ny inloggning i ett privat fönster <em>omedelbart</em> efter inställningen. Kontrollera serverns och telefonens klockor om koden nekas, innan du stänger den fungerande sessionen. Om åtkomsten redan är förlorad, använd återställningskod eller redigera <code>auth.json</code> från värdens skal.",
|
||||
"testBody": "Behåll den nuvarande sessionen och testa en ny inloggning i ett privat fönster <em>omedelbart</em> efter inställningen. Kontrollera serverns och telefonens klockor om koden nekas, innan du loggar ut från den fungerande sessionen. Om åtkomsten redan är förlorad, använd en reservkod eller redigera <code>auth.json</code> från värdens skal.",
|
||||
"lostTitle": "Förlorad autentiseringsapp",
|
||||
"lostIntro": "Tre återställningsmetoder, från minst till mest ingripande:",
|
||||
"lostItems": [
|
||||
"<strong>Använd en återställningskod.</strong> Ange en av de åtta sparade koderna i TOTP-fältet. Den fungerar en gång; oanvända koder förblir giltiga. Ställ sedan in 2FA på nytt i inställningarna för åtta nya koder.",
|
||||
"<strong>Använd en reservkod.</strong> Ange en av de åtta sparade koderna i TOTP-fältet. Den fungerar en gång; oanvända koder förblir giltiga. Öppna Säkerhet efter inloggningen, välj <strong>Inaktivera 2FA</strong> och sedan <strong>Aktivera 2FA</strong> för att få åtta nya koder.",
|
||||
"<strong>Återställ appen från moln eller säkerhetskopia.</strong> Med inställd molnsynkronisering kan appen installeras och kontot öppnas på en ny enhet: Google, Microsoft, Authy, Apple Passwords via iCloud-nyckelring, Ente eller 2FAS. Med en exportfil från Aegis, Raivo eller FreeOTP+, installera appen och importera filen.",
|
||||
"<strong>Stäng av 2FA från värdens skal.</strong> Om övriga metoder saknas, redigera <code>/root/.config/proxmenux-monitor/auth.json</code> som root via SSH eller konsol. Sätt <code>totp_enabled</code> till <code>false</code>, spara och starta om tjänsten:"
|
||||
],
|
||||
"lostShellOutro": "Du kan logga in med användarnamn + lösenord bara, sedan aktivera 2FA från Inställningar.",
|
||||
"disableTitle": "Inaktivera 2FA",
|
||||
"disableBody": "Öppna <strong>Säkerhet</strong> och välj <strong>Inaktivera 2FA</strong>. <code>POST /api/auth/totp/disable</code> kräver aktuellt lösenord och giltig TOTP- eller återställningskod. Hemligheten och återställningskoderna tas bort. Ta även bort den gamla posten i appen.",
|
||||
"disableBody": "Öppna <strong>Säkerhet</strong> och välj <strong>Inaktivera 2FA</strong>. <code>POST /api/auth/totp/disable</code> kräver aktuellt lösenord och en giltig TOTP- eller reservkod. TOTP-hemligheten och reservkoderna tas bort. Ta även bort den gamla posten i autentiseringsappen.",
|
||||
"rejectedTitle": "Den sexsiffriga koden nekas alltid",
|
||||
"rejectedIntro": "TOTP är tidsbaserat. Serverns och telefonens klockor bör skilja mindre än cirka 30 s. Två kontroller:",
|
||||
"rejectedItems": [
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "Avstängt som standard, aktiveras med ett reglage",
|
||||
"body": "AI-omskrivning är avstängd som standard. Aktivera den under <em>Inställningar → Aviseringar → Avancerat: AI-förbättring</em>. Om kontextberikning eller omskrivning misslyckas skickas originalmallen. Varje omskrivning har högst 25 sekunders väntetid; därefter används mallen i stället för obegränsad väntan."
|
||||
"body": "AI-omskrivning är avstängd som standard. Aktivera den under <em>Inställningar → Aviseringar → Avancerat: AI-förbättring</em>. Om kontextberikning eller omskrivning misslyckas skickar sändaren originalmallen. Omskrivningar i händelsernas sändningskö har en tidsgräns på 25 sekunder; när den nås skickas mallen i stället för att vänta."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Hur det fungerar",
|
||||
@@ -109,7 +109,7 @@
|
||||
],
|
||||
"customNote": "Läget med egen prompt har en fast gräns på 500 utdatatoken oavsett detaljnivå. Du styr prompten och gränsen motverkar alltför långa svar.",
|
||||
"sizingTitle": "Praktisk storlek",
|
||||
"sizingBody": "Uppskatta förbrukningen som omskrivna händelser × AI-kanaler × in- och utdatatoken per anrop. Exempel: 50 händelser × en kanal × (500 indata + 300 utdata) = 40 000 token per dag. Förbrukning och kostnad beror på modell, kontext, cache och leverantörsgränser. <link>Detaljnivå per kanal</link> visar <code>brief</code> för chatt i stället för <code>standard</code>, med fortsatt detaljerad e-post."
|
||||
"sizingBody": "Uppskatta förbrukningen som omskrivna händelser × AI-aktiverade kanaler × in- och utdatatoken per anrop. Exempel: 50 händelser × en kanal × (2 000 indata + 300 utdata) blir cirka 115 000 token per dag, eftersom standardsystemprompten ensam är ungefär 1 500 token. Faktisk förbrukning och kostnad beror på modell, kontext, cache och leverantörsgränser. Avsnittet <link>Detaljnivå per kanal</link> visar hur du använder <code>brief</code> för chatt i stället för <code>standard</code>, med fortsatt detaljerade e-postrapporter."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "AI-leverantörer",
|
||||
@@ -142,7 +142,7 @@
|
||||
"items": [
|
||||
"API-nyckel: <a>console.anthropic.com/settings/keys</a>",
|
||||
"Exempel från den medföljande modellistan: <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
|
||||
"Medföljande rekommendation: <strong><code>claude-haiku-4-5-20251001</code></strong>. Denna exakta version är rekommenderad; de äldre Claude 3.5-posterna finns inte längre i listan."
|
||||
"Medföljande rekommendation: <strong><code>claude-haiku-4-5-20251001</code></strong>, en fast ögonblicksbild i stället för ett rörligt alias."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Skapar en vzdump-säkerhetskopia av VM eller LXC. Valfria fält att anpassa till lagringen: <code>storage</code> (PVE-mål), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> eller <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> eller <code>none</code>), <code>protected</code> (<code>true</code> eller <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> eller <code>never</code>) och <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> eller <code>data</code>). Returnerar PVE-uppgiftens UPID."
|
||||
"use": "Skapar en vzdump-säkerhetskopia av en VM eller LXC. Fält i begäran, alla valfria om inte standardvärdena passar lagringsupplägget: <code>storage</code> (en PVE-lagring), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> eller <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> eller <code>none</code>), <code>protected</code> (<code>true</code> eller <code>false</code>), <code>notes</code> och <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> eller <code>data</code>). Returnerar PVE-uppgiftens UPID."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
@@ -286,7 +286,7 @@
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Startar ett SMART-självtest. Schema för begäran: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
"use": "Startar ett SMART-självtest. Schema för begäran: <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
|
||||
@@ -73,13 +73,13 @@
|
||||
"intro": "AppImage innehåller ett filsystem som monteras vid körning. <code>AppRun</code> i roten ställer in miljön och startar <code>flask_server.py</code>:",
|
||||
"consequencesIntro": "Två konsekvenser av denna layout:",
|
||||
"consequences": [
|
||||
"<strong>Medföljande Python-miljö.</strong> Tolken och paketen finns i AppImage utan installation i värdens system-Python. Appen använder fortfarande kärngränssnitt och externa värdverktyg.",
|
||||
"<strong>Medföljande Python-paket.</strong> Python-paketen levereras i AppImage och körs med värdens egen Python-tolk 3.11 (PVE 8) eller 3.13 (PVE 9), utan att något installeras i värdens system-Python. Appen använder fortfarande värdens kärngränssnitt och externa värdverktyg.",
|
||||
"<strong>Maskinvaruklienter ingår.</strong> Här finns <code>ipmitool</code>, <code>lm-sensors</code> och <code>upsc</code>. Mätningar kräver maskinvarustöd, sensoråtkomst och för UPS en konfigurerad NUT-server."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Flask-appens struktur",
|
||||
"intro": "<code>flask_server.py</code> skapar en <code>Flask(__name__)</code>-instans med begränsat CORS, registrerar nio blueprints direkt och initierar terminalen. Tabellen visar huvudmoduler; även granskning, VM-säkerhetskopiering och PBS registreras. PVE-förladdning körs bara på PVE-värdar.",
|
||||
"intro": "<code>flask_server.py</code> skapar en <code>Flask(__name__)</code>-instans med begränsade CORS-ursprung, registrerar tio blueprints direkt och initierar terminalrutterna. Tabellen visar huvudmodulerna; blueprints för PBS, Monitor-länkar, granskning och VM-säkerhetskopiering registreras också. PVE-specifik förladdning körs bara på PVE-värdar.",
|
||||
"headerBlueprint": "Blueprint / modul",
|
||||
"headerPrefix": "Ruttprefix",
|
||||
"headerOwns": "Ansvar",
|
||||
@@ -242,10 +242,10 @@
|
||||
"Uppdateringar: väntande paket och säkerhetsuppdateringar.",
|
||||
"Loggar: ihållande mönster, toppar och kaskader i systemjournalen.",
|
||||
"Minne: OOM-händelser och ihållande minnestryck.",
|
||||
"Temperatur: CPU- och diskvärden jämförs med övervakningsgränser; tillgängliga sensorer beror på maskinvaran.",
|
||||
"CPU: användning och CPU-temperatur jämförs med de konfigurerbara gränserna; tillgängliga sensorer beror på maskinvaran.",
|
||||
"Säkerhet: inloggningsfel, blockeringar och Fail2Ban-jailstatus."
|
||||
],
|
||||
"afterIntro": "Resultat använder stabil <code>error_key</code>, kategori och allvarlighetsgrad. Rader i <code>errors</code> uppdateras med <code>last_seen</code> och räknare utan dubbletter. Aviseringssändning har även egna fingeravtryck och väntetider.",
|
||||
"afterIntro": "Resultat använder stabil <code>error_key</code>, kategori och allvarlighetsgrad. Befintliga poster i <code>errors</code> uppdateras på plats (<code>last_seen</code>, allvarlighetsgrad, orsak) i stället för att dupliceras. Aviseringssändning har även egna regler för fingeravtryck och väntetider.",
|
||||
"cycleEnd": "Rensning kan lösa gamla fel med kategorins <em>tid för undertryckning</em> och statusregler, ta bort övergivna poster för borttagna resurser och radera <code>events</code> äldre än 30 dagar. Kategorierna beskrivs i <link>Panel → Health Monitor</link>."
|
||||
},
|
||||
"notifications": {
|
||||
@@ -264,9 +264,9 @@
|
||||
"intro": "Fliken <em>Terminal</em> ansluter en lätt <code>xterm.js</code>-klient till ett PTY på servern via WebSocket. Två lägen finns:",
|
||||
"items": [
|
||||
"<strong>HTTP-läge, standard:</strong> den inbyggda Flask-servern med <code>flask-sock</code> hanterar byte till WebSocket-protokollet.",
|
||||
"<strong>HTTPS-/WSS-läge:</strong> använder <code>gevent.pywsgi.WSGIServer</code> med <code>geventwebsocket.handler.WebSocketHandler</code> för WebSocket över TLS."
|
||||
"<strong>HTTPS-/WSS-läge:</strong> TLS-servern använder <code>gevent.pywsgi.WSGIServer</code> med sin standardhanterare; <code>flask-sock</code> hanterar WebSocket-anslutningar över TLS."
|
||||
],
|
||||
"outro": "Terminalprocesser ärver <code>User=root</code>. Med autentisering på kräver WebSocket en kortlivad engångsbiljett från den autentiserade biljettslutpunkten med administratörsbehörighet. Om autentisering är avstängd eller avböjd följer anslutningen det oautentiserade läget.",
|
||||
"outro": "Terminalens underprocesser ärver <code>User=root</code> från tjänsten. För att öppna en WebSocket krävs en kortlivad engångsbiljett från den autentiserade slutpunkten för terminalbiljetter med administratörsbehörighet.",
|
||||
"proxyNote": "Med omvänd proxy måste WebSocket och dess headers <code>Upgrade</code> och <code>Connection</code> vidarebefordras. Terminalen kräver det."
|
||||
},
|
||||
"proxy": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user