docs: review Monitor documentation in all seven translations

This commit is contained in:
Jonatan
2026-10-17 15:08:53 +02:00
parent ce1a3de719
commit dace78214a
209 changed files with 43788 additions and 1942 deletions
@@ -0,0 +1,396 @@
{
"meta": {
"title": "Autenticazione della dashboard Proxmox — 2FA, token API, profilo, proxy inverso | ProxMenux Monitor",
"description": "Accesso e protezione di ProxMenux Monitor: configurazione iniziale, password con nome e avatar, profilo, TOTP 2FA, token API per script, HTTPS, esempi Nginx/Caddy/Traefik, registro di controllo e jail Fail2Ban facoltativa.",
"ogTitle": "Autenticazione Proxmox — 2FA, token API, proxy inverso",
"ogDescription": "Proteggi ProxMenux Monitor con password, TOTP 2FA, token API, HTTPS, esempi di proxy inverso e jail Fail2Ban facoltativa.",
"twitterTitle": "Autenticazione di Dashboard Proxmox | ProxMenux Monitor",
"twitterDescription": "Password + TOTP 2FA, Token API, HTTPS, Nginx/Caddy/Traefik snippets e log audit."
},
"header": {
"title": "Accesso e autenticazione",
"description": "Accesso alla dashboard, primo avvio e livelli di protezione: password e TOTP, sessioni JWT, token API, HTTPS, proxy inversi, Secure Gateway e jail Fail2Ban facoltativa.",
"section": "Monitor di ProxMenux"
},
"intro": {
"title": "L’autenticazione è facoltativa",
"body": "Al primo avvio la dashboard mostra la finestra <em>«Proteggere la dashboard?»</em>, con i pulsanti <strong>Sì, imposta password</strong> e <strong>No, continua senza protezione</strong>. Scegliendo la seconda opzione, gli endpoint dell’API rimangono aperti sulla porta TCP 8008: può andare bene in una LAN di laboratorio isolata, ma è pericoloso in altri ambienti. L’autenticazione a due fattori (2FA) <strong>non</strong> fa parte di questa scelta iniziale; si configura successivamente nella <strong>scheda Sicurezza</strong>, dopo aver impostato una password."
},
"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."
},
"firstLaunch": {
"heading": "Procedura al primo avvio",
"intro": "La prima volta che si apre il cruscotto, il frontend chiama <code>GET /api/auth/status</code>. Se la configurazione auth non è mai stata scritta (<code>configured: false</code>), una singola finestra di dialogo appare intitolato <em>\"Protect Your Dashboard?\"</em> con due scelte:",
"imageAlt": "Finestra iniziale «Proteggere la dashboard?» con opzioni per impostare una password o continuare senza protezione",
"imageCaption": "Scelta iniziale tra protezione con password e nessuna protezione. Ricompare dopo una nuova installazione o dopo aver disattivato l’autenticazione nelle impostazioni.",
"headerButton": "Pulsante",
"headerWhat": "Cosa succede?",
"headerApi": "Chiamata API",
"rows": [
{
"button": "Sì, imposta password",
"what": "Apre un modulo con nome utente e password obbligatori, più <em>nome visualizzato</em> e <em>immagine avatar</em> facoltativi. Abilita l’autenticazione in <code>auth.json</code> con <code>enabled: true</code> e restituisce un JWT per accedere. I campi facoltativi del profilo vengono salvati con chiamate successive, descritte sotto.",
"api": "POST /api/auth/setup"
},
{
"button": "No, continua senza protezione",
"what": "Imposta <code>declined: true</code> in <code>auth.json</code>. Gli endpoint API restano aperti finché non abiliti la protezione nelle impostazioni.",
"api": "POST /api/auth/skip"
}
],
"twofaCalloutTitle": "2FA è configurato in seguito, non qui",
"twofaCalloutBody": "La finestra iniziale riguarda solo la password. L’<strong>autenticazione a due fattori (TOTP)</strong> si configura dopo nella <strong>scheda Sicurezza</strong>, una volta effettuato l’accesso con password. La procedura completa è più avanti.",
"createTitle": "Creare il primo utente",
"createIntro": "<em>Sì, imposta password</em> apre un modulo per creare l’account e compilare il profilo facoltativo, così l’avatar appare subito dopo il salvataggio. I campi sono:",
"headerField": "Campo",
"headerRequired": "Obbligatorio",
"headerNotes": "Note",
"fieldRows": [
{
"field": "Nome utente",
"required": "Sì",
"notes": "Identificativo di accesso. Non modificabile dall’interfaccia: occorre intervenire direttamente su <code>auth.json</code>."
},
{
"field": "Password",
"required": "Sì",
"notes": "Almeno 10 caratteri da almeno 3 delle 4 categorie: minuscole, maiuscole, cifre e simboli. Password ovvie come <code>password</code>, <code>12345678</code> e <code>proxmenux</code> vengono rifiutate. Le stesse regole valgono sul server: curl non può aggirarle."
},
{
"field": "Nome visualizzato",
"required": "No",
"notes": "Nome nel menu dell’intestazione e nel profilo. Se vuoto, viene usato il nome utente. Modificabile da <strong>Avatar → Visualizza profilo</strong>."
},
{
"field": "Immagine di Avatar",
"required": "No",
"notes": "PNG, JPEG, WebP o GIF fino a 2 MB. Visualizzato come un cerchio nell’intestazione e nel profilo. Senza immagine viene mostrata l’iniziale del nome visualizzato o del nome utente su sfondo colorato. Dal profilo puoi caricare, sostituire o rimuovere l’immagine."
}
],
"createImageAlt": "Modulo per creare l’account con nome utente e password obbligatori, nome visualizzato e avatar facoltativi",
"createImageCaption": "Modulo del primo avvio. Nome visualizzato e avatar sono facoltativi; lasciandoli vuoti si crea l’account con un’iniziale in un cerchio nell’intestazione.",
"saveCalloutTitle": "Un salvataggio, fino a tre chiamate API",
"saveCalloutBody": "Il modulo invia prima <code>POST /api/auth/setup</code> con nome utente e password. Con il JWT ricevuto esegue, se compilati, <code>PUT /api/auth/profile</code> per il nome e <code>POST /api/auth/profile/avatar</code> per l’immagine. Un errore del profilo non annulla l’account: potrai completarlo in seguito.",
"avatarTitle": "Menu Avatar e pagina del profilo",
"avatarBody1": "Dopo la configurazione appare l’avatar in alto a destra, accanto al selettore del tema. Il menu apre profilo e Sicurezza e offre <strong>Esci</strong>. Puoi terminare la sessione anche dalla scheda Sicurezza.",
"avatarBody2": "Il profilo mostra avatar, nome utente in sola lettura e nome visualizzato modificabile. Caricamenti, sostituzioni e rimozioni dell’avatar sono atomici; l’intestazione si aggiorna automaticamente dopo il successo. Modulo iniziale e profilo usano gli stessi endpoint descritti sotto.",
"profileImageAlt": "Profilo con anteprima avatar, pulsanti Carica / Sostituisci / Rimuovi, nome utente in sola lettura e nome visualizzato modificabile",
"profileImageCaption": "Pagina del profilo. Il nome utente è in sola lettura; nome visualizzato e avatar sono modificabili qui senza aprire Sicurezza.",
"headerEndpoint": "Endpoint",
"headerEpWhat": "Che cosa fa",
"endpointRows": [
{
"endpoint": "GET /api/auth/profile",
"what": "Restituisce nome utente, nome visualizzato e stato dell’avatar (<code>has_avatar</code>, <code>avatar_mtime</code>)."
},
{
"endpoint": "PUT /api/auth/profile",
"what": "Aggiorna il nome visualizzato. Corpo della richiesta: <code>'{' \"display_name\": \"...\" '}'</code>."
},
{
"endpoint": "GET /api/auth/profile/avatar",
"what": "Restituisce l’immagine PNG / JPEG / WebP / GIF con il tipo di contenuto corretto. Richiede l’header Bearer: il frontend scarica un blob e crea un URL locale per visualizzarlo."
},
{
"endpoint": "POST /api/auth/profile/avatar",
"what": "Carica un nuovo avatar (max 2 MB). Il tipo di contenuto deve corrispondere al file. Il vecchio avatar è sostituito atomicamente."
},
{
"endpoint": "DELETE /api/auth/profile/avatar",
"what": "Rimuove l’avatar. Nell’intestazione ricompare un’iniziale in un cerchio colorato."
}
],
"reversibleTitle": "Puoi attivare la protezione in seguito",
"reversibleBody": "Dopo <em>No, continua senza protezione</em>, la finestra iniziale non ricompare. Attiva l’autenticazione dalla <strong>scheda Sicurezza</strong> oppure modifica <code>/root/.config/proxmenux-monitor/auth.json</code>, rimuovi il flag <code>declined</code> e riavvia il servizio."
},
"password": {
"heading": "autenticazione password",
"intro": "Dopo la configurazione, le chiamate API protette richiedono un JWT in <code>Authorization: Bearer &lt;token&gt;</code>:",
"items": [
"<strong>Token di sessione:</strong> valido 24 ore, emesso da <code>POST /api/auth/login</code>.",
"<strong>Token API per integrazioni:</strong> valido 365 giorni, emesso da <code>POST /api/auth/generate-api-token</code>. Dettagli nella sezione successiva."
],
"loginImageAlt": "schermata di accesso mostrata dopo la configurazione dell'autenticazione — campi username e password",
"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:",
"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à."
],
"cryptoTitle": "Crittografia e archiviazione",
"cryptoIntro": "ProxMenux Monitor è fonte aperta — nessuno di questo è segreto. Documentare lo stack qui esplicitamente è una scelta deliberata: gli operatori che memorizzano le credenziali sul loro host meritano di sapere come queste credenziali sono protette prima che decidano di fidarsi di loro. Gli algoritmi sottostanti sono gli stessi che il codice in <code>scripts/auth_manager.py</code> utilizza; questa sezione è un contratto, non una promessa di marketing.",
"headerAsset": "Elemento",
"headerAlgo": "Algoritmo",
"headerWhere": "Posizione",
"cryptoRows": [
{
"asset": "Password",
"algorithm": "PBKDF2-HMAC-SHA256 con un sale casuale per password e un alto conteggio di iterazione (OWASP 2023+ baseline). Conservato come <code>pbkdf2_sha256$&lt;iters&gt;$&lt;salt&gt;$&lt;hash&gt;</code>.",
"where": "<code>auth.json</code> → <code>password_hash</code>"
},
{
"asset": "Sessione / API JWT",
"algorithm": "Firma HS256 con un segreto per installazione generato al primo avvio (<code>secrets.token_urlsafe</code>, ≥48 byte). I token contengono <code>iss=proxmenux-monitor</code> e <code>aud=api</code>; ogni richiesta verifica la firma con il segreto attuale.",
"where": "Segreto: <code>auth.json</code> → <code>jwt_secret</code>. JWT: solo sul cliente."
},
{
"asset": "metadati di token API",
"algorithm": "L’hash SHA-256 del JWT viene salvato con l’impronta <code>signed_with</code> del <code>jwt_secret</code> usato. Permette di mostrare i metadati e rilevare i token interessati da un cambio del segreto.",
"where": "<code>auth.json</code> → <code>api_tokens[]</code>"
},
{
"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.",
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
},
{
"asset": "Revoche",
"algorithm": "Quando un token viene revocato, il suo hash SHA-256 entra in un elenco di blocco verificato a ogni controllo. Una cache in memoria di circa 30 s evita letture ripetute del disco.",
"where": "<code>auth.json</code> → <code>revoked_tokens[]</code>"
}
],
"authJsonTitle": "auth.json — ciò che contiene e come è protetto",
"authJsonBody": "I dati di autenticazione sono in <code>/root/.config/proxmenux-monitor/auth.json</code>, modalità <code>0600</code>, proprietario <code>root</code>. Contiene <em>hash</em> PBKDF2 e <em>segreti crittografici</em> (<code>jwt_secret</code>, <code>totp_secret</code>), mai la password in chiaro. Cifra le destinazioni di backup o replica e non inserire questo file nel controllo di versione.",
"rotateTitle": "La rotazione di jwt_secret invalida tutti i JWT esistenti",
"rotateBody": "Se <code>auth.json</code> viene ricreato o ripristinato con un segreto diverso, cambia <code>jwt_secret</code>. I vecchi JWT di sessione e API falliscono con \"Invalid or expired token\". L’interfaccia li segnala come <strong>Non valido — rigenerare</strong>. Revocali e sostituiscili anche in Home Assistant, script e altri client.",
"recoverTitle": "Recuperare una password persa",
"recoverIntro": "Il recupero della password richiede accesso alla shell dell’host. ProxMenux offre una reimpostazione guidata nel menu di configurazione, senza modificare manualmente <code>auth.json</code>:",
"survivesTitle": "Cosa sopravvive al reset",
"survivesBody": "Viene cancellato l’accesso interattivo, mentre <code>jwt_secret</code> e gli <code>api_tokens</code> registrati restano. Home Assistant e altri script possono continuare con gli stessi token. Per azzerare tutto con un nuovo segreto, elimina <code>auth.json</code> e riavvia il servizio: tutti i vecchi token diventano invalidi.",
"physicalTitle": "Prerequisito di accesso fisico",
"physicalBody": "Richiede una <strong>shell root sull’host</strong>. Chi esegue <code>menu</code> come root controlla già la macchina; reimpostare la password non aumenta i suoi privilegi. L’accesso Monitor non protegge quindi da chi dispone già di accesso root."
},
"twofa": {
"heading": "Autenticazione a due fattori (TOTP)",
"intro": "2FA aggiunge alla password un codice a sei cifre che cambia ogni 30 secondi, generato sul telefono o gestore di password. La sola password non basta per entrare. ProxMenux Monitor usa il protocollo standard <strong>TOTP</strong> (RFC 6238), compatibile con le app di autenticazione.",
"pickTitle": "Scegli un’app di autenticazione",
"pickIntro": "Puoi usare un’app TOTP già installata. La tabella elenca opzioni comuni: alcune gratuite, altre in abbonamento. Cambiano anche piattaforme e metodi di backup.",
"headerApp": "App",
"headerPlatforms": "Piattaforme",
"headerAppNotes": "Note",
"apps": [
{
"name": "Google Authenticator",
"href": "https://safety.google/authentication/",
"platforms": "iOS, Android",
"notes": "Il default per molti utenti. Backup cloud opzionale di Google-account."
},
{
"name": "Microsoft Authenticator",
"href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app",
"platforms": "iOS, Android",
"notes": "Backup tramite account Microsoft. Gestisce anche le notifiche push Microsoft, se le usi al lavoro."
},
{
"name": "Authy",
"href": "https://authy.com/",
"platforms": "iOS, Android",
"notes": "Sincronizzazione cifrata tra dispositivi. L’app desktop non è più supportata dal 19 marzo 2024."
},
{
"name": "Apple Passwords",
"href": "https://support.apple.com/guide/passwords/welcome/mac",
"platforms": "iOS, iPadOS, macOS, visionOS, Windows (tramite iCloud)",
"notes": "Integrata nei sistemi Apple; app Passwords autonoma da iOS 18 / macOS Sequoia. Conserva TOTP con la password e sincronizza tramite Portachiavi iCloud."
},
{
"name": "Bitwarden",
"href": "https://bitwarden.com/",
"platforms": "iOS, Android, computer, browser",
"notes": "Open source. TOTP può essere conservato con le password nell’archivio. È comodo, ma non mantiene i due fattori su dispositivi separati."
},
{
"name": "1Password",
"href": "https://1password.com/",
"platforms": "iOS, Android, computer, browser",
"notes": "Stessa idea di Bitwarden — TOTP integrato con il caveau password. Abbonamento."
},
{
"name": "Aegis Authenticator",
"href": "https://getaegis.app/",
"platforms": "Android",
"notes": "Open source. File di backup cifrato sul dispositivo, sotto il tuo controllo. Nessun cloud né account richiesto."
},
{
"name": "Raivo OTP",
"href": "https://raivo-otp.com/",
"platforms": "iOS, macOS",
"notes": "Open source. Sincronizzazione iCloud facoltativa. Alternativa nell’ecosistema Apple paragonabile ad Aegis."
},
{
"name": "Ente Auth",
"href": "https://ente.io/auth/",
"platforms": "iOS, Android, computer, web",
"notes": "Open source. Sincronizzazione cloud fra dispositivi con cifratura end-to-end."
},
{
"name": "2FAS",
"href": "https://2fas.com/",
"platforms": "iOS, Android, estensione del browser",
"notes": "Open source. Backup cloud cifrato facoltativo; l’estensione browser può compilare automaticamente i codici."
},
{
"name": "FreeOTP+",
"href": "https://github.com/helloworld1/FreeOTPPlus",
"platforms": "Android",
"notes": "Fork open source di FreeOTP per Android, con importazione ed esportazione. Non richiede account."
}
],
"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.",
"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.",
"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>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>Fatto.</strong> 2FA è attivo. Al prossimo accesso verrà richiesta prima la password, poi il codice attuale a sei cifre."
],
"setupStep4Sub": [
"<em>Metodo semplice:</em> nell’app scegli <em>Aggiungi account</em> → <em>Scansiona QR</em> e inquadra il codice. La voce viene nominata automaticamente, ad esempio <code>ProxMenux Monitor (your-username)</code>, e mostra un codice a sei cifre che cambia ogni 30 secondi.",
"<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.",
"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>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.",
"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": [
"<strong>Telefono:</strong> Impostazioni → Data e ora → sincronizzazione automatica / di rete attiva.",
"<strong>Host Proxmox:</strong> <code>timedatectl status</code> dovrebbe mostrare \"System clock synchronized: yes\". Altrimenti esegui <code>timedatectl set-ntp true</code> e attendi un minuto."
],
"rejectedOutro": "Quando gli orologi sono sincronizzati, il codice viene accettato nella successiva finestra di 30 secondi."
},
"apiTokens": {
"heading": "Token API di lunga durata",
"intro": "Le sessioni scadono dopo 24 ore. Per Homepage, Home Assistant, Grafana o Uptime Kuma crea un <strong>token API</strong> valido 365 giorni. Il JWT usa lo stesso segreto di firma; il campo <code>token_name</code> permette di identificarlo e revocarlo singolarmente.",
"imageAlt": "Pannello di token API con nome, prefisso, data e scadenza",
"imageCaption": "Elenco token nelle impostazioni: nome, prefisso con ultimi quattro caratteri di identificazione, date di creazione e scadenza, revoca.",
"generateTitle": "Generare un token",
"generateIntro": "Dal cruscotto:",
"generateSteps": [
"Apri <strong>Sicurezza → Token di accesso API</strong>.",
"Assegna un nome descrittivo, <em>ad esempio \"Home Assistant\"</em>.",
"Reinserisci la password e, con 2FA attivo, il codice attuale a sei cifre.",
"Premi <strong>Genera token</strong>. Compare <strong>una sola volta</strong>: copialo subito."
],
"generateCli": "Dalla riga di comando:",
"useTitle": "Usare un token",
"revokeTitle": "Revocare un token",
"revokeBody": "Ogni riga offre <strong>Revoca</strong>, che aggiunge l’hash a <code>revoked_tokens</code> in <code>auth.json</code>. Il token viene rifiutato dalla richiesta successiva.",
"cheatTitle": "Scheda di sicurezza token",
"cheatItems": [
"Conserva i token nel sistema di segreti dell’integrazione: Homepage <code>secrets.yaml</code>, Home Assistant <code>!secret</code> o variabili d’ambiente. Non inserirli mai in Git.",
"Un token per integrazione, con il suo nome. Revocalo quando rimuovi l’integrazione.",
"Ruotare ogni 6–12 mesi. La scadenza è un limite duro, non una raccomandazione."
],
"outro": "Indicazioni di archiviazione ed esempi: <apiLink>Riferimento API → Gestione token</apiLink> e <intLink>Integrazioni</intLink>."
},
"https": {
"heading": "HTTPS",
"intro": "Due percorsi per TLS:",
"items": [
"<strong>Proxy inverso consigliato.</strong> Termina TLS su Nginx / Caddy / Traefik e inoltra HTTP al processo Flask sulla porta 8008. Esempi sotto.",
"<strong>HTTPS diretto nell’AppImage.</strong> Configura un certificato con <code>POST /api/ssl/configure</code> (interfaccia: <strong>Impostazioni → SSL</strong>). HTTPS usa <code>gevent.pywsgi</code> con il gestore standard; flask-sock gestisce WebSocket per WSS. I percorsi sono salvati nella configurazione SSL."
],
"calloutTitle": "Limitazioni dirette HTTPS",
"calloutBody": "Monitor può usare un certificato gestito da Proxmox o file personalizzati. Non emette certificati ACME. Per emissione e rinnovo automatici usa Proxmox ACME o un proxy Caddy, Traefik o Nginx e assicurati che i certificati rinnovati vengano caricati."
},
"gateway": {
"heading": "Gateway sicuro (Tailscale)",
"intro": "Un proxy inverso consente l’accesso remoto. <strong>Secure Gateway</strong> evita di esporre TCP 8008: distribuisce un LXC Alpine con <a>Tailscale</a> come router di sottorete. L’accesso all’IP LAN dell’host dipende da rotte approvate e regole della tailnet.",
"calloutTitle": "Perché questo è conveniente",
"calloutBody": "Usa l’URL LAN <code>http://&lt;proxmox-lan-ip&gt;:8008</code> tramite la rotta approvata. I router Tailscale usano SNAT per impostazione predefinita: Monitor vede normalmente l’IP LAN del gateway, non l’indirizzo <code>100.x.y.z</code> del client. Registri e Fail2Ban identificano l’origine effettivamente ricevuta dall’host.",
"deployBody": "In una schermata scegli lo storage LXC, incolla una chiave Tailscale creata su <a>login.tailscale.com/admin/settings/keys</a>, scegli le sottoreti e distribuisci. Il LXC si inizializza in circa 30 secondi e si registra nella tailnet.",
"outro": "Distribuzione, rotte di sottorete, ACL Tailscale e modalità Exit Node sono descritte in <link>Dashboard → Sicurezza → Secure Gateway</link>, dove si trova la procedura guidata. Qui viene descritto l’accesso."
},
"proxy": {
"heading": "Snippet del proxy inverso",
"intro": "Usa un <strong>nome host dedicato</strong>, come <code>monitor.example.com</code>, inoltrato alla porta 8008 dell’host Proxmox. Gli esempi seguono questo schema. Un sottopercorso come <code>example.com/proxmenux-monitor/</code> richiede modifiche a frontend e proxy: rimuovere il prefisso non basta.",
"nginxTitle": "Nginx",
"caddyTitle": "Caddy",
"traefikTitle": "Traefik (etichette — Docker / Kubernetes)",
"subPathTitle": "Avanzato: distribuzione in un sottopercorso",
"subPathBody": "Il frontend attuale non ha una base per sottopercorsi e costruisce chiamate dalla radice con URL <code>/api/*</code>. Rimuovere un prefisso come <code>example.com/proxmenux-monitor/</code> non gestisce queste chiamate né tutti i file frontend. Usa un nome host dedicato. Un sottopercorso richiede modifiche coordinate e verifiche specifiche."
},
"audit": {
"heading": "Registro di audit",
"intro": "Errori di accesso e avvisi sui limiti vengono scritti, una riga per evento, in <code>/var/log/proxmenux-auth.log</code>. Questo logger non registra gli accessi riusciti:",
"outro": "Segui il registro con <code>tail -F /var/log/proxmenux-auth.log</code>. Una configurazione aggiuntiva di <code>logrotate</code> ne gestisce la rotazione; Monitor non la esegue."
},
"fail2ban": {
"heading": "Facoltativo: jail di Fail2Ban",
"calloutTitle": "Fail2Ban non è in bundle con il Monitor",
"calloutBody": "Fail2Ban <strong>non</strong> viene installato da Monitor. Installalo da <link>Sicurezza → Fail2Ban</link> nel menu ProxMenux o dal pacchetto Debian. Senza di esso resta il registro, ma non il blocco automatico degli IP.",
"intro": "L’integrazione ProxMenux fornisce una jail <code>[proxmenux]</code> che:",
"items": [
"Legge <code>/var/log/proxmenux-auth.log</code>.",
"Abbina il modello <code>authentication failure; rhost=&lt;ip&gt;</code> con un filtro dedicato.",
"Blocca normalmente l’IP responsabile nel firewall del kernel.",
"L’hook Flask <code>before_request</code> confronta le richieste con l’elenco di blocco, in cache per 30 s. Dietro un proxy inverso, il blocco per IP richiede anche PROXMENUX_TRUST_PROXY=1 e un proxy controllato che imposti header affidabili."
],
"outro": "Configurazione, durata dei blocchi e sblocco: <link>Sicurezza → Fail2Ban</link>."
},
"troubleshoot": {
"heading": "Risoluzione dei problemi",
"noScreenTitle": "Lo schermo del primo lancio non appare mai",
"noScreenBody": "L’autenticazione è già configurata (<code>configured: true</code>) oppure è stata saltata. Per ricominciare:",
"noScreenOutro": "Cancella autenticazione, segreti TOTP e token API. Salva prima una copia di <code>auth.json</code> se vuoi conservarli.",
"tokenTitle": "HTTP 401 su ogni richiesta da un token API funzionante",
"tokenBody": "Token scaduto (365 d limit) o entrato nell'elenco <code>revoked_tokens</code>. Generare uno nuovo in Impostazioni e aggiornare l'integrazione. Per verificare:",
"tokenOutro": "Token scaduti o revocati restituiscono <code>'{'\"error\":\"Invalid or expired token\"'}'</code>.",
"no2faTitle": "Non è possibile accedere dopo aver abilitato 2FA, nessun autenticatore a portata di mano",
"no2faBody": "Utilizzare un codice di backup nel campo TOTP. Se questi sono andati, modificare <code>/root/.config/proxmenux-monitor/auth.json</code> da una shell host, impostare <code>totp_enabled</code> a <code>false</code>, riavviare il servizio.",
"wsTitle": "Il proxy inverso funziona ma la scheda terminale si disconnette ogni minuto",
"wsBody": "Timeout di inattività WebSocket del proxy. Aumenta il limite di lettura (Nginx: <code>proxy_read_timeout 86400s</code>; Traefik: <code>idleTimeout</code> nell’entry point o middleware). Per Nginx verifica <code>proxy_set_header Upgrade $http_upgrade</code> e <code>Connection \"upgrade\"</code>."
},
"whereNext": {
"heading": "Prossimi passi",
"items": [
{
"label": "Riferimento API → Gestione token",
"href": "/docs/monitor/api",
"tail": " — creare, elencare e revocare token API; sicurezza e archiviazione dei segreti."
},
{
"label": "Integrazioni",
"href": "/docs/monitor/integrations",
"tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma ed esempi cURL."
},
{
"label": "Dashboard → Sicurezza → Secure Gateway",
"href": "/docs/monitor/dashboard/security",
"tail": " — distribuire il LXC gateway Tailscale: rotte di sottorete, ACL e modalità Exit Node."
},
{
"label": "Sicurezza → Fail2Ban",
"href": "/docs/security/fail2ban",
"tail": " — installare e configurare la jail facoltativa."
},
{
"label": "Impostazioni → ProxMenux Monitor",
"href": "/docs/settings/proxmenux-monitor",
"tail": " — avviare e fermare il servizio systemd dalla TUI ProxMenux."
}
]
}
}
@@ -0,0 +1,342 @@
{
"meta": {
"title": "Assistente IA Proxmox — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor",
"description": "L’assistente IA facoltativo riscrive le notifiche Proxmox VE in un linguaggio chiaro. Sei provider: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter e Ollama. L’interfaccia offre tredici lingue, tre livelli di dettaglio per canale, prompt personalizzati con una raccolta della comunità e contesto con tempo di attività, ricorrenza e dati SMART.",
"ogTitle": "Assistente AI Proxmox — OpenAI, Claude, Gemini, Groq, Ollama",
"ogDescription": "Riscrivi le notifiche Proxmox VE in un linguaggio chiaro con OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter o Ollama locale.",
"twitterTitle": "Assistente IA per Proxmox | ProxMenux Monitor",
"twitterDescription": "Riscrivi le notifiche Proxmox VE in un linguaggio chiaro con OpenAI, Anthropic, Gemini, Groq, OpenRouter o Ollama locale."
},
"header": {
"title": "Assistente AI",
"description": "La riscrittura IA facoltativa trasforma le notifiche idonee in messaggi chiari, con dettaglio per canale, tredici lingue nell’interfaccia, prompt personalizzati, raccolta pubblica della comunità e contesto aggiuntivo. I rapporti <code>backup_complete</code> e <code>backup_fail</code> escludono completamente l’IA.",
"section": "Monitor di ProxMenux"
},
"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."
},
"howItWorks": {
"heading": "Come funziona",
"intro": "Gli eventi inviati da Monitor seguono lo stesso processo. La riscrittura IA è una fase facoltativa tra il testo del modello e l’invio al canale. Un evento attraversa quattro passaggi:",
"steps": [
"<strong>Evento e modello.</strong> Un evento arriva da uno dei sei raccoglitori. <code>notification_templates.py</code> lo formatta come testo semplice strutturato, che il canale invierebbe senza riscrittura IA.",
"<strong>Arricchimento del contesto.</strong> Il sistema di invio aggiunge i segnali pertinenti all’evento: tempo di attività per guasti critici del sistema, frequenza degli eventi, dati SMART per i dischi, corrispondenze nel database degli errori noti e righe di log.",
"<strong>Creazione del prompt.</strong> Il prompt di sistema unisce modello e impostazioni del canale: lingua, dettaglio, regole emoji dei <em>Messaggi arricchiti</em> e suggerimenti IA se attivi. In modalità personalizzata, il tuo prompt sostituisce completamente quello di sistema. Il messaggio utente contiene testo del modello e blocchi di contesto.",
"<strong>Chiamata al provider.</strong> Groq, OpenAI, Anthropic, Gemini, Ollama o OpenRouter restituisce titolo e testo riscritti. Il sistema di invio analizza la risposta, sostituisce questi contenuti per il canale e li passa all’adattatore di consegna."
],
"notesIntro": "Tre dettagli che vale la pena tenere a prima di leggere il resto di questa pagina:",
"notes": [
"<strong>L’IA non crea eventi.</strong> Ogni evento nasce da un segnale reale: controllo di integrità, riga di log, webhook PVE, ecc. Il testo viene prodotto dal modello prima di arrivare all’IA, che traduce e riformatta senza monitorare il sistema.",
"<strong>L'AI funziona per canale.</strong> Telegram e Discord possono usare una breve riscrittura mentre l'Email riceve un report dettagliato — stesso evento, forma diversa, tutti da una chiamata del fornitore per canale.",
"<strong>In caso di errore si usa il modello.</strong> Se il provider restituisce un errore 5xx, supera il tempo limite, produce un formato errato o rifiuta la richiesta, il sistema registra l’errore e invia il testo originale del modello per quel canale."
]
},
"enabling": {
"heading": "Abilitare il pannello",
"intro": "La configurazione AI vive nella parte inferiore del pannello Notifiche all'interno della scheda Impostazioni, come un blocco pieghevole <em>Advanced: AI Enhancement</em>. Fare clic sull'intestazione per espandere:",
"collapsedAlt": "Intestazione AI avanzata collassata con indicatore chevron",
"collapsedCaption": "Chiuso per impostazione predefinita; un clic espande il pannello.",
"panelAlt": "Pannello IA aperto con interruttore principale, provider Google Gemini, chiave API nascosta, modello gemini-2.5-flash, prompt predefinito, lingua inglese, dettaglio per Telegram, Discord, Gotify ed e-mail, suggerimenti IA e test di connessione",
"panelCaption": "Il pannello completo AI Enhancement — ogni controllo documentato in questa pagina mappa a uno dei campi sopra.",
"outro": "Dall’alto: interruttore <em>Messaggi migliorati con IA</em>, scelta del provider e finestra informativa, chiave API o URL Ollama, elenco dei modelli caricato dopo la chiave, modalità <em>Predefinita</em> / <em>Personalizzata</em>, lingua, dettaglio per canale, <em>Suggerimenti IA</em> e pulsante <em>Verifica connessione</em> che invia un messaggio di prova al provider per verificare le credenziali."
},
"context": {
"heading": "Quale contesto riceve l'AI",
"intro": "Prima della costruzione del prompt, il dispacciatore passa una routine di arricchimento del contesto che decide quali segnali aggiuntivi sono rilevanti per l'evento a portata di mano. L'obiettivo è quello di dare al LLM abbastanza informazioni per produrre un messaggio utile, senza inondarlo (e il portafoglio) con rumore che non si applica. Cinque blocchi di contesto possono essere aggiunti al messaggio utente:",
"headerBlock": "Blocco",
"headerWhen": "Quando viene iniettato",
"headerWhat": "Che cosa porta",
"rows": [
{
"block": "Tempo di attività sistema",
"when": "Solo per guasti critici del sistema: <code>crash</code>, <code>panic</code>, <code>oom</code>, <code>kernel</code>, <code>split_brain</code>, <code>quorum_lost</code>, <code>node_offline</code>, <code>node_fail</code>, <code>system_fail</code>, <code>boot_fail</code>. Viene omesso per errori dei dischi, avvisi e operazioni ordinarie per mantenere il prompt conciso.",
"what": "Una linea come <code>System uptime: 14 days (stable system)</code>. Consente al LLM di distinguere i problemi di avvio da guasti di lunga durata."
},
{
"block": "Frequenza dell'evento",
"when": "Sempre, quando il Monitor ha visto la stessa impronta.",
"what": "Numero di occorrenze, data e ora della prima rilevazione e tipo di andamento facoltativo: ricorrente, isolato o picco. Il modello distingue così un problema ricorrente da uno visto per la prima volta."
},
{
"block": "Dati SMART",
"when": "Solo per eventi relativi al disco (tipo di evento contiene <code>disk</code>, <code>smart</code>, <code>storage</code>, <code>io_error</code>, o il corpo menziona <code>/dev/sd</code>, <code>ata</code>, <code>i/o error</code>).",
"what": "Uscita di <code>smartctl</code> per il dispositivo interessato — salute generale (PASSED / FAILED) più gli attributi rilevanti per la modalità di guasto."
},
{
"block": "Database degli errori noti",
"when": "Quando il testo o i log corrispondono a uno schema di errore specifico di Proxmox incluso in Monitor.",
"what": "Un blocco <code>KNOWN PROXMOX ERROR DETECTED</code> con la causa abbinata e una soluzione concreta. Il prompt istruisce il LLM a tradurre questo verbatim — nessun parafrasamento della correzione raccomandata."
},
{
"block": "Log di sistema",
"when": "Quando il raccoglitore originario ha acquisito righe di log per l’evento, soprattutto nel monitoraggio dei log e delle attività.",
"what": "Estratti originali di <code>journalctl</code>. Il prompt chiede al modello di estrarre ID, date e ore e indizi sulla causa principale, ignorando le voci non pertinenti."
}
],
"afterBlocks": "Una volta che questi blocchi sono uniti, il messaggio utente inviato al LLM ha questa forma:",
"calloutTitle": "Nessuna telemetria oltre l'evento stesso",
"calloutBody": "Monitor invia solo i dati disponibili per l’evento corrente: nessuna telemetria generale, serie storica di metriche o esportazione dell’inventario. I cinque blocchi indicati sono il limite del contenuto inviato per una riscrittura IA."
},
"tokens": {
"heading": "Tokens — che cosa sono e come sono consumati",
"intro1": "I provider commerciali fatturano i <em>token</em>. Un token equivale indicativamente a quattro caratteri inglesi o tre quarti di una parola. La frase inglese <em>\"Backup completed on storage local-bak\"</em> contiene circa otto token. Dieci righe di log possono richiedere 200–400 token, secondo la densità tecnica.",
"intro2": "Due cose sono fatturate su ogni chiamata:",
"items": [
"<strong>Token in ingresso</strong>: prompt di sistema e messaggio utente con gravità, titolo, testo del modello e contesto aggiuntivo. La quantità dipende da prompt ed evento. Ogni canale riscritto può consumare i propri token; i rapporti di backup completato o fallito escludono l’IA.",
"<strong>Token in uscita</strong>: la risposta del modello. Monitor li limita con <code>max_tokens</code>. Il tetto è un <em>limite</em>, non un consumo fisso: se il modello produce 250 token con un limite di 1500, paghi per 250."
],
"capsIntro": "Questi sono i limiti effettivi applicati dal sistema di invio, definiti in <code>AI_DETAIL_TOKENS</code> in <code>notification_templates.py</code>:",
"headerLevel": "Livello di dettaglio",
"headerCap": "Limite di uscita (token)",
"headerConsumption": "Tipico consumo reale",
"capRows": [
{
"level": "breve",
"cap": "500",
"consumption": "Token di uscita 50-200 per eventi brevi."
},
{
"level": "standard",
"cap": "1500",
"consumption": "200–700 token in uscita per eventi tipici con poco contesto."
},
{
"level": "dettagliato",
"cap": "3000",
"consumption": "Token di uscita 500-2000 per report e-mail completi con tabelle di log e SMART."
}
],
"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."
},
"providers": {
"heading": "Fornitori di AI",
"intro": "Monitor integra sei provider. Il menu li mostra tutti e il pulsante informativo accanto apre una finestra con una breve descrizione di ciascuno. Di seguito trovi URL per la chiave API, descrizioni dell’interfaccia e note dal codice.",
"imageAlt": "Finestra informativa dei sei provider IA: Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama e OpenRouter, con icona, breve descrizione e nota sulle API compatibili con OpenAI",
"imageCaption": "In-app modal — sei carte, una per fornitore, con le stesse descrizioni documentate di seguito.",
"groq": {
"heading": "Groq",
"tagline": "Molto veloce, generoso tier libero (30 req/min). Ideale per iniziare.",
"items": [
"Chiave API: <a>console.groq.com/keys</a>",
"Esempi dall’elenco di modelli incluso: <code>allam-2-7b</code>, <code>qwen/qwen3.8-27b</code>, <code>openai/gpt-oss-20b</code>, <code>groq/compound-mini</code>.",
"Raccomandazione inclusa: <strong><code>openai/gpt-oss-20b</code></strong>. Verifica la disponibilità per il tuo account tramite il selettore del provider e il test di connessione."
]
},
"openai": {
"heading": "OpenAI",
"tagline": "Standard di settore. Molto accurato e ampiamente usato.",
"items": [
"Chiave API: <a>platform.openai.com/api-keys</a>",
"Esempi dall’elenco di modelli incluso: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
"Raccomandazione inclusa: <strong><code>gpt-4.1-nano</code></strong>. L’adattatore gestisce anche i requisiti dei modelli di ragionamento; la lista include gpt-5-nano, quindi questi modelli non sono esclusi in generale."
],
"baseUrlTitle": "URL di base compatibile con OpenAI",
"baseUrlBody": "Il provider OpenAI accetta un <em>URL di base</em> personalizzato per endpoint compatibili, come <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong> e <strong>Fireworks AI</strong>, che usano il formato <code>/v1/chat/completions</code>. Imposta l’URL nella scheda OpenAI accanto alla chiave API."
},
"anthropic": {
"heading": "Anthropic (Claude)",
"tagline": "Eccellente per la scrittura e la traduzione. Veloce ed economico.",
"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."
]
},
"gemini": {
"heading": "Google Gemini",
"tagline": "Piano gratuito disponibile, buon rapporto qualità/prezzo.",
"items": [
"Chiave API: <a>aistudio.google.com/app/apikey</a>",
"Esempi dall’elenco di modelli incluso: <code>gemini-2.5-flash-lite</code>, <code>gemini-2.5-flash</code>, <code>gemini-3-flash-preview</code>.",
"Raccomandato: <strong><code>gemini-2.5-flash-lite</code></strong> — flash e flash-lite passano costantemente il verificatore. Le varianti pro rifiutano il <code>thinkingBudget=0</code> impostando il Monitor utilizza e sono overkill per questo carico di lavoro."
]
},
"openrouter": {
"heading": "OpenRouter",
"tagline": "Aggregatore con accesso a oltre 100 modelli tramite una sola chiave API. Massima flessibilità.",
"items": [
"Chiave API: <a>openrouter.ai/keys</a>",
"Esempi dall’elenco di modelli incluso: <code>meta-llama/llama-3.3-70b-instruct</code>, <code>meta-llama/llama-3.1-70b-instruct</code>, <code>meta-llama/llama-3.1-8b-instruct</code>, <code>anthropic/claude-haiku-4.5</code>, <code>google/gemini-2.5-flash-lite</code>, <code>openai/gpt-4o-mini</code>, <code>mistralai/mistral-medium-3</code>.",
"Raccomandato: <strong><code>meta-llama/llama-3.3-70b-instruct</code></strong> — stesso modello della voce Groq ma percorso attraverso OpenRouter, che significa una singola chiave per tutti i modelli elencati."
]
},
"ollama": {
"heading": "Ollama (locale)",
"tagline": "Usa i modelli esposti dal server Ollama configurato. I modelli locali vengono eseguiti lì; i modelli cloud inoltrano le richieste a un provider esterno. L’esecuzione locale evita costi di API ospitate, ma usa hardware ed elettricità tuoi.",
"items": [
"Nessuna chiave API. Impostare il campo <em>Ollama URL</em> sul server (default <code>http://localhost:11434</code> o qualsiasi host esegue l'istanza Ollama).",
"Modelli <strong>non filtrati.</strong> Monitor legge i modelli scaricati con <code>ollama pull &lt;model&gt;</code>. L’elenco viene caricato da <code>GET /api/tags</code> sul server Ollama.",
"Installazione: <a>ollama.com/download</a> — Linux, macOS e Windows. Scegli un modello che rientri nella RAM e abbia una finestra di contesto sufficiente per i blocchi di log aggiunti dal sistema di invio."
]
}
},
"models": {
"heading": "Perché questi modelli specifici",
"intro": "La scelta dei modelli commerciali usa il catalogo incluso <code>verified_ai_models.json</code> e i controlli di disponibilità degli adattatori. Questi convertono la richiesta interna <code>system_prompt + user_message + max_tokens</code> nel formato di ciascuna API. Il catalogo contiene voci testate e aggiunte manuali; non garantisce accesso attuale né lo stesso test di verifica per ogni modello.",
"consequencesIntro": "Due conseguenze che meritano di essere consapevoli di:",
"consequences": [
"<strong>La raccomandazione inclusa</strong> è un punto di partenza per le notifiche. Valuta qualità linguistica, latenza e costo con i tuoi eventi e il tuo account; non è una classifica universale.",
"<strong>Puoi scegliere un altro modello elencato</strong> secondo quota e preferenze. Verifica la disponibilità con il test di connessione: essere in lista non garantisce l’accesso attuale."
],
"ollamaTitle": "Ollama è l'eccezione",
"ollamaBody": "La lista Ollama non è filtrata dal catalogo commerciale: mostra i modelli del server. Per l’esecuzione locale scegli un modello locale compatibile con RAM e contesto dei log. I modelli cloud restano remoti anche tramite un server Ollama locale."
},
"defaultPrompt": {
"heading": "Prompt predefinito",
"intro": "In modalità <em>Predefinita</em>, Monitor usa il prompt di sistema seguente. Prima della chiamata sostituisce i segnaposto: <code>'{'language'}'</code>, <code>'{'detail_level'}'</code>, <code>'{'emoji_instructions'}'</code>, <code>'{'suggestions_addon'}'</code>. Seguono le varianti per canali formattati o semplici e l’aggiunta per i suggerimenti IA.",
"showFullSummary": "Mostra il prompt completo del sistema predefinito",
"passagesIntro": "Due varianti di testo vengono scelte in base al controllo <em>Messaggi arricchiti</em> di ogni canale:",
"passages": [
"<strong>Rich on</strong> → un blocco emoji viene iniettato elencando le icone che l'LLM può utilizzare, più una regola hostname (il LLM deve mantenere il prefisso hostname dal titolo verbatim) e una manciata di esempi formattati (avvio di backup, completo di backup, aggiornamenti, avvio VM, degradato di salute). Questo è ciò che produce i messaggi prefissi emoji su Telegram e Discord.",
"<strong>Rich off</strong> → un blocco a una linea dice al LLM di utilizzare solo ASCII normale — senza emoji, senza simboli Unicode. Utilizzato per e-mail e qualsiasi canale in cui la formattazione del rumore fa male alle regole di inbox o alla leggibilità."
],
"suggestionsPlaceholder": "E il segnaposto <code>'{'suggestions_addon'}'</code> è vuoto a meno che non si abilitano suggerimenti AI (sezione successiva), nel qual caso questo blocco viene iniettato:",
"showAddonSummary": "Mostra il componente dei suggerimenti IA"
},
"customPrompt": {
"heading": "Modalità prompt personalizzato",
"intro": "La modalità <em>Personalizzata</em> sostituisce tutto il prompt di sistema con il tuo testo. Viene salvato nelle impostazioni SQLite e inviato senza modifiche a ogni chiamata IA. Puoi così scegliere tono, struttura e obiettivi diversi.",
"imageAlt": "Prompt personalizzato con area di testo per le regole di traduzione, pulsanti Esporta e Importa e collegamento ai prompt della comunità",
"imageCaption": "Custom Prompt — grande area di testo con il prompt dell'utente, più <em>Export</em>, <em>Import</em> e un collegamento alla galleria della comunità su GitHub.",
"changesTitle": "Cosa cambia in modalità personalizzata",
"changes": [
"<strong>Il prompt predefinito viene sostituito interamente.</strong> Le mappe Proxmox, le regole di gestione del contesto e le istruzioni emoji sono sparite. Se si desidera mantenere uno qualsiasi di loro, incollarli nel prompt — il bundle <code>EXAMPLE_CUSTOM_PROMPT</code> mostrato di seguito è un punto di partenza.",
"<strong>Il selettore linguistico viene ignorato.</strong> Il prompt predefinito ha un segnaposto <code>'{'language'}'</code>; il prompt personalizzato non lo fa. Se si desidera l'output in una lingua specifica, dichiararlo all'interno del prompt (\"Traduzione in spagnolo\", \"Output tutto in francese\").",
"<strong>Il limite personalizzato resta fisso a 500 token</strong>, indipendentemente dal dettaglio salvato per canale. La modalità predefinita usa 500 / 1500 / 3000. Modificare il prompt non aumenta il limite: chiedi risposte più brevi o usa un dettaglio predefinito adeguato.",
"<strong>I marcatori di uscita restano obbligatori.</strong> Includi <code>[TITLE]</code> e <code>[BODY]</code> nel formato di risposta. Il parser ne estrae il contenuto; se manca un marcatore, restituisce il modello originale.",
"Le regole emoji dei messaggi <strong>Rich non vengono iniettate automaticamente.</strong> Se si desidera emojis, indicare il prompt di utilizzarli. Se vuoi un testo normale, diglielo. La funzione di attivazione passa solo i blocchi in bundle del prompt predefinito, non la stringa personalizzata."
],
"starterTitle": "Avvio del prompt",
"starterIntro": "Il campo <em>Prompt personalizzato</em> contiene inizialmente un esempio minimo che puoi adattare:",
"showStarterSummary": "Mostra il prompt personalizzato starter",
"shareTitle": "Condividere i prompt con la comunità",
"shareIntro": "Il pulsante <em>Esporta</em> salva il prompt in un file (<code>.txt</code> / <code>.md</code>) da conservare come backup o condividere. <em>Importa</em> carica un file. Il terzo pulsante apre la raccolta pubblica della comunità su GitHub:",
"shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Condividi prompt personalizzati per notifiche IA",
"shareOutro": "Sfoglia la discussione per vedere i prompt di altri amministratori: avvisi molto brevi, rapporti tecnici dettagliati e varianti linguistiche. Se sei soddisfatto della tua versione, condividila con un paragrafo che ne spieghi l’obiettivo. Sono graditi anche riscontri su cosa funziona e cosa no."
},
"suggestions": {
"heading": "Suggerimenti IA (BETA)",
"intro": "I suggerimenti IA permettono di aggiungere <strong>un</strong> consiglio breve e pratico in fondo al testo. Richiedono modalità <em>Predefinita</em>, IA e <em>Suggerimenti IA</em> attivi. Il prompt chiede di ometterlo se causa o soluzione non sono chiare.",
"formatIntro": "Quando viene aggiunto un consiglio, segue questo formato:",
"rulesIntro": "Le regole incluse nel componente, visibili nel blocco espandibile della sezione Prompt predefinito:",
"rules": [
"Il suggerimento è incluso <em>solo</em> se il contesto del journal o il database degli errori noti indica chiaramente una correzione specifica.",
"Il prompt chiede un consiglio sotto i 100 caratteri; il parser non ne verifica separatamente la lunghezza.",
"Il prompt richiede un comando o percorso preciso e chiede al modello di evitare consigli generici.",
"Se un errore noto fornisce una soluzione, il LLM deve usare quella soluzione, non inventarne una nuova.",
"Il prompt chiede di omettere il consiglio se i dati non supportano una soluzione concreta."
],
"betaTitle": "Perché BETA",
"betaBody": "La qualità dei consigli dipende dal modello scelto e dal contesto dei log. Un modello come Claude 3.5 Haiku, GPT-4.1 Mini o Llama 3.3 70B, con dati smartctl e log, può dare consigli utili. Un piccolo modello Ollama locale con un evento di una riga può produrre un risultato poco utile o nessun consiglio. Disattiva i suggerimenti se disturbano e riattivali quando vuoi."
},
"detailLevel": {
"heading": "Livello di dettaglio per canale",
"intro": "Telegram, Discord, Gotify ed e-mail hanno ciascuno una scelta del dettaglio. Tre valori regolano i limiti dei token e le istruzioni del prompt predefinito:",
"headerLevel": "Livello",
"headerLabel": "Etichetta UI",
"headerCap": "Limite di uscita",
"headerProduce": "Che cosa il prompt chiede al LLM di produrre",
"rows": [
{
"level": "breve",
"label": "2–3 righe, solo l’essenziale",
"cap": "500 token",
"produce": "\"Cosa è successo + dove\". Nient'altro."
},
{
"level": "standard",
"label": "Concisa con contesto di base",
"cap": "1500 token",
"produce": "3–6 righe: cosa, dove, causa, dispositivi coinvolti."
},
{
"level": "dettagliato",
"label": "Dettagli tecnici completi",
"cap": "3000 token",
"produce": "Rapporto completo: cosa, dove, causa, dispositivi coinvolti, log, dati SMART e cronologia."
}
],
"defaultsIntro": "Impostazioni predefinite alla prima installazione:",
"defaults": [
"<strong>Telegram, Discord, Gotify</strong> — <code>standard</code>.",
"<strong>Email</strong> — <code>detailed</code>. Email è il canale in cui si desidera in genere l'immagine completa per l'archiviazione."
],
"emailTitle": "Il livello di dettaglio e-mail aggiunge l'originale",
"emailBody": "Se il formattatore IA restituisce un risultato per l’e-mail in <code>detailed</code> e il testo originale supera 50 caratteri, lo aggiunge dopo 40 trattini e <code>Original message:</code>. I dettagli restano disponibili per ricerche future. Se l’IA viene saltata o fallisce, può essere inviato solo il modello originale."
},
"language": {
"heading": "Lingua",
"intro": "Il selettore offre tredici lingue. Salva <code>ai_language</code>, usato dal prompt predefinito in <em>\"translate alerts into '{'language'}'\"</em>. L’elenco:",
"list": "Inglese (<code>en</code>), slovacco (<code>sk</code>), spagnolo (<code>es</code>), francese (<code>fr</code>), tedesco (<code>de</code>), portoghese (<code>pt</code>), italiano (<code>it</code>), russo (<code>ru</code>), svedese (<code>sv</code>), norvegese (<code>no</code>), giapponese (<code>ja</code>), cinese (<code>zh</code>), olandese (<code>nl</code>).",
"rulesIntro": "Due importanti regole prese direttamente dal prompt:",
"rules": [
"<strong>Tradurre</strong>: etichette, descrizioni, stati e unità, per esempio GB → Go in francese.",
"<strong>Non tradurre</strong>: nomi host, IP, percorsi, ID VM/CT, nomi dei dispositivi come <code>/dev/sdX</code>, identificatori tecnici. Questi rimangono verbatim indipendentemente dalla lingua."
],
"customNote": "Il prompt personalizzato <strong>non usa il selettore della lingua</strong>. Se vuoi una lingua specifica, dichiarala nel prompt."
},
"templates": {
"heading": "Una nota sui modelli",
"body1": "L’IA riceve il testo già prodotto da un modello, non dati grezzi. Tipi come <code>vm_start</code>, <code>auth_fail</code> e <code>health_degraded</code> hanno modelli in <code>notification_templates.py</code>. L’IA riscrive i testi idonei; <code>backup_complete</code> e <code>backup_fail</code> mantengono rapporti deterministici senza IA.",
"body2": "Due implicazioni pratiche: l'IA non vede mai un hostname o VMID che deve inventare — quei campi sono posti dal modello prima della riscrittura. E se l'IA è disabilitata, il corpo modello è quello che viene inviato direttamente. La pagina <link>Notifications</link> documenta la pipeline di spedizione in pieno ed è la giusta cross-referenza per tutto ciò che accade ad un evento prima che raggiunga questo livello."
},
"privacy": {
"heading": "Privacy e flusso dati",
"intro": "Con la riscrittura AI abilitata, il Monitor invia il corpo di notifica reso più i blocchi di contesto arricchiti al provider configurato. Ciò può includere nomi host, IP, nomi utente, percorsi di dispositivo, linee di registro di giornale e attributi SMART per il dispositivo interessato. Se questo lascia l'host dipende da quale fornitore hai scelto:",
"headerProvider": "Fornitore",
"headerDestination": "Destinazione dei dati",
"rows": [
{
"provider": "Ollama",
"destination": "I modelli locali vengono eseguiti sull’host Ollama configurato. Se è il nodo Proxmox, le richieste restano lì. I modelli cloud inoltrano le richieste all’esterno anche tramite un server Ollama locale."
},
{
"provider": "OpenAI",
"destination": "<code>api.openai.com</code> per impostazione predefinita o l’URL di base personalizzato. Si applica la politica sui dati del gestore effettivo dell’endpoint."
},
{
"provider": "Anthropic",
"destination": "<code>api.anthropic.com</code>."
},
{
"provider": "Google Gemini",
"destination": "<code>generativelanguage.googleapis.com</code>."
},
{
"provider": "Groq",
"destination": "<code>api.groq.com</code>."
},
{
"provider": "OpenRouter",
"destination": "<code>openrouter.ai</code> inoltra al provider del modello scelto nel campo <code>model</code>. Due passaggi invece di uno."
}
],
"calloutTitle": "Se i contenuti degli eventi non possono lasciare la rete",
"calloutBody": "Usa un endpoint ospitato localmente con un modello locale, come Ollama o un server compatibile OpenAI, oppure disattiva l’IA. I modelli cloud Ollama non elaborano i dati localmente. Il sistema non anonimizza nomi host o IP: crea il prompt dal contenuto reale dell’evento."
},
"whereNext": {
"heading": "Come proseguire",
"items": [
{
"label": "Notifiche",
"href": "/docs/monitor/notifications",
"tail": "— la pipeline di spedizione, i canali, le regolazioni per evento e l'integrazione PVE webhook che circonda questo strato."
},
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tail": "— il più grande produttore singolo di eventi l'AI finisce per riscrivere, con le proprie durate di soppressione per categoria."
},
{
"label": "Architettura",
"href": "/docs/monitor/architecture",
"tail": "— dove l'AI Enhancer si inserisce nel più ampio processo Monitor (è un modulo, non un servizio separato)."
}
],
"communityLabel": "Prompt della comunità su GitHub",
"communityTail": "— navigare, condividere, chiedere."
}
}
@@ -0,0 +1,760 @@
{
"meta": {
"title": "API Proxmox Monitor — Riferimento per le integrazioni | ProxMenux",
"description": "Endpoint HTTP di ProxMenux Monitor per Home Assistant, Homepage, Grafana, Prometheus, n8n e pannelli personalizzati. Consultazione dello stato e operazioni documentate: controllo VM, avvio backup, notifiche e conferma degli avvisi.",
"ogTitle": "API Proxmox Monitor — Riferimento per le integrazioni",
"ogDescription": "Endpoint di ProxMenux Monitor per Home Assistant, Homepage, Grafana, Prometheus, n8n e pannelli personalizzati.",
"twitterTitle": "Monitor Proxmox API | ProxMenux",
"twitterDescription": "Endpoint per Home Assistant, Homepage, Grafana, Prometheus, n8n e pannelli personalizzati."
},
"header": {
"title": "Riferimento API",
"description": "Endpoint HTTP per leggere lo stato e invocare azioni documentate: sensori Home Assistant, schede Homepage, pannelli Grafana, raccolta Prometheus, flussi n8n e script personalizzati. Include categorie, metriche esportate ed esempi curl.",
"section": "ProxMenux Monitor"
},
"intro": {
"title": "A cosa serve questa pagina",
"body": "Questa pagina raccoglie endpoint per integrazioni: lettura dei dati, avvio di backup, notifiche personalizzate e conferma degli avvisi. L’API usa il processo Flask del pannello su TCP <strong>8008</strong>. Indirizzo di ascolto e TLS sono descritti in <link>Accesso e autenticazione</link>."
},
"headerEndpoint": "Endpoint",
"headerMethod": "Metodo",
"headerUse": "Uso",
"auth": {
"heading": "Autenticazione",
"intro": "Con autenticazione attiva, gli endpoint protetti richiedono un token JWT Bearer nell’intestazione:",
"tokensIntro": "Due modi per ottenere il token:",
"items": [
"<strong>Token API, consigliati per le integrazioni.</strong> Valgono 365 giorni e si creano in <strong>Sicurezza → Token API</strong>. Hanno un nome e si revocano singolarmente. Usa read_only per i dati e full_admin solo per azioni amministrative necessarie.",
"<strong>Accesso, JWT di 24 ore.</strong> <code>POST /api/auth/login</code> con utente, password e TOTP se richiesto dalla 2FA. Il JWT scade dopo 24 ore; gli script devono autenticarsi di nuovo."
],
"flowLink": "Accesso, password, 2FA, registro di audit e TLS sono descritti in <link>Accesso e autenticazione</link>.",
"rows": [
{
"endpoint": "/api/auth/login",
"method": "POST",
"use": "Campi del corpo (schema): <code>'{'\"username\",\"password\",\"totp_token?\"'}'</code>. Restituisce un JWT di 24 ore."
},
{
"endpoint": "/api/auth/api-tokens",
"method": "GET",
"use": "Elenca i token API (solo metadati — nomi, prefissi, date; mai il segreto reale)."
},
{
"endpoint": "/api/auth/generate-api-token",
"method": "POST",
"use": "Crea un token API di 365 giorni con sessione autenticata. Campi: <code>password, token_name?, totp_token?, scope?</code>. Password e TOTP richiesto sono ricontrollati. scope vale read_only per impostazione predefinita; full_admin va scelto esplicitamente. Il segreto è restituito una sola volta."
},
{
"endpoint": "/api/auth/api-tokens/<id>",
"method": "DELETE",
"use": "Revocare un token specifico API dal suo ID."
}
]
},
"conventions": {
"heading": "Convenzioni",
"items": [
"La maggior parte usa JSON. Alcuni download restituiscono testo semplice; <code>/api/prometheus</code> usa il formato testuale Prometheus 0.0.4 anziché OpenMetrics. Controlla il tipo di risposta della singola rotta.",
"Molte scritture restituiscono <code>'{'\"success\": true, ...'}'</code>. Gli errori variano; un formato comune è <code>'{'\"success\": false, \"error\": \"'<'reason'>'\"'}'</code>. Controlla stato HTTP e campi: alcune richieste di autenticazione usano HTTP 200 con success false.",
"I parametri dipendono dall’endpoint. Usa <code>limit</code>, <code>offset</code>, <code>since</code> e filtri di categoria solo dove supportati.",
"I formati temporali variano: timestamp Unix, stringhe ISO-8601 e date systemd. Non presumere la stessa unità né un fuso esplicito per tutti i campi."
]
},
"system": {
"heading": "Sistema e hardware",
"rows": [
{
"endpoint": "/api/system",
"method": "GET",
"use": "Valori attuali di CPU, memoria, swap, tempo di attività e carico."
},
{
"endpoint": "/api/info",
"method": "GET",
"use": "Informazioni statiche dell’host: nome, kernel, versione PVE, modello CPU e distribuzione."
},
{
"endpoint": "/api/system-info",
"method": "GET",
"use": "Dati di sistema estesi usati nell’intestazione: metriche generali e ora di avvio."
},
{
"endpoint": "/api/hardware",
"method": "GET",
"use": "Inventario hardware dettagliato: dispositivi PCI, GPU e sensori."
},
{
"endpoint": "/api/hardware/live",
"method": "GET",
"use": "Valori attuali dei sensori che cambiano rapidamente."
},
{
"endpoint": "/api/temperature/history",
"method": "GET",
"use": "Serie temporali delle temperature CPU e package."
},
{
"endpoint": "/api/gpu/<slot>/realtime",
"method": "GET",
"use": "Metriche attuali delle GPU NVIDIA, Intel e AMD per posizione PCI."
}
]
},
"actions": {
"heading": "Azioni di sistema",
"intro": "Queste azioni asincrone usano unità systemd temporanee. Con autenticazione attiva, le scritture richiedono <code>full_admin</code>; <code>read_only</code> può consultare <code>.../status</code>. L’avvio accettato restituisce HTTP 202 e stato; consulta <code>.../status</code> per l’avanzamento. Controllo ospiti e backup usano risposte diverse, descritte sotto.",
"shapeTitle": "Forma di risposta comune",
"shapeIntro": "Le azioni di sistema asincrone condividono questo oggetto JSON di stato. Controllo ospiti e backup hanno formati diversi:",
"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": "Concorrenza e cancellazione",
"concurrencyBody": "Avviare di nuovo la stessa azione attiva restituisce HTTP 409. Si annulla solo con una rotta DELETE documentata, come per l’aggiornamento PVE. Lo stato passa a <code>cancelled</code> conservando le date. Gli stati finali restano nella memoria del processo e possono perdersi al riavvio di Monitor.",
"rows": [
{
"endpoint": "/api/system/power/reboot",
"method": "POST",
"use": "Avvia il riavvio dell’host Proxmox. La connessione HTTP può chiudersi quando systemd inizia l’arresto."
},
{
"endpoint": "/api/system/power/reboot/status",
"method": "GET",
"use": "Stato del riavvio attuale o precedente."
},
{
"endpoint": "/api/system/power/shutdown",
"method": "POST",
"use": "Spegne l’host Proxmox, ad esempio in risposta al segnale di arresto dell’UPS."
},
{
"endpoint": "/api/system/power/shutdown/status",
"method": "GET",
"use": "Stato dell’arresto attuale o precedente."
},
{
"endpoint": "/api/system/pve-update/run",
"method": "POST",
"use": "Avvia l’aggiornamento PVE usato da Aggiorna ora di Health Monitor e dal menu della shell; delega a update-pve-safe.sh."
},
{
"endpoint": "/api/system/pve-update/status",
"method": "GET",
"use": "Stato dell’aggiornamento PVE attuale o precedente."
},
{
"endpoint": "/api/system/pve-update",
"method": "DELETE",
"use": "Annulla un aggiornamento PVE in corso con SIGTERM."
},
{
"endpoint": "/api/proxmenux/self-update/run",
"method": "POST",
"use": "Aggiorna ProxMenux con l’installer del canale stabile o beta configurato. Usa un’unità systemd separata per continuare durante il riavvio di proxmenux-monitor eseguito dall’installer."
},
{
"endpoint": "/api/proxmenux/self-update/status",
"method": "GET",
"use": "Stato dell’aggiornamento ProxMenux attuale o precedente."
},
{
"endpoint": "/api/vms/<vmid>/control",
"method": "POST",
"use": "Invia un comando di controllo VM o LXC. <code>action</code> accetta <code>start</code>, <code>stop</code>, <code>shutdown</code> o <code>reboot</code>. La risposta riuscita restituisce una task PVE confermata, senza indicarne il completamento. Consulta l’endpoint control-task dell’ospite per l’esito."
},
{
"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."
},
{
"endpoint": "/api/vms/<vmid>/backups",
"method": "GET",
"use": "Elenca i backup precedenti di una VM o di un LXC negli storage raggiungibili."
}
],
"syncVsAsyncTitle": "Due tipi di azioni",
"syncVsAsyncBody": "Alimentazione e aggiornamenti host usano unità systemd temporanee con <code>.../status</code>. Solo l’aggiornamento PVE ha qui una rotta <code>DELETE</code> di annullamento. Il controllo VM/LXC restituisce una task da seguire; il backup un UPID di lavoro in background. Accettazione non significa completamento. Autenticazione e permessi dipendono dalla rotta.",
"curlTitle": "Esempio curl",
"curlBody": "Avvia un aggiornamento PVE e ne segue il completamento, come un’automazione 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\"",
"haTitle": "Esempio per Home Assistant",
"haBody": "Un sensore <code>rest</code> consulta lo stato e <code>rest_command</code> avvia l’aggiornamento. Usali con un pulsante del pannello e le automazioni desiderate:",
"haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\""
},
"health": {
"heading": "Monitoraggio integrità",
"rows": [
{
"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 di Uptime Kuma; con autenticazione attiva, il client deve inviare l’intestazione Bearer."
},
{
"endpoint": "/api/health/status",
"method": "GET",
"use": "Stato generale: un livello di gravità e un riepilogo."
},
{
"endpoint": "/api/health/details",
"method": "GET",
"use": "Le dieci categorie con stato e dati strutturati di ogni controllo."
},
{
"endpoint": "/api/health/full",
"method": "GET",
"use": "Dati completi: categorie, errori attivi, avvisi ignorati e impostazioni di silenziamento. Usa risultati in background di meno di sei minuti; altrimenti, o con aggiornamento forzato, esegue un nuovo controllo."
},
{
"endpoint": "/api/health/active-errors",
"method": "GET",
"use": "Elenco attivo, filtrabile con <code>?category=&lt;name&gt;</code>."
},
{
"endpoint": "/api/health/dismissed",
"method": "GET",
"use": "Avvisi ignorati con le ore di silenziamento rimanenti."
},
{
"endpoint": "/api/health/settings",
"method": "GET",
"use": "Durata del silenziamento impostata per categoria."
},
{
"endpoint": "/api/health/remote-storages",
"method": "GET",
"use": "Inventario degli storage remoti definiti in Proxmox, con stato di disponibilità."
},
{
"endpoint": "/api/health/interfaces",
"method": "GET",
"use": "Interfacce di rete con tipo (bridge / bond / fisica), IP e velocità del collegamento."
},
{
"endpoint": "/api/health/acknowledge",
"method": "POST",
"use": "Corpo: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Silenzia un avviso per la durata impostata nella categoria."
},
{
"endpoint": "/api/health/cleanup-orphans",
"method": "POST",
"use": "Pulizia manuale degli errori relativi a dispositivi o VM rimossi. Idempotente."
}
],
"outro": "Formati delle risposte e categorie sono descritti in <link>Health Monitor</link>."
},
"storage": {
"heading": "Archiviazione",
"rows": [
{
"endpoint": "/api/storage",
"method": "GET",
"use": "Dischi visibili all’host: dispositivi a blocchi, pool ZFS e LVM."
},
{
"endpoint": "/api/storage/summary",
"method": "GET",
"use": "Riepilogo compatto utilizzato da schede di dashboard."
},
{
"endpoint": "/api/proxmox-storage",
"method": "GET",
"use": "Storage definiti in <code>/etc/pve/storage.cfg</code>, con stato di disponibilità e spazio libero."
},
{
"endpoint": "/api/storage/observations",
"method": "GET",
"use": "Cronologia persistente: avvisi SMART, errori I/O ed eventi ZFS. Resta disponibile dopo la risoluzione automatica degli avvisi."
},
{
"endpoint": "/api/storage/smart/<disk>",
"method": "GET",
"use": "Attributi attuali SMART per un disco."
},
{
"endpoint": "/api/storage/smart/<disk>/latest",
"method": "GET",
"use": "Più recente SMART auto-test per il disco."
},
{
"endpoint": "/api/storage/smart/<disk>/history",
"method": "GET",
"use": "Elenco dei rapporti SMART memorizzati per il disco."
},
{
"endpoint": "/api/storage/smart/<disk>/history/<file>",
"method": "GET",
"use": "Legge un rapporto SMART specifico salvato."
},
{
"endpoint": "/api/storage/smart/<disk>/test",
"method": "POST",
"use": "Avvia un autotest SMART. Schema del corpo: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
},
{
"endpoint": "/api/storage/smart/schedules",
"method": "GET",
"use": "Elenca i test SMART attualmente programmati."
},
{
"endpoint": "/api/storage/smart/tools",
"method": "GET",
"use": "Verifica se <code>smartctl</code> e gli strumenti associati sono installati."
}
]
},
"network": {
"heading": "Rete",
"rows": [
{
"endpoint": "/api/network",
"method": "GET",
"use": "Tutte le interfacce con lo stato del collegamento e gli indirizzi."
},
{
"endpoint": "/api/network/summary",
"method": "GET",
"use": "Vista compatta utilizzata dal cruscotto."
},
{
"endpoint": "/api/network/<iface>/metrics",
"method": "GET",
"use": "RX/TX per interfaccia, contatori di errori e serie temporali RRD."
},
{
"endpoint": "/api/network/latency/current",
"method": "GET",
"use": "Ultima misurazione di latenza verso il gateway."
},
{
"endpoint": "/api/network/latency/history",
"method": "GET",
"use": "Serie temporale di latenza gateway."
}
]
},
"vms": {
"heading": "VM e container",
"rows": [
{
"endpoint": "/api/vms",
"method": "GET",
"use": "VM e CT del nodo locale con stato, vmid e nome."
},
{
"endpoint": "/api/vms/<vmid>",
"method": "GET",
"use": "Dettagli completi di un ospite: configurazione, rete e dischi."
},
{
"endpoint": "/api/vms/<vmid>/metrics",
"method": "GET",
"use": "Serie temporali di CPU, memoria e I/O disco di un ospite (RRD)."
},
{
"endpoint": "/api/vms/<vmid>/logs",
"method": "GET",
"use": "Log delle attività recenti di questo ospite."
},
{
"endpoint": "/api/vms/<vmid>/backups",
"method": "GET",
"use": "Backup conservati per questo ospite."
},
{
"endpoint": "/api/vms/<vmid>/control",
"method": "POST",
"use": "Scegli un’azione dello schema: <code>'{'\"action\":\"start|stop|reboot|shutdown\"'}'</code>. Controlla l’alimentazione dell’ospite."
},
{
"endpoint": "/api/vms/<vmid>/backup",
"method": "POST",
"use": "Avvia <code>vzdump</code> per l’ospite. Il corpo indica storage e modalità (<code>snapshot</code> / <code>suspend</code> / <code>stop</code>)."
},
{
"endpoint": "/api/vms/<vmid>/config",
"method": "PUT",
"use": "Aggiorna la descrizione (note) di una VM o di un CT. Questo endpoint non modifica altre chiavi di configurazione."
},
{
"endpoint": "/api/node/metrics",
"method": "GET",
"use": "Metriche aggregate del nodo in serie RRD."
}
]
},
"backups": {
"heading": "Backup",
"rows": [
{
"endpoint": "/api/backups",
"method": "GET",
"use": "Backup trovati negli storage dir, NFS, CIFS e PBS interrogati tramite il nodo locale. Non esamina tutti i nodi del cluster."
},
{
"endpoint": "/api/backup-storages",
"method": "GET",
"use": "Storage indicati come destinazioni di backup, con spazio libero."
}
]
},
"logs": {
"heading": "Log, attività, eventi",
"rows": [
{
"endpoint": "/api/logs",
"method": "GET",
"use": "Le voci del diario filtrate. Query: <code>?level=&service=&limit=</code>."
},
{
"endpoint": "/api/logs/download",
"method": "GET",
"use": "Esporta l’intervallo filtrato come testo semplice."
},
{
"endpoint": "/api/events",
"method": "GET",
"use": "Flusso di eventi interno — lo stesso che alimenta le notifiche."
},
{
"endpoint": "/api/task-log/<upid>",
"method": "GET",
"use": "Log completo in testo semplice di una task Proxmox identificata dall’UPID."
}
]
},
"notifications": {
"heading": "Notifiche e IA",
"intro": "Invio, canali e riformulazione con IA sono descritti in <notifLink>Notifiche</notifLink> e <aiLink>Assistente IA</aiLink>.",
"rows": [
{
"endpoint": "/api/notifications",
"method": "GET",
"use": "Notifiche recenti mostrate nel pannello."
},
{
"endpoint": "/api/notifications/download",
"method": "GET",
"use": "Esporta le notifiche come testo."
},
{
"endpoint": "/api/notifications/status",
"method": "GET",
"use": "Stato dell’invio: processo in background attivo, lunghezza della coda e ultimo invio."
},
{
"endpoint": "/api/notifications/settings",
"method": "GET",
"use": "Legge la configurazione delle notifiche: canali, controlli per evento, riformulazione IA e nome visualizzato."
},
{
"endpoint": "/api/notifications/history",
"method": "GET",
"use": "Cronologia degli invii. Parametri: <code>?limit=&offset=&severity=&channel=</code>."
},
{
"endpoint": "/api/notifications/history",
"method": "DELETE",
"use": "Svuota la tabella della cronologia degli invii."
},
{
"endpoint": "/api/notifications/test",
"method": "POST",
"use": "Invia una notifica di prova a un canale. Corpo: <code>'{'\"channel\":\"telegram\"'}'</code>."
},
{
"endpoint": "/api/notifications/send",
"method": "POST",
"use": "Genera un evento personalizzato. Corpo: <code>'{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'</code>."
},
{
"endpoint": "/api/notifications/test-ai",
"method": "POST",
"use": "Verifica la connessione al provider IA. Campi del corpo (schema): <code>'{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'</code>."
},
{
"endpoint": "/api/notifications/provider-models",
"method": "POST",
"use": "Elenca i modelli disponibili per il fornitore AI selezionato."
},
{
"endpoint": "/api/notifications/proxmox/setup-webhook",
"method": "POST",
"use": "Registrare il Monitor come obiettivo webhook in <code>/etc/pve/notifications.cfg</code>."
},
{
"endpoint": "/api/notifications/proxmox/cleanup-webhook",
"method": "POST",
"use": "Rimuovere l'obiettivo Monitor dalla configurazione di notifica di PVE."
},
{
"endpoint": "/api/notifications/proxmox/read-cfg",
"method": "GET",
"use": "Leggi l'attuale <code>notifications.cfg</code> di PVE come la vede PVE."
}
]
},
"security": {
"heading": "Sicurezza (lettura)",
"rows": [
{
"endpoint": "/api/security/firewall/status",
"method": "GET",
"use": "Stato firewall PVE e regole attive."
},
{
"endpoint": "/api/security/fail2ban/details",
"method": "GET",
"use": "Stato del jail Fail2Ban; richiede il componente opzionale installato."
},
{
"endpoint": "/api/security/fail2ban/activity",
"method": "GET",
"use": "Eventi recenti Fail2Ban: blocchi, sblocchi e avvii del jail."
},
{
"endpoint": "/api/security/lynis/status",
"method": "GET",
"use": "Stato di Lynis: installazione e data dell’ultima analisi."
},
{
"endpoint": "/api/security/lynis/report",
"method": "GET",
"use": "Ultimo rapporto Lynis: avvisi, suggerimenti e indice di hardening."
},
{
"endpoint": "/api/security/tools",
"method": "GET",
"use": "Rileva quali strumenti di sicurezza opzionali (Fail2Ban, Lynis) sono installati."
}
]
},
"proxmenuxIntegration": {
"heading": "Integrazione ProxMenux",
"rows": [
{
"endpoint": "/api/proxmenux/update-status",
"method": "GET",
"use": "Disponibilità di aggiornamenti ProxMenux Monitor, versione installata e più recente."
},
{
"endpoint": "/api/proxmenux/installed-tools",
"method": "GET",
"use": "Elenco di ogni ottimizzazione post-installazione ProxMenux attualmente registrata sull'host (da <code>/usr/local/share/proxmenux/installed_tools.json</code>)."
},
{
"endpoint": "/api/proxmenux/tool-source/<key>",
"method": "GET",
"use": "Codice della funzione post-installazione associata, estratto dagli script attuali dell’host o da codice precedente conservato. Non garantisce una copia del codice eseguito in origine."
}
]
},
"prometheus": {
"heading": "Metriche Prometheus",
"intro": "L’endpoint autenticato <code>GET /api/prometheus</code> restituisce il formato testuale Prometheus 0.0.4. Ogni metrica include <code>node=\"&lt;hostname&gt;\"</code> e un timestamp esplicito. Usa Prometheus o un database temporale compatibile per raccoglierle.",
"exportedTitle": "metriche esportate",
"headerGroup": "Gruppo",
"headerMetric": "Metrica",
"headerDesc": "Descrizione",
"groups": [
{
"group": "Sistema",
"metrics": [
{
"metric": "proxmox_cpu_usage",
"desc": "Percentuale di utilizzo CPU, tipo gauge."
},
{
"metric": "proxmox_memory_total_bytes",
"desc": "Memoria fisica totale in byte."
},
{
"metric": "proxmox_memory_used_bytes",
"desc": "Memoria utilizzata in byte."
},
{
"metric": "proxmox_memory_usage_percent",
"desc": "Percentuale di utilizzo della memoria."
},
{
"metric": "proxmox_load_average",
"desc": "Media del carico di sistema. Etichetta <code>period=\"1m\" | \"5m\" | \"15m\"</code>."
}
]
},
{
"group": "Tempo di attività",
"metrics": [
{
"metric": "proxmox_uptime_seconds",
"desc": "Secondi dall’ultimo avvio."
}
]
},
{
"group": "Hardware",
"metrics": [
{
"metric": "proxmox_cpu_temperature_celsius",
"desc": "Temperatura del package CPU."
},
{
"metric": "proxmox_disk_temperature_celsius",
"desc": "Temperatura per disco. Etichetta <code>disk</code>."
},
{
"metric": "proxmox_fan_speed_rpm",
"desc": "Velocità delle ventole. Etichetta <code>fan</code>."
}
]
},
{
"group": "Spazio disco",
"metrics": [
{
"metric": "proxmox_disk_total_bytes",
"desc": "Capacità totale per voce disco esportata. Etichetta <code>disk</code>."
},
{
"metric": "proxmox_disk_used_bytes",
"desc": "Capacità utilizzata per voce disco esportata."
},
{
"metric": "proxmox_disk_usage_percent",
"desc": "Percentuale utilizzata per voce disco esportata."
}
]
},
{
"group": "Rete",
"metrics": [
{
"metric": "proxmox_network_bytes_sent_total",
"desc": "Totale dei byte inviati, tipo counter."
},
{
"metric": "proxmox_network_bytes_received_total",
"desc": "Totale dei byte ricevuti, tipo counter."
},
{
"metric": "proxmox_interface_bytes_sent_total",
"desc": "Byte inviati per interfaccia. Etichetta <code>interface</code>."
},
{
"metric": "proxmox_interface_bytes_received_total",
"desc": "Byte ricevuti per interfaccia."
}
]
},
{
"group": "VMs / CTs",
"metrics": [
{
"metric": "proxmox_vms_total",
"desc": "Numero totale di VM e LXC."
},
{
"metric": "proxmox_vms_running",
"desc": "Numero di ospiti in esecuzione."
},
{
"metric": "proxmox_vms_stopped",
"desc": "Numero di ospiti fermati."
},
{
"metric": "proxmox_vm_status",
"desc": "Stato per VM/CT: 1 in esecuzione, 0 altrimenti. Etichette <code>node</code>, <code>vmid</code> e <code>name</code>."
},
{
"metric": "proxmox_vm_cpu_usage",
"desc": "Utilizzo CPU per VM/CT, con le stesse etichette."
},
{
"metric": "proxmox_vm_memory_used_bytes / _max_bytes",
"desc": "Memoria utilizzata e massimo configurato per VM/CT."
}
]
},
{
"group": "GPU",
"metrics": [
{
"metric": "proxmox_gpu_temperature_celsius",
"desc": "Temperatura GPU. Etichette <code>slot</code> e <code>vendor</code>; gpu include anche il nome della GPU."
},
{
"metric": "proxmox_gpu_utilization_percent",
"desc": "Percentuale di utilizzo della GPU."
},
{
"metric": "proxmox_gpu_memory_total_bytes",
"desc": "Memoria totale della GPU."
},
{
"metric": "proxmox_gpu_power_draw_watts",
"desc": "Potenza assorbita dalla GPU in watt."
},
{
"metric": "proxmox_gpu_clock_speed_mhz",
"desc": "Frequenza del core GPU."
},
{
"metric": "proxmox_gpu_memory_clock_mhz",
"desc": "Frequenza della memoria GPU."
}
]
},
{
"group": "UPS",
"metrics": [
{
"metric": "proxmox_ups_battery_charge_percent",
"desc": "Percentuale di carica della batteria."
},
{
"metric": "proxmox_ups_load_percent",
"desc": "Carico corrente sull'UPS."
},
{
"metric": "proxmox_ups_runtime_seconds",
"desc": "Autonomia stimata della batteria."
},
{
"metric": "proxmox_ups_input_voltage_volts",
"desc": "Tensione di ingresso."
}
]
}
],
"scrapeTitle": "Configurazione di raccolta Prometheus",
"scrapeIntro": "Con autenticazione attiva, aggiungi un token API nell’intestazione Bearer della configurazione di raccolta Prometheus:",
"perHostTitle": "Raccolta per host",
"perHostBody": "Ogni istanza esporta le metriche del proprio host. In un cluster configura Prometheus per interrogare ogni nodo. L’etichetta <code>node</code> distingue le serie in Grafana (<code>proxmox_vms_running'{'node=\"pve01\"'}'</code>)."
},
"puttingItTogether": {
"heading": "Combinare le integrazioni",
"body": "Vedi <link>Integrazioni</link> per collegare gli endpoint a sensori Home Assistant, schede Homepage, pannelli Grafana, flussi n8n e altri strumenti. Include configurazioni tipiche copiabili per ogni piattaforma. Questa pagina raccoglie il catalogo degli endpoint."
},
"whereNext": {
"heading": "Come proseguire",
"items": [
{
"label": "Accesso e autenticazione",
"href": "/docs/monitor/access-auth",
"tail": " — creazione di token, registro di audit, jail Fail2Ban opzionale e TLS."
},
{
"label": "Notifiche",
"href": "/docs/monitor/notifications",
"tailRich": " — contenuto di <code>data</code> per evento nelle chiamate a <code>/api/notifications/send</code>."
},
{
"label": "Assistente IA",
"href": "/docs/monitor/ai-assistant",
"tailRich": " — funzionamento di <code>/api/notifications/test-ai</code> e <code>/api/notifications/provider-models</code>."
},
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tailRich": " — formato delle risposte di <code>/api/health/*</code> e significato delle dieci categorie."
}
]
}
}
@@ -0,0 +1,303 @@
{
"meta": {
"title": "Architettura di ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux",
"description": "Struttura di ProxMenux Monitor: AppImage, blueprint Flask, attività in background, dati da psutil, pvesh, smartctl e journalctl, archiviazione SQLite, terminale WebSocket, provider IA, canali di notifica, proxy inverso e Fail2Ban opzionale.",
"ogTitle": "ProxMenux Monitor Architettura",
"ogDescription": "Dentro ProxMenux Monitor: AppImage, blueprint Flask, attività in background, SQLite, WebSocket, provider IA e canali di notifica.",
"twitterTitle": "ProxMenux Monitor Architettura",
"twitterDescription": "AppImage, Flask, SQLite, WebSocket, provider IA e canali di notifica: dentro Monitor."
},
"header": {
"title": "Architettura",
"description": "Come viene distribuito ProxMenux Monitor, cosa contiene l’AppImage e come le richieste del browser passano da Flask agli strumenti dell’host e all’archivio SQLite.",
"section": "ProxMenux Monitor"
},
"intro": {
"title": "Un processo, molte responsabilità",
"body": "Un processo Python ascolta su TCP 8008. Serve la versione statica Next.js, espone l’API REST, gestisce il terminale WebSocket, esegue Health Monitor e invia notifiche. Non richiede un server web separato, un broker di messaggi o un database esterno."
},
"requestFlow": {
"heading": "Percorso di una richiesta",
"intro": "Una richiesta di dati tipica segue questo percorso; le preferenze del browser possono essere gestite localmente:",
"diagramCaption": "Le rotte protette verificano JWT con autenticazione attiva. Rotte principali e blueprint restituiscono dati in cache o appena raccolti. Il controllo Fail2Ban opzionale consulta la lista dei blocchi in cache. Le intestazioni IP inoltrate sono attendibili solo con PROXMENUX_TRUST_PROXY=1; altrimenti usa l’indirizzo della connessione. Lo stato persistente include SQLite e file JSON come auth.json.",
"diagramArrowLabel": "HTTP / WS",
"nodes": {
"clientLabel": "Cliente",
"clientDetail": "Browser o PWA\n+ proxy opzionale\nNginx / Caddy /\nTraefik",
"flaskLabel": "Flask :8008",
"flaskDetail": "Blueprint\nMiddleware JWT\nControllo Fail2Ban\n(se installato)",
"hostLabel": "Strumenti dell’host",
"hostDetail": "psutil\npvesh\nsmartctl\njournalctl",
"stateLabel": "Stato locale",
"stateDetail": "SQLite DB\n+ auth.json"
},
"threadsIntro": "Il processo esegue anche <strong>thread in background</strong>. Questi esempi raccolgono dati, aggiornano cache e SQLite e inviano notifiche. Esistono altre attività; l’invio dipende dalla relativa attivazione:",
"headerThread": "Thread",
"headerCadence": "Cadenza",
"headerJob": "Attività pianificata",
"rows": [
{
"thread": "_temperature_collector_loop",
"cadence": "60 s",
"job": "Salva temperatura CPU e campioni di latenza nel database storico, così i grafici hanno dati anche senza browser connessi."
},
{
"thread": "_health_collector_loop",
"cadence": "5 min",
"job": "Esegue il ciclo Health Monitor delle dieci categorie, salva errori e osservazioni sui dischi, gestisce gli avvisi ignorati e passa i nuovi eventi al motore di notifica."
},
{
"thread": "_vital_signs_sampler",
"cadence": "CPU 5 s; temperatura 15 s; memoria 30 s",
"job": "Campiona CPU, memoria e temperatura CPU per gli indicatori e il rilevamento di condizioni prolungate, indipendentemente dal controllo generale di cinque minuti."
},
{
"thread": "notification_manager.start()",
"cadence": "Basato su eventi",
"job": "Avvia gli osservatori di journal, attività e hook (<code>JournalWatcher</code>, <code>TaskWatcher</code>, <code>ProxmoxHookWatcher</code>) e invia ai canali configurati, con riformulazione IA opzionale."
}
]
},
"systemd": {
"heading": "Unità systemd",
"intro": "L’installer crea l’unità <code>/etc/systemd/system/proxmenux-monitor.service</code>. Configurazione predefinita:",
"items": [
"<strong><code>User=root</code></strong>: il servizio usa privilegi root per SMART, <code>pvesh</code> e gestione ZFS. I processi del terminale web ereditano questi permessi.",
"<strong><code>Restart=on-failure</code></strong> con attesa di dieci secondi: il servizio riparte automaticamente dopo un’uscita con errore.",
"<strong><code>After=network.target</code></strong>: ordina l’avvio dopo quel target; non garantisce IP assegnato, DNS o connettività esterna."
],
"inspectTitle": "Esaminare l’unità attuale"
},
"appimage": {
"heading": "Cosa contiene l’AppImage",
"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>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.",
"headerBlueprint": "Blueprint / modulo",
"headerPrefix": "Prefisso delle rotte",
"headerOwns": "Responsabilità",
"rows": [
{
"blueprint": "flask_server.py",
"prefix": [
"/api/system",
"/api/storage",
"/api/network",
"/api/vms",
"/api/hardware",
"/api/logs",
"/api/prometheus"
],
"owns": "Endpoint principali, web statico e controllo Fail2Ban opzionale se il jail <code>proxmenux</code> è presente sull’host."
},
{
"blueprint": "flask_auth_routes.py",
"prefix": [
"/api/auth/*"
],
"owns": "Accesso, emissione JWT, configurazione e verifica TOTP, cambio password e token API."
},
{
"blueprint": "flask_health_routes.py",
"prefix": [
"/api/health/*"
],
"owns": "Controlli di stato, dettagli, errori attivi e ignorati e impostazioni di silenziamento. Le rotte protette richiedono autenticazione quando attiva."
},
{
"blueprint": "flask_terminal_routes.py",
"prefix": [
"/api/terminal/* + WS"
],
"owns": "Assegna un PTY per sessione e lo collega via WebSocket a <code>xterm.js</code> nel browser."
},
{
"blueprint": "flask_notification_routes.py",
"prefix": [
"/api/notifications/*"
],
"owns": "Creazione, lettura, modifica e rimozione dei canali; prove, IA, cronologia e invii manuali."
},
{
"blueprint": "flask_security_routes.py",
"prefix": [
"/api/security/*"
],
"owns": "Errori di accesso e, con Fail2Ban installato, stato del jail, blocchi e sblocco manuale."
},
{
"blueprint": "flask_proxmenux_routes.py",
"prefix": [
"/api/proxmenux/*"
],
"owns": "Legge le ottimizzazioni ProxMenux registrate sull’host."
},
{
"blueprint": "flask_oci_routes.py",
"prefix": [
"/api/oci/*"
],
"owns": "Funzioni di distribuzione di applicazioni OCI e container su Proxmox VE 9.1+."
}
],
"endpointsLink": "Gli endpoint di integrazione e i loro formati sono descritti in <link>Riferimento API</link>."
},
"dataSources": {
"heading": "Fonti dati",
"intro": "I dati dell’host provengono soprattutto da librerie standard, file e comandi amministrativi. Alcuni dati degli ospiti dipendono anche da QEMU Guest Agent o da comandi nel CT:",
"headerSource": "Fonte",
"headerUsedFor": "Usato per",
"rows": [
{
"source": "psutil",
"usedFor": "Carico CPU, memoria, swap, utilizzo dei montaggi, contatori di rete e processi."
},
{
"source": "pvesh / qm / pct",
"usedFor": "Informazioni del nodo Proxmox, inventario e configurazione VM/CT, storage e cronologia delle attività."
},
{
"source": "smartctl",
"usedFor": "Attributi SATA/NVMe, stato SMART, usura, vita utile, modello e numero di serie."
},
{
"source": "zpool / zfs",
"usedFor": "Stato del pool (ONLINE / DEGRADED / FAULTED / UNAVAIL), avanzamento dello scrub e utilizzo dei dataset."
},
{
"source": "journalctl",
"usedFor": "Log di sistema, processi terminati per OOM, errori ATA/NVMe/dm, sicurezza e unità di servizio personalizzate."
},
{
"source": "ip / iproute2",
"usedFor": "Interfacce, indirizzi, bridge, bond e dispositivi gestiti da OVS."
},
{
"source": "nvidia-smi · intel_gpu_top",
"usedFor": "Dati GPU disponibili su utilizzo, VRAM, temperatura e codifica/decodifica. I campi dipendono da produttore, strumento e driver."
},
{
"source": "lspci · lscpu · dmidecode",
"usedFor": "Topologia PCIe, modello e topologia CPU, scheda madre e BIOS."
},
{
"source": "ipmitool · sensors",
"usedFor": "Sensori fuori banda, ventole e temperature della scheda madre, se l’hardware li supporta."
},
{
"source": "upsc (NUT)",
"usedFor": "Stato batteria, carico e autonomia UPS con un server NUT configurato."
}
],
"cacheTitle": "Cache per ridurre le richieste all’host",
"cacheBody": "I risultati costosi di <code>smartctl -a</code> e <code>pvesh get</code> sono conservati temporaneamente nel processo Flask per ridurre le richieste a dischi e API del cluster. La durata varia: secondi per le metriche e minuti per SMART."
},
"persistence": {
"heading": "Persistenza",
"intro": "Diversi file di stato hanno contenuti e requisiti di accesso differenti:",
"headerPath": "Path",
"headerOwner": "Proprietario",
"headerContents": "Contenuto",
"rows": [
{
"path": "/usr/local/share/proxmenux/health_monitor.db",
"owner": "root:root",
"contents": "Database SQLite. Tabelle: <code>errors</code>, <code>events</code>, <code>disk_registry</code>, <code>disk_observations</code>, <code>user_settings</code>, <code>notification_history</code>, <code>excluded_storages</code>, <code>excluded_interfaces</code>. Modalità journal WAL."
},
{
"path": "/usr/local/share/proxmenux/.notification_key",
"owner": "root <code>0600</code>",
"contents": "Chiave principale di 32 byte per i segreti di notifica ENC2. Usa sale casuale per valore, chiavi derivate e MAC. I vecchi valori XOR sono supportati per la migrazione."
},
{
"path": "/root/.config/proxmenux-monitor/auth.json",
"owner": "root:root",
"contents": "Configurazione di accesso: attivazione, utente, hash password PBKDF2-HMAC-SHA256 con salt, segreto TOTP, codici di recupero, chiave JWT dell’installazione, metadati dei token API e hash di revoca. I vecchi hash SHA-256 vengono migrati all’accesso riuscito."
},
{
"path": "/var/log/proxmenux-auth.log",
"owner": "root:root",
"contents": "Log di autenticazione in testo semplice, indipendente da Fail2Ban. Se il jail <code>[proxmenux]</code> è installato e attivo, legge il file per rilevare errori di accesso ripetuti. Senza quel jail, il log resta consultabile."
}
],
"backupTitle": "Salvare auth.json prima della reinstallazione",
"backupBody": "Sostituire l’AppImage normalmente conserva <code>/root/.config/proxmenux-monitor/auth.json</code> e <code>/usr/local/share/proxmenux/health_monitor.db</code>. Conserva <code>auth.json</code> con jwt_secret per mantenere validità e metadati dei token. Il database conserva separatamente stato e notifiche. Salva <code>.notification_key</code> insieme per ripristinare i segreti dei canali; il solo database non ripristina l’autenticazione API."
},
"health": {
"heading": "Ciclo Health Monitor",
"intro": "Circa ogni cinque minuti, il processo in background invoca <code>health_monitor.py</code> per i controlli delle dieci categorie del pannello:",
"items": [
"Servizi PVE critici (<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>).",
"Storage Proxmox: <code>pvesh get /storage</code> e disponibilità di ciascuno.",
"Dischi e filesystem: SMART, errori I/O in dmesg, stato ZFS e capacità dei montaggi.",
"VM e CT: errori di avvio, arresti anomali, errori QMP e problemi di spegnimento.",
"Rete: stato di bridge e bond, collegamenti e latenza verso il gateway.",
"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.",
"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.",
"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": {
"heading": "Motore di notifica",
"intro": "<code>notification_manager.py</code> coordina l’invio: carica i canali, gestisce la coda e offre un’API Python per Flask e Health Monitor e un ingresso CLI per gli hook <code>.sh</code> di ProxMenux.",
"items": [
"Gli <strong>osservatori</strong> generano eventi: <code>JournalWatcher</code> segue il journal, <code>TaskWatcher</code> consulta le attività Proxmox, <code>ProxmoxHookWatcher</code> riceve hook di backup, replica e snapshot e <code>PollingCollector</code> gestisce fonti lente.",
"I <strong>modelli</strong> trasformano eventi in titolo e testo. Il provider IA configurato (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) può riformularli in linguaggio naturale. Entrambe le versioni sono salvate in <code>notification_history</code>.",
"I <strong>canali</strong> inviano tramite servizi come Telegram, Discord, email, Gotify, Pushover e Apprise. Le implementazioni in <code>notification_channels.py</code> condividono <code>create_channel()</code> / <code>send()</code>.",
"<strong>Cifratura.</strong> Le impostazioni sensibili (<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>) vengono cifrate con la chiave di <code>.notification_key</code> prima del salvataggio e mascherate nell’interfaccia."
],
"linksFooter": "Controlli per evento, opzioni dei canali e IA sono descritti in <notifLink>Impostazioni → Notifiche</notifLink> e <aiLink>Impostazioni → Assistente IA</aiLink>."
},
"websocket": {
"heading": "Terminale WebSocket",
"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."
],
"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.",
"proxyNote": "Con un proxy inverso, abilita WebSocket e le intestazioni <code>Upgrade</code> e <code>Connection</code>. Il terminale richiede questo inoltro."
},
"proxy": {
"heading": "Proxy inverso e Fail2Ban",
"intro": "La scelta dell’IP client e il blocco applicativo opzionale dipendono da queste impostazioni e componenti:",
"items": [
"<strong>Scelta dell’IP client.</strong> Il controllo <code>before_request</code> e il log di accesso si fidano di <code>X-Forwarded-For</code>, poi <code>X-Real-IP</code>, solo con PROXMENUX_TRUST_PROXY=1. Altrimenti usano <code>request.remote_addr</code>. Le intestazioni inoltrate non sono accettate automaticamente.",
"<strong>Fail2Ban applicativo opzionale.</strong> Una connessione proxy può mostrare l’IP del proxy come origine TCP. Con l’IP client attendibile e il jail <code>proxmenux</code> attivo, Flask rifiuta gli IP bloccati con HTTP 403. La lista resta in cache per 30 secondi e si aggiorna alle richieste dopo la scadenza, senza timer dedicato."
],
"calloutTitle": "Fail2Ban non è incluso",
"calloutBody": "Fail2Ban <strong>non</strong> è incluso né installato automaticamente. Si può installare da Sicurezza di Monitor o <link>Sicurezza → Fail2Ban</link> in ProxMenux Scripts. Senza <code>fail2ban-client</code> o il jail <code>proxmenux</code>, questo controllo non blocca richieste. Resta valida la politica di autenticazione configurata.",
"outro": "Esempi Nginx/Caddy/Traefik e guida del jail sono in <accessLink>Accesso e autenticazione</accessLink> e <fail2banLink>Sicurezza → Fail2Ban</fail2banLink>."
},
"whereNext": {
"heading": "Come proseguire",
"items": [
{
"label": "Accesso e autenticazione",
"href": "/docs/monitor/access-auth",
"tail": " — primo avvio, password e TOTP 2FA, esempi di proxy inverso e jail Fail2Ban."
},
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tail": " — endpoint di integrazione, gestione token e convenzioni di autenticazione."
},
{
"label": "Impostazioni → ProxMenux Monitor",
"href": "/docs/settings/proxmenux-monitor",
"tail": " — controllo del servizio e verifica dello stato nel menu testuale ProxMenux."
}
]
}
}
@@ -0,0 +1,218 @@
{
"meta": {
"title": "Valutazione e inventario | Audit e report",
"description": "Valutazione in Audit e report: profili dei rapporti, classificazione dei risultati, rischi accettati, fonti illeggibili, Lynis e inventario del nodo."
},
"header": {
"title": "Valutazione e inventario",
"description": "La valutazione ispeziona il nodo, mantiene i suoi risultati e risponde a diverse domande a seconda del profilo del report.",
"section": "Audit e report"
},
"sections": [
{
"id": "read-only",
"blocks": [
{
"calloutInfo": {
"title": "Una valutazione ispeziona senza modificare la configurazione",
"body": "Legge la configurazione e lo stato dell'host. Scrive risultati, rapporti e log; i controlli di avvio possono montare brevemente le partizioni di sistema EFI. La configurazione valutata non viene modificata."
}
},
{
"p": "<strong>Esegui valutazione</strong> avvia un'esecuzione con il profilo selezionato in <strong>Rapporto</strong>. La vista mostra la data dell'ultima esecuzione e il tempo trascorso."
}
]
},
{
"id": "profiles",
"title": "Profili report",
"intro": "Ogni profilo risponde a una domanda diversa. I controlli e le sezioni vengono selezionati prima che il documento sia composto.",
"blocks": [
{
"table": {
"headers": [
"Profilo",
"Che cosa copre"
],
"rows": [
[
"Audit completo",
"Tutti i controlli e tutta la struttura disponibile."
],
[
"Diagnosi rapida",
"Ogni controllo; il risultato si apre con i risultati critici, gli avvisi e le letture che non potrebbero essere verificate."
],
[
"Inventario",
"Una descrizione del nodo, senza controlli né classificazione."
],
[
"Verifica sicurezza",
"Esposizione, accesso, privilegi, certificati, aggiornamenti, repository e Lynis."
],
[
"Affidabilità backup",
"Copertura, età, risultati, verifica, ritenzione e recupero dei backup."
],
[
"Capacità e usura",
"Margine di crescita, memoria, uso dello spazio e la durata dei dischi."
]
]
}
},
{
"p": "Il contenuto di ogni documento è descritto in <reportsLink>Rapporti e confronti</reportsLink>."
}
]
},
{
"id": "results",
"title": "Come vengono classificati i risultati",
"blocks": [
{
"table": {
"headers": [
"Classificazione",
"Significato"
],
"rows": [
[
"Critico",
"Una condizione fallita che ha priorità."
],
[
"Avvertenza",
"Una condizione che ha bisogno di una revisione, date le prove o la politica."
],
[
"Osservazione",
"Informazioni sul nodo che non viene segnalato come un fallimento."
],
[
"Non verificato",
"La fonte richiesta dal controllo non è stata leggibile. Questo non significa che il problema sia assente."
],
[
"Conforme",
"La condizione soddisfa il criterio applicato."
],
[
"Non applicabile",
"Non si applica nulla nell'ambito del controllo."
],
[
"Rischio accettato",
"Il ritrovamento esiste e una decisione su di esso è stata registrata."
],
[
"Escluso dalla politica",
"La politica dichiara che l'elemento è lasciato fuori dal conteggio."
]
]
}
},
{
"p": "I risultati si possono filtrare per area: Sistema, Archiviazione, Rete, Sicurezza, Backup, Guest e Hardware. Ogni risultato conserva le evidenze con la fonte da cui sono state lette."
}
]
},
{
"id": "unverified",
"title": "Quando una fonte non può essere letta",
"blocks": [
{
"table": {
"headers": [
"Caso",
"Comportamento"
],
"rows": [
[
"Non verificato",
"Il controllo conserva la propria identità, indica nelle evidenze quale fonte ha fallito e non trasforma i dati mancanti in un risultato conforme."
],
[
"Evidenze incomplete",
"Il rapporto indica la fonte e il momento della raccolta per distinguere un problema reale da una lettura insufficiente."
],
[
"Una nuova esecuzione",
"Una volta corretto l'accesso, il pacchetto o il servizio, lo stesso profilo viene eseguito di nuovo e il confronto mostra se il risultato potrebbe essere verificato."
]
]
}
}
]
},
{
"id": "lynis",
"title": "Lynis",
"blocks": [
{
"p": "La verifica di sicurezza usa il rapporto Lynis dell'host. Se Lynis non è mai stato eseguito o il rapporto supera l'età consentita dalla politica, una finestra propone <strong>Esegui con Lynis</strong>, che richiede alcuni minuti in più, oppure <strong>Esegui senza Lynis</strong>, che usa il rapporto esistente."
},
{
"figure": {
"src": "/monitor/audit/lynis-dialog.png",
"alt": "Dialogo che offre di eseguire la valutazione con o senza Lynis",
"caption": "La finestra Lynis prima di una verifica di sicurezza."
}
}
]
},
{
"id": "accept",
"title": "Accettare un rischio",
"blocks": [
{
"p": "<strong>Accetta rischio</strong> registra una decisione su un risultato. Il motivo è obbligatorio e viene salvato con autore e data."
},
{
"table": {
"headers": [
"Campo",
"Opzioni"
],
"rows": [
[
"Motivo",
"Testo libero, obbligatorio."
],
[
"Scadenza",
"90 giorni, 180 giorni, 1 anno o non scade. Quando il periodo termina il risultato diventa nuovamente attivo."
],
[
"Promemoria revisione",
"Un promemoria che riporta la decisione all'attenzione mentre rimane in vigore."
]
]
}
},
{
"p": "Un risultato accettato rimane visibile con la decisione; <strong>Riporta ad attivo</strong> revoca l'accettazione. Accettare un rischio non lo corregge: il confronto lo mostra come accettato, non come risolto."
}
]
},
{
"id": "inventory",
"title": "Inventario",
"blocks": [
{
"list": {
"items": [
"Identità, versione Proxmox VE, kernel, abbonamento e cluster.",
"CPU, memoria, scheda, BIOS, controller e IOMMU.",
"Disco, SMART, ore di alimentazione e eventi registrati.",
"Adattatori, bond, bridge, latenza e connessioni.",
"Stoccaggio, ospiti con i loro dischi e interfacce, e backup.",
"PCI passthrough e il software ProxMenux gestisce."
]
}
}
]
}
]
}
@@ -0,0 +1,208 @@
{
"meta": {
"title": "Modifiche | Audit e report",
"description": "Registro delle modifiche di Audit e report: interventi di ProxMenux sull'host, stato precedente, differenze e possibilità di annullamento."
},
"header": {
"title": "Modifiche",
"description": "Registro delle operazioni eseguite da ProxMenux sull'host e, quando acquisito, dello stato prima e dopo ogni operazione.",
"section": "Audit e report"
},
"sections": [
{
"id": "purpose",
"blocks": [
{
"calloutInfo": {
"title": "Dallo script eseguito alla modifica effettuata",
"body": "Una funzione lunga può modificare solo due righe. Il registro conserva ogni operazione concreta con script, funzione e versione responsabili, risorsa interessata, differenze e possibilità di annullamento."
}
},
{
"flow": {
"nodes": [
{
"label": "Script",
"detail": "funzione + versione"
},
{
"label": "Acquisizione",
"detail": "contenuto prima"
},
{
"label": "Operazione",
"detail": "file · pacchetto · servizio"
},
{
"label": "Registro",
"detail": "attribuzione + differenza"
}
],
"caption": "L'acquisizione avviene durante l'operazione e viene consolidata quando Monitor legge il registro."
}
},
{
"figure": {
"src": "/monitor/audit/changes-view.png",
"alt": "Vista Modifiche di Audit e report con voci raggruppate per opzione post-installazione e script",
"caption": "La vista Modifiche con le differenze di un file modificato da ProxMenux."
}
}
]
},
{
"id": "types",
"title": "Tipi di voce",
"intro": "Il filtro in alto separa le voci per genere.",
"blocks": [
{
"table": {
"headers": [
"Tipo",
"Cosa registra"
],
"rows": [
[
"Configurazione",
"ProxMenux ha scritto, modificato o rimosso un file, ha cambiato un'impostazione o modificato un servizio."
],
[
"Installazioni",
"ProxMenux ha aggiunto un pacchetto o un componente, e i pacchetti che sono effettivamente apparsi sono registrati."
],
[
"Esecuzioni",
"ProxMenux ha eseguito un comando; le modifiche dipendono dal comando stesso."
],
[
"Applicato",
"Una funzione è stata applicata prima che esistesse il registro; lo stato precedente non è stato acquisito."
]
]
}
}
]
},
{
"id": "groups",
"title": "Come è organizzata la vista",
"blocks": [
{
"table": {
"headers": [
"Sezione",
"Contenuto"
],
"rows": [
[
"Ottimizzazioni post-installazione",
"Gruppo dell'opzione post-installazione selezionata dall'utente."
],
[
"Script ProxMenux",
"GPU, Coral, rete, archiviazione, sicurezza, utilità e altri script con strumentazione di audit, inclusi il programma di installazione di ProxMenux e ProxMenux Monitor."
],
[
"Pacchetti e utilità installati",
"Software installato da ProxMenux sull'host."
]
]
}
},
{
"p": "All'interno di ogni sezione, <strong>Per funzione</strong> raggruppa le voci sotto la funzione che li ha fatti."
}
]
},
{
"id": "entry",
"title": "Cosa mostra ogni voce",
"blocks": [
{
"list": {
"items": [
"Lo script, la funzione e la versione responsabile.",
"La data e la risorsa interessata.",
"Lo stato conosciuto prima e dopo il cambiamento.",
"Le linee aggiunte e rimosse.",
"I pacchetti che sono stati effettivamente aggiunti.",
"Il cambiamento di stato di un servizio.",
"<strong>Annullamento</strong>: <em>Ripristina esattamente lo stato precedente</em>, <em>Elimina il file (prima non esisteva)</em>, <em>Il pacchetto può essere disinstallato</em>, un annullamento parziale oppure <em>Non annullabile dal registro</em>."
]
}
}
]
},
{
"id": "before",
"title": "Cosa significa lo stato precedente",
"blocks": [
{
"p": "Lo stato precedente può essere contenuto acquisito, un file creato per la prima volta o uno stato sconosciuto. Le modifiche precedenti al registro non possono essere ricostruite; eseguendo nuovamente la funzione viene acquisito prima lo stato trovato in quel momento."
}
]
},
{
"id": "limits",
"title": "Ambito del registro",
"blocks": [
{
"list": {
"items": [
"Le modifiche manuali e le modifiche apportate da altri software non sono registrate.",
"Solo le operazioni che attraversano i primitivi di audit ProxMenux sono coperte.",
"La registrazione non blocca mai l'operazione che descrive: se l'entrata non può essere scritta, l'operazione continua.",
"Le modifiche successive alla stessa risorsa sono mostrate confrontando lo stato iniziale noto con quello attuale."
]
}
}
]
},
{
"id": "retention",
"title": "Prove memorizzate",
"blocks": [
{
"table": {
"headers": [
"Elemento",
"Comportamento"
],
"rows": [
[
"Voci",
"Le voci sono conservate sull'host; nulla viene eliminato automaticamente dal registro."
],
[
"Contenuto catturato",
"Un oggetto catturato viene mantenuto mentre una voce si riferisce ad esso."
],
[
"Dimensione di una cattura",
"I contenuti sopra 1 MiB non sono memorizzati in tutto; la voce riporta che la cattura è stata ignorata a causa della sua dimensione."
],
[
"Lettura",
"Il Monitor non carica oggetti memorizzati sopra 2 MiB."
],
[
"Differenza",
"Vengono mostrate al massimo 400 righe; le differenze più lunghe sono contrassegnate come troncate."
],
[
"Elenco",
"L'API restituisce 200 voci per richiesta per impostazione predefinita, fino a un massimo di 1000."
]
]
}
},
{
"calloutWarning": {
"title": "Conservare il contenuto non significa annullare automaticamente",
"body": "Il contenuto precedente può essere ispezionato e ripristinato manualmente, ma la vista Modifiche non annulla le operazioni. Una voce di esecuzione registra il comando senza conoscere tutti gli effetti dello strumento eseguito."
}
}
]
}
]
}
@@ -0,0 +1,136 @@
{
"meta": {
"title": "Audit e report | ProxMenux Monitor",
"description": "Valuta un nodo Proxmox VE, registra le modifiche di ProxMenux e dichiara le aspettative per i sistemi guest e la archiviazione, con report stampabili."
},
"header": {
"title": "Audit e report",
"description": "Valutazione del nodo, registro delle modifiche di ProxMenux e dichiarazione delle aspettative, con documenti stampabili o salvabili in PDF.",
"section": "ProxMenux Monitor"
},
"sections": [
{
"id": "views",
"blocks": [
{
"calloutInfo": {
"title": "Tre viste, tre domande",
"body": "Audit e report distingue i dati del nodo, gli interventi di ProxMenux e le aspettative dichiarate. Una configurazione non valutabile rispetto a uno scopo dichiarato viene descritta senza essere segnalata come errore."
}
},
{
"cards": {
"items": [
{
"icon": "shield",
"title": "Valutazione — come sta il nodo?",
"body": "Esegue i controlli del profilo scelto, compone l'inventario e classifica ciò che ha bisogno di attenzione, con la prova di ogni risultato."
},
{
"icon": "refresh",
"title": "Cambiamenti — cosa ha fatto ProxMenux?",
"body": "Elenca file, pacchetti, servizi e comandi modificati dagli script ProxMenux dotati di strumentazione di audit, con lo stato precedente quando acquisito."
},
{
"icon": "fileText",
"title": "Politica — cosa ci si aspetta?",
"body": "Dichiara quali sistemi guest richiedono un backup o devono avviarsi con l'host, quale archiviazione è essenziale e le soglie dei controlli."
}
]
}
},
{
"flow": {
"nodes": [
{
"label": "Valutazione",
"detail": "fatti"
},
{
"label": "Politica",
"detail": "contesto"
},
{
"label": "Modifiche",
"detail": "interventi"
}
],
"caption": "La valutazione fornisce i dati, la politica dà loro contesto e il registro documenta gli interventi di ProxMenux."
}
},
{
"figure": {
"src": "/monitor/audit/assessment-view.png",
"alt": "Audit e report in ProxMenux Monitor con le viste Valutazione, Modifiche e Politica",
"caption": "Audit & Report, con la vista di valutazione aperta."
}
}
]
},
{
"id": "boundaries",
"title": "Tre funzioni diverse",
"blocks": [
{
"table": {
"headers": [
"Funzione",
"Che cosa fa"
],
"rows": [
[
"<healthLink>Monitoraggio dello stato</healthLink>",
"Osserva metriche ed eventi continuamente e può generare notifiche."
],
[
"Audit e report",
"Esegue una valutazione su richiesta, documenta il nodo e confronta le esecuzioni tra loro."
],
[
"Registro delle modifiche",
"Registra le operazioni eseguite da ProxMenux tramite le sue primitive di audit."
]
]
}
}
]
},
{
"id": "pages",
"title": "Pagine di questa sezione",
"blocks": [
{
"next": {
"items": [
{
"label": "Valutazione e inventario",
"href": "/docs/monitor/audit-report/assessment",
"tail": "profili, risultati, rischi accettati e inventario."
},
{
"label": "Modifiche",
"href": "/docs/monitor/audit-report/changes",
"tail": "il diario di ciò che ProxMenux ha cambiato sull'host."
},
{
"label": "Politica",
"href": "/docs/monitor/audit-report/policy",
"tail": "sistemi guest, archiviazione e soglie."
},
{
"label": "Rapporti e confronti",
"href": "/docs/monitor/audit-report/reports",
"tail": "i sei documenti e l'esecuzione di riferimento."
},
{
"label": "Ambito e garanzie",
"href": "/docs/monitor/audit-report/scope",
"tail": "fonti, limiti e dati memorizzati."
}
]
}
}
]
}
]
}
@@ -0,0 +1,111 @@
{
"meta": {
"title": "Politica | Audit e report",
"description": "Politica del nodo in Audit e report: backup, avvio automatico e obiettivo di ripristino di ogni guest, ruolo di ogni archiviazione e soglie dei controlli."
},
"header": {
"title": "Politica",
"description": "La politica dichiara ciò che nessuna ispezione può dedurre: lo scopo di ogni guest e archiviazione e le soglie applicate dai controlli.",
"section": "Audit e report"
},
"sections": [
{
"id": "principle",
"blocks": [
{
"calloutInfo": {
"title": "Senza dichiarazione il rapporto descrive; con una dichiarazione valuta",
"body": "Una valutazione vede cosa fa l'host, non a cosa serve. Un guest senza backup e senza scopo dichiarato viene segnalato come osservazione. Se il backup è dichiarato obbligatorio, la stessa assenza diventa un avviso. Non è obbligatorio dichiarare nulla."
}
},
{
"figure": {
"src": "/monitor/audit/policy-view.png",
"alt": "Vista Politica con guest, archiviazione e soglie del nodo",
"caption": "La vista politica."
}
}
]
},
{
"id": "guests",
"title": "Guest",
"intro": "Ogni VM e LXC del nodo ha tre campi. Un valore lasciato come predefinito prende il valore generale, mostrato accanto ad esso.",
"blocks": [
{
"table": {
"headers": [
"Campo",
"Valori",
"Effetti sulla valutazione"
],
"rows": [
[
"Backup",
"Richiesto, Non richiesto, Non dichiarato",
"Un backup mancante è un avviso quando è necessario, un'osservazione quando non è indicato, e viene lasciato fuori dal conteggio quando non è richiesto."
],
[
"Avvio automatico",
"Richiesto, Non richiesto, Non dichiarato",
"Indica se il guest deve avviarsi insieme all'host."
],
[
"Obiettivo di ripristino",
"Ore",
"L'età massima accettabile dell'ultimo backup."
]
]
}
}
]
},
{
"id": "storage",
"title": "Archiviazione",
"blocks": [
{
"p": "Un deposito irraggiungibile è segnalato come critico quando è dichiarato essenziale o serve un ospite in esecuzione, come un avvertimento quando il suo ruolo non è dichiarato, e come osservazione quando è dichiarato facoltativo."
}
],
"intro": "Ogni archiviazione del nodo è dichiarata Essenziale, Facoltativa o Non dichiarata."
},
{
"id": "thresholds",
"title": "Soglie",
"intro": "Una soglia vuota usa il valore predefinito incluso, mostrato come segnaposto.",
"blocks": [
{
"list": {
"items": [
"Controllo della capacità di archiviazione (%) e del riempimento del thin pool (%).",
"Rapporto di overprovisioning thin e rapporto di sovrallocazione della memoria.",
"Intervallo di scrub ZFS (giorni).",
"Limite alternativo dell'età del backup (giorni) e margine sulla pianificazione (rapporto).",
"Avviso di scadenza del certificato (giorni).",
"Durata del servizio del disco (ore) e finestra di errore del disco recente (giorni).",
"Età del rapporto Lynis (giorni) e degli indici dei pacchetti (giorni).",
"Utilizzo del journal rispetto al limite (%).",
"Controllo dello spazio (%) e degli inode (%) del filesystem."
]
}
}
]
},
{
"id": "save",
"title": "Come si salva la politica",
"blocks": [
{
"p": "La dichiarazione viene convalidata e salvata atomicamente in <code>/usr/local/share/proxmenux/audit_policy.json</code>. Ogni salvataggio include una revisione: se un'altra sessione ha modificato la dichiarazione, la bozza non viene salvata e la vista propone di ricaricare la versione salvata."
},
{
"calloutWarning": {
"title": "La politica non è mai rinviata",
"body": "ProxMenux non aggiunge requisiti autonomamente. Un campo vuoto mantiene il valore predefinito o rimane non dichiarato; una dichiarazione parziale riguarda solo gli elementi indicati."
}
}
]
}
]
}
@@ -0,0 +1,247 @@
{
"meta": {
"title": "Rapporti e confronti | Audit e report",
"description": "I sei documenti di Audit e report, la stampa o il salvataggio in PDF e il confronto delle esecuzioni con un'esecuzione di riferimento."
},
"header": {
"title": "Rapporti e confronti",
"description": "Sei documenti per domande diverse e il confronto di ogni esecuzione con un'esecuzione di riferimento.",
"section": "Audit e report"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Sei documenti, non sei stili",
"body": "Il motore seleziona i controlli e le sezioni prima di comporre il documento. Una diagnosi rapida non è un controllo completo con meno pagine, e un inventario non presenta risultati di valutazione. I documenti del campione qui sotto usano i dati fittizi."
}
}
]
},
{
"id": "documents",
"title": "I sei documenti",
"blocks": [
{
"downloads": {
"items": [
{
"title": "Audit completo",
"body": "Documenta tutto il nodo come registro tecnico.",
"href": "/monitor/audit/sample-audit-full-report.pdf",
"facts": [
{
"label": "Controlli",
"value": "Tutti i controlli disponibili."
},
{
"label": "Contenuto",
"value": "Sintesi; identità e cluster; hardware; rete e latenza; archiviazione; guest; passthrough; applicazioni; risultati con evidenze; fonti e ambito."
}
]
},
{
"title": "Diagnosi rapida",
"body": "Mostra ciò che ha bisogno di attenzione senza l'inventario completo.",
"href": "/monitor/audit/sample-audit-diagnostic-report.pdf",
"facts": [
{
"label": "Controlli",
"value": "Gli stessi controlli dell'audit completo."
},
{
"label": "Contenuto",
"value": "Identità minima; risultati critici; avvisi; osservazioni pertinenti; letture non verificate e azioni prioritarie. Diagrammi, inventario e allegati lunghi sono esclusi."
}
]
},
{
"title": "Inventario",
"body": "Descrive ciò che esiste sul nodo senza valutarlo.",
"href": "/monitor/audit/sample-audit-inventory-report.pdf",
"facts": [
{
"label": "Controlli",
"value": "Nessuno; nessun risultato è classificato."
},
{
"label": "Contenuto",
"value": "Identità; cluster; CPU e memoria; scheda, BIOS e controller; rete; storage; VM e LXC; passthrough; applicazioni ed elementi gestiti da ProxMenux."
}
]
},
{
"title": "Verifica sicurezza",
"body": "Copre l'esposizione e i controlli sull'accesso al nodo.",
"href": "/monitor/audit/sample-audit-security-report.pdf",
"facts": [
{
"label": "Controlli",
"value": "L'area di sicurezza, oltre ai privilegi dei container, agli aggiornamenti, ai repository e alla catena APT."
},
{
"label": "Contenuto",
"value": "Identità e cluster; rete e latenza; accesso; firewall; 2FA; certificati; privilegi; aggiornamenti; repository; stato ed età del rapporto Lynis."
}
]
},
{
"title": "Affidabilità backup",
"body": "Controlla che la protezione dichiarata esista e che i suoi backup siano utilizzabili.",
"href": "/monitor/audit/sample-audit-backup-report.pdf",
"facts": [
{
"label": "Controlli",
"value": "L'area di backup, oltre alla connettività di archiviazione e alla consegna delle notifiche."
},
{
"label": "Contenuto",
"value": "Copertura per ospite; obiettivo dichiarato di recupero; età e risultato; destinazione; conservazione; verifica; lavori falliti; recupero e fonti incomplete."
}
]
},
{
"title": "Capacità e usura",
"body": "Misura il margine di crescita e i segni di esaurimento o invecchiamento.",
"href": "/monitor/audit/sample-audit-capacity-report.pdf",
"facts": [
{
"label": "Controlli",
"value": "Le aree di archiviazione e hardware, oltre a memoria, swap, journal e il filesystem host."
},
{
"label": "Contenuto",
"value": "Utilizzo e soglie; thin pool; overprovisioning; memoria; inode; ZFS; temperature; ore di funzionamento; errori SMART e vita utile NVMe/SSD."
}
]
}
]
}
},
{
"figure": {
"src": "/monitor/audit/audit-report-preview.png",
"alt": "Prima pagina di un rapporto completo di audit",
"caption": "Ogni documento condivide l'identificatore del rapporto, le sezioni numerate, la data, il nodo, il profilo e il piè di pagina."
}
},
{
"p": "In base al profilo, il documento include identità del nodo e data della valutazione, sintesi, riepilogo per area, struttura di hardware, rete e archiviazione, protezione dei guest, risultati con evidenze, fonti illeggibili e ambito e politica applicati."
}
]
},
{
"id": "print",
"title": "Stampa o salvataggio come PDF",
"blocks": [
{
"steps": {
"items": [
{
"title": "Esegui",
"body": "La valutazione usa il profilo selezionato in <strong>Rapporto</strong>."
},
{
"title": "Verifica",
"body": "L'esecuzione completata mostra risultati, fonti non leggibili e politica applicata."
},
{
"title": "Genera report",
"body": "<strong>Genera rapporto</strong> apre la vista preparata come documento."
},
{
"title": "Stampa",
"body": "<strong>Stampa o salva come PDF</strong> apre la finestra di stampa del browser per scegliere una stampante o <em>Salva come PDF</em>."
}
]
}
},
{
"calloutTip": {
"title": "La stampa è un documento, non uno screenshot",
"body": "La barra delle azioni è nascosta, le tabelle che continuano sulla pagina successiva ripetono l'intestazione, i blocchi evitano interruzioni inutili e ogni pagina conserva identificazione e numerazione."
}
}
]
},
{
"id": "compare",
"title": "Confronto con un'esecuzione di riferimento",
"intro": "<strong>Usa come riferimento</strong> contrassegna un'esecuzione completata. Le successive vengono confrontate con essa e i risultati vengono raggruppati in:",
"blocks": [
{
"table": {
"headers": [
"Gruppo",
"Significato"
],
"rows": [
[
"Nuovo",
"Segnalato ora e non prima."
],
[
"Peggiorati",
"Ancora segnalati, ma più gravi o con effetti più estesi di prima."
],
[
"Migliorati",
"Ancora segnalati, ma meno gravi o con effetti meno estesi di prima."
],
[
"Risolto",
"Non sono più segnalati e nessuno li ha accettati."
],
[
"Accettati",
"Non più contato perché è stato accettato un rischio, non perché l'host è cambiato."
],
[
"Non più valutati",
"Presenti prima ma assenti da questa esecuzione; non è stato verificato che siano scomparsi."
]
]
}
},
{
"table": {
"headers": [
"Esecuzione di riferimento",
"Comportamento"
],
"rows": [
[
"Impostarlo",
"Qualsiasi esecuzione terminata può essere contrassegnata; nessuna è contrassegnata automaticamente."
],
[
"Cambiarlo",
"Contrassegnare un'altra esecuzione cambia il riferimento senza eliminare la cronologia."
],
[
"Comparazione",
"Se non vengono selezionate due esecuzioni, il confronto usa quella di riferimento e quella selezionata o più recente."
],
[
"Conservazione delle esecuzioni",
"Vengono conservate le 30 esecuzioni più recenti; quella di riferimento non viene mai eliminata."
],
[
"Senza un riferimento",
"La vista indica che non è ancora stata scelta un'esecuzione di riferimento, quindi manca una base per il confronto."
]
]
}
},
{
"calloutWarning": {
"title": "Un rapporto descrive un momento",
"body": "Una valutazione non certifica un intero periodo. I risultati vecchi non descrivono più lo stato attuale; la vista mostra l'età dell'ultima esecuzione e ogni fonte conserva il momento della raccolta."
}
}
]
}
]
}
@@ -0,0 +1,115 @@
{
"meta": {
"title": "Ambito e garanzie | Audit e report",
"description": "Origine dei dati di Audit e report, limiti del suo ambito, garanzie di progettazione e posizione dei dati."
},
"header": {
"title": "Ambito e garanzie",
"description": "Da dove provengono i dati di una valutazione, cosa rimane fuori dal suo ambito e dove Audit e report conserva i dati.",
"section": "Audit e report"
},
"sections": [
{
"id": "sees",
"title": "Cosa osserva",
"blocks": [
{
"list": {
"items": [
"La configurazione e lo stato del nodo locale.",
"La configurazione dichiarata delle VM e dei LXC.",
"Lo stato della archiviazione come rilevato da Proxmox VE.",
"La cronologia disponibile dei backup e delle verifiche.",
"Dati SMART e gli eventi che il Monitor ha raccolto.",
"Lo stato dei servizi, cluster, HA e fonti locali."
]
}
}
]
},
{
"id": "outside",
"title": "Che cosa è fuori dalla sua vista",
"blocks": [
{
"list": {
"items": [
"L'interno degli ospiti, oltre quello che dichiarano a Proxmox VE.",
"Apparecchiature di rete al di fuori dell'host.",
"Dipendenze remote che il nodo non può osservare.",
"Stato fisico che l'hardware non rende disponibile.",
"Il registro delle modifiche non include azioni manuali o di altri programmi."
]
}
},
{
"calloutWarning": {
"title": "Le prove mancanti non sono prove di assenza",
"body": "Una fonte che non può essere letta dà un risultato non verificato o incompleto, mai conformante. Il rapporto elenca le fonti che non erano disponibili."
}
}
]
},
{
"id": "guarantees",
"title": "Garanzie del design",
"blocks": [
{
"list": {
"items": [
"Identificatori stabili per i controlli.",
"Cronologia delle esecuzioni e dei risultati.",
"Una politica validata, salvata atomicamente.",
"Rischi accettati con un motivo, visibile.",
"Attribuzione di modifiche allo script e alla funzione.",
"Acquisizione dello stato prima e dopo, quando disponibile.",
"Un risultato esplicito quando qualcosa non può essere misurato o catturato."
]
}
}
]
},
{
"id": "storage",
"title": "Dove vengono memorizzati i dati",
"blocks": [
{
"table": {
"headers": [
"Dati",
"Percorso"
],
"rows": [
[
"Politica",
"<code>/usr/local/share/proxmenux/audit_policy.json</code>"
],
[
"Valutazioni",
"Il database di audit del Monitor"
],
[
"Oggetti catturati",
"<code>/usr/local/share/proxmenux/changes/objects/</code>"
],
[
"Voci in attesa",
"<code>/usr/local/share/proxmenux/changes/spool/</code>"
],
[
"Registro consolidato",
"<code>/usr/local/share/proxmenux/changes.db</code>"
]
]
}
},
{
"calloutInfo": {
"title": "Uno strumento di verifica, non una certificazione",
"body": "Audit e report valuta, confronta e documenta il nodo. I risultati si interpretano considerando lo scopo del sistema, la politica dichiarata e le fonti disponibili."
}
}
]
}
]
}
@@ -0,0 +1,174 @@
{
"meta": {
"title": "Pannello Apps: un lanciatore per tutti i collegamenti web | ProxMenux",
"description": "Utilizzare il cruscotto Apps per aprire i Link Web registrati LXC e link personalizzati, organizzarli per categoria, e saltare indietro all'ospite che possiede ogni servizio."
},
"header": {
"title": "Dashboard: scheda Apps",
"description": "Un singolo lanciatore per le interfacce web che si utilizzano attraverso il nodo, se provengono da un'applicazione LXC registrata o da un collegamento Web personalizzato.",
"section": "ProxMenux Monitor · Dashboard"
},
"intro": {
"title": "Un lanciatore, non un installatore di applicazione",
"body": "La scheda <strong>Apps</strong> non installa software né scopre servizi. Raggruppa i collegamenti salvati in una griglia ricercabile. I link LXC si configurano nella <appTabLink>scheda App</appTabLink> del guest; i link personalizzati includono servizi VM, proxy inversi e pannelli esterni."
},
"sources": {
"heading": "Cosa appare in Apps",
"intro": "Ogni URL avviabile diventa la propria carta. La fonte determina dove la carta viene modificata, ma non come sembra durante l'uso normale.",
"colSource": "Fonte",
"colAppears": "Che cosa appare",
"colManagedFrom": "Dove è gestito",
"rows": [
{
"source": "Applicazione registrata LXC",
"appears": "Una scheda per ogni collegamento Web salvato sul record di applicazione.",
"managedFrom": "VM & LXCs → LXC modal → App"
},
{
"source": "Collegamento personalizzato legato ad un ospite",
"appears": "Un URL di servizio associato a una specifica VM o LXC.",
"managedFrom": "Apps → Modifica"
},
{
"source": "Collegamento personalizzato senza associazione",
"appears": "Qualsiasi destinazione HTTP(S), incluso un servizio esterno o pubblicato tramite proxy inverso.",
"managedFrom": "Apps → Modifica"
}
],
"relationshipTitle": "App e la scheda App LXC hanno diversi lavori",
"relationshipBody": "La <appTabLink>scheda App</appTabLink> del LXC gestisce identità, link web e tracciamento opzionale della versione. <strong>Apps</strong> usa questi link per aprirli rapidamente. Modificare una scheda LXC riporta quindi al record del guest senza duplicare la configurazione."
},
"cards": {
"heading": "Come utilizzare una carta",
"intro": "L'intera carta è l'obiettivo di lancio, mentre i suoi controlli più piccoli forniscono contesto senza aprire il servizio.",
"items": [
"Fare clic sulla scheda per aprire il suo URL in una nuova scheda del browser.",
"Il logo utilizza prima il logo Web Link e torna al logo dell'applicazione quando necessario.",
"Il chip di categoria utilizza lo stesso colore ed etichetta del corrispondente collegamento Web nella scheda App LXC.",
"L'etichetta del guest identifica la VM o il LXC associato. Un clic apre la sua finestra: i link LXC aprono <strong>App</strong>, quelli VM <strong>Stato</strong>.",
"Una freccia verso l'alto viola significa che l'applicazione specifica o l'immagine Docker ha un aggiornamento disponibile. Non è un numero di aggiornamento generale per l'intero ospite."
]
},
"toolbar": {
"heading": "Cerca, filtra e ordina",
"intro": "La barra degli strumenti restringe una grande collezione di applicazioni senza cambiare i record salvati.",
"items": [
"La ricerca corrisponde al nome dell'applicazione, al nome degli ospiti, alla VMID e alla categoria.",
"Il filtro categoria mostra una categoria alla volta o tutte le applicazioni.",
"Ordina per <strong>Nome</strong>, <strong>ID</strong> o <strong>Categoria</strong>. L'ordinazione per categoria aggiunge titoli tra i gruppi di schede.",
"L'ordine viene ricordato in questo browser. Testo di ricerca e filtro categoria vengono azzerati tornando alla pagina.",
"La scheda App rimane disponibile quando la griglia è vuota, quindi il primo link personalizzato può essere aggiunto senza prima registrare un'applicazione LXC."
]
},
"customLinks": {
"heading": "Aggiungere e modificare link web personalizzati",
"intro": "Utilizzare un link personalizzato quando il servizio non è rappresentato da un'applicazione LXC registrata.",
"steps": [
"Premi <strong>Aggiungi link</strong> nella barra degli strumenti o nella vista vuota.",
"Inserisci un nome e un URL completo <code>http://</code> o <code>https://</code>.",
"A richiesta aggiungere un logo, scegliere o creare una categoria, e legare il link a un VM o LXC.",
"Salva il collegamento. La scheda appare subito nella griglia.",
"Per modificare o rimuovere un link personalizzato scegli <strong>Modifica</strong> e usa la matita sulla scheda."
],
"colField": "Campo",
"colRequired": "Obbligatorio",
"colPurpose": "Scopo",
"fields": [
{
"field": "Nome",
"required": "Sì",
"purpose": "Il titolo della carta e il termine di ricerca."
},
{
"field": "URL",
"required": "Sì",
"purpose": "La destinazione completa HTTP(S) aperta dalla scheda."
},
{
"field": "URL logo",
"required": "No",
"purpose": "Un'immagine remota mostrata sulla scheda."
},
{
"field": "Categoria",
"required": "No",
"purpose": "Aggiunge un badge condiviso e consente di filtrare la categoria."
},
{
"field": "Associazione al guest",
"required": "No",
"purpose": "Associa il collegamento con un VM o LXC e consente la scorciatoia degli ospiti."
}
],
"editTitle": "Modificare la fonte della verità",
"editBody": "La modalità modifica mostra matite solo per i link personalizzati. Per una scheda di applicazione LXC apri la <appTabLink>scheda App</appTabLink> del guest e modifica il link salvato."
},
"categories": {
"heading": "Categorie e segnali di aggiornamento",
"intro": "Le categorie organizzano i link; gli indicatori di aggiornamento descrivono lo stato del software. Sono intenzionalmente separati.",
"items": [
"La registrazione LXC, assistita da un catalogo, può preriempire una categoria, ma rimane modificabile.",
"I nomi di categoria personalizzati possono essere creati dallo stesso selettore e poi riutilizzati dal filtro.",
"I colori della categoria sono deterministici e si adattano al tema chiaro o scuro. Gamma viola e rossa sono riservati per gli stati di aggiornamento e pericolo.",
"Per Docker, ProxMenux associa la scheda al container o all'immagine e mostra gli aggiornamenti dell'immagine. Quelli di Docker Engine rimangono nella <updatesLink>scheda Aggiornamenti</updatesLink> del LXC."
]
},
"persistence": {
"heading": "Persistenza e comportamento della cache",
"intro": "Il pannello usa i dati già disponibili di Monitor senza analizzare di nuovo ogni guest.",
"items": [
"I link personalizzati vengono salvati atomicamente in <code>/etc/proxmenux/custom_links.json</code> e caricati in memoria all'avvio di Monitor.",
"I link LXC registrati rimangono parte del record Monitor salvato della loro applicazione; il cruscotto Apps non li duplica nel file di collegamento personalizzato.",
"Creare, modificare o cancellare un link personalizzato aggiorna immediatamente la lista in memoria.",
"La preferenza di ordinamento è locale al browser e non si sincronizza tra dispositivi o utenti.",
"La posizione di Apps nella navigazione principale si configura separatamente in <settingsLink>Impostazioni → Ordine di navigazione</settingsLink>."
]
},
"troubleshooting": {
"heading": "Situazioni comuni",
"colProblem": "Situazione",
"colResolution": "Risoluzione",
"rows": [
{
"problem": "Un'applicazione LXC è registrata ma nessuna scheda appare",
"resolution": "Aprire la scheda App e aggiungere almeno un collegamento Web. Il tracciamento della versione da solo non crea una carta di lancio."
},
{
"problem": "L'URL o il logo è sbagliato",
"resolution": "Modificare il link personalizzato in Apps, o modificare il collegamento Web nella scheda app LXC."
},
{
"problem": "Manca un servizio Docker",
"resolution": "Modificare l'applicazione Docker registrata e salvare la porta web pubblicata del servizio come Web Link."
},
{
"problem": "La freccia viola si riferisce all'aggiornamento sbagliato Docker",
"resolution": "Rivedere il nome e la descrizione del Web Link in modo che possano essere abbinati al contenitore o all'immagine."
},
{
"problem": "Apps si apre prima di Panoramica del sistema",
"resolution": "Il primo elemento salvato in Impostazioni → ordine di navigazione diventa la scheda di atterraggio. Ripristinare l'ordine predefinito o spostare Panoramica prima."
}
]
},
"whereNext": {
"heading": "Dove proseguire",
"items": [
{
"label": "scheda App LXC",
"href": "/docs/monitor/dashboard/vms-lxcs/app",
"tail": "— registrare le applicazioni, i Link Web e il monitoraggio delle versioni facoltative."
},
{
"label": "scheda Aggiornamenti LXC",
"href": "/docs/monitor/dashboard/vms-lxcs/updates",
"tail": " — configura ed esegui aggiornamenti di applicazioni, Docker Engine e immagini."
},
{
"label": "Scheda delle impostazioni",
"href": "/docs/monitor/dashboard/settings#navigation-order",
"tail": " — cambia l'ordine di navigazione e la scheda iniziale."
}
]
}
}
@@ -0,0 +1,248 @@
{
"meta": {
"title": "ProxMenux Monitor — Pannello: Hardware | Documentazione ProxMenux",
"description": "La scheda Hardware inventaria la macchina fisica: CPU e scheda madre, moduli di memoria, sensori termici, GPU con monitoraggio per slot e installazione driver in un clic, acceleratori Coral TPU, riepilogo storage con velocità dei collegamenti, elenchi PCI e USB, consumo, alimentatori, ventole e UPS."
},
"header": {
"title": "Pannello: Hardware",
"description": "La macchina fisica in uno schermo — CPU e l'identità della scheda madre, ogni modulo di memoria, sensori termici in tutti i sottosistemi, GPU con l'utilizzo dal vivo e un installatore driver integrato, Coral TPUs, ogni dispositivo PCI e USB con il suo driver del kernel, l'inventario del disco completo con velocità di collegamento negoziate, più potenza, raffreddamento e UPS.",
"section": "ProxMenux Monitor · Dashboard"
},
"intro": {
"title": "Costruito con strumenti standard",
"body": "La maggior parte dei dati proviene da <code>lscpu</code>, <code>dmidecode</code>, <code>lspci</code>, <code>lsusb</code>, <code>lsblk</code>, <code>smartctl</code>, <code>nvme</code>, <code>sensors</code>, <code>nvidia-smi</code>, <code>intel_gpu_top</code>, <code>amdgpu_top</code>, <code>ipmitool</code> e <code>upsc</code>. Le sezioni appaiono solo quando lo strumento pertinente restituisce dati: senza UPS non appare la scheda UPS e senza IPMI non appaiono i dati di potenza fuori banda."
},
"thresholds": {
"title": "Colori e soglie di stato applicate qui",
"intro": "Ogni indicatore e lettura di temperatura usa la stessa scala: <green/> <strong>verde</strong> sotto Avviso, <amber/> <strong>ambra</strong> tra Avviso e Critico, <red/> <strong>rosso</strong> da Critico in poi. Valori predefiniti consigliati di ProxMenux:",
"items": [
"<strong>Temperatura CPU</strong> — avviso 80 °C, critico 90 °C.",
"<strong>Temperatura del disco</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (avvertimento / critico)."
],
"outro": "Ogni valore è configurabile per host. <link>Impostazioni → Soglie del monitor di integrità</link> centralizza le impostazioni e spiega come regolarle."
},
"sections": {
"heading": "Sezioni",
"intro": "Le sezioni appaiono in questo ordine, dall’alto in basso. Alcune richiedono lo hardware o lo strumento corrispondente e sono indicate come <em>(condizionale)</em>.",
"systemInfoTitle": "Informazioni sistema",
"systemInfoIntro": "Due blocchi affiancati, sempre presenti:",
"systemInfoItems": [
"<strong>CPU</strong> — modello, microarchitettura, socket/core/thread, frequenze base e boost, funzionalità di virtualizzazione (VT-x / AMD-V) e topologia della cache.",
"<strong>Scheda madre</strong> — produttore, modello, versione e data BIOS, UUID SMBIOS. Aiuta a trovare la pagina corretta del produttore per gli aggiornamenti firmware."
],
"memoryTitle": "Moduli memoria",
"memoryBody": "Una riga per slot occupato da <code>dmidecode</code>: etichetta, capacità del modulo, tipo (DDR4 / DDR5 / varianti ECC), velocità configurata e nominale, produttore, codice prodotto e numero di serie. Gli slot vuoti sono attenuati per mostrare le possibilità di espansione.",
"thermalTitle": "Monitoraggio termico",
"thermalIntro": "Sette blocchi con dati da <code>lm-sensors</code>, <code>sysfs</code> e lettori specifici per strumento. I sensori hwmon di storage sono associati al dispositivo a blocchi fisico, con modello e percorso <code>/dev/...</code>. Un blocco si nasconde se la categoria non contiene sensori.",
"thermalItems": [
"<strong>CPU</strong> — temperatura del package e di ogni core.",
"<strong>GPU</strong> — sensori di GPU dedicata tramite <code>nvidia-smi</code> / <code>amdgpu_top</code> e iGPU Intel. Include hot spot e temperatura di giunzione della memoria quando il driver li espone.",
"<strong>NVME</strong> — temperatura composita del controller associata al namespace NVMe esatto.",
"<strong>HDD</strong> — Letture <code>drivetemp</code> per dispositivi di blocco rotazionale.",
"<strong>SSD</strong> — Letture <code>drivetemp</code> per dispositivi di blocco SATA/SAS non-rotazionali.",
"<strong>PCI</strong> — sensori di dispositivi collegati a PCI, come HBA e schede di rete con sensori interni.",
"<strong>OTHER</strong> — chipset, VRM, sensori ambientali che non si adattano altrove."
]
},
"graphics": {
"heading": "Schede grafiche",
"intro": "Ogni controller video appare in una scheda con produttore, modello, tipo (<em>Integrata</em> / <em>PCI</em> / BMC), indirizzo PCI (BDF), driver del kernel e moduli. <strong>Cambia modalità</strong> alterna condivisione LXC con driver nativo e passthrough VM (<code>vfio-pci</code>). <link>Cambia modalità GPU (VM ↔ LXC)</link> spiega gli effetti sull'host.",
"vfioImageAlt": "Schede grafiche: Matrox G200EH integrata associata a mgag200, pronta per LXC, e NVIDIA Quadro P400 associata a vfio-pci, pronta per passthrough VM",
"vfioImageCaption": "Due GPU rilevate: il chip BMC Matrox usa il driver nativo ed è pronto per LXC; NVIDIA Quadro P400 è associata a <code>vfio-pci</code>, pronta per passthrough VM.",
"lxcImageAlt": "Schede grafiche: iGPU Intel UHD Graphics con i915 e NVIDIA Quadro P1000 con nvidia, entrambe pronte per container LXC",
"lxcImageCaption": "Stesso nodo dopo aver cambiato la scheda NVIDIA al driver nativo — entrambe le GPU ora pronte per contenitori LXC.",
"realtimeTitle": "Finestra di monitoraggio in tempo reale",
"realtimeBody": "Un clic apre il monitoraggio per slot, che interroga lo strumento del produttore ogni tre secondi. Mostra produttore, tipo, slot PCI, driver, moduli del kernel, utilizzo dei motori (Render/3D, Video, Blitter, VideoEnhance), frequenze grafiche e di memoria, temperatura, consumo se disponibile, VRAM e processi attivi con carico per processo. Dati da <code>/api/gpu/&lt;slot&gt;/realtime</code>.",
"toolsIntro": "Lo strumento del fornitore utilizzato per GPU:",
"headerVendor": "Produttore",
"headerTool": "Strumento",
"headerProject": "Progetto",
"tools": [
{
"vendor": "NVIDIA",
"tool": "nvidia-smi",
"projectLabel": "developer.nvidia.com",
"projectHref": "https://developer.nvidia.com/nvidia-system-management-interface"
},
{
"vendor": "Intel iGPU",
"tool": "intel_gpu_top (igt-gpu-tools)",
"projectLabel": "gitlab.freedesktop.org",
"projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools"
},
{
"vendor": "AMD",
"tool": "amdgpu_top",
"projectLabel": "github.com/Umio-Yasuno/amdgpu_top",
"projectHref": "https://github.com/Umio-Yasuno/amdgpu_top"
},
{
"vendor": "Matrox / ASPEED (BMC)",
"tool": "— (solo visualizzazione)",
"projectLabel": "Rilevato e identificato come BMC; nessun monitoraggio in tempo reale."
}
],
"nvidiaImageAlt": "Monitoraggio NVIDIA Quadro P1000: produttore NVIDIA, driver nvidia caricato, frequenza grafica 1.26 GHz, memoria 2.50 GHz, temperatura 50 °C, motori allo 0 %, nessun processo attivo, memoria totale 4096 MiB",
"nvidiaImageCaption": "NVIDIA Quadro P1000 con driver proprietario: frequenze, temperatura, barre di utilizzo dei motori e processi attivi.",
"intelImageAlt": "Monitoraggio iGPU Intel UHD Graphics con i915: consumo 11.31 W, carico video 1 % e processo ffmpeg che usa 8 MB",
"intelImageCaption": "Intel iGPU con <code>i915</code> attivo. La tabella dei processi attivi raccoglie un lavoro ffmpeg utilizzando il motore video.",
"amdImageAlt": "Monitoraggio GPU integrata AMD Lucienne con amdgpu: motori allo 0 % e amdgpu_top come processo attivo",
"amdImageCaption": "iGPU AMD monitorata con <code>amdgpu_top</code>. Lo strumento appare come processo attivo perché acquisisce i dati in tempo reale.",
"installTitle": "Installare il driver NVIDIA dalla finestra",
"installBody": "Con <code>nouveau</code>/<code>nvidiafb</code> senza driver proprietario NVIDIA, non sono disponibili frequenze, consumo e carico per processo. La finestra offre <strong>Installa driver NVIDIA</strong>, che esegue lo script di <link>Installa driver NVIDIA (host)</link>.",
"noDriverAlt": "Monitoraggio NVIDIA Quadro P620 con nvidiafb e nouveau caricati, avviso Monitoraggio esteso non disponibile e pulsante blu Installa driver NVIDIA",
"noDriverCaption": "Driver proprietario non ancora installato: la finestra offre un installatore in un clic.",
"promptAlt": "Conferma di installazione del driver NVIDIA con GPU rilevate, container LXC con passthrough NVIDIA e pulsanti Sì/Annulla",
"promptCaption": "Riepilogo prima dell'installazione: GPU rilevate, container LXC con passthrough NVIDIA e azioni previste. Nessuna modifica prima della conferma.",
"successAlt": "Uscita terminale che mostra il driver NVIDIA 580.105.08 installato con successo e nvidia-smi segnalando un Quadro P620",
"successCaption": "Installazione di successo — il NVIDIA <code>.run</code> costruito tramite DKMS, il servizio di persistenza è in atto, e <code>nvidia-smi</code> segnala il GPU.",
"warningTitle": "Scegli una versione del driver supportata dalla GPU",
"warningBody": "I nuovi rami NVIDIA abbandonano il supporto per famiglie GPU precedenti, come Maxwell o Kepler. Se <code>nvidia-smi</code> mostra <em>\"No devices were found\"</em> dopo l'installazione o DKMS fallisce, il ramo può essere incompatibile. Ripeti con un ramo precedente, come legacy 470.x per Kepler. Verifica la compatibilità nella <a>pagina ufficiale di ricerca dei driver</a>.",
"whereGoIntro": "Dove andare da qui:",
"whereGoItems": [
"<link1>Installa driver NVIDIA (host)</link1> — guida completa, matrice di compatibilità del kernel, patch NVENC opzionale e propagazione ai LXC.",
"<link2>Cambia modalità GPU (VM ↔ LXC)</link2> — effetti del comando <em>Cambia modalità</em> nella scheda.",
"<link3>Aggiungi GPU a VM (passthrough)</link3> e <link4>Aggiungi GPU a LXC</link4> — prima assegnazione di una GPU non associata."
]
},
"coral": {
"heading": "Coral TPU / Acceleratori AI",
"subHeading": "(condizionale)",
"intro": "Appare con dispositivi Google Coral o altri acceleratori AI collegati. Ogni finestra mostra connessione (M.2 / mini-PCIe / USB), larghezza PCIe, ID produttore/prodotto, supporto software (<code>apex</code> nel kernel per PCIe, <code>libedgetpu</code> in spazio utente per USB), moduli (<code>gasket</code> + <code>apex</code>), nodi (<code>/dev/apex_*</code>), stato del runtime Edge TPU, temperatura in tempo reale e soglie di avviso del firmware.",
"imageAlt": "Coral Edge TPU dettaglio modale: connessione PCIe/M.2, collegamento PCIe 5.0 GT/s x1, fornitore 1ac1:089a, driver del kernel apex, Moduli gasket e apex caricati, /dev/apex_0 presente, Edge TPU Runtime non installato, temperatura 53.5 °C con soglie di avviso hardware",
"imageCaption": "M.2 Coral con i moduli del kernel host caricati, il nodo del dispositivo e gli avvisi di temperatura del firmware esposti. La linea runtime diventa verde una volta installato il runtime Edge TPU corrispondente.",
"pathsIntro": "Esistono due percorsi di installazione a seconda del fattore forma:",
"pathsItems": [
"<strong>M.2 / Mini-PCIe</strong> — l'host ha bisogno dei moduli del kernel <code>gasket</code> + <code>apex</code> costruiti tramite DKMS così il nodo del dispositivo <code>/dev/apex_0</code> appare all'avvio.",
"<strong>USB Accelerator</strong> — l'host ha solo bisogno del runtime user-space Edge TPU (<code>libedgetpu1-std</code>) del repository APT di Google."
],
"outro": "<installLink>Installa Coral TPU sull'host</installLink> rileva e gestisce entrambe le varianti. Informazioni e runtime ufficiale sono su <a>coral.ai/docs</a>. Poi assegna il dispositivo a un container con <lxcLink>Aggiungi Coral TPU a LXC</lxcLink>."
},
"storage": {
"heading": "Riepilogo storage",
"intro": "Tutti i dispositivi a blocchi noti al kernel, raggruppati per tipo. Ogni disco mostra nome (<code>sda</code>, <code>nvme0n1</code>, <code>zram0</code>…), tipo (<em>SSD</em>, <em>HDD</em>, <em>NVMe SSD</em>), modello e collegamento negoziato. Un clic apre modello, numero di serie, capacità, interfaccia e velocità attuale e massima.",
"imageAlt": "Riepilogo storage con undici dispositivi a blocchi (SSD SATA, HDD SATA, SSD NVMe e zram), modelli e velocità negoziate; due NVMe in 3.0 x4 con velocità attuale evidenziata",
"imageCaption": "Undici dispositivi su questo nodo. I collegamenti SATA appaiono come <em>SATA &lt;version&gt;, &lt;Gb/s&gt; (current: ...)</em>; gli NVMe come <em>&lt;PCIe gen&gt; x&lt;width&gt;</em>.",
"nvmeBody": "Per ogni NVMe la riga confronta il collegamento negoziato con il massimo supportato. Se differiscono, per esempio un SSD Gen3 x4 a <strong>3.0 x1</strong> in uno slot con una sola linea, il valore attuale appare in ambra. Aiuta a diagnosticare dischi lenti o cambiamenti delle linee dopo un aggiornamento BIOS.",
"nvmeModalAlt": "Dettagli NVMe di nvme0n1: NVMe SSD, 953.9 GB, collegamento attuale 3.0 x1 in ambra, massimo 3.0 x4, WDC CL SN720, numero di serie e interfaccia PCIe/NVMe",
"nvmeModalCaption": "Dettagli NVMe con collegamento ridotto: il disco supporta x4, ma lo slot è cablato x1.",
"outro": "Dati SMART, autotest, cronologia e rapporto PDF sono in <storageLink>Pannello: Storage</storageLink>. Gli stessi dati alimentano <smartLink>Integrità e test SMART dei dischi</smartLink>. Un test lungo dallo script scrive il JSON mostrato da Monitor in <em>Storage → Cronologia</em>."
},
"pci": {
"heading": "Dispositivi PCI",
"intro": "Dispositivi PCI identificati dal <strong>BDF PCI</strong> (Bus:Device.Function, ad esempio <code>03:00.0</code>) e classe (<em>Controller di storage</em>, <em>Controller USB</em>, <em>Scheda grafica</em>, <em>Controller di rete</em>, <em>Controller audio</em>…). Ogni scheda mostra produttore, nome e <strong>driver del kernel associato</strong>, utili per diagnosticare passthrough, gruppi IOMMU o driver errati.",
"imageAlt": "PCI Dispositivi elenco quindici dispositivi raggruppati per classe: controller di archiviazione su ahci/nvme, controller USB, schede grafiche (uno su vfio-pci, uno sul driver nativo), controllori di rete su igb / tg3, un controller audio accanto a un GPU",
"imageCaption": "Quindici dispositivi su questo nodo. Notare il GPU e la sua funzione audio compagno sia legato a <code>vfio-pci</code> — che è una scheda preparata per il passaggio VM.",
"bdfTitle": "Leggere il BDF",
"bdfBody": "<code>03:00.0</code> indica bus PCI <code>03</code>, dispositivo <code>00</code>, funzione <code>0</code>. Le GPU dedicate usano di solito <code>.0</code> per la GPU e <code>.1</code> per l'audio HDMI. Entrambe le funzioni si passano insieme alla VM; <link>Cambia modalità GPU</link> pulisce quindi anche le associazioni audio orfane quando si esce dalla modalità VM."
},
"usb": {
"heading": "Dispositivi USB",
"intro": "Dispositivi USB con produttore e prodotto, versione USB, indirizzo <code>bus:device</code>, ID <code>vendor:product</code> e driver del kernel. Sono classificati per ruolo: <em>Comunicazioni</em> (adattatori Z-Wave / Zigbee), <em>UPS</em>, storage o HID. Si identificano così senza confrontare gli ID.",
"imageAlt": "Dispositivi USB: Aeotec Z-Wave Z-Stick, coordinatore Zigbee ConBee II e UPS Ellipse ECO, con versione USB, indirizzo, ID vendor:product e driver associato",
"imageCaption": "Tre dispositivi USB — due radio home-automazione su <code>usbfs</code> e un UPS su <code>usbfs</code> (NUT parla con libusb)."
},
"power": {
"heading": "Consumo energetico",
"subHeading": "(condizionale)",
"intro": "Appare se l'host fornisce telemetria di potenza. Mostra due fonti indipendenti quando disponibili:",
"items": [
"<strong>Consumo totale ACPI / IPMI</strong> — potenza di tutto il sistema misurata da un sensore della scheda madre o dal BMC. Tipico delle schede server.",
"<strong>Consumo del package CPU</strong> — contatori Intel RAPL o equivalente AMD. Distingue il consumo CPU dal resto sulle schede consumer prive di sensore totale."
],
"supplyImageAlt": "Consumo: 198 W totali via ACPI e due alimentatori con stato OK e potenza di uscita di 185 W e 5 W",
"supplyImageCaption": "Scheda server con un sensore ACPI e due alimentatori via IPMI: il secondo è ridondante, a riposo con 5 W.",
"cpuImageAlt": "Consumo su scheda consumer: solo 8.7 W di CPU tramite Intel RAPL",
"cpuImageCaption": "Scheda consumer senza sensore totale: mostra solo il consumo CPU tramite RAPL."
},
"psu": {
"heading": "Alimentatori",
"subHeading": "(condizionale)",
"body": "Sulle macchine server con doppi alimentatori, IPMI mostra presenza (PSU 1 / PSU 2 / …), tensione di ingresso, potenza di uscita e stato OK/guasto. Da controllare dopo un'interruzione elettrica sui nodi con alimentatori ridondanti."
},
"fans": {
"heading": "Ventole sistema",
"subHeading": "(condizionale)",
"body": "RPM di ogni ventola con minigrafico, se supportato. Senza dati individuali mostra una sola lettura della ventola del telaio."
},
"ups": {
"heading": "Stato UPS",
"subHeading": "(condizionale)",
"body": "Appare con un server NUT (Network UPS Tools) configurato e raggiungibile. Mostra stato (rete / batteria / ricarica / batteria scarica), carica della batteria, autonomia stimata, percentuale di carico, tensione di ingresso, modello e firmware. I dati alimentano anche <em>Sicurezza e certificati</em> del monitor di integrità: il passaggio a batteria viene segnalato subito."
},
"dataCollected": {
"heading": "Come vengono raccolti i dati",
"headerSection": "Sezione della scheda",
"headerEndpoint": "Endpoint",
"headerSource": "Fonte",
"rows": [
{
"section": "inventario statico (PCI, CPU, BIOS)",
"endpoint": "/api/hardware",
"source": "<code>lspci -vmm</code>, <code>/proc/cpuinfo</code>, <code>dmidecode</code>; cache per la durata del processo."
},
{
"section": "Valori del sensore dal vivo",
"endpoint": "/api/hardware/live",
"source": "<code>sensors</code> (lm-sensors), <code>/sys/class/hwmon</code> e <code>/sys/block</code> identificano i dispositivi di storage. Le temperature restano in tempo reale; solo la mappatura hwmon-dispositivo è in cache per 60 secondi."
},
{
"section": "Storia della temperatura CPU",
"endpoint": "/api/temperature/history",
"source": "Serie temporale registrata ogni 60 secondi dal collettore di temperatura e salvata in SQLite."
},
{
"section": "metriche live GPU",
"endpoint": "/api/gpu/<slot>/realtime",
"source": "NVIDIA: <code>nvidia-smi --query-gpu=...</code>. Intel: <code>intel_gpu_top</code>. AMD: sysfs <code>/sys/class/drm/cardN</code>."
}
],
"codeComment1": "# Confronta l'inventario con la vista del sistema operativo",
"codeComment2": "# Confermare la scheda GPU che il cruscotto vede"
},
"whereNext": {
"heading": "Dove proseguire",
"items": [
{
"label": "Installare driver NVIDIA (Host)",
"href": "/docs/hardware/nvidia-host",
"tail": " — script eseguito dal pulsante di installazione della finestra GPU."
},
{
"label": "Cambia modalità GPU (VM ↔ LXC)",
"href": "/docs/hardware/switch-gpu-mode",
"tail": "— che cosa fa l'interruttore in linea su ogni scheda GPU all'host."
},
{
"label": "Installare Coral TPU sull'host",
"href": "/docs/hardware/install-coral-tpu-host",
"tail": " — installazione del modulo kernel e del runtime Coral."
},
{
"label": "Integrità e test disco SMART",
"href": "/docs/disk-manager/smart-disk-test",
"tail": " — script che produce i dati SMART nei dettagli del disco nella scheda Storage."
},
{
"label": "Dashboard: scheda di stoccaggio",
"href": "/docs/monitor/dashboard/storage",
"tail": " — tabella completa degli attributi SMART, cronologia degli autotest e rapporto PDF."
},
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tail": " — categoria CPU e Temperatura, che usa gli stessi sensori."
},
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tail": " — endpoint di hardware e GPU."
},
{
"label": "Indice del pannello",
"href": "/docs/monitor/dashboard",
"tail": "— le altre schede."
}
]
}
}
@@ -0,0 +1,101 @@
{
"meta": {
"title": "ProxMenux Monitor — Dashboard | Documentazione ProxMenux",
"description": "Il pannello è l'interfaccia principale di ProxMenux Monitor: dieci schede, incluso il lanciatore Apps, un'intestazione globale e un ordine di navigazione configurabile."
},
"header": {
"title": "Dashboard",
"description": "La vista quotidiana di ProxMenux Monitor: dieci schede, incluso il lanciatore Apps, un'intestazione globale e un ordine di navigazione configurabile.",
"section": "ProxMenux Monitor"
},
"oneHeader": {
"title": "Un'intestazione, dieci schede",
"body": "L'intestazione (logo, nome del nodo, indicatore di stato, tempo di attività, aggiornamento e tema) rimane visibile. La scheda attiva cambia l'intera area dei contenuti. Il colore indica la categoria peggiore del <link>monitoraggio dello stato</link>: lo stesso dato visualizzato nel pannello."
},
"tabs": {
"heading": "Le dieci schede",
"intro": "Ogni scheda ha una propria pagina dedicata. Le pagine sono aggiunte in modo incrementale come la documentazione è riempita in; di seguito è l'elenco completo e ciò che ciascuno è responsabile.",
"headerTab": "Scheda",
"headerOwns": "Di cosa si occupa",
"rows": [
{
"name": "Panoramica sistema",
"linksTo": "/docs/monitor/dashboard/system-overview",
"owns": "CPU / widget di memoria / temperatura, conteggio attivo VM & LXC, grafici metrici storici, sommari di archiviazione e rete. Scheda di atterraggio predefinita fino a quando l'ordine di navigazione è personalizzato."
},
{
"name": "Applicazioni",
"linksTo": "/docs/monitor/dashboard/apps",
"owns": "Lanciatore unificato di collegamenti web LXC registrati e collegamenti personalizzati, con categorie, ricerca, scorciatoie ai guest e indicatori di aggiornamento per applicazione."
},
{
"name": "Archiviazione",
"owns": "Pool Proxmox, dischi fisici, dati SMART, stato ZFS, usura e durata utile, cronologia delle osservazioni."
},
{
"name": "Rete",
"owns": "Interfacce fisiche, bond, bridge e OVS, indirizzi IP/MAC, grafici RX/TX e cronologia RRD per interfaccia."
},
{
"name": "VM e LXC",
"owns": "Inventario dei guest, dettagli di configurazione, metriche e log, azioni di avvio, arresto, riavvio e spegnimento."
},
{
"name": "Hardware",
"owns": "Modello e topologia CPU, layout di memoria, topologia PCIe, GPU con monitoraggio in tempo reale per-slot."
},
{
"name": "Log di sistema",
"owns": "Live <code>journalctl</code> con filtri, cronologia delle attività Proxmox, registro delle notifiche, pacchetti di log scaricabili."
},
{
"name": "Terminale",
"owns": "Shell dell'host o di qualsiasi VM/CT nel browser, con <code>xterm.js</code> tramite WebSocket."
},
{
"name": "Sicurezza",
"owns": "Impostazione dell'auth, password / Token 2FA / API, log di audit, pannello Fail2Ban opzionale, distribuzione Secure Gateway."
},
{
"name": "Impostazioni",
"owns": "Lingua di Monitor, ordine di navigazione, canali di notifica, provider IA, soglie di stato, esclusioni e inventario delle ottimizzazioni post-installazione."
}
]
},
"headerAnatomy": {
"heading": "Struttura dell'intestazione",
"items": [
"<strong>Logo + nome del prodotto</strong> a sinistra. Il logo si trasforma in una variante \"aggiornamento disponibile\" quando viene rilevata una nuova versione Monitor.",
" <strong>Identità del nodo</strong>: nome ottenuto da <code>pvesh get /nodes</code>, con <code>hostname</code> come alternativa.",
" <strong>Indicatore di stato</strong>: Regolare (verde), Avviso (giallo), Critico (rosso). Un clic apre il monitoraggio dello stato. Un badge blu <em>info</em> appare se gli elementi ignorati sono ancora nel periodo di soppressione.",
" <strong>Tempo di attività</strong>: durata di funzionamento dell'host in formato leggibile.",
" <strong>Pulsante Aggiorna</strong>: ripete le chiamate API dei dati in tempo reale senza ricaricare l'intera pagina.",
" <strong>Selettore del tema</strong>: chiaro, scuro o sistema. Salvato in <code>localStorage</code>."
]
},
"whereNext": {
"heading": "Dove proseguire",
"items": [
{
"label": "Scheda Apps",
"href": "/docs/monitor/dashboard/apps",
"tail": " — lanciatore unificato di collegamenti web e relazione con le applicazioni LXC registrate."
},
{
"label": "Scheda Panoramica del sistema",
"href": "/docs/monitor/dashboard/system-overview",
"tail": "— la scheda di atterraggio, completamente documentata."
},
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tail": " — finestra dell'indicatore di stato, con dettagli delle dieci categorie."
},
{
"label": "Architettura",
"href": "/docs/monitor/architecture",
"tail": "— come il cruscotto parla al backend Flask."
}
]
}
}
@@ -0,0 +1,251 @@
{
"meta": {
"title": "ProxMenux Monitor — Dashboard: scheda Rete | Documentazione ProxMenux",
"description": "La scheda Rete elenca le interfacce dell’host: schede fisiche, bridge, bond, VLAN e interfacce virtuali VM/LXC. Il dettaglio mostra IP, MAC, stato, membri del bond, traffico dall’avvio e storico RRD."
},
"header": {
"title": "Dashboard: scheda di rete",
"description": "Le interfacce rilevate dal kernel — schede fisiche, bridge, bond, VLAN e porte virtuali VM/LXC — sono raggruppate in tre schede. Fai clic su una riga per vedere indirizzi, contatori del traffico e dati storici RRD.",
"section": "ProxMenux Monitor · Dashboard"
},
"intro": {
"title": "Dati attuali e storici",
"body": "Lo stato attuale proviene da <code>psutil.net_if_stats()</code> e <code>ip</code>, lo storico della banda dall’archivio RRD Proxmox tramite <code>/api/network/&lt;interface&gt;/metrics</code>. I contatori si aggiornano circa ogni 5 secondi e i dati RRD del grafico vengono caricati su richiesta."
},
"topRow": {
"heading": "Riga superiore: quattro schede statistiche",
"headerCard": "Scheda",
"headerWhat": "Cosa mostra",
"rows": [
{
"card": "Traffico rete",
"what": "Velocità RX/TX complessiva di tutte le interfacce, espressa nell’unità appropriata (bps / Kbps / Mbps / Gbps)."
},
{
"card": "Interfacce attive",
"what": "Due contatori: <em>Physical X / Y</em> e <em>Bridges X / Y</em>, attive rispetto al totale. Un primo controllo quando qualcosa smette di funzionare."
},
{
"card": "Stato rete",
"what": "Stato rapido: Regolare / Avviso / Critico in base a collegamento, raggiungibilità del gateway e integrità del bridge. Rispecchia la categoria <em>Interfacce di rete</em> di Health Monitor."
},
{
"card": "Latenza rete",
"what": "Tempo di andata e ritorno verso il gateway con un piccolo grafico. Un clic apre la <strong>finestra Latenza di rete</strong> descritta sotto: storico e test ping su richiesta verso gateway, Cloudflare o Google, con rapporto PDF scaricabile."
}
]
},
"flow": {
"heading": "Schema di flusso di rete",
"intro": "Tra la riga superiore e le tre schede, <strong>Network Flow</strong> mostra la topologia in tempo reale. I percorsi dei pacchetti collegano le schede fisiche, i bridge al centro e infine VM e container. Gli impulsi animati rappresentano il traffico rx/tx attuale di ogni collegamento.",
"imageAlt": "Schema di flusso di rete — NIC a sinistra, host e ponti nel mezzo, VM e LXC a destra, con impulsi animati su ogni connessione",
"imageCaption": "Flusso di rete — nodi colorati più comete animate la cui direzione e spessore riflettono il traffico dal vivo.",
"elementsTitle": "Cosa mostra il diagramma",
"elementsIntro": "Ogni nodo rappresenta una voce dello stesso inventario delle schede sottostanti. La disposizione come topologia rende subito visibili le relazioni:",
"elements": [
"<strong>Schede di rete</strong> (ambra) — interfacce fisiche con collegamento attivo; quelle inattive appaiono attenuate.",
"<strong>Host</strong> (ambra) — l’host Proxmox tra schede di rete e bridge. Un punto fisso non cliccabile.",
"<strong>Bridge</strong> (ciano) — bridge Linux e OVS con almeno un guest attivo. Quelli inutilizzati sono nascosti per concentrare il diagramma sul traffico effettivo.",
"<strong>LXC</strong> (ciano) — container in esecuzione collegati a un bridge.",
"<strong>VM</strong> (viola) — macchine virtuali in esecuzione collegate a un bridge.",
"Le VM e i container arrestati sono nascosti."
],
"pulsesTitle": "Cosa codifica l'animazione",
"pulsesBody": "Le comete animate che viaggiano lungo ogni bordo rappresentano il traffico dal vivo:",
"pulses": [
"<strong>Direzione</strong> — verso la scheda di rete significa <em>tx</em> del guest; verso il guest, <em>rx</em>.",
"Lo <strong>spessore della linea</strong> cresce con la velocità rx+tx del guest. Senza traffico resta una linea animata tenue; con molto traffico diventa spessa.",
"<strong>Bagliore della testa della cometa</strong> — tonalità calda intorno a 1 MB/s, intensa da 30 MB/s. Aiuta a individuare il guest che occupa maggiormente una scheda di rete.",
"<strong>Clic</strong> — tutti i nodi tranne l’host aprono la finestra di dettaglio dell’interfaccia descritta sotto. Fare clic sull’host non ha effetto: questa vista non prevede una finestra per esso."
],
"useTitle": "Quando è utile",
"useBody": "Le schede mostrano <em>cosa</em> esiste; il diagramma mostra <em>come è collegato</em> e dove passa il traffico. Puoi individuare guest sullo stesso bridge, due guest molto attivi sulla stessa scheda — un possibile collo di bottiglia — o una VM che satura un collegamento mentre le altre sono inattive."
},
"groups": {
"heading": "Tre gruppi di interfaccia",
"intro": "Tre schede raggruppano le interfacce per funzione. Ogni intestazione indica quante sono attive. Un’etichetta colorata identifica il <strong>tipo</strong> di ogni interfaccia:",
"badges": [
"Blu <strong>Physical</strong> — NIC reale.",
"Verde <strong>Bridge</strong> — bridge Linux o OVS (<code>vmbr*</code>).",
"Viola <strong>Bond</strong> — aggregazione bond / LACP / active-backup.",
"Ciano <strong>VLAN</strong> — sottointerfaccia VLAN (<code>vmbr0.10</code>, <code>eno1.42</code>, …)."
],
"clickable": "<strong>Ogni riga è cliccabile</strong>: interfacce fisiche, virtuali, bridge e bond. Il dettaglio descritto sotto mostra dati di base, IP, contatori e storico RX/TX dall’archivio RRD Proxmox.",
"physicalTitle": "Interfacce fisiche",
"physicalBody": "Interfacce fisiche riconosciute dal kernel: <code>eno1</code>, <code>enp4s0</code>, <code>eth0</code>, <code>wlp3s0</code>, ecc. Ogni dispositivo ha una riga con etichetta blu <strong>Physical</strong> e stato del collegamento. Compaiono anche i <em>membri di un bond</em>, con riferimento al bond di appartenenza.",
"bridgeTitle": "Interfacce bridge",
"bridgeBody": "Bridge Linux (<code>vmbr0</code>, <code>vmbr1</code>, …) e OVS gestiti da Proxmox. Ogni riga mostra l’etichetta verde <strong>Bridge</strong>, l’interfaccia fisica se c’è una sola porta e lo stato. I bond hanno l’etichetta viola <strong>Bond</strong>, le sottointerfacce VLAN quella ciano <strong>VLAN</strong>.",
"vmTitle": "Interfacce VM / LXC",
"vmBody": "Interfacce <code>tap*</code> e <code>veth*</code> create all’avvio dei guest, una per scheda virtuale. L’intestazione mostra <em>X / Y Active</em> e le righe rimandano alla VM/CT nella scheda VM e LXC. Dopo l’arresto, le voci inattive scompaiono al successivo aggiornamento."
},
"drillIn": {
"heading": "Dettaglio per interfaccia",
"intro": "Un clic su una riga apre una finestra con cinque sezioni:",
"headerBlock": "Blocco",
"headerContents": "Contenuto",
"rows": [
{
"block": "Informazioni di base",
"contents": "Nome, tipo (fisica / bridge / bond / VLAN / vm), indirizzo MAC, stato (attivo / inattivo), MTU e interfaccia fisica sottostante per i tipi virtuali."
},
{
"block": "Membri del bond",
"contents": "Solo per i bond: ogni scheda membro con stato attivo o guasto, modalità del bond (active-backup / 802.3ad / balance-alb / …) e interfaccia principale se configurata."
},
{
"block": "Indirizzi IP",
"contents": "Ogni indirizzo IPv4 / IPv6 con la lunghezza del prefisso. Gli indirizzi link-locali configurati automaticamente sono elencati ma grigiati."
},
{
"block": "Grafico storico",
"contents": "Banda RX/TX nell’intervallo scelto (1 ora / 24 ore / 7 giorni / 30 giorni / 1 anno), ottenuta da <code>/api/network/&lt;interface&gt;/metrics</code> (RRD Proxmox)."
},
{
"block": "Traffico dall'ultimo avvio",
"contents": "Totale di byte e pacchetti RX/TX dall’ultimo avvio dell’host, con contatori di errori e pacchetti scartati."
}
],
"inactiveTitle": "Il dettaglio delle interfacce inattive resta accessibile",
"inactiveBody": "Se l’interfaccia è <em>inattiva</em>, la finestra mostra l’avviso «Interfaccia inattiva» senza contatori attuali. Configurazione — indirizzi e membri del bond — e storico restano visibili per capire cosa è fallito e quando."
},
"latency": {
"heading": "Finestra Latenza di rete",
"intro": "Fai clic su <em>Latenza di rete</em> nella riga superiore per aprire la finestra: storico, test su richiesta, tre destinazioni e rapporto PDF scaricabile.",
"targetsTitle": "Destinazioni",
"targetsIntro": "Il menu in alto seleziona la destinazione del ping:",
"targets": [
"<strong>Gateway</strong> — il router LAN. Verifica solo il tratto locale per analizzare problemi di switch o cablaggio senza includere la WAN.",
"<strong>Cloudflare (1.1.1.1)</strong> — resolver DNS pubblico su rete anycast. Verifica il tratto WAN.",
"<strong>Google (8.8.8.8)</strong> — destinazione pubblica alternativa per confrontare i risultati o in caso di problemi regionali Cloudflare."
],
"mode1Title": "Modalità 1 — Vista storica",
"mode1Alt": "Finestra di latenza in modalità storica, destinazione Gateway, intervallo di un’ora e misurazioni precedenti tracciate",
"mode1Caption": "Storico del gateway nell’ultima ora. Il processo di raccolta di temperatura e latenza salva le misurazioni nel database ogni 60 secondi.",
"mode1Body1": "Modalità iniziale della finestra. Un secondo menu sceglie l’intervallo (<em>1 ora / 6 ore / 24 ore / 3 giorni / 7 giorni</em>). Sopra compaiono Attuale / Minimo / Media / Massimo e uno stato Eccellente / Buono / Discreto / Scarso secondo le soglie seguenti.",
"mode1Body2": "Fonte: le misurazioni usate da Health Monitor per rilevare rallentamenti persistenti. Il thread in background <code>_temperature_collector_loop</code> misura il gateway ogni 60 secondi e conserva lo storico in un database SQLite locale.",
"mode2Title": "Modalità 2 — Test in tempo reale",
"mode2Alt": "Finestra di latenza con ping in tempo reale verso Cloudflare, avanzamento al 50% e nuove misurazioni nel grafico",
"mode2Caption": "Test di due minuti verso Cloudflare con una lettura ogni cinque secondi, subito aggiunta al grafico. <em>Interrompi</em> termina prima; <em>Ripeti test</em> aggiunge misurazioni allo stesso insieme di dati.",
"mode2Intro": "Attivare l'obiettivo di Cloudflare o Google avvia un test di ping on-demand. Comportamento:",
"mode2Items": [
"<strong>Durata</strong> — due minuti per test, con barra di avanzamento e secondi rimanenti.",
"<strong>Frequenza</strong> — una lettura ogni cinque secondi, 24 per test.",
"<strong>Metodo</strong> — ICMP Echo Request (<code>ping</code>), tre ping consecutivi per misurazione con latenza media.",
"<strong>Stop</strong> — termina immediatamente il test; i dati parziali vengono conservati.",
"<strong>Ripeti test</strong> — aggiunge misurazioni ai dati esistenti per costruire uno storico più lungo con più esecuzioni.",
"<strong>Indicatore di stato attuale</strong> — aggiornato dopo ogni misurazione con le stesse soglie Eccellente / Buono / Discreto / Scarso."
],
"thresholdsTitle": "Soglie di prestazione",
"headerStatus": "Stato",
"headerRange": "Intervallo",
"headerImpact": "Impatto pratico",
"thresholdRows": [
{
"status": "Eccellente",
"range": "< 50 ms",
"impact": "Perfetto per applicazioni in tempo reale, giochi e videochiamate."
},
{
"status": "Buono",
"range": "50 – 100 ms",
"impact": "Accettabile per la maggior parte delle applicazioni con impatto minimo."
},
{
"status": "Discreto",
"range": "100 – 200 ms",
"impact": "Ritardo notevole. Può influenzare VoIP e applicazioni interattive."
},
{
"status": "Scarso",
"range": "> 200 ms",
"impact": "Latenza significativa. Si consiglia un'indagine."
}
],
"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.",
"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)",
"sectionsIntro": "La relazione ha sei sezioni:",
"sections": [
"<strong>Sintesi</strong> — indicatore da 0 a oltre 300 ms con zone verde, gialla e rossa; stato Eccellente / Buono / Discreto / Scarso; destinazione, modalità, numero di misurazioni e riepilogo della perdita di pacchetti.",
"<strong>Statistiche di latenza</strong> — quattro indicatori per valore attuale, minimo, media e massimo, oltre a numero di misurazioni, perdita media di pacchetti e periodo del test.",
"<strong>Grafico di latenza</strong> — grafico ad area delle misurazioni durante il test, con riferimenti di minimo, media e massimo sull’asse verticale.",
"<strong>Soglie di prestazione</strong> — la stessa scala a quattro livelli descritta sopra, con un punto colorato per livello.",
"<strong>Risultati dettagliati</strong> — tabella numerata con data e ora, latenza, perdita di pacchetti e stato di ogni misurazione. Rivela picchi brevi nascosti dalle medie.",
"<strong>Metodologia</strong> — ICMP Echo Request, tre ping consecutivi per misurazione, nome e IP della destinazione e valutazione finale derivata dallo stato."
],
"useCaseTitle": "Caso d’uso: assistenza del provider Internet",
"useCaseBody": "Esegui due minuti di test Cloudflare quando la connessione è lenta, prolunga con <em>Ripeti test</em> e seleziona <em>Rapporto</em>. Il PDF contiene tutte le misurazioni e la metodologia. Puoi allegarlo a una richiesta di assistenza con gli orari del problema; il provider decide quali prove richiedere."
},
"excluding": {
"heading": "Escludere interfacce dal monitoraggio",
"body1": "Puoi escludere interfacce dal monitoraggio: bridge disattivati volontariamente, interfacce di test o schede rimosse ancora configurate. L’impostazione è salvata in <code>excluded_interfaces</code>: Health Monitor non genera avvisi o notifiche e non le include nello stato generale.",
"body2": "Nel menu contestuale scegli <em>Escludi dal monitoraggio</em>. L’interfaccia resta visibile con etichetta viola <strong>esclusa</strong>. Puoi riattivare il monitoraggio dallo stesso menu."
},
"dataCollected": {
"heading": "Come vengono raccolti i dati",
"headerSection": "Sezione della scheda",
"headerEndpoint": "Endpoint",
"headerSource": "Fonte",
"rows": [
{
"section": "Inventario di interfaccia",
"endpoint": "/api/network",
"source": "<code>ip -j addr</code> + <code>ip -j link</code> e analisi di bond e bridge."
},
{
"section": "Carte di sintesi",
"endpoint": "/api/network/summary",
"source": "Riepilogo dell’inventario e conteggio delle interfacce attive e inattive."
},
{
"section": "Storico RX/TX per interfaccia",
"endpoint": "/api/network/<iface>/metrics",
"source": "I contatori attuali usano <code>/proc/net/dev</code>; lo storico proviene da RRD Proxmox tramite pvesh. Le interfacce VM/LXC usano i dati del guest; quelle fisiche e i bridge, i dati del nodo."
},
{
"section": "Latenza: corrente",
"endpoint": "/api/network/latency/current",
"source": "Breve serie di <code>ping</code> verso il gateway o la destinazione configurata."
},
{
"section": "Latenza: storica",
"endpoint": "/api/network/latency/history",
"source": "Misurazioni salvate circa ogni 60 secondi dal processo in background di raccolta di temperatura e latenza."
}
],
"codeComment1": "# Verifica lo stato delle interfacce mostrato nella dashboard",
"codeComment2": "# Verifica una misurazione attuale della latenza end-to-end"
},
"whereNext": {
"heading": "Per approfondire",
"items": [
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tail": " — categoria Rete e soglie dello storico della latenza."
},
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tail": " — endpoint di rete e latenza."
},
{
"label": "Integrazioni",
"href": "/docs/monitor/integrations",
"tail": " — la raccolta Prometheus espone le stesse metriche di rete."
},
{
"label": "Indice Dashboard",
"href": "/docs/monitor/dashboard",
"tail": "— le altre schede."
},
{
"label": "ProxMenux → Rete",
"href": "/docs/network",
"tail": "— il lato delle azioni: analisi del ponte, nomi di interfaccia persistenti, backup e riavvio, iperf3."
}
]
}
}
@@ -0,0 +1,246 @@
{
"meta": {
"title": "ProxMenux Monitor — Dashboard: scheda Sicurezza | Documentazione ProxMenux",
"description": "La scheda Sicurezza riunisce i controlli di protezione in due colonne: ProxMenux Monitor (autenticazione, SSL/HTTPS, token API, Secure Gateway) e Proxmox VE (firewall, Fail2Ban, audit Lynis). Include la procedura guidata di Secure Gateway, l’audit Lynis e l’installazione e la configurazione delle regole di Fail2Ban."
},
"header": {
"title": "Dashboard: scheda di sicurezza",
"description": "I controlli di sicurezza sono divisi in due blocchi: la configurazione di Monitor (autenticazione, SSL, token, Secure Gateway) e quella dell’host Proxmox monitorato (firewall, Fail2Ban, Lynis).",
"section": "ProxMenux Monitor · Dashboard"
},
"intro": {
"title": "Due ambiti, una scheda",
"body": "La scheda Sicurezza ha due sezioni: <strong>ProxMenux Monitor</strong> (impostazioni della dashboard) e <strong>Proxmox VE</strong> (impostazioni dell’host). Le schede Fail2Ban e Lynis propongono l’installazione se gli strumenti mancano e mostrano i relativi controlli dopo l’installazione."
},
"monitor": {
"heading": "ProxMenux Monitor",
"intro": "Quattro schede consentono di gestire l’accesso alla dashboard e l’autenticazione."
},
"auth": {
"heading": "Autenticazione",
"imageAlt": "Scheda di autenticazione con stato Attivata, pulsanti Esci e Cambia password, informazioni sull’autenticazione a due fattori e pulsanti per attivarla o disattivare l’autenticazione",
"imageCaption": "Scheda con autenticazione attiva: indicatore di stato, Cambia password, Attiva 2FA e l’azione distruttiva Disattiva autenticazione.",
"intro": "La scheda gestisce l’accesso alla dashboard. Il primo avvio, i criteri per le password, la configurazione TOTP e il recupero dopo la perdita dell’autenticatore sono descritti in <link>Accesso e autenticazione</link>. Qui puoi gestire queste impostazioni nell’uso quotidiano:",
"items": [
"<strong>Stato autenticazione</strong> — indicatore <em>Attivata</em> / <em>Disattivata</em> / <em>Rifiutata</em>.",
"<strong>Cambia password</strong> — password attuale + nuova password + conferma.",
"<strong>Attiva / Disattiva autenticazione a due fattori</strong> — apre la configurazione con codice QR all’attivazione e richiede la password attuale alla disattivazione.",
"<strong>Disattiva autenticazione</strong> — azione distruttiva che alla visita successiva ripropone la finestra iniziale <em>Proteggere la dashboard?</em>."
]
},
"ssl": {
"heading": "SSL/HTTPS",
"imageAlt": "Scheda SSL/HTTPS con stato HTTP senza SSL, certificato Proxmox rilevato con soggetto, emittente e scadenza, pulsante Usa certificato Proxmox e opzione Usa certificato personalizzato",
"imageCaption": "Scheda SSL/HTTPS con HTTPS disattivato. Monitor rileva il certificato installato sull’host Proxmox e permette di usarlo con un clic. Se hai altri file, puoi scegliere <em>Usa certificato personalizzato</em>.",
"intro": "Rende disponibile la dashboard via HTTPS senza proxy inverso. La scheda rileva il certificato usato da Proxmox in <code>/etc/pve/local/</code> e mostra soggetto, emittente e scadenza per verificarlo prima dell’attivazione. HTTPS può essere attivato in due modi:",
"items": [
"<strong>Usa certificato Proxmox</strong> — Monitor riutilizza il certificato dell’host con un clic. Adatto se PVE e la dashboard usano già lo stesso nome DNS.",
"<strong>Usa certificato personalizzato</strong> — incolla i percorsi assoluti del certificato <code>.pem</code> e della chiave privata <code>.key</code>. Vengono convalidati prima del riavvio del servizio. Se il caricamento fallisce, la dashboard torna automaticamente a HTTP e resta accessibile."
],
"enabledAlt": "Scheda SSL/HTTPS con HTTPS attivato, certificato attivo con i percorsi di pve-ssl.pem e pve-ssl.key e pulsante Disattiva HTTPS",
"enabledCaption": "HTTPS attivo — la scheda mostra il certificato in uso, i percorsi dei file e l’azione <em>Disattiva HTTPS</em>, che ripristina HTTP sulla stessa porta.",
"acmeTitle": "ACME / Let's Encrypt tramite Proxmox",
"acmeBody": "Se Let’s Encrypt è già configurato sul nodo Proxmox in <em>Datacenter → Certificati → ACME</em>, la dashboard riutilizza il certificato presentato ai browser quando scegli <em>Usa certificato Proxmox</em>. Non serve configurare ACME separatamente per Monitor.",
"walkthroughLink": "Consulta <link>HTTPS per ProxMenux Monitor</link> per la procedura di rilevamento del certificato ACME, i dati scritti su disco e l’uso di una coppia <code>.pem</code> / <code>.key</code> personalizzata."
},
"apiTokens": {
"heading": "Token di accesso API",
"emptyAlt": "Scheda dei token di accesso API vuota, con informazioni sui token e pulsante Genera nuovo token API",
"emptyCaption": "Scheda dei token dopo una nuova installazione. Il riquadro <em>Informazioni sui token API</em> riepiloga durata, utilizzo e inserimento nelle intestazioni <code>Authorization: Bearer</code>.",
"intro": "Token validi un anno per integrazioni automatiche: widget Homepage, sensori REST Home Assistant, raccolta dati Grafana, flussi n8n e script personalizzati. La scheda presenta tre stati: vuota → modulo → token generato.",
"generateBody": "<strong>Genera un token.</strong> Fai clic su <em>Genera nuovo token API</em>. Inserisci un <em>nome del token</em> descrittivo per riconoscerlo nell’elenco e la <em>password</em> come conferma aggiuntiva. Se la 2FA è attiva, serve anche il codice TOTP attuale.",
"generateAlt": "Modulo di generazione del token API con campi Nome del token e Password e pulsanti Genera token e Annulla",
"generateCaption": "Modulo Genera token API: inserisci un nome e conferma con la password e, se la 2FA è attiva, il codice TOTP.",
"saveBody": "<strong>Salva subito il token.</strong> Il valore completo appare <strong>una sola volta</strong> dopo la creazione. La scheda lo segnala con un avviso arancione e un pulsante di copia. Non potrai recuperarlo in seguito: l’elenco dei token attivi mostrerà solo il prefisso.",
"generatedAlt": "Token API generato con valore mascherato, pulsante di copia, istruzioni per l’intestazione Authorization: Bearer ed elenco dei token attivi con prefisso",
"generatedCaption": "Token generato: il valore appare una sola volta con pulsante di copia e frammento esatto <code>Authorization: Bearer</code>. Sotto, l’elenco dei token attivi mostra nome, prefisso e data di creazione per revocarli singolarmente.",
"outro": "Ogni token attivo ha un pulsante <em>Revoca</em>. La revoca lo invalida subito e interrompe le integrazioni che lo usano. Trovi esempi per Homepage, Home Assistant, n8n e Prometheus in <link>Integrazioni</link>."
},
"gateway": {
"heading": "Secure Gateway",
"cardAlt": "Scheda Secure Gateway prima del primo deployment, con il pulsante Distribuisci Secure Gateway",
"cardCaption": "Scheda Secure Gateway in una nuova installazione: un pulsante avvia la procedura guidata.",
"intro": "Accedi alla dashboard, all’interfaccia web Proxmox e alle macchine guest dalla rete <a>Tailscale</a>, senza esporre porte a Internet. Monitor distribuisce sull’host un container LXC Alpine con <code>tailscaled</code> come router di sottorete. Dopo l’approvazione nella console Tailscale, i dispositivi remoti possono raggiungere l’IP LAN dell’host ovunque si trovino.",
"wizardTitle": "Procedura guidata",
"wizardIntro": "Prima di fare clic su <em>Deploy Secure Gateway</em>, genera una chiave di autenticazione nella console Tailscale. La procedura la richiederà al passaggio 2.",
"step0Title": "0. Generare la chiave di autenticazione Tailscale",
"step0Body": "Accedi a <a>login.tailscale.com/admin/settings/keys</a> e fai clic su <em>Generate auth key…</em>. Scegli una chiave <em>preautenticata</em> per evitare l’accesso interattivo a Tailscale dal gateway. Copia il valore: viene mostrato una sola volta.",
"step0Alt": "Pagina Settings → Keys della console Tailscale, con il pulsante Generate auth key evidenziato",
"step0Caption": "Console di amministrazione di Tailscale — <em>Impostazioni → Chiavi → Generare chiave auth...</em>. Utilizzare un account Tailscale gratuito se non ne hai ancora uno (link all'interno della procedura guidata).",
"step1Title": "1. Apri la procedura guidata",
"step1Body": "Torna alla scheda Sicurezza e fai clic su <em>Deploy Secure Gateway</em>. Il primo passaggio presenta funzioni e requisiti.",
"step1Alt": "Introduzione della procedura Secure Gateway: accesso VPN senza inoltro di porte e con crittografia end-to-end",
"step1Caption": "Passo 1 — panoramica di ciò che fornisce Secure Gateway e un promemoria che avrete bisogno di un account Tailscale gratuito.",
"step2Title": "2. Autenticazione Tailscale",
"step2Body": "Incolla la chiave di autenticazione del passaggio 0 e scegli un nome host. Il gateway apparirà con questo nome nella console Tailscale, in genere <code>proxmox-gateway</code> o il nome del nodo.",
"step2Alt": "Passaggio della procedura Secure Gateway con campi per la chiave di autenticazione Tailscale e il nome host del dispositivo e link per generare la chiave",
"step2Caption": "Passaggio 2: incolla la chiave preautenticata e scegli il nome host. Se hai saltato il passaggio 0, il link sotto il campo apre la relativa pagina Tailscale.",
"step3Title": "3. Ambito di accesso",
"step3Intro": "Scegli le risorse raggiungibili dalla tua rete Tailscale tramite il gateway:",
"step3Items": [
"<strong>Proxmox Only</strong> — solo l'interfaccia utente Proxmox e il monitor. Superficie di attacco più piccola.",
"<strong>Intera rete locale</strong> — tutta la sottorete LAN, rilevata automaticamente dall’interfaccia principale dell’host. Permette di raggiungere NAS, stampanti, VM e qualsiasi altro dispositivo LAN.",
"<strong>Sottoreti personalizzate</strong> — indica i CIDR desiderati. Per configurazioni con più VLAN in cui vuoi rendere accessibili solo alcuni segmenti."
],
"step3Alt": "Passaggio Ambito di accesso della procedura Secure Gateway con le opzioni Solo Proxmox, Intera rete locale e Sottoreti personalizzate",
"step3Caption": "Passaggio 3: scegli l’ambito di accesso. <em>Intera rete locale</em> inserisce automaticamente la sottorete LAN rilevata.",
"step4Title": "4. Opzioni avanzate (opzionale)",
"step4Intro": "Due opzioni, entrambe <strong>disattivate per impostazione predefinita</strong>:",
"step4Items": [
"<strong>Exit Node</strong> — dopo l’attivazione e la selezione su un dispositivo remoto, tutto il suo traffico Internet esce dalla WAN dell’host Proxmox. Utile in viaggio per usare la connessione di casa dal telefono.",
"<strong>Accetta route</strong> — permette al gateway di raggiungere le reti annunciate da <em>altri</em> router di sottorete Tailscale, per configurazioni con più sedi."
],
"step4Alt": "Passaggio Opzioni avanzate di Secure Gateway con le caselle Exit Node e Accept Routes",
"step4Caption": "Passaggio 4: Exit Node e Accept Routes. Lascia entrambe disattivate se vuoi solo accedere alla dashboard dal telefono o dal portatile.",
"step5Title": "5. Verifica e distribuisci",
"step5Body": "Riepilogo finale prima del deployment. La procedura ricorda il passaggio manuale ancora necessario nella console Tailscale: <strong>approvare la route di sottorete</strong>.",
"step5Alt": "Passaggio Verifica e distribuisci di Secure Gateway con riepilogo di nome host, modalità di accesso, reti, Exit Node e Accept Routes e pulsante Distribuisci gateway",
"step5Caption": "Passo 5 — rivedere la configurazione e distribuire. L'avviso blu in fondo segnala l'approvazione del percorso in sospeso.",
"approvalTitle": "Un ultimo passo manuale in Tailscale admin",
"approvalBody": "Dopo il deployment, apri <a>login.tailscale.com/admin/machines</a> e approva la route di sottorete annunciata dal gateway. Fino ad allora, i dispositivi remoti della rete Tailscale non potranno raggiungere gli IP LAN tramite il gateway. Tailscale segnala le route in attesa con un avviso giallo nella riga del dispositivo: fai clic su <em>Edit route settings</em> e seleziona la route."
},
"pve": {
"heading": "Proxmox VE",
"intro": "Le protezioni dell’host: firewall, prevenzione delle intrusioni e audit di sicurezza. Le schede Fail2Ban e Lynis propongono l’installazione se mancano, poi mostrano i controlli di gestione."
},
"firewall": {
"heading": "Proxmox Firewall",
"imageAlt": "Scheda firewall Proxmox con stato di cluster e host, regole di accesso rapido per Monitor e interfaccia web Proxmox, contatori, elenco delle regole e pulsante Aggiungi regola",
"imageCaption": "Scheda firewall Proxmox: interruttori per cluster e host, porte comuni in <em>Regole di accesso rapido</em>, contatori in <em>Riepilogo regole</em> ed elenco completo con <em>+ Aggiungi regola</em>.",
"intro": "La scheda gestisce la configurazione del firewall Proxmox VE. Il backend classico usa <code>iptables</code>, quello alternativo usa <code>nftables</code>. Non gestisce regole arbitrarie create fuori da Proxmox. Tre sezioni:",
"items": [
"<strong>Firewall del cluster + firewall dell’host</strong> — interruttori globali. Il firewall del cluster deve essere attivo affinché le regole dell’host abbiano effetto. La scheda indica questa dipendenza accanto all’impostazione.",
"<strong>Regole di accesso rapido</strong> — righe predefinite per <code>8008/TCP</code> (Monitor) e <code>8006/TCP</code> (interfaccia web Proxmox), con stato consentito, bloccato o non protetto. L’interfaccia Proxmox è consentita tramite una macro firewall <em>integrata</em> che non può essere eliminata per errore.",
"<strong>Riepilogo regole</strong> — contatori delle regole totali, accept, drop/reject e delle porte distinte protette. I valori provengono da <code>/etc/pve/firewall/cluster.fw</code> e <code>/etc/pve/nodes/&lt;node&gt;/host.fw</code>.",
"<strong>Regole firewall</strong> — elenco con azione, protocollo, porta, origine e livello. <em>+ Aggiungi regola</em> apre l’editor nella scheda; il cestino elimina la regola. Le modifiche vengono salvate nei file Proxmox e compaiono anche nella sua interfaccia (Datacenter / Node → Firewall)."
]
},
"fail2ban": {
"heading": "Fail2Ban",
"subHeading": "(in base allo stato)",
"whatIs": "<strong>Che cos’è.</strong> Fail2Ban è un servizio open source che rileva nei registri i tentativi di accesso falliti ripetuti e blocca l’IP nel firewall. Protegge SSH e i moduli web dagli attacchi continui di forza bruta. ProxMenux configura tre jail: SSH, accesso web Proxmox (porta 8006) e accesso ProxMenux Monitor (porta 8008).",
"notBundled": "Fail2Ban <strong>non è incluso</strong>. La scheda ne rileva la presenza e si adatta: se manca, propone l’installazione con un clic. Una volta installato, mostra lo stato dei jail e gli IP bloccati e permette di regolare il numero di tentativi e la durata del blocco per ciascun jail.",
"notInstalledAlt": "Scheda Fail2Ban non installato con descrizione della protezione per SSH, interfaccia web Proxmox e Monitor tramite nftables e pulsante Installa e configura Fail2Ban",
"notInstalledCaption": "Scheda Fail2Ban prima dell'installazione — la scatola blu prevede ciò che l'installazione configura.",
"clickBody": "Fai clic su <em>Installa e configura Fail2Ban</em> per aprire una finestra di conferma con tutte le modifiche che lo script apporterà all’host:",
"confirmAlt": "Conferma Fail2Ban con modalità SSH aggressiva, protezione Proxmox sulla porta 8006 e Monitor sulla porta 8008, rilevamento nftables, impostazioni dei registri journald e protezione SSH MaxAuthTries",
"confirmCaption": "Conferma di installazione: elenco dei jail, livello di registrazione journald adattato per leggere gli eventi SSH e ulteriore protezione SSH (<code>MaxAuthTries=3</code>).",
"confirmIntro": "Dopo la conferma, un pannello mostra il registro di installazione in tempo reale: apt, configurazione dei jail e test. Usa lo stesso meccanismo dell’installer CLI ProxMenux.",
"progressAlt": "Pannello con registro di installazione Fail2Ban: pacchetto, journald MaxLevelStore per l’autenticazione, jail, rilevamento nftables, protezione MaxAuthTries, test di comunicazione fail2ban-client e messaggio finale",
"progressCaption": "Installazione in corso: il pannello registra ogni passaggio. Il messaggio Connection closed in fondo indica la fine della trasmissione.",
"afterInstall": "Dopo l’installazione, la scheda mostra lo stato in tempo reale: jail configurati, IP bloccati e blocchi recenti. Le schede separano <em>Jail e IP bloccati</em> da <em>Attività recente</em>, le ultime N voci del registro Fail2Ban.",
"activeAlt": "Scheda Fail2Ban attiva con tre jail (proxmenux, proxmox, sshd), conteggi di IP bloccati, blocchi totali e tentativi falliti e righe con tentativi, durata del blocco, intervallo e ingranaggio",
"activeCaption": "Fail2Ban attivo: i tre jail predefiniti (<code>proxmenux</code>, <code>proxmox</code>, <code>sshd</code>) con impostazioni per tentativi, durata del blocco e intervallo di rilevamento.",
"tuneBody": "<strong>Regola il jail.</strong> Fai clic sull’ingranaggio per modificare <em>Max Retries</em>, <em>Ban Time</em> e <em>Find Time</em>, l’intervallo mobile in cui si contano i tentativi. Un blocco permanente dura fino alla rimozione manuale. Il modulo spiega i valori comuni.",
"configAlt": "Modulo del jail sshd con Max Retries, Ban Time in secondi, opzione Permanent Ban, Find Time, suggerimenti sui valori comuni e pulsante Salva configurazione",
"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."
},
"lynis": {
"heading": "Audit di sicurezza Lynis",
"subHeading": "(in base allo stato)",
"whatIs": "<strong>Che cos’è.</strong> Lynis è uno strumento open source di audit della sicurezza che esegue circa 280 test sull’host: permessi, protezione del kernel, SSH, vulnerabilità dei pacchetti, criteri crittografici, attività pianificate, identificazione dei servizi e altro. Produce un indice di sicurezza da 0 a 100, avvisi e suggerimenti. È un riferimento comune per valutare i server Debian.",
"whyUseful": "<strong>Perché è utile.</strong> Valutare la sicurezza leggendo ogni file di configurazione è difficile. Lynis rileva problemi spesso trascurati: protezioni del kernel mancanti, cifrari SSH deboli, registri non persistenti o <code>NOPASSWD</code> in sudoers per gli account predefiniti. Ripetere l’analisi dopo le modifiche ProxMenux permette di confrontare il miglioramento tramite un punteggio.",
"notInstalledAlt": "Scheda Lynis non installato con pulsante Installa Lynis e funzioni: indice di sicurezza, rilevamento delle vulnerabilità, conformità e codice GitHub",
"notInstalledCaption": "carta Lynis prima dell'installazione — la scatola blu riassume ciò che lo strumento fa.",
"notBundled": "Anche Lynis <strong>non è incluso</strong>. ProxMenux lo installa direttamente dal codice ufficiale GitHub anziché dal pacchetto Debian.",
"confirmAlt": "Finestra di conferma Lynis con le funzioni: indice di sicurezza, rilevamento delle vulnerabilità, analisi della configurazione, verifica di conformità e codice dal repository ufficiale GitHub",
"confirmCaption": "Conferma dell’installazione che indica esplicitamente l’origine GitHub.",
"progressAlt": "Pannello di installazione Lynis in tempo reale, con installazione della versione più recente, conferma della versione 3.1.6 e messaggio finale",
"progressCaption": "Installazione in corso: il pannello mostra il registro in tempo reale, come per Fail2Ban.",
"afterInstall": "Dopo l’installazione, la scheda mostra la versione e una cronologia degli audit vuota. Fai clic su <em>Esegui audit di sicurezza</em> per avviare la prima analisi.",
"installedAlt": "Scheda Lynis dopo l’installazione con versione 3.1.6, data dell’ultima analisi, indice di sicurezza 0, avvisi 0, suggerimenti 0, rapporto vuoto e pulsante Esegui audit di sicurezza",
"installedCaption": "Lynis è installato, senza audit ancora eseguiti. Gli indicatori mostrano inizialmente zero.",
"runningAlt": "Scheda Lynis durante l’audit con messaggio di analisi in corso, durata stimata di 2–5 minuti e pulsante Audit in corso disabilitato",
"runningCaption": "Audit in corso: il pulsante mostra un indicatore di caricamento e la scheda avvisa che l’analisi può richiedere da 2 a 5 minuti.",
"finishedBody": "Al termine, la scheda mostra i risultati: indice di sicurezza, avvisi, suggerimenti ed elenco dei <em>Rapporti di audit</em> con le analisi precedenti.",
"resultsAlt": "Scheda Lynis con indice 71, dettaglio Lynis 66 e PVE 71, 3 avvisi, 40 suggerimenti, punteggio adattato a Proxmox di 71 su 100 nella fascia Buono, rapporti con download PDF e pulsante Esegui audit di sicurezza",
"resultsCaption": "Risultati di esempio: indice di sicurezza <strong>71/100 (Buono)</strong>. La scheda mostra il punteggio originale Lynis (66) e quello adattato a Proxmox (71). L’adattamento dipende dal punteggio originale e dalla quota dei rilievi considerati normali su Proxmox VE; non aggiunge 11 punti fissi.",
"scoreTitle": "Punteggio originale Lynis e punteggio adattato a Proxmox",
"scoreIntro": "Le regole Lynis sono pensate per sistemi Debian generici. Proxmox se ne discosta in alcuni casi per motivi validi, come servizi del cluster eseguiti come root o impostazioni specifiche di <code>journald</code>. La scheda mostra entrambi i punteggi per:",
"scoreItems": [
"Seguire il <em>punteggio originale Lynis</em> come farebbe un revisore esterno.",
"Seguire il punteggio <em>adattato a Proxmox</em>, un riferimento più appropriato per confrontare i nodi dello stesso cluster."
],
"reportBody": "<strong>Rapporto completo.</strong> Il pulsante <em>PDF</em> di ogni audit scarica un rapporto di più pagine: sintesi, informazioni di sistema, stato della sicurezza, avvisi spiegati, suggerimenti ordinati per impatto e inventario dei pacchetti. Puoi allegarlo a una revisione della sicurezza.",
"reportAlt": "Prima pagina di esempio del PDF Lynis con sintesi, indice 71 su 100, conteggi di avvisi e suggerimenti, nome host, kernel, versione Lynis, data e panoramica della sicurezza",
"reportCaption": "Prima pagina del rapporto: sintesi, informazioni di sistema e stato della sicurezza. Seguono avvisi dettagliati, suggerimenti e pacchetti installati. È allegato un <a>PDF di esempio</a> come riferimento.",
"runPeriodically": "Eseguire l'audit periodicamente (dopo i principali aggiornamenti di Proxmox, dopo aver applicato tweaks post-install, prima di aprire un percorso di accesso remoto) e mantenere i rapporti — la tendenza conta più di qualsiasi singolo numero.",
"outro": "La guida a <em>installazione, configurazione e disinstallazione</em> e l’analisi di un rapporto di esempio sono in <link>ProxMenux → Sicurezza → Lynis</link>."
},
"dataCollected": {
"heading": "Come vengono raccolti i dati",
"headerCard": "Scheda",
"headerEndpoint": "Endpoint",
"headerSource": "Fonte",
"rows": [
{
"card": "Autenticazione, 2FA, cambio password",
"endpoint": "/api/auth/*",
"source": "Configurazione locale di autenticazione in ~/.config/proxmenux-monitor/auth.json; JWT emessi da Monitor."
},
{
"card": "SSL/HTTPS",
"endpoint": "/api/auth/ssl/*",
"source": "<code>openssl x509</code> su <code>/etc/pve/local/pve-ssl.pem</code> + <code>/etc/proxmenux/ssl_config.json</code>."
},
{
"card": "Elencare, generare e revocare token API",
"endpoint": "/api/auth/api-tokens",
"source": "I dati dei token restano sul sistema locale; nulla lascia l’host."
},
{
"card": "Gateway sicuro (deploy + stato)",
"endpoint": "/api/oci/*",
"source": "Crea un container LXC Alpine con <code>tailscaled</code> tramite <code>pct create</code> / <code>pct exec</code>."
},
{
"card": "Stato e regole Firewall",
"endpoint": "/api/security/firewall/*",
"source": "<code>pve-firewall</code> + <code>/etc/pve/firewall/&lt;cluster|host&gt;.fw</code>."
},
{
"card": "Fail2Ban (solo quando installato)",
"endpoint": "/api/security/fail2ban/*",
"source": "<code>fail2ban-client status</code>, <code>/var/log/fail2ban.log</code>, <code>/etc/fail2ban/jail.local</code>."
},
{
"card": "Lynis audit (solo quando installato)",
"endpoint": "/api/security/lynis/*",
"source": "Esegue <code>lynis audit system</code> in background e analizza il rapporto in <code>/var/log/lynis-report.dat</code>."
}
]
},
"whereNext": {
"heading": "Per approfondire",
"items": [
{
"label": "Accesso e autenticazione",
"href": "/docs/monitor/access-auth",
"tail": " — configurazione iniziale completa, scelta dell’app 2FA, recupero dopo la perdita dell’autenticatore ed esempi di proxy inverso."
},
{
"label": "Integrazioni",
"href": "/docs/monitor/integrations",
"tail": " — esempi di token API con Homepage, Home Assistant, Prometheus e n8n e configurazione completa di Secure Gateway."
},
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tailRich": " — tutti gli endpoint <code>/api/auth</code>, <code>/api/security</code> e <code>/api/oci</code> con metodo, corpo della richiesta ed esempi curl."
},
{
"label": "ProxMenux → Sicurezza → Fail2Ban",
"href": "/docs/security/fail2ban",
"tail": " — guida all’installazione, jail configurati e installazione manuale."
},
{
"label": "ProxMenux → Sicurezza → Lynis",
"href": "/docs/security/lynis",
"tail": " — rapporto di esempio, interpretazione del punteggio e quando ripetere l’audit."
}
]
}
}
@@ -0,0 +1,367 @@
{
"meta": {
"title": "ProxMenux Monitor — Dashboard: scheda Impostazioni | Documentazione ProxMenux",
"description": "La scheda Impostazioni gestisce lingua, ordine di navigazione, preferenze della dashboard, soglie ed esclusioni dal monitoraggio, notifiche, IA e inventario delle ottimizzazioni dopo l’installazione."
},
"header": {
"title": "Dashboard: scheda Impostazioni",
"description": "Lingua di Monitor, ordine di navigazione, preferenze della dashboard, esclusioni dal monitoraggio, notifiche, configurazione IA e inventario attuale delle ottimizzazioni ProxMenux.",
"section": "ProxMenux Monitor · Dashboard"
},
"intro": {
"title": "Dove viene salvata ogni impostazione",
"body": "Impostazioni riunisce presentazione della dashboard, monitoraggio Health Monitor, invio degli avvisi e modifiche già applicate da ProxMenux all’host. Le schede rimandano alla propria documentazione dettagliata; qui trovi il punto di accesso."
},
"interfaceLanguage": {
"heading": "Lingua di interfaccia",
"intro": "Scegli la lingua dell’<strong>interfaccia web di Monitor</strong>. Cambia subito, senza riavviare il servizio né modificare la lingua dei menu di terminale ProxMenux.",
"items": [
"ProxMenux Monitor offre attualmente inglese, tedesco, spagnolo, francese, italiano, portoghese, slovacco e svedese.",
"Alla prima visita usa la lingua del browser, se supportata; altrimenti l’inglese.",
"La scelta aggiorna la lingua della pagina e la sincronizza con le altre schede dello stesso profilo del browser.",
"Se manca una traduzione, solo quel testo appare in inglese anziché come chiave o segnaposto non valido."
],
"scopeTitle": "Preferenza locale del browser",
"scopeBody": "La scelta è salvata in <code>localStorage</code> sotto <code>proxmenux-ui-language</code>. Vale per questo profilo del browser e dispositivo, non per l’intero nodo. Ogni amministratore può scegliere la propria lingua."
},
"navigationOrder": {
"heading": "Ordine di navigazione",
"intro": "Riordina le sette voci principali: <strong>Panoramica, App, VM e LXC, Nodo, Backup, Terminale e Amministrazione</strong>. Premi <strong>Modifica</strong>, trascina le righe e salva.",
"items": [
"Con il mouse il trascinamento inizia alla pressione. Su schermi touch serve una pressione di 250 ms per distinguerlo dallo scorrimento.",
"I gruppi <strong>Nodo</strong> e <strong>Amministrazione</strong> si spostano interi; le pagine interne mantengono l’ordine stabilito.",
"Il menu mobile segue lo stesso ordine salvato.",
"<strong>Ripristina predefiniti</strong> reimposta l’ordine in modifica. Salva per applicare il cambiamento.",
"Le nuove schede principali delle versioni future vengono aggiunte alla fine dell’ordine personalizzato, conservando la tua disposizione."
],
"landingTitle": "La prima voce diventa la scheda iniziale",
"landingBody": "Monitor apre la prima voce salvata. Con <strong>Nodo</strong> apre Archiviazione; con <strong>Amministrazione</strong>, Registri di sistema. L’ordine è salvato nel browser sotto <code>proxmenux-nav-order</code>, quindi ogni dispositivo può avere la propria disposizione."
},
"networkUnits": {
"heading": "Unità rete",
"imageAlt": "Scheda Unità di rete con il selettore di visualizzazione su Byte",
"imageCaption": "Scegli tra bit al secondo e byte al secondo per ogni velocità di rete visualizzata nel cruscotto.",
"body": "Mostra la velocità in <strong>bit al secondo</strong> (Mbps/Gbps) o <strong>byte al secondo</strong> (MB/s/GB/s). I bit sono predefiniti, come nelle specifiche di schede e provider; i trasferimenti di file usano spesso byte. Grafici, etichette e suggerimenti cambiano subito senza ricaricare."
},
"health": {
"heading": "Monitoraggio integrità",
"intro": "La scheda imposta la <strong>durata del silenziamento</strong>: quanto attendere prima di segnalare nuovamente un avviso ignorato. Ogni categoria — CPU, memoria, storage, dischi, rete, VM, servizi PVE, registri, aggiornamenti e sicurezza — ha il proprio menu:",
"items": [
"<strong>24 h</strong> — default per la maggior parte delle categorie transitorie.",
"<strong>72 h</strong> — per silenziare questi eventi per qualche giorno.",
"<strong>168 h</strong> (1 settimana) e <strong>720 h</strong> (1 mese) — controlli periodici.",
"<strong>8760 h</strong> (1 anno) — silenziamento per un lungo periodo.",
"<strong>-1</strong> — silenzio permanente fino a quando non si riattiva manualmente.",
"<strong>Ore personalizzate</strong> — un numero intero per un valore intermedio."
],
"imageAlt": "Impostazioni, scheda Health Monitor con durata per categoria e silenziamenti attivi",
"imageCaption": "I menu definiscono la durata dei silenziamenti futuri. La sezione inferiore mostra gli avvisi silenziati e permette di riattivarli.",
"editTitle": "Modalità di modifica",
"editBody": "La scheda è inizialmente in sola lettura. <strong>Modifica</strong> in alto a destra attiva menu e pulsanti di riattivazione. <strong>Salva</strong> applica insieme durate e riattivazioni in attesa; <strong>Annulla</strong> le scarta. Salva è attivo solo se ci sono modifiche.",
"activeTitle": "Silenziamenti attivi",
"activeIntro": "Sotto le durate, <strong>Silenziamenti attivi</strong> elenca gli avvisi silenziati temporaneamente —24 h, 7 giorni o altro periodo— e quelli <em>permanenti</em>. Ogni riga mostra:",
"activeItems": [
"Un badge colorato: <strong>Permanente</strong> in ambra oppure un conto alla rovescia, come <strong>24 h rimanenti</strong> / <strong>7 giorni rimanenti</strong>, in blu.",
"L’identificatore dell’avviso in forma leggibile (ad es. <code>pve_storage_full_PBS-Cloud</code> → <em>Storage PVE pieno: PBS-Cloud</em>).",
"Categoria, gravità e data e ora in cui l’avviso è stato ignorato.",
"Un pulsante <strong>Riattiva</strong> in modifica prepara la rimozione del silenziamento al salvataggio."
],
"activeReenableTitle": "Come riattivare un avviso",
"activeReenableBody": "<strong>Riattiva</strong> in modifica colora la riga di verde e barra l’identificatore, senza applicare ancora il cambio. Premi di nuovo per <strong>Annullare</strong>. <strong>Salva</strong> invia in parallelo <code>POST /api/health/un-acknowledge</code> per ogni riattivazione e rimuove le righe. Se il problema persiste e la categoria consente nuovi avvisi, torna tra gli attivi al prossimo controllo.",
"activePermanentNote": "I silenziamenti permanenti —con <em>Permanente</em> o durata predefinita <code>-1</code>— <strong>si annullano solo qui</strong>. La finestra generale non offre quel pulsante; questa sezione riunisce elenco e riattivazione.",
"activeAutoRefreshTitle": "Aggiornamento automatico",
"activeAutoRefreshBody": "L’elenco si aggiorna ignorando o riattivando un avviso in Health Monitor, tornando alla scheda e quando cambia la visibilità. Non serve ricaricare.",
"calloutTitle": "Dettagli nella pagina Health Monitor",
"calloutBody": "Escalation, risoluzione automatica quando scompare un dispositivo e differenza tra ignorare e risolvere sono descritte in <link>Health Monitor → Ignorare avvisi e durata del silenziamento</link>. Questa scheda offre menu e silenziamenti attivi."
},
"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.",
"whatForTitle": "A cosa serve",
"whatForIntro": "I valori predefiniti sono un punto di partenza, ma ogni ambiente ha condizioni proprie:",
"whatForItems": [
"Un homelab con un solo SSD può avvisare prima, per esempio al 75/90%, per lasciare spazio agli snapshot.",
"Le soglie di memoria devono riflettere misurazioni e carico dell’host. La ridondanza Ceph non giustifica da sola avvisi meno severi; l’uso elevato di ARC ZFS non equivale a memoria di lavoro non recuperabile.",
"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.",
"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",
"headerRange": "Intervallo",
"headerMeaning": "Significato",
"colourRows": [
{
"colour": "Verde",
"range": "valore < Avviso",
"meaning": "Intervallo normale. Nessun avviso viene generato."
},
{
"colour": "Ambra",
"range": "Avviso ≤ valore < Critico",
"meaning": "Stato di avviso. Health Monitor genera un evento WARNING; le notifiche rispettano filtri e orari silenziosi."
},
{
"colour": "Rosso",
"range": "Valore ≥ Critico",
"meaning": "Stato critico. Health Monitor genera un evento CRITICAL che ignora gli orari silenziosi. Le impostazioni di categoria ed evento del canale restano valide; la consegna dipende anche dalla sua disponibilità."
}
],
"sectionsTitle": "Sezioni e valori predefiniti consigliati",
"sectionsIntro": "Sono i valori iniziali ProxMenux fino a modifica. Le sezioni seguono <em>carico di calcolo</em>, <em>temperatura</em> e <em>capacità di archiviazione</em>, dal carico attuale allo spazio occupato.",
"headerSection": "Sezione",
"headerWarning": "Avviso",
"headerCritical": "Critico",
"headerGates": "Controllo interessato",
"thresholdRows": [
{
"section": "Utilizzo CPU",
"warning": "85 %",
"critical": "95 %",
"gates": "Avviso di carico prolungato quando la CPU media supera la soglia nel periodo di controllo."
},
{
"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."
},
{
"section": "Swap (solo soglia critica)",
"warning": "—",
"critical": "80 %",
"gates": "Il CRITICAL di swap richiede oltre l’80% di swap e meno del 15% di RAM disponibile su più misurazioni. Lo swap occupato da solo non attiva la regola."
},
{
"section": "Temperatura CPU",
"warning": "80 °C",
"critical": "90 °C",
"gates": "Temperatura del package CPU o dei core da <code>lm-sensors</code>."
},
{
"section": "Temperatura del disco — HDD",
"warning": "60 °C",
"critical": "65 °C",
"gates": "Temperatura HDD. Valori iniziali: avviso a 60 °C, critico a 65 °C. Sono valori di monitoraggio, non un limite universale del produttore; consulta le specifiche del modello."
},
{
"section": "Temperatura del disco — SSD",
"warning": "70 °C",
"critical": "75 °C",
"gates": "SSD SATA da 2,5 pollici o M.2. Questa classe usa 70/75 °C come valori iniziali; i limiti reali dipendono dal modello."
},
{
"section": "Temperatura del disco — NVMe",
"warning": "80 °C",
"critical": "85 °C",
"gates": "Temperatura NVMe. Questa classe usa 80/85 °C come valori iniziali. La temperatura di limitazione del controller dipende dal modello e non è sempre 85 °C."
},
{
"section": "Temperatura del disco — SAS",
"warning": "55 °C",
"critical": "65 °C",
"gates": "Temperatura SAS. Questa classe usa avviso a 55 °C e critico a 65 °C. Sono <em>valori di monitoraggio</em>, non prova di un guasto di raffreddamento a 55 °C né un limite universale."
},
{
"section": "Spazio su disco — host",
"warning": "85 %",
"critical": "95 %",
"gates": "Capacità di <code>/</code> e di ogni punto di montaggio dell’host (<code>/var/lib/vz</code>, <code>/mnt/*</code>…)."
},
{
"section": "Spazio disco — LXC rootfs",
"warning": "85 %",
"critical": "95 %",
"gates": "Disco root di ciascun container, valutato rispetto alla dimensione rootfs indicata da PVE."
},
{
"section": "Punti di montaggio LXC",
"warning": "85 %",
"critical": "95 %",
"gates": "Capacità dei montaggi nei CT attivi: mp0, mp1, NFS e bind mount. Esclude rootfs."
},
{
"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."
},
{
"section": "Pool ZFS",
"warning": "85 %",
"critical": "95 %",
"gates": "Pool ZFS dell’host, indipendentemente dalla registrazione in PVE."
}
],
"defaultsTitle": "Valori predefiniti, modifiche e ripristino",
"defaultsBody": "Ogni sezione parte dai valori predefiniti; salvi solo le modifiche desiderate. La scheda mostra il valore <em>effettivo</em>: la modifica o il valore iniziale. <strong>Ripristina</strong> elimina tutte le modifiche di tutte le sezioni.",
"validationTitle": "Validazione",
"validationBody": "Il salvataggio verifica gli intervalli ammessi e rifiuta Critico sotto Avviso. L’interfaccia mostra gli errori e il server valida nuovamente le richieste API prima di salvare."
},
"lxcDetection": {
"heading": "Rilevamento aggiornamenti LXC",
"imageAlt": "Scheda di rilevamento aggiornamenti LXC con interruttore per cercare pacchetti in attesa nei container Debian, Ubuntu e Alpine attivi",
"imageCaption": "Interruttore dell’analisi periodica con <code>apt list --upgradable</code> / <code>apk list -u</code> nei CT attivi. È acceso per impostazione predefinita. L’opzione in Notifiche → Servizi appare mentre il rilevamento è attivo.",
"intro": "L’interruttore tra Soglie e Notifiche controlla l’analisi LXC. Attivo, interroga i gestori di pacchetti dei CT in esecuzione; Hardware mostra i risultati e alimenta <code>lxc_updates_available</code>. Disattivo, ferma le chiamate <code>pct exec</code> e rimuove le voci LXC da <code>managed_installs.json</code>; <code>/api/managed-installs</code> smette di riportare lo stato senza attendere 24 ore.",
"whatRunsTitle": "Cosa esegue l’analisi",
"whatRunsIntro": "Per ogni CT in stato <code>running</code> con un gestore di pacchetti supportato:",
"whatRunsItems": [
"<strong>Aggiornamento dei metadati.</strong> Se la cache apt/apk supera <strong>24 ore</strong>, tenta <code>apt-get update -qq</code> su Debian/Ubuntu o <code>apk update</code> su Alpine con limite di 60 s. Se fallisce, l’elenco usa la cache disponibile e può essere obsoleto.",
"<strong>Elenco.</strong> Esegue <code>apt list --upgradable</code> / <code>apk list -u</code> ed estrae numero di pacchetti e alcuni nomi.",
"<strong>Evitare duplicati per CT.</strong> Un’impronta di totale, aggiornamenti di sicurezza e nomi ordinati evita avvisi quotidiani identici. Un cambiamento significativo genera un nuovo avviso."
],
"selfUpdateTitle": "I CT aggiornati fuori apt possono indicare 0",
"selfUpdateBody": "Il rilevamento copre solo il gestore di pacchetti del CT. Software aggiornato fuori apt, come un’attività <code>plexupdate</code> configurata o immagini ottenute con <code>docker pull</code>, non rientra nel conteggio. Zero aggiornamenti apt non prova che tutte le app siano aggiornate. I pacchetti del sistema base restano rilevati.",
"refreshTitle": "Perché aggiornare i metadati dopo 24 ore",
"refreshBody": "Un CT attivo da tempo può avere metadati apt vecchi se nessuno esegue <code>apt update</code>. <code>apt list --upgradable</code> può quindi perdere nuovi aggiornamenti. ProxMenux tenta il rinnovo dopo 24 ore e lo salta se la cache è più recente.",
"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."
},
"storageExclusions": {
"heading": "Esclusioni storage remoto",
"imageAlt": "Scheda esclusioni degli storage remoti PBS-Cloud, PBS e PBS2 con controlli Stato e Avvisi per riga",
"imageCaption": "Controlli <em>Stato</em> e <em>Avvisi</em> per storage. Con entrambi spenti, lo storage non contribuisce a Health Monitor e non invia notifiche. Resta visibile in Archiviazione, indicato come escluso.",
"intro": "Puoi escludere gli storage gestiti da Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / ecc.) con due controlli indipendenti:",
"items": [
"<strong>Stato</strong> — disattivando questo controllo, lo storage non contribuisce più alla categoria Archiviazione di Health Monitor. Utile per volumi di archivio solitamente offline o destinazioni di backup remote accese solo secondo un programma.",
"<strong>Avvisi</strong> — disattivandolo, gli avvisi di questo storage non passano più ai canali configurati, anche con i controlli di stato attivi. Utile per vedere lo stato nel pannello senza ricevere notifiche."
],
"outro": "Gli storage esclusi restano nella <link>scheda Archiviazione</link> con il badge viola <em>escluso</em>, mantenendo visibile l’inventario. Lo stato è salvato nella tabella SQLite <code>excluded_storages</code>."
},
"interfaceExclusions": {
"heading": "Esclusioni interfacce rete",
"imageAlt": "Scheda esclusioni delle interfacce vmbr0, vmbr1, vmbr2, bond0 ed eno1 con controlli Stato e Avvisi per interfaccia",
"imageCaption": "Come per gli storage, ogni interfaccia offre <em>Stato</em> e <em>Avvisi</em>. Ogni riga mostra nome, tipo (bridge / bond / fisica), IP e velocità del collegamento.",
"intro": "Lo stesso principio vale per le interfacce: escludere ciascuna dai controlli di stato, dalle notifiche o da entrambi. Esempi comuni:",
"items": [
"Un bridge di riserva disattivato intenzionalmente.",
"Una scheda di rete rimossa fisicamente ma ancora presente in <code>/etc/network/interfaces</code>.",
"Una sottointerfaccia VLAN usata solo durante la manutenzione.",
"Un bridge di gestione con cambi ripetuti e noti dello stato del collegamento durante la manutenzione."
],
"outro": "Lo stato è salvato nella tabella SQLite <code>excluded_interfaces</code>. Il badge viola <em>esclusa</em> nella <link>scheda Rete</link> mantiene visibili le interfacce escluse."
},
"notifications": {
"heading": "Notifiche e IA",
"body1": "Qui si attivano le notifiche di ProxMenux Monitor e la riformulazione con IA. <em>Attiva notifiche</em> avvia l’invio in background, registra una destinazione webhook Proxmox VE per riceverne gli eventi e apre i canali: Telegram, Discord, email, Gotify e altri. La riformulazione con IA è in una sezione avanzata espandibile dello stesso pannello.",
"body2": "Le opzioni sono spiegate in pagine dedicate: canali, controlli per evento, messaggi formattati, nome visualizzato, invio con deduplicazione, attesa, raggruppamento e ore silenziose, webhook PVE, provider IA e modalità delle istruzioni:",
"items": [
"<notifLink>Notifiche</notifLink>: configurazione dei canali (Telegram, Discord, Gotify, email e password per app Gmail / Microsoft, ntfy, Slack, Teams e webhook generico), categorie di eventi, messaggi formattati, nome visualizzato, invio, webhook PVE, cronologia e API.",
"<aiLink>Assistente IA</aiLink>: provider (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), modelli, istruzioni predefinite o personalizzate, lingua di uscita, dettaglio per canale e suggerimenti IA."
]
},
"optimizations": {
"heading": "Ottimizzazioni ProxMenux",
"intro": "Inventario delle ottimizzazioni successive all’installazione registrate da ProxMenux sull’host. Le opzioni di <autoLink>Post-installazione automatica</autoLink> e <customLink>Post-installazione personalizzabile</customLink> registrano l’applicazione in <code>/usr/local/share/proxmenux/installed_tools.json</code>. Monitor legge questo registro. Una voce non verifica di nuovo che tutte le impostazioni siano rimaste invariate.",
"imageAlt": "Scheda ottimizzazioni ProxMenux con 14 voci: punto colorato, nome e versione. Include APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged con Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal e VFIO IOMMU Passthrough.",
"imageCaption": "Ogni ottimizzazione mostra nome, versione e punto colorato. In alto a destra compare il contatore arancione <em>14 attive</em>. Gli strumenti con sorgente disponibile sono apribili.",
"dotsTitle": "Cosa significano i puntini",
"dotsItems": [
"<green/> <strong>Punto verde</strong>: ottimizzazione registrata senza indicazione Legacy né aggiornamento disponibile. Apri la riga se il sorgente è disponibile.",
"<amber/> <strong>Punto ambra e badge <em>legacy</em></strong>: ottimizzazione registrata il cui script è stato rinominato o sostituito. Il sorgente conservato si apre in modalità Legacy con dettagli ambra. Non verifica nuovamente la configurazione attuale dell’host."
],
"clickTitle": "Aprire il codice sorgente",
"clickBody": "Un clic mostra la funzione bash associata e il nome dello script (<code>auto_post_install.sh</code> o <code>customizable_post_install.sh</code>). Gli strumenti attuali usano file dell’host; quelli precedenti possono usare sorgente conservato. Evidenziazione della sintassi e Copia aiutano l’esame. Non è una copia garantita del codice eseguito all’installazione.",
"detailAlt": "Finestra del sorgente APT IPv4 Force con la funzione bash force_apt_ipv4 da customizable_post_install.sh versione 1.0. Il codice evidenziato configura /etc/apt/apt.conf.d/99-force-ipv4 con Acquire ForceIPv4 true, registra lo strumento e mostra un messaggio tradotto di configurazione APT IPv4 completata.",
"detailCaption": "Codice di <em>APT IPv4 Force</em>: funzione <code>force_apt_ipv4()</code> di <code>customizable_post_install.sh v1.0</code>, con evidenziazione della sintassi e copia con un clic.",
"whyTitle": "Perché questo è importante",
"whyBody": "ProxMenux può modificare parametri del kernel, repository, rete, rotazione dei log e passthrough GPU. Consulta le ottimizzazioni registrate prima di modifiche manuali, specie se un altro amministratore ha preparato l’host. La scheda mostra registro e sorgente disponibile; non controlla ogni impostazione attuale né conserva una cronologia esatta delle esecuzioni.",
"updatesTitle": "Banner degli aggiornamenti disponibili",
"updatesBody": "Se la versione su disco di un’ottimizzazione supera quella registrata sull’host, appare un banner con il numero e <strong>Applica</strong>. <strong>Applica</strong> apre il selettore, come <em>Applica aggiornamenti disponibili</em> nel menu post-installazione. Scegli cosa aggiornare: ProxMenux esegue di nuovo le funzioni e aggiorna il registro. Quando tutto è aggiornato, il banner scompare.",
"updatesAlt": "Scheda ottimizzazioni ProxMenux con banner degli aggiornamenti disponibili, numero in attesa e pulsante Applica per selezionarli",
"updatesCaption": "Il banner appare se almeno un’ottimizzazione ha una versione più recente su disco. Vedi <link>Applica aggiornamenti disponibili</link> per la procedura e l’equivalente Path-A nel menu della shell.",
"revertTitle": "Annullare un’ottimizzazione",
"revertBody": "Per annullare un’ottimizzazione, usa l’opzione corrispondente in <link>Disinstalla ottimizzazioni</link> dal menu ProxMenux Scripts. La disinstallazione rimuove la voce da <code>installed_tools.json</code> e la scheda non la mostra al prossimo aggiornamento."
},
"dataCollected": {
"heading": "Come vengono raccolti i dati",
"headerCard": "Scheda",
"headerEndpoint": "Endpoint",
"headerSource": "Fonte",
"rows": [
{
"card": "Lingua di interfaccia",
"endpoint": "localStorage",
"source": "Preferenza del browser <code>proxmenux-ui-language</code>; senza una scelta salvata, usa inizialmente la lingua del browser."
},
{
"card": "Ordine di navigazione",
"endpoint": "localStorage",
"source": "Preferenza del browser <code>proxmenux-nav-order</code>; determina anche la scheda iniziale."
},
{
"card": "Unità rete",
"endpoint": "/api/settings",
"source": "Salvato nella tabella SQLite delle impostazioni del pannello."
},
{
"card": "Durate di Health Monitor",
"endpoint": "/api/health/settings",
"source": "Durata del silenziamento per categoria nel database di Health Monitor."
},
{
"card": "Esclusioni di storage/interfaccia",
"endpoint": "/api/storage/exclusions, /api/network/exclusions",
"source": "Tabelle SQLite <code>excluded_storages</code> e <code>excluded_interfaces</code>."
},
{
"card": "Pannello Notifiche e IA",
"endpoint": "/api/notifications/*",
"source": "Vedi <notifLink>Notifiche</notifLink> e <aiLink>Assistente IA</aiLink>."
},
{
"card": "Elenco ottimizzazioni ProxMenux",
"endpoint": "/api/proxmenux/installed-tools",
"source": "Legge <code>/usr/local/share/proxmenux/installed_tools.json</code>, scritto dalle chiamate a <code>register_tool</code> negli script post-installazione."
},
{
"card": "Finestra del codice di ottimizzazione",
"endpoint": "/api/proxmenux/tool-source",
"source": "Estrae la funzione bash associata da <code>auto_post_install.sh</code> o <code>customizable_post_install.sh</code> sull’host; gli strumenti precedenti possono usare codice conservato."
}
]
},
"whereNext": {
"heading": "Come proseguire",
"items": [
{
"label": "Scheda Apps",
"href": "/docs/monitor/dashboard/apps",
"tail": " — il pannello di avvio la cui posizione si modifica con l’ordine di navigazione."
},
{
"label": "Notifiche",
"href": "/docs/monitor/notifications",
"tail": " — canali, controlli per evento, impostazioni specifiche per canale, cronologia e invio di prova."
},
{
"label": "Assistente IA",
"href": "/docs/monitor/ai-assistant",
"tail": " — provider, modelli, modalità delle istruzioni, lingue e dettaglio per canale."
},
{
"label": "Health Monitor → Silenziare gli avvisi e durata del silenziamento",
"href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration",
"tail": " — come funzionano i menu di durata per categoria."
},
{
"label": "ProxMenux Scripts → Post-installazione automatica",
"href": "/docs/post-install/automated",
"tailRich": " e <customLink>Post-installazione personalizzabile</customLink>: gli script che registrano le ottimizzazioni nell’elenco precedente."
},
{
"label": "Disinstalla ottimizzazioni",
"href": "/docs/post-install/uninstall",
"tail": " — come annullare un’ottimizzazione elencata sopra."
},
{
"label": "Indice Dashboard",
"href": "/docs/monitor/dashboard",
"tail": " — torna alla panoramica delle schede."
}
]
}
}
@@ -0,0 +1,268 @@
{
"meta": {
"title": "ProxMenux Monitor — Dashboard: scheda Archiviazione | Documentazione ProxMenux",
"description": "La scheda Archiviazione riunisce quattro viste: storage Proxmox con stato, pool ZFS, dischi interni con SMART e unità USB esterne. Il dettaglio di ogni disco mostra attributi SMART, usura, durata e storico permanente delle osservazioni."
},
"header": {
"title": "Dashboard: scheda Archiviazione",
"description": "Tutto lo storage dell’host in una schermata: NFS / CIFS / LVM / ZFS / dir Proxmox, stato dei pool ZFS, dischi interni SATA/NVMe con SMART e unità USB esterne. Fai clic su un disco per vedere attributi SMART e storico delle osservazioni.",
"section": "ProxMenux Monitor · Dashboard"
},
"intro": {
"title": "Supportato da tre fonti",
"body": "Gli storage Proxmox provengono da <code>pvesm status</code>, ZFS da <code>zpool status</code>, i dischi da <code>lsblk</code> + <code>smartctl</code> e i campi NVMe da <code>nvme</code>. La scheda si aggiorna circa ogni 60 secondi; aprire il dettaglio richiede una lettura SMART."
},
"thresholds": {
"title": "Colori e soglie di stato applicate qui",
"intro": "Health Monitor classifica lo stato come <green/> <strong>verde</strong> sotto Avviso, <amber/> <strong>ambra</strong> tra Avviso e Critico e <red/> <strong>rosso</strong> da Critico in poi. Seguono i valori predefiniti. Le barre della dashboard possono usare altri limiti visivi descritti sotto.",
"items": [
"<strong>Capacità</strong> (dischi host, storage PVE, pool ZFS, montaggi LXC) — avviso 85%, critico 95%.",
"<strong>Temperatura del disco</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (avvertimento / critico)."
],
"outro": "Ogni valore è configurabile per host. <link>Impostazioni → Soglie di Health Monitor</link> riporta i valori di riferimento e spiega come modificarli."
},
"topRow": {
"heading": "Riga superiore: riepilogo dello storage",
"intro": "All’apertura, quattro schede riepilogano capacità totale, uso locale, uso remoto e inventario dei dischi fisici. Offrono risposte rapide; le schede sottostanti contengono i dettagli.",
"imageAlt": "Scheda Archiviazione con quattro schede: capacità totale, uso locale, uso remoto e dischi fisici",
"imageCaption": "Riga superiore: capacità totale e numero di dischi, byte usati localmente e da remoto e dischi fisici per tipo con riepilogo dello stato.",
"headerCard": "Scheda",
"headerWhat": "Cosa mostra",
"totalLabel": "Capacità totale",
"totalWhat": "Capacità grezza totale di tutti i dischi fisici. Il piè di pagina indica quanti dischi sono stati rilevati.",
"localLabel": "Uso locale",
"localWhat": "Byte usati sullo storage locale: LVM / LVM-thin / ZFS / dir sui dischi dell’host. Il valore principale mostra i byte usati e il piè di pagina <em>X.XX % di Y TB</em> indica anche la percentuale di occupazione.",
"remoteLabel": "Uso remoto",
"remoteWhat": "Stesso formato dell’uso locale per storage remoti NFS / CIFS / PBS / Ceph / iSCSI. Sono conteggiati separatamente perché i guasti locali e remoti hanno effetti diversi e queste risorse si dimensionano e monitorano diversamente.",
"disksLabel": "Dischi fisici",
"disksIntro": "Due linee di ripartizione per l'inventario:",
"disksItems": [
"<strong>Per tipo</strong> — numero di NVMe in viola, SSD e HDD in blu. Compaiono i tipi rilevati; un host con soli NVMe mostra solo quel conteggio.",
"<strong>Per stato</strong> — numero di dischi <em>normali</em> in verde, con <em>avviso</em> in giallo e <em>critici</em> in rosso. Senza problemi compare solo «X normali»; gli altri stati appaiono in presenza di problemi."
]
},
"pveStorage": {
"heading": "Scheda di stoccaggio Proxmox",
"intro": "Una riga per storage di <code>/etc/pve/storage.cfg</code> con tipo (<code>nfs</code> / <code>cifs</code> / <code>zfspool</code> / <code>lvm</code> / <code>lvmthin</code> / <code>dir</code> / <code>pbs</code>), nome, stato attivo/errore/non monitorato, percentuale d’uso e barra colorata:",
"items": [
"<strong>Fino al 75%</strong> — barra e valore blu.",
"<strong>Oltre il 75% fino al 90%</strong> — barra e valore gialli. Questi limiti visivi sono distinti dalle soglie di Health Monitor.",
"<strong>> 90%</strong> — barra e valore rossi. Questo limite visivo è distinto dall’escalation di Health Monitor.",
"<strong>Errore</strong> — bordo rosso della riga se lo storage è configurato ma non raggiungibile, per esempio server NFS fermo o credenziali CIFS scadute.",
"<strong>Escluso</strong> — bordo viola ed etichetta «non monitorato». Storage esclusi dall’utente, come volumi di archivio mantenuti scollegati."
],
"calloutTitle": "Escludere uno storage dal monitoraggio",
"calloutBody": "Il menu di ogni storage permette di marcarlo come <em>escluso dal monitoraggio</em>. L’impostazione è salvata in <code>excluded_storages</code> e rispettata da dashboard e Health Monitor: nessuna notifica né effetto sullo stato generale."
},
"zfs": {
"heading": "Scheda Pool ZFS",
"intro": "Compare solo se ZFS è installato e c’è almeno un pool. Ogni riga mostra un pool con stato, dimensione, spazio allocato e libero e icona di stato:",
"items": [
"<strong>ONLINE</strong> — verde. Tutto sano.",
"<strong>DEGRADED</strong> — giallo. Il pool fornisce dati, ma almeno un dispositivo non è disponibile; occorre gestirne la sostituzione.",
"<strong>FAULTED</strong> / <strong>UNAVAIL</strong> / <strong>SUSPENDED</strong> — rosso. Il pool non fornisce dati e richiede intervento immediato."
],
"outro": "Lo stato ZFS e SMART di ogni disco contribuisce alla categoria <em>Dischi e I/O</em> di <link>Health Monitor</link>."
},
"physical": {
"heading": "Dischi fisici e stato SMART",
"intro": "Disco interno (SATA / NVMe). Ogni riga condensa i campi più utili a colpo d'occhio:",
"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>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.",
"<strong>Stato SMART</strong> — superato / fallito / sconosciuto.",
"<strong>Etichetta delle osservazioni</strong> — se lo storico permanente <code>disk_observations</code> contiene voci per il disco, un’etichetta blu ne indica il numero, come <em>3 obs.</em>. Fai clic sul disco per esaminarle.",
"<strong>Etichetta di stato</strong> — Regolare / Avviso / Critico, secondo SMART e le osservazioni recenti."
],
"clickHint": "Un clic sull’intera riga apre il dettaglio del disco descritto sotto.",
"warningTitle": "Attenzione ai dischi con etichetta System",
"warningBody": "I dischi con etichetta arancione <strong>System</strong> ospitano il sistema attivo. L’etichetta aiuta a identificarli; <link>ProxMenux → Gestione dischi → Formatta / Cancella</link> rifiuta le azioni distruttive su di essi. Per riutilizzare il disco di avvio, usa un ambiente di ripristino esterno al Proxmox in esecuzione."
},
"external": {
"heading": "Storage esterno (USB)",
"body": "Le unità USB hanno una scheda dedicata, visibile quando almeno una è presente. Mostra gli stessi campi dei dischi interni e l’etichetta arancione <strong>USB</strong>. Poiché spesso si collegano solo per backup o trasferimenti occasionali, le osservazioni sono conservate, ma gli errori I/O di un’unità USB scollegata non vengono escalati."
},
"drillIn": {
"heading": "Finestra di dettaglio del disco",
"intro": "Un clic sul disco apre quattro schede: <strong>Panoramica</strong> · <strong>SMART</strong> · <strong>Cronologia</strong> · <strong>Pianificazione</strong>. L’intestazione mostra percorso, modello, capacità e, se applicabile, l’etichetta arancione <em>System</em>.",
"overviewTitle": "Scheda 1 — Panoramica",
"overviewImageAlt": "Dettaglio del disco, scheda Panoramica con stato, indicatore circolare di usura e durata e attributi SMART principali",
"overviewImageCaption": "Panoramica: identificazione, stato, vita residua con usura attuale e dati scritti e attributi SMART principali.",
"overviewIntro": "Scheda iniziale per consultare lo stato del disco senza eseguire test. Tre sezioni:",
"overviewItems": [
"<strong>Identificazione</strong> — modello, numero di serie, capacità e stato Regolare / Avviso / Critico.",
"<strong>Usura e durata</strong> — anello della vita residua (97%, 50%, …) con attributo sorgente (<em>Media Wearout Indicator</em>, <em>Percentage Used</em>, …), barra della percentuale consumata, previsione <em>Vita stimata</em> in anni e dati totali scritti. NVMe mostra anche <em>Available Spare</em>.",
"<strong>Attributi SMART</strong>: i valori principali sono mostrati su due colonne: temperatura, ore di accensione con una durata leggibile come <em>3 anni e 116 giorni</em>, velocità di rotazione oppure <em>SSD</em>, cicli di accensione, stato SMART, settori riallocati, settori in attesa ed errori CRC. La tabella completa degli attributi si trova nella scheda SMART."
],
"smartTitle": "Scheda 2 — SMART",
"smartImageAlt": "Dettaglio del disco, scheda SMART con test breve ed esteso, ultimo risultato e tabella completa degli attributi",
"smartImageCaption": "Scheda SMART: avvia test brevi o estesi, consulta l’ultimo risultato e tutti gli attributi e apri il rapporto completo per stamparlo o salvarlo in PDF.",
"smartIntro": "Azioni disponibili in tre sezioni:",
"smartItems": [
"<strong>Esegui test SMART</strong> — due pulsanti. <em>Test breve (~2 min)</em> attende il risultato e lo mostra nella finestra. <em>Test esteso (background)</em> può durare ore sui dischi grandi, continua sul server e notifica al termine.",
"<strong>Ultimo test</strong> — tipo, stato (<em>superato</em> / <em>fallito</em>) e data e ora dell’ultima esecuzione.",
"<strong>Attributi SMART</strong> — tabella completa con ID, nome, valore, valore peggiore e stato regolare, avviso o critico. SATA/SAS mostra l’elenco numerato. NVMe usa <code>nvme smart-log</code>: temperatura, riserva disponibile, percentuale usata, unità lette/scritte, letture/scritture host, tempo di occupazione del controller, cicli di accensione, arresti non sicuri, errori del supporto, voci del registro errori e tempo con temperatura composita in avviso/critico."
],
"pdfTitle": "Visualizza il rapporto SMART completo (PDF)",
"pdfIntro": "In fondo a SMART, <strong>Visualizza rapporto SMART completo</strong> apre un rapporto stampabile. Usa la finestra di stampa del browser per salvarlo in PDF, archiviarlo o condividerlo con il supporto per un RMA.",
"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:",
"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.",
"<strong>Usura e durata SSD</strong> (solo SSD/NVMe) — vita residua, attributo sorgente, usura attuale, dati scritti e ore di accensione.",
"<strong>Attributi SMART completi</strong> — ID, nome, valore, valore peggiore, soglia, valore grezzo e stato di ogni attributo. I principali — Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, … — hanno una breve spiegazione sotto la riga.",
"<strong>Ultimo autotest e cronologia completa</strong> — ultimo test con tipo, risultato, messaggio finale e ore di accensione al momento, più tabella numerata di tutti i test conservati.",
"<strong>Raccomandazioni</strong> — azioni secondo il risultato. Per dischi regolari: <em>disco sano / test periodici / strategia di backup</em>. Se gli attributi superano i limiti, compaiono indicazioni per la sostituzione."
],
"pdfOutro": "Il browser crea il rapporto stampabile; Stampa e Salva come PDF aprono entrambi la finestra di stampa. Scegli un nome come <code>SMART-&lt;short-id&gt;.pdf</code>. Conserva copie datate per confrontare i cambiamenti o condividerle con il supporto.",
"historyTitle": "Scheda 3 — Cronologia",
"historyImageAlt": "Dettaglio del disco, scheda Cronologia con test SMART precedenti e azioni di download ed eliminazione",
"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>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",
"scheduleImageAlt": "Dettaglio del disco, scheda Pianificazione con interruttore per test SMART automatici, elenco dei piani e pulsante Aggiungi pianificazione",
"scheduleImageCaption": "Pianificazione: scegli tipo, frequenza e conservazione; Monitor configura <code>cron</code> per eseguire i test automaticamente.",
"scheduleIntro": "Test SMART automatici tramite cron, senza terminale. Tre aree:",
"scheduleItems": [
"<strong>Test SMART automatici</strong> — interruttore generale di tutti i piani del disco. Permette di sospenderli durante la manutenzione senza cancellarne la configurazione.",
"<strong>Piani configurati</strong> — una riga per piano con tipo (<em>breve</em> / <em>lungo</em>), espressione cron leggibile (<em>«Il giorno 1 del mese alle 03:00»</em>, <em>«Ogni domenica alle 02:00»</em>), dischi inclusi e conservazione.",
"<strong>Aggiungi / Modifica pianificazione</strong> — tipo (<em>breve ~2 min</em> / <em>lungo 1–4 h</em>), frequenza (<em>giornaliera / settimanale / mensile</em>), giorno del mese o settimana, ora e risultati conservati (<em>ultimi 5 / 10 / 20</em>)."
],
"scheduleOutro": "Il piano crea una voce cron sull’host che richiama Monitor. I risultati vanno nello storico SMART della scheda 3 e la conservazione elimina automaticamente i più vecchi al termine di un nuovo test.",
"tempTitle": "Finestra dello storico della temperatura",
"tempIntro": "Monitor raccoglie periodicamente le letture dei dischi con sensore di temperatura e le salva in uno storico locale. Il valore attuale appare in Panoramica; un clic apre lo storico della temperatura.",
"tempImageAlt": "Storico della temperatura con percorso e modello, intervalli di 1 ora, 24 ore, 7 o 30 giorni, indicatori Attuale/Minimo/Media/Massimo e grafico a linee colorato secondo le soglie del tipo di disco",
"tempImageCaption": "Il dettaglio della temperatura si apre da Panoramica se il sensore restituisce un valore diverso da zero. Il grafico usa le soglie HDD / SSD / NVMe / SAS.",
"tempShowsTitle": "Contenuto della finestra",
"tempShowsItems": [
"<strong>Selettore dell’intervallo</strong>: <em>1 ora</em>, <em>24 ore</em> predefinite, <em>7 giorni</em> o <em>30 giorni</em>. Ogni richiesta adatta la risoluzione per mantenere il grafico leggibile.",
"<strong>Quattro indicatori</strong>: <em>Attuale</em>, <em>Minimo</em>, <em>Media</em> e <em>Massimo</em> nell’intervallo. <em>Attuale</em> usa le soglie dello storage e delle notifiche per distinguere temperatura normale, elevata o molto alta.",
"<strong>Grafico a linee</strong> della temperatura nel tempo, con linea e area colorate secondo il tipo di disco:"
],
"tempDiskTypes": [
"HDD — soglie tipicamente più fresche.",
"SSD — soglie moderate.",
"NVMe — soglie più elevate (NVMe funziona più caldo per design).",
"SAS — avviso a 55 °C e critico a 65 °C, con soglia di avviso diversa da HDD."
],
"tempConfigurable": "I quattro tipi si configurano in <em>Impostazioni → Soglie di Health Monitor</em>.",
"tempWhyTitle": "Perché lo storico è utile",
"tempWhyItems": [
"<strong>Rilevare tendenze.</strong> Una lettura isolata non rivela che un disco si scalda da settimane, per esempio per ventilazione difettosa, polvere o calore vicino. Le viste di 7 e 30 giorni mostrano l’evoluzione.",
"<strong>Correlare i picchi.</strong> Se un backup o una ricostruzione ha superato brevemente la soglia, le viste di 1 e 24 ore mostrano se il picco è isolato o ricorrente.",
"<strong>Regolare le soglie.</strong> Prima di modificarle in <em>Impostazioni → Soglie di Health Monitor</em>, consulta il grafico di 30 giorni per conoscere l’intervallo operativo reale del disco."
],
"obsTitle": "Storico delle osservazioni nelle schede",
"obsIntro": "I guasti possono svilupparsi gradualmente. Un disco può indicare SMART <strong>PASSED</strong> e registrare errori di lettura in dmesg, perdere collegamenti SATA o mostrare settori in attesa intermittenti. ProxMenux conserva questi <em>segnali</em> e li mostra nella finestra accanto allo stato SMART attuale.",
"obsImageAlt": "Panoramica di un disco con SMART superato e zero settori riallocati/in attesa ed errori CRC, ma un’osservazione di errore I/O con messaggio originale del kernel, spiegazione ATA, prima e ultima data e conteggio",
"obsImageCaption": "Un disco che <strong>supera SMART</strong> può avere osservazioni precedenti. La scheda aggiunge lo storico dei segnali allo stato attuale.",
"obsWhatTitle": "Che cos’è un’osservazione",
"obsWhatIntro": "ProxMenux registra come <strong>osservazione</strong> gli eventi disco rilevati nei registri del kernel, dmesg o SMART troppo specifici per una notifica singola. Ogni riga mostra:",
"obsWhatItems": [
"<strong>Tipo</strong> — errore I/O, SMART, filesystem, pool ZFS o connessione.",
"<strong>Messaggio originale del kernel</strong> da dmesg, da copiare in un motore di ricerca o richiesta di supporto.",
"<strong>Breve spiegazione</strong> dei codici ATA noti: <code>IDNF</code>, indirizzo del settore non trovato, possibile settore o cavo difettoso; <code>UNC</code>, errore di lettura irrecuperabile, settore difettoso; e altri codici standard.",
"<strong>Prima e ultima data</strong> e <strong>numero di occorrenze</strong>, raggruppate per firma dell’errore."
],
"obsWhyTitle": "Perché ProxMenux le registra e mostra",
"obsWhyItems": [
"<strong>I guasti possono evolvere.</strong> Errori del bus ATA, settori UNC o errori del supporto possono apparire prima di SMART <em>FAILED</em>. Il buffer dmesg non li conserva dopo il riavvio; lo storico delle osservazioni sì.",
"<strong>SMART non esclude ogni guasto.</strong> Un disco può avere attributi verdi e presentare problemi. Le osservazioni conservano altri sintomi, come ICRC, IDNF, reset dei collegamenti SATA o riduzioni di velocità.",
"<strong>Distingue il presente dal recente.</strong> Health Monitor risolve automaticamente gli errori transitori che non si ripresentano. Lo storico permette di vedere giorni dopo, per esempio, tre errori I/O di una notte.",
"<strong>Alimenta le notifiche per livelli.</strong> disk_io usa la frequenza delle osservazioni per scegliere silenzio, WARNING o CRITICAL su una finestra mobile di 24 ore introdotta in 1.2.1.2."
],
"obsDedupTitle": "Raggruppamento dei duplicati e nuovi avvisi",
"obsDedupBody1": "Le osservazioni sono raggruppate per <strong>firma</strong>, un’impronta stabile di tipo di errore, dispositivo e campi chiave del messaggio. Le ripetizioni incrementano <code>occurrence_count</code> nella riga esistente. Una <strong>firma diversa</strong> crea un’altra osservazione ed è un nuovo evento per le notifiche.",
"obsDedupBody2": "Per evitare notifiche a cascata, la prima combinazione di disco, firma e gravità avvisa l’operatore. La stessa combinazione attende 24 ore prima di un nuovo avviso, anche se il conteggio aumenta. Il passaggio da WARNING a CRITICAL interrompe l’attesa e segnala il peggioramento.",
"obsDismissTitle": "Storico permanente ed errori attivi",
"obsDismissBody1": "Le osservazioni non possono essere ignorate, nascoste o eliminate. Ogni firma ha una scheda; una ripetizione aumenta il conteggio e aggiorna l’ultima data. Lo storico segue il numero di serie: un altro disco inizia vuoto anche sulla stessa porta e un cambio di nome del kernel conserva lo storico.",
"obsDismissBody2": "Risolvere o ignorare un errore attivo in Health Monitor non modifica le osservazioni. Restano dopo la risoluzione automatica, così un avviso transitorio della settimana scorsa è ancora visibile. Vedi <link>Health Monitor</link> per gestire gli errori attivi."
},
"dataCollected": {
"heading": "Come vengono raccolti i dati",
"headerSection": "Sezione della scheda",
"headerEndpoint": "Endpoint",
"headerSource": "Fonte",
"rows": [
{
"section": "Schede di riepilogo superiori",
"endpoint": "/api/storage/summary",
"source": "Aggregato da <code>lsblk</code>, <code>zpool list</code>, <code>vgs</code> / <code>lvs</code>."
},
{
"section": "Inventario per disco",
"endpoint": "/api/storage",
"source": "<code>lsblk -O</code> + <code>smartctl -i</code> per dispositivo, con cache dell’identità svuotata agli eventi hotplug."
},
{
"section": "Storage Proxmox",
"endpoint": "/api/proxmox-storage",
"source": "<code>pvesh get /nodes/&lt;node&gt;/storage</code> con lo stato attivo/online di ciascuno."
},
{
"section": "Valori SMART attuali",
"endpoint": "/api/storage/smart/<disk>",
"source": "<code>smartctl -A &lt;dev&gt;</code> è una delle interrogazioni disponibili; l’endpoint di dettaglio usa anche il JSON SMART completo e dati specifici NVMe."
},
{
"section": "Cronologia degli autotest SMART",
"endpoint": "/api/storage/smart/<disk>/history",
"source": "Salvato in <code>/usr/local/share/proxmenux/smart/&lt;disk&gt;/</code> come snapshot JSON."
},
{
"section": "Osservazioni permanenti",
"endpoint": "/api/storage/observations",
"source": "Tabella SQLite aggiornata da Health Monitor a ogni ciclo e conservata dopo la risoluzione degli errori attivi."
}
],
"outro": "Verificare la catena di raccolta sull'host:",
"codeComment1": "# Ottieni lo stato attuale da uno script",
"codeComment2": "# Confronta i dati della dashboard con quelli del sistema operativo"
},
"whereNext": {
"heading": "Per approfondire",
"items": [
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tail": " — categoria Dischi e I/O e regole di soppressione."
},
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tail": " — endpoint di storage e SMART."
},
{
"label": "Notifiche",
"href": "/docs/monitor/notifications",
"tailRich": " — azioni successive attivate da <code>disk_io_error</code>, <code>storage_unavailable</code> e <code>smart_test_failed</code>."
},
{
"label": "Indice Dashboard",
"href": "/docs/monitor/dashboard",
"tail": "— le altre schede."
},
{
"label": "ProxMenux → Gestore dischi",
"href": "/docs/disk-manager",
"tail": " — azioni TUI: formattare, cancellare, eseguire test SMART e importare dischi in VM o container."
},
{
"label": "ProxMenux → Stato e test SMART del disco",
"href": "/docs/disk-manager/smart-disk-test",
"tail": " — equivalente CLI: pianificare test SMART, esportare il JSON mostrato e consultare tipi di test e interpretazione dei risultati."
}
]
}
}
@@ -0,0 +1,120 @@
{
"meta": {
"title": "ProxMenux Monitor — Pannello: Log di sistema | Documentazione ProxMenux",
"description": "La scheda System Logs consolida tre sorgenti in una schermata: live journalctl con filtri e download, cronologia delle attività Proxmox (UPID), e registro di notifica — tutti ricercabili, filtrabili per gravità / intervallo di tempo e scaricabili come pacchetti di testo."
},
"header": {
"title": "Pannello: Log di sistema",
"description": "Tre sottoschede in una schermata: journal di sistema (journalctl con filtri), cronologia delle attività Proxmox e registro delle notifiche. Tutte consentono di cercare, filtrare e scaricare i dati come pacchetti di testo.",
"section": "ProxMenux Monitor · Dashboard"
},
"readOnly": {
"title": "sola lettura per design",
"body": "Questa scheda non modifica i file di log. I filtri risiedono nell'URL o nello stato dell'interfaccia; i file da scaricare sono preparati sul server. Il pannello non elimina mai le voci: per la manutenzione usa <code>journalctl --vacuum-time=&lt;N&gt;</code> o <code>logrotate</code> sull'host."
},
"topRow": {
"heading": "Riga superiore: quattro contatori",
"items": [
"<strong>Voci totali</strong> — numero di record nel periodo del filtro attivo.",
"<strong>Errori</strong> — numero di voci con gravità ≤ 3 (<code>err</code> / <code>crit</code> / <code>alert</code> / <code>emerg</code>).",
"<strong>Avvisi</strong> — numero di voci con gravità 4 (<code>warning</code>).",
"<strong>Backup</strong> — numero di voci di attività vzdump / PBS nello stesso periodo."
]
},
"subtabs": {
"heading": "Tre sottoschede",
"logsTitle": "Log",
"logsIntro": "Il journal di sistema, letto sul server con <code>journalctl</code>. Filtri disponibili nella barra degli strumenti:",
"logsFilters": [
"<strong>Gravità</strong> — emerg / alert / crit / err / warning / notice / info / debug, o qualsiasi combinazione.",
"<strong>Time range</strong> — ultima 5 min / 15 min / 1 h / 6 h / 24 h / 7 d / personalizzato.",
"<strong>Ricerca libera</strong> — sottostringa o espressione regolare (<code>journalctl --grep</code>).",
"<strong>Filtro per unità</strong> — limita a una specifica unità systemd (<code>pveproxy.service</code>, <code>nginx.service</code>, …)."
],
"logsRowsAfter": "Ogni riga mostra timestamp, tasso di gravità, unità sorgente e il messaggio. I messaggi lunghi crollano con un \"mostra di più\". L'azione <strong>Download</strong> raggruppa il filtro corrente in un unico file <code>.txt</code> tramite <code>GET /api/logs/download</code> — utile quando si desidera condividere una fetta di giornale con qualcuno.",
"logDetailsModalTitle": "Finestra Dettagli del log",
"logDetailsBody": "Un clic su una riga apre <strong>Dettagli del log</strong> con tutti i campi strutturati acquisiti da journald per quella voce, come eseguendo <code>journalctl --output=verbose</code> sull'host.",
"logDetailsImageAlt": "Finestra Dettagli del log — singola voce del journal con livello, servizio, data e ora, origine, unità systemd, ID del processo, nome host e messaggio completo",
"logDetailsImageCaption": "Dettagli del log — tutti i campi strutturati di questa voce journald, con il messaggio completo non troncato in fondo. Utile per i log di cron e dei servizi quando conta la riga di comando eseguita.",
"fieldsIntro": "Campi indicati:",
"fields": [
"<strong>Level</strong> — distintivo di gravità colorato (INFO / ATTENZIONE / ERROR / CRITICAL).",
"<strong>Service</strong> — nome corto dell'unità / processo che ha emesso l'ingresso.",
"<strong>Timestamp</strong> — data e ora completi della linea di registro.",
"<strong>Source</strong> — origine dell'entrata (giornale, kernel, audit, ...).",
"<strong>Systemd Unit</strong> — l'unità effettiva <code>.service</code> / <code>.timer</code> / <code>.socket</code> se l'ingresso è associato a uno.",
"<strong>Process ID</strong> — PID del processo di emissione.",
"<strong>Hostname</strong> — utile quando le riviste vengono inoltrate attraverso nodi di cluster.",
"<strong>Messaggio</strong> — messaggio completo non troncato in un blocco a spaziatura fissa, pronto da copiare."
],
"maxLevelStoreTitle": "Journald MaxLevelStore",
"maxLevelStoreBody": "Su una nuova installazione Proxmox, journald usa per impostazione predefinita <code>MaxLevelStore=warning</code>, scartando i messaggi info. Monitor lo rileva all'avvio e aggiunge una configurazione complementare (<code>/etc/systemd/journald.conf.d/proxmenux-loglevel.conf</code>) con soglia <code>info</code>, per conservare messaggi informativi e più gravi. Questo non include debug.",
"backupsTitle": "Backup",
"backupsBody": "Cronologia delle attività Proxmox limitata ai backup. Una riga per attività (<code>vzdump</code>, trasferimenti PBS, Garbage Collect, Verify), con stato (OK / WARNINGS / ERROR), guest interessato, storage di origine, durata e UPID. Fai clic su una riga per caricare il log completo tramite <code>GET /api/task-log/&lt;upid&gt;</code>: gli stessi dati esposti da Proxmox in <em>Datacenter → Tasks</em>, limitati ai backup.",
"notificationsTitle": "Notifiche",
"notificationsBody1": "Tutte le notifiche inviate da Monitor: Telegram, Discord, e-mail, Gotify, ntfy, Slack, Teams e webhook. Ogni riga mostra data e ora, canale, tipo di evento, gravità, titolo e corpo generati e, se l'IA è attiva, un comando per confrontare la sua riscrittura con l'originale.",
"notificationsBody2": "Usa questa scheda per verificare che un canale recapiti le notifiche e confrontare la riscrittura AI con il modello di base. I canali si configurano nella pagina dettagliata <link>Notifiche</link>."
},
"dataCollected": {
"heading": "Come vengono raccolti i dati",
"headerSubtab": "Sottoscheda",
"headerEndpoint": "Endpoint",
"headerSource": "Fonte",
"rows": [
{
"subtab": "Registri (filtro in tempo reale)",
"endpoint": "/api/logs",
"source": "<code>journalctl --output json --since &lt;range&gt;</code> con filtri per gravità, unità e ricerca applicati sul server."
},
{
"subtab": "Scarica",
"endpoint": "/api/logs/download",
"source": "La stessa query, restituita come testo semplice per grep / less."
},
{
"subtab": "Backup",
"endpoint": "/api/backups",
"source": "Cronologia delle attività PVE filtrata per <code>vzdump</code>, trasferimenti PBS, Garbage Collect e Verify."
},
{
"subtab": "Dettagli di un'attività di backup",
"endpoint": "/api/task-log/&lt;upid&gt;",
"source": "Log completo dell'attività in testo semplice, letto da <code>/var/log/pve/tasks/&lt;index&gt;/&lt;upid&gt;</code>."
},
{
"subtab": "Cronologia delle notifiche",
"endpoint": "/api/notifications/history",
"source": "Tabella SQLite <code>notification_history</code> alimentata dal ciclo di invio."
}
],
"apiIntro": "Il filtro in tempo reale e i download sono accessibili anche tramite API:",
"codeComment1": "# Errori ed eventi più gravi dell'ultima ora con una parola chiave",
"codeComment2": "# Scarica il journal completo delle ultime 6 ore come testo semplice",
"codeComment3": "# Cerca l'output completo di un'attività specifica tramite UPID"
},
"whereNext": {
"heading": "Dove proseguire",
"items": [
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tail": " — la categoria Log di sistema, che rileva eventi persistenti, picchi e sequenze a cascata."
},
{
"label": "Notifiche",
"href": "/docs/monitor/notifications",
"tail": " — il monitoraggio del journal legge la stessa fonte e trasforma le corrispondenze in notifiche."
},
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tail": " — gli endpoint logs e task-log con i rispettivi parametri di query."
},
{
"label": "Indice del pannello",
"href": "/docs/monitor/dashboard",
"tail": "— le altre schede."
}
]
}
}
@@ -0,0 +1,177 @@
{
"meta": {
"title": "ProxMenux Monitor — Pannello: Panoramica del sistema | Documentazione ProxMenux",
"description": "La scheda iniziale predefinita di ProxMenux Monitor: quattro schede (CPU, memoria, VM e LXC attivi, temperatura) con aggiornamenti in tempo reale e minigrafico di tendenza, grafico storico e riepiloghi di storage e rete con link alle rispettive schede."
},
"header": {
"title": "Pannello: Panoramica del sistema",
"description": "La scheda aperta per impostazione predefinita: quattro schede con metriche in tempo reale in alto, grafico storico al centro e riepiloghi di storage e rete in basso, dalle stesse API delle rispettive schede.",
"section": "ProxMenux Monitor · Dashboard"
},
"readOnly": {
"title": "Un'istantanea di sola lettura",
"body": "Tutti i pannelli di questa scheda sono informativi. Le azioni si trovano nelle schede collegate: Storage per gestire i dischi, VM e LXC per avviare o fermare i guest e Sicurezza per configurare l'autenticazione."
},
"captureAlt": "Scheda Panoramica di sistema — quattro schede metriche (CPU, Memoria, VM attive, Temperatura), grafico metrico nodo e schede di sommario di Storage / Network",
"captureCaption": "Panoramica del sistema, la scheda iniziale predefinita. Le quattro schede si aggiornano in tempo reale, il grafico mostra lo storico e le due schede in basso riepilogano storage e rete.",
"topRow": {
"heading": "Riga superiore: schede con metriche in tempo reale",
"intro": "Quattro schede in una griglia 2×2 su mobile e in una riga su desktop. Ciascuna si aggiorna da <code>/api/system</code> ogni pochi secondi.",
"headerCard": "Scheda",
"headerWhat": "Cosa mostra",
"headerSource": "Fonte",
"rows": [
{
"card": "Utilizzo CPU",
"what": "Percentuale attuale con barra di avanzamento. Si aggiorna ogni ~1 s tramite il campionatore dei parametri vitali.",
"source": "psutil.cpu_percent()"
},
{
"card": "Utilizzo memoria",
"what": "GB usati, percentuale e GB totali. La barra rappresenta la percentuale.",
"source": "psutil.virtual_memory()"
},
{
"card": "VM e LXC attivi",
"what": "Numero di guest in esecuzione, con ripartizione In esecuzione / Arrestati e totali di VM e LXC in fondo.",
"source": "/api/vms (consolidato)"
},
{
"card": "Temperatura",
"what": "Temperatura CPU in °C con stato (bassa / moderata / alta) e minigrafico degli ultimi 5 minuti sullo sfondo. Mostra <em>N/A</em> senza sensore. Un clic apre i dettagli.",
"source": "sensors / coretemp"
}
],
"thresholdsTitle": "Colori e soglie di stato applicate qui",
"thresholdsIntro": "Anelli, barre e minigrafici usano la stessa scala: <green/> <strong>verde</strong> sotto Avviso, <amber/> <strong>ambra</strong> tra Avviso e Critico, <red/> <strong>rosso</strong> da Critico in poi. Valori predefiniti consigliati inclusi in ProxMenux:",
"thresholdsItems": [
"<strong>Utilizzo CPU</strong> — avviso 85 %, critico 95 %.",
"<strong>Memoria</strong> — avviso 85 %, critico 95 %. Anche lo swap attiva Critico al 5 % di utilizzo; un host Proxmox sano dovrebbe usarlo raramente.",
"<strong>Temperatura CPU</strong> — avviso 80 °C, critico 90 °C."
],
"thresholdsOutro": "Ogni valore è configurabile per host. <link>Impostazioni → Soglie del monitor di integrità</link> centralizza le impostazioni e spiega come regolarle.",
"sparklineTitle": "Il minigrafico mostra la tendenza",
"sparklineBody": "La scheda della temperatura traccia gli ultimi 5 minuti sotto il valore, con colori di linea e sfumatura legati alle soglie Avviso/Critico descritte sopra. Permette di vedere subito se la temperatura dell'host sale senza aprire i dettagli."
},
"processes": {
"heading": "Processi con maggiore utilizzo di CPU e memoria",
"intro": "Le schede Utilizzo CPU e Memoria aprono un elenco ordinabile dei 25 processi principali: per utilizzo CPU dalla scheda CPU e per memoria residente dalla scheda Memoria.",
"listTitle": "La finestra di dialogo elenco",
"listItems": [
"<strong>Aggiornamento automatico</strong> — l'elenco si aggiorna ogni 5 secondi finché la finestra è aperta e interrompe le richieste alla chiusura.",
"<strong>Filtro</strong> — la ricerca limita l'elenco per comando, utente o PID.",
"<strong>Barra nella riga</strong> — la colonna della metrica principale disegna una piccola barra scalata al massimo valore nell'elenco filtrato. La graduatoria resta evidente anche se nessun processo si avvicina al 100 %.",
"<strong>Disposizione mobile</strong> — sotto 640 px le colonne PID e Utente si nascondono, così Comando, CPU % e Memoria restano visibili senza scorrimento orizzontale."
],
"captureListAlt": "Finestra dei processi per memoria — tabella ordinata per RSS con PID, utente, comando, CPU % e memoria",
"captureListCaption": "La scheda Memoria apre l'elenco ordinato per RSS (colore indaco). La scheda CPU apre lo stesso elenco ordinato per utilizzo CPU (colore blu).",
"detailTitle": "Dettaglio del processo",
"detailIntro": "Un clic su una riga apre una seconda finestra con i dati in tempo reale del processo, organizzati in quattro sezioni:",
"detailItems": [
"<strong>Panoramica</strong> — stato, processo padre, numero di thread, descrittori di file aperti, utente e gruppo.",
"<strong>Risorse</strong> — CPU %, memoria %, memoria residente (RSS), dimensione virtuale, swap e totali I/O di lettura e scrittura.",
"<strong>Comando</strong> — nome breve, riga di comando completa, percorso dell'eseguibile e directory di lavoro.",
"<strong>Durata</strong> — data e ora di avvio e tempo di esecuzione trascorso."
],
"detailRefresh": "I dettagli si aggiornano ogni 3 secondi. Quando il processo termina, le richieste cessano e appare l'avviso ambra <em>Questo processo è terminato</em>. L'ultimo stato acquisito resta visibile ma attenuato, per vedere cosa accadeva prima della fine.",
"captureDetailAlt": "Dettagli del processo — Panoramica, Risorse, Comando e Durata per un PID",
"captureDetailCaption": "Dettagli di un processo aperti da una riga dell'elenco. Il colore corrisponde alla scheda usata per aprirli: blu per CPU, indaco per Memoria."
},
"middle": {
"heading": "Centro: grafici delle metriche del nodo",
"body1": "Sotto le schede, <code>NodeMetricsCharts</code> mostra grafici storici di CPU, memoria e I/O disco dal database RRD di Proxmox tramite <code>/api/node/metrics</code>. Il selettore offre <em>1 ora / 24 ore / 7 giorni / 30 giorni / 1 anno</em>. La risoluzione diminuisce con periodi più ampi per mantenere fluido il grafico.",
"body2": "Sono gli stessi grafici dell'interfaccia web Proxmox per un nodo, integrati nel tema scuro di Monitor e allineati agli altri pannelli."
},
"bottom": {
"heading": "Riga inferiore: riepiloghi di storage e rete",
"storageTitle": "Scheda Panoramica dello storage",
"storageIntro": "Vista compatta dello stato dello storage dell'host, suddivisa in tre blocchi:",
"storageItems": [
"<strong>Capacità totale del nodo</strong> — somma degli storage VM/LXC e dello storage locale del sistema, con una barra sfumata dello spazio usato e libero.",
"<strong>Capacità totale / Dischi fisici</strong> — capacità grezza e numero dei dischi fisici rilevati.",
"<strong>Storage VM/LXC</strong> — spazio usato, libero e percentuale degli storage dei guest, con un contatore quando sono più di uno.",
"<strong>Storage locale (sistema)</strong> — filesystem root o di sistema montato sull'host, separato dal pool dei guest."
],
"storageDrillIn": "I dettagli sono nella <link>scheda Storage</link>: SMART per disco, pool ZFS, cronologia delle osservazioni e altro.",
"networkTitle": "Scheda panoramica della rete",
"networkBody1": "In alto appare il numero delle interfacce attive, fisiche e bridge insieme. Sotto, due righe di etichette colorate indicano le interfacce <code>up</code>: NIC fisiche in blu, bridge con un colore secondario. Il selettore in alto a destra (1 ora / 24 ore / 7 giorni / 30 giorni / 1 anno) controlla un piccolo grafico del traffico RX / TX.",
"networkBody2": "I dettagli per interfaccia (IP/MAC, grafico RRD, membri del bridge, modalità bond e altro) sono nella <link>scheda Rete</link>."
},
"refresh": {
"heading": "Modello di aggiornamento",
"intro": "Ogni pannello gestisce il proprio stato di caricamento (<code>loadingStates.cpu</code>, <code>loadingStates.storage</code>, …), così una sorgente lenta non blocca le altre. Durante il caricamento mostra un segnaposto pulsante. Gli errori sono gestiti senza interrompere la vista: senza sensore di temperatura mostra <em>N/A</em> invece di un errore.",
"items": [
"<strong>Schede superiori</strong> — aggiornamento ogni ~5 s. CPU e temperatura ricevono anche dati ogni secondo dal campionatore dei parametri vitali.",
"<strong>Grafico delle metriche del nodo</strong> — carica all'apertura e al cambio di periodo o lingua. Se necessario, riprova dopo 60 s.",
"<strong>Scheda Storage</strong> — aggiornamento ogni ~60 s. I dati SMART restano in cache più a lungo; la scheda Storage richiede una nuova lettura quando serve.",
"<strong>Scheda Rete</strong> — riepilogo ogni 59 s e grafico del traffico ogni 60 s nel periodo attivo.",
"<strong>Aggiornamento manuale</strong> — il pulsante Aggiorna nell'intestazione ricarica subito tutti i pannelli."
]
},
"dataCollected": {
"heading": "Come vengono raccolti i dati",
"headerCard": "Scheda",
"headerEndpoint": "Endpoint",
"headerSource": "Fonte",
"rows": [
{
"card": "Indicatore di stato nell'intestazione",
"endpoint": "/api/health",
"source": "Lo stato complessivo prodotto dal monitor di integrità a ogni ciclo e conservato in cache."
},
{
"card": "CPU / RAM / Swap / Tempo di attività",
"endpoint": "/api/system",
"source": "<code>/proc/stat</code>, <code>/proc/meminfo</code>, <code>/proc/uptime</code>, con campionamento CPU su un breve intervallo."
},
{
"card": "Informazioni sull'host (kernel, BIOS, distribuzione)",
"endpoint": "/api/info",
"source": "<code>uname -a</code>, <code>dmidecode</code>, versione PVE. Conservati in cache per processo."
},
{
"card": "Carte di archiviazione / rete / VM",
"endpoint": "/api/storage/summary, /api/network/summary, /api/vms",
"source": "Vedere le schede dedicate per ciascuno. Le schede di intestazione mostrano una vista compattata dagli stessi endpoint."
},
{
"card": "Frequenza di aggiornamento",
"endpoint": "—",
"source": "Dati di sistema ogni 5 s; storage, VM e riepilogo di rete ogni 59 s. Il pulsante Aggiorna nell'intestazione ricarica subito tutti i pannelli."
}
],
"codeComment1": "# Chiamata che alimenta lo indicatore di stato nell'intestazione",
"codeComment2": "# pubblico, senza token",
"codeComment3": "# Istantanea autenticata utilizzata dalle carte"
},
"whereNext": {
"heading": "Dove proseguire",
"items": [
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tail": " — la finestra dell'indicatore di stato nell'intestazione: dieci categorie, avvisi ignorati e soppressione."
},
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tail": " — endpoint system, info e health."
},
{
"label": "Notifiche",
"href": "/docs/monitor/notifications",
"tail": "— come gli stessi stati si trasformano in messaggi Telegram / Discord / Email."
},
{
"label": "Indice del pannello",
"href": "/docs/monitor/dashboard",
"tail": " — le altre schede del pannello a colpo d'occhio."
},
{
"label": "Architettura",
"href": "/docs/monitor/architecture",
"tail": " — i thread in background e le API che alimentano questa vista."
}
]
}
}
@@ -0,0 +1,174 @@
{
"meta": {
"title": "ProxMenux Monitor — Pannello: Terminale | Documentazione ProxMenux",
"description": "Shell dell'host Proxmox nel browser: fino a 4 terminali in griglia, pulsanti tastiera per dispositivi mobili (ESC, TAB, frecce, combinazioni Ctrl), prontuario di comandi integrato con cheat.sh e protezione JWT."
},
"header": {
"title": "Pannello: Terminale",
"description": "Una vera sessione shell sull'host Proxmox dal browser. Fino a quattro terminali contemporaneamente, pulsanti tastiera per dispositivi mobili e prontuario dei comandi integrato, con lo stesso tema del resto del pannello.",
"section": "ProxMenux Monitor · Dashboard"
},
"intro": {
"title": "Un vero PTY nel browser",
"body": "Il terminale crea un PTY sul server tramite <code>flask_terminal_routes</code>, lo collega via WebSocket a <code>xterm.js</code> nel browser e viene eseguito come <code>root</code>, utente dell'unità systemd. Come con <code>ssh root@&lt;host&gt;</code>, puoi usare <code>vim</code>, <code>tmux</code>, strumenti ncurses e le CLI Proxmox (<code>qm</code>, <code>pct</code>, <code>pvesh</code>, <code>pvecm</code>). Ogni PTY esporta <code>PROXMENUX_TERMINAL=monitor</code>, ereditata da tutti i processi figli <code>bash</code>, incluso un successivo avvio di <code>menu</code>, per riconoscere il terminale di Monitor."
},
"singleAlt": "Scheda Terminale di ProxMenux Monitor — sessione singola con il riepilogo di sistema Fastfetch allo accesso",
"singleCaption": "Un terminale host aperto — la barra degli strumenti sopra mostra il conteggio (<em>1 / 4 terminali</em>), <em>+ Nuovo</em>, <em>Ricerca</em>, <em>Cancellazione</em> e <em>Chiudere</em>. Gli helper della tastiera mobile appaiono sotto il terminale su dispositivi touch.",
"target": {
"heading": "Obiettivo di connessione",
"body1": "La scheda Terminale apre una shell sullo <strong>host Proxmox stesso</strong>, come uno accesso SSH. Ogni scheda apre un nuovo terminale dell'host.",
"body2": "Per accedere a un <strong>container LXC</strong> dal browser, usa <em>Console</em> sulla scheda di ogni CT in esecuzione nella <link>scheda VM e LXC</link>. Apre una finestra che esegue <code>pct enter &lt;vmid&gt;</code> e usa la stessa barra per dispositivi mobili descritta sotto."
},
"menuGuard": {
"heading": "Protezione durante l'aggiornamento di menu in questo terminale",
"body1": "Dopo la conferma, <code>menu</code> sostituisce il proprio albero di script e si ricarica. Questo funziona tramite SSH o console Proxmox, ma nel browser chiuderebbe il PTY della shell e interromperebbe il WebSocket. Per evitarlo, <code>check_updates_stable</code>, <code>check_updates_beta</code> e <code>apply_release_channel</code> leggono <code>PROXMENUX_TERMINAL</code> e riconoscono il contesto Monitor.",
"body2": "Il dialogo sì/no viene quindi sostituito da un messaggio con il comando ufficiale di installazione: <code>bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"</code> per stable e l'URL equivalente di <code>install_proxmenux_beta.sh</code> per beta. Lo aggiornamento si esegue tramite SSH o console dell'host Proxmox; il terminale del browser serve solo a leggere e confermare il messaggio."
},
"fourTerminals": {
"heading": "Fino a quattro terminali contemporaneamente",
"intro": "La scheda consente di aprire fino a quattro terminali host contemporaneamente. Ognuno ottiene il proprio PTY e il proprio WebSocket — sono sessioni completamente indipendenti. Due layout passano con le icone accanto al pulsante \"Nuovo\":",
"items": [
"<strong>Vista a schede</strong> — un terminale visibile, gli altri come schede con nome in alto (<em>Terminale 1</em>, <em>Terminale 2</em>…). Utile per un'attività con le altre in secondo piano.",
"<strong>Vista a griglia</strong> — tutti i terminali aperti in una griglia 2×2. Puoi osservare <code>htop</code> in uno, <code>iftop</code> in un altro e modificare file in un terzo senza cambiare scheda."
],
"outro": "La barra indica il conteggio (<em>1/4 terminali</em>, <em>4/4 terminali</em>). <strong>+ Nuovo</strong> apre una scheda; la piccola <code>×</code> nell'intestazione la chiude. Il grande pulsante rosso <strong>Chiudi</strong> in alto chiude tutti i terminali."
},
"gridAlt": "Scheda terminale ProxMenux Monitor — visualizzazione griglia con quattro terminali host che eseguono ls, configurazione di rete, iftop e il menu principale ProxMenux fianco a fianco",
"gridCaption": "Vista a griglia (4 / 4 terminali) — quattro PTY indipendenti in parallelo: elenco directory, <code>/etc/network/interfaces</code>, <code>iftop</code> e menu principale ProxMenux. Il selettore di disposizione nella barra alterna griglia e schede.",
"keyboard": {
"heading": "Pulsanti tastiera per dispositivi mobili",
"intro": "Le tastiere di telefoni e tablet spesso non offrono ESC, TAB, frecce o combinazioni con modificatori. Servono per usare <code>vim</code>, <code>nano</code>, <code>htop</code> e menu TUI. Terminale aggiunge quindi una riga di pulsanti tattili sotto il terminale quando lo schermo è piccolo o il dispositivo supporta il tocco:",
"headerButton": "Pulsante",
"headerSends": "Invia",
"headerUse": "Uso tipico",
"rows": [
{
"button": "ESC",
"sends": "\\x1b",
"use": "Esce dalla modalità di inserimento di <code>vim</code>, annulla un dialogo TUI o chiude una ricerca."
},
{
"button": "TAB",
"sends": "\\t",
"use": "Completamento dei percorsi e navigazione tra campi in dialog/whiptail."
},
{
"button": "↑ ↓ ← →",
"sends": "\\x1bO[ABCD]",
"use": "Cronologia della shell, movimento del cursore e navigazione dei menu."
},
{
"button": "↵ Invio",
"sends": "\\r",
"use": "Conferma. Alcune tastiere sullo schermo sostituiscono Invio con Vai/Fine; questo pulsante evita ambiguità."
},
{
"button": "Ctrl ▾",
"sends": "Menu a discesa",
"useRich": true
}
],
"ctrlIntro": "Tre sequenze di controllo:",
"ctrlItems": [
"<code>Ctrl+C</code> — annullare / interrompere il comando in esecuzione (<code>\\x03</code>).",
"<code>Ctrl+X</code> — esce da <code>nano</code> (<code>\\x18</code>).",
"<code>Ctrl+R</code> — ricerca a ritroso nella cronologia bash (<code>\\x12</code>)."
],
"modalTitle": "Stessa barra nella finestra della console LXC",
"modalBody": "La console aperta da <link>VM e LXC → Console</link> mostra gli stessi pulsanti tastiera sotto la finestra. Alla connessione inserisce automaticamente <code>pct enter &lt;vmid&gt;</code> per entrare direttamente nel container."
},
"lxcAlt": "Finestra console LXC di ProxMenux Monitor — Terminal: ubuntu (ID: 103), con la stessa barra per dispositivi mobili (ESC, TAB, frecce, Invio, Ctrl) sotto il terminale",
"lxcCaption": "Console LXC aperta da <em>VM e LXC → Console</em>. L'intestazione mostra il container di destinazione (<em>Terminal: ubuntu (ID: 103)</em>) e sotto il terminale appare la stessa barra tattile.",
"search": {
"heading": "Cerca comandi — prontuario integrato",
"intro": "Il pulsante blu <strong>Cerca</strong> apre una ricerca approssimativa dei comandi. Digita alcune lettere di un comando Linux o Proxmox (<code>ls</code>, <code>tar</code>, <code>qm</code>, <code>pct</code>, <code>zpool</code>, <code>systemctl</code>…) per vedere esempi con <em>Invia al terminale attivo</em> in un tocco. Puoi così ritrovare un'opzione senza cambiare scheda.",
"modalAlt": "Finestra Cerca comandi di ProxMenux Monitor — ricerca approssimativa di comandi Linux e Proxmox tramite cheat.sh, con vari esempi di ls",
"modalCaption": "Ricerca di <code>ls</code> — ogni risultato mostra comando, descrizione e una piccola freccia di invio al terminale attivo. In basso a destra è indicata la fonte dei dati (<em>Fornito da cheat.sh</em>).",
"aboutLabel": "Informazioni su cheat.sh:",
"aboutBody": "è un prontuario open source curato dalla comunità, con esempi brevi e pratici per centinaia di comandi Linux, strumenti di amministrazione e linguaggi di programmazione. Progettato per essere consultato con <code>curl cheat.sh/&lt;command&gt;</code>, è accessibile anche dal browser. ProxMenux Monitor inoltra le query tramite proxy sul server per mantenere la stessa origine del pannello.",
"headerSource": "Fonte",
"headerWhen": "Quando viene usato",
"headerWhat": "Cosa vedi",
"onlineLabel": "(in linea)",
"onlineWhen": "Quando l'host ha accesso a Internet e il proxy cheat.sh risponde.",
"onlineWhat": "Vari esempi pratici per comando, con la descrizione sopra. Il punto di stato nell'intestazione è <green>verde</green>.",
"fallbackLabel": "Alternativa locale",
"fallbackWhen": "Quando cheat.sh non è raggiungibile (host offline, firewall restrittivo o interruzione del servizio cheat.sh).",
"fallbackWhat": "Un elenco incluso di comandi Linux e Proxmox comuni. Il catalogo è più piccolo ma sempre disponibile. Il punto di stato è <red>rosso</red>.",
"sendingNote": "<strong>Come funziona l'invio</strong>: la freccia accanto al risultato invia il testo al terminale attivo (la scheda selezionata o l'ultimo terminale cliccato nella griglia). La finestra si chiude automaticamente per consentire di premere Invio."
},
"auth": {
"heading": "Autenticazione",
"items": [
"Il browser richiede prima un ticket monouso tramite <code>POST /api/terminal/ticket</code>, autenticato con JWT nell'intestazione <code>Authorization</code>. Poi invia il ticket all'apertura del WebSocket. Scade dopo 5 secondi; se l'autenticazione è attiva e il ticket manca o non è valido, la connessione si chiude prima di creare un PTY.",
"Se Monitor si trova dietro un proxy inverso, questo deve inoltrare gli upgrade WebSocket. Esempi per Nginx / Caddy / Traefik nella pagina <link>Accesso e autenticazione</link>."
]
},
"clipboard": {
"heading": "Appunti, cronologia dello schermo e ridimensionamento",
"items": [
"<strong>Copia e incolla</strong> — usa gli appunti del browser. Seleziona il testo con mouse o trackpad e usa la scorciatoia del sistema (<code>Cmd+C</code> su macOS, <code>Ctrl+Shift+C</code> su Linux/Windows). I desktop Linux supportano anche l'incollaggio con clic centrale.",
"<strong>Cronologia dello schermo</strong> — scorrimento con rotella o due dita. xterm.js conserva in memoria le ultime migliaia di righe.",
"<strong>Ridimensionamento</strong> — il terminale adatta la dimensione della finestra PTY quando ridimensioni il pannello, per visualizzare correttamente <code>htop</code> e <code>vim</code>.",
"<strong>Riconnessione al ritorno alla scheda</strong> — cambiare app su telefono o tablet, soprattutto iPad, può interrompere il WebSocket. Terminale rileva il cambio di visibilità e si riconnette al ritorno, con un timeout di 15 secondi per VPN lente."
]
},
"disconnect": {
"heading": "Cause di disconnessione",
"intro": "Le cause più comuni della fine di una sessione e come risolverle:",
"headerCause": "Causa",
"headerFix": "Soluzione",
"rows": [
{
"cause": "JWT di sessione scaduto all'apertura o riconnessione di un terminale (durata di 24 ore).",
"fix": "Aggiorna la pagina e accedi di nuovo. Il terminale non è progettato per sessioni non assistite, quindi la durata di JWT corrisponde al normale login del cruscotto."
},
{
"cause": "Timeout di inattività del proxy inverso.",
"fix": "Aumenta <code>proxy_read_timeout</code> in Nginx o il valore equivalente in Caddy / Traefik (esempi in Accesso e autenticazione)."
},
{
"cause": "Telefono o tablet in sospensione.",
"fix": "Al risveglio del dispositivo la scheda si riconnette automaticamente (timeout di 15 secondi per i percorsi VPN). In caso contrario, ricaricala."
},
{
"cause": "Il servizio si riavvia sull'host.",
"fix": "Ogni riavvio di <code>proxmenux-monitor.service</code> chiude tutti i PTY. Apri nuovi terminali quando il pannello ha terminato il caricamento."
}
]
},
"warning": {
"title": "Il terminale è una shell root sull'host",
"body": "Il terminale eredita l'utente dell'unità systemd (<code>root</code>) e ha pieni privilegi sull'host Proxmox. Configura nome utente, password e 2FA in <authLink>Accesso e autenticazione</authLink> prima di consentire accessi fuori dalla rete locale. Con autenticazione disattivata, chi raggiunge la porta 8008 può aprire una shell root senza altre conferme o credenziali SSH. Per accessi esterni usa <gatewayLink>Secure Gateway</gatewayLink> (Tailscale) o un proxy inverso HTTPS invece di pubblicare la porta su Internet."
},
"whereNext": {
"heading": "Dove proseguire",
"items": [
{
"label": "Accesso e autenticazione",
"href": "/docs/monitor/access-auth",
"tail": " — esempi per proxy inversi con le righe di upgrade WebSocket necessarie per il terminale."
},
{
"label": "Architettura",
"href": "/docs/monitor/architecture",
"tail": " — trasporto WebSocket (HTTP tramite flask-sock e HTTPS / WSS tramite gevent)."
},
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tail": " — endpoint WebSocket /ws/terminal e /ws/script/<sid>, insieme al resto dell'API."
},
{
"label": "Integrazioni → Secure Gateway",
"href": "/docs/monitor/integrations",
"tail": "— quando si desidera l'accesso terminale da fuori della LAN senza esporre la porta 8008."
},
{
"label": "Indice del pannello",
"href": "/docs/monitor/dashboard",
"tail": "— le altre schede."
}
]
}
}
@@ -0,0 +1,245 @@
{
"meta": {
"title": "Scheda App LXC: scoperta, collegamenti e tracciamento versione | ProxMenux",
"description": "Scoprire e registrare le applicazioni LXC, creare collegamenti web e seguire in modo facoltativo le versioni installate e disponibili."
},
"header": {
"title": "Scheda App LXC: scoperta, collegamenti e tracciamento versione",
"description": "Dare ad ogni applicazione LXC un'identità persistente, l'accesso al web e le prove della versione facoltativa senza accoppiare la registrazione agli aggiornamenti."
},
"intro": {
"p1": "La scheda <strong>App</strong> registra le applicazioni di un LXC. Un record può contenere solo nome e link web, oppure anche un rilevatore della versione installata e una fonte upstream.",
"p2": "La procedura che modifica il software si configura nella <link>scheda Aggiornamenti</link>. Salvare un'app non esegue mai un installatore o un programma di aggiornamento.",
"callout": "Registrazione, tracciamento delle versioni e aggiornamento sono tre funzioni indipendenti. Ciascuna è utilizzabile senza richiedere le altre due.",
"dashboardTitle": "Dalla registrazione al lanciatore Apps",
"dashboard": "Ogni link web salvato qui appare anche come scheda nella <appsLink>scheda Apps</appsLink> principale. Questa pagina LXC resta il riferimento per nome, logo, link e tracciamento delle versioni."
},
"overview": {
"heading": "Cosa può offrire un record di applicazione",
"lead": "Un singolo record salvato può includere:",
"items": [
"Un nome visualizzato e un logo adattato al tema.",
"Uno o più link web cliccabili costruiti dall'indirizzo LXC, schema e porta salvata.",
"Un rilevatore opzionale per la versione attualmente installata all'interno del LXC.",
"Una sorgente opzionale GitHub, HTTP JSON o Docker Hub per l'ultima versione disponibile.",
"Notifiche di rilascio per applicazione e preferenze di inclusione del contatore di aggiornamento.",
"Una sezione corrispondente sulla scheda Aggiornamenti, anche quando il monitoraggio della versione è disabilitato."
]
},
"discovery": {
"heading": "Ricerca in cache e Trova applicazioni",
"lead": "I suggerimenti sono inclusi nella cache della finestra di ogni LXC. La scansione iniziale li prepara in background per mostrarli subito quando si apre App.",
"items": [
"L'apertura della scheda App <strong>non</strong> avvia una nuova scansione del catalogo e non interroga ripetutamente il LXC.",
"<strong>Trova applicazioni</strong> avvia una nuova ricerca per quel LXC. Usalo dopo aver installato software mentre ProxMenux è già in esecuzione.",
"L'elenco precedente resta visibile durante la scansione. Le nuove corrispondenze si aggiungono alla fine.",
"Se non ci sono nuove corrispondenze, il risultato appare accanto alle azioni e <strong>Registra applicazione</strong> resta disponibile per l'inserimento manuale.",
"Salvare, rimuovere o ripristinare un'app aggiorna immediatamente la stessa cache. Avviare o ripristinare un LXC rinfresca solo l'ospite attraverso il suo evento ciclo di vita esistente."
],
"callout": "Un suggerimento non è una registrazione. Resta in sola lettura finché non premi <strong>Registra</strong> e salvi il modulo."
},
"registration": {
"heading": "Registrazione di un'applicazione",
"lead": "Un suggerimento rilevato e un record manuale usano lo stesso editor:",
"steps": [
"<strong>Registra</strong> un suggerimento oppure usa <strong>Registra applicazione</strong> per scegliere dal catalogo o inserire un nome personalizzato.",
"Rivedere il nome e il logo proposti dal catalogo.",
"Aggiungi i link web richiesti. Le porte di ascolto rilevate vengono offerte come scorciatoie, ma nessuna viene salvata automaticamente.",
"<strong>Traccia versione upstream</strong> può restare disattivato per record con soli link. Se lo attivi, verifica il rilevatore della versione installata e la fonte upstream.",
"Se il tracciamento è attivo, usa <strong>Prova rilevatore</strong> e salva il record.",
"Premi <strong>Fine</strong> dopo la modifica. App e Aggiornamenti usano lo stesso record aggiornato in cache."
]
},
"catalog": {
"heading": "Registrazione assistita da catalogo",
"lead": "Il catalogo fornisce i default, ma il record salvato rimane modificabile.",
"items": [
"I risultati della ricerca possono precompilare nome canonico, logo e porte web comuni.",
"I rilevatori noti usano veri nomi di pacchetti, binari, file, distribuzioni Python, etichette OCI o comandi, invece di un'ipotesi universale come <code>/root/.app</code>.",
"Gli override di runtime verificati hanno la precedenza quando un'installazione utilizza un percorso che differisce dai metadati dell'installatore.",
"I marcatori Proxmox VE Helper-Scripts come <code>/root/.slug</code> rimangono un segnale di compatibilità per le nuove installazioni di helper, non l'unico rilevatore.",
"Ogni valore proposto può essere modificato prima di salvare per coprire installatori ufficiali e installazioni manuali."
]
},
"docker": {
"heading": "Come vengono rappresentati i Docker LXC",
"lead": "Per un LXC la cui piattaforma primaria è Docker, <strong>Docker</strong> è l'applicazione registrata a livello LXC.",
"items": [
"Un carico di lavoro containerizzato come Portainer, Frigate o Vaultwarden non è suggerito come un'applicazione indipendente LXC nativo.",
"I servizi Docker in esecuzione con porte TCP pubblicate sono proposti come link web opzionali nell'editor Docker.",
"Ogni link suggerito mostra servizio, porta dell'host e porta del container. Salva solo quelli che offrono un'interfaccia web.",
"Il logo globale Docker viene utilizzato quando un link non ha un logo specifico. Un logo per-link lo sovrascrive quando uno è configurato.",
"Dopo che Docker è registrato, Docker Engine e gli aggiornamenti delle immagini vengono visualizzati insieme nella sua sezione sulla scheda Aggiornamenti."
],
"callout": "Questa struttura previene un carico di lavoro Docker dall'aspetto di un software installato direttamente nel LXC preservando i collegamenti rapidi alle sue interfacce."
},
"webLinks": {
"heading": "Link web e loghi",
"lead": "I link web funzionano con o senza tracciamento della versione.",
"items": [
"Ogni link memorizza uno schema, la porta, la descrizione facoltativa e l'URL del logo opzionale.",
"L'URL visualizzato utilizza l'indirizzo corrente già rilevato per il LXC; l'indirizzo non viene duplicato in ogni record di app.",
"Un link senza il proprio logo rientra nel logo dell'app.",
"Più link possono rappresentare interfaccia amministrativa, API, interfaccia secondaria o un altro endpoint della stessa app.",
"Una app con soli link appare anche in Aggiornamenti, dove puoi configurare in seguito un programma personalizzato."
]
},
"tracking": {
"heading": "Tracciamento versione opzionale",
"lead": "Il tracciamento combina un rilevatore della versione installata con una fonte upstream opzionale. I due lati sono controllati separatamente.",
"colMethod": "Metodo per la versione installata",
"colUse": "Uso",
"detectorRows": [
{
"method": "dpkg / apk",
"use": "Legge la versione del pacchetto installato dai metadati del pacchetto Debian, Ubuntu o Alpine."
},
{
"method": "binary",
"use": "Esegue un percorso binario assoluto o un nome di comando con argomenti di versione."
},
{
"method": "file + regex",
"use": "Legge un file reale ed estrae la versione con un gruppo di cattura."
},
{
"method": "docker label / docker exec",
"use": "Legge un'etichetta di versione OCI o esegue un comando di versione all'interno di un contenitore Docker."
},
{
"method": "python distribution",
"use": "Utilizza importlib.metadata attraverso l'interprete Python selezionato."
},
{
"method": "command",
"use": "Esegue un comando avanzato in stile argv senza una shell ed estrae la versione dalla sua uscita."
},
{
"method": "manual",
"use": "Conserva una versione inserita manualmente; deve essere modificata dopo l'aggiornamento dell'app."
},
{
"method": "OCI image",
"use": "Per container installati da OCI manager Apps. Legge le versioni di app e immagine dal record di installazione e confronta il digest installato con quello pubblicato dal registro. Non richiede configurazione."
}
],
"sourcesHeading": "Fonti della versione disponibile",
"sources": [
"<strong>GitHub repository</strong>: ultima release o tag da un repository pubblico <code>owner/name</code>.",
"<strong>HTTP JSON</strong>: un endpoint pubblico più un percorso punteggiato come <code>data.version</code> o <code>releases[0].tag_name</code>.",
"<strong>Docker Hub</strong>: tag con versione filtrati tramite espressione regolare. Un'anteprima mostra i tag reali corrispondenti prima del salvataggio.",
"<code>latest</code>, <code>stable</code> e <code>lts</code> sono tag mobili senza versione. Traccia queste immagini tramite digest negli aggiornamenti delle immagini Docker."
],
"regexHeading": "Scrivere l'espressione di cattura",
"regexLead": "L'espressione regolare deve restituire la versione nel <strong>primo gruppo di cattura</strong>.",
"regexRules": [
"Abbina il testo emesso dalla sorgente binaria, file, comando o tag selezionata; non indovinare un percorso generico.",
"Usa <code>\\.</code> per i punti letterali, così non corrispondono a caratteri arbitrari.",
"Consenti una <code>v</code> iniziale solo se la fonte può includerla.",
"Includere suffissi come prerelease o revisioni distro solo quando sono significativi per il confronto.",
"Usa <strong>Prova rilevatore</strong> prima di salvare e verifica che la versione installata mostrata corrisponda al LXC."
],
"regexExampleLead": "cattura semantica comune:",
"regexExample": "v?(\\d+\\.\\d+\\.\\d+)",
"regexCallout": "Una corrispondenza regex riuscita non dimostra che il percorso del rilevatore sia corretto. Il percorso o pacchetto deve esistere nell'installazione reale da registrare."
},
"updater": {
"heading": "Il monitoraggio delle versioni e l'aggiornamento sono indipendenti",
"lead": "La <link>scheda Aggiornamenti</link> crea una sezione app non appena viene salvato un record.",
"items": [
"Un record di collegamento mostra che il tracciamento della versione non è configurato, ma può ancora ricevere un comando di aggiornamento personalizzato.",
"Un'applicazione con monitoraggio ma senza un metodo eseguibile mostra un messaggio neutro che chiede un comando personalizzato.",
"Una app con wrapper Proxmox VE Helper-Scripts verificato può usare il programma integrato anche se la registrazione è partita da un link web.",
"Aggiungere o modificare un programma di aggiornamento non cambia rilevatore o fonte upstream salvati in App."
]
},
"states": {
"heading": "Stati di versione nella scheda App",
"colState": "Stato",
"colDisplay": "Visualizzazione",
"colMeaning": "Significato",
"rows": [
{
"state": "Aggiornamento disponibile",
"display": "Versione disponibile in viola con icona a freccia verso l'alto",
"meaning": "Le versioni installate e a monte differiscono."
},
{
"state": "Aggiornata",
"display": "Versioni installata e disponibile senza avviso viola",
"meaning": "L'ultimo controllo non ha trovato una versione upstream più recente."
},
{
"state": "Monitoraggio in attesa",
"display": "Controllo o stato in sospeso",
"meaning": "Il record è configurato ma non ha ancora completato entrambi i controlli."
},
{
"state": "Tracciamento disattivato",
"display": "Solo link web; nessun blocco di confronto versione",
"meaning": "Il record resta valido e può avere un programma di aggiornamento."
},
{
"state": "Errore di verifica",
"display": "Spiegazione ambra all'interno della scheda",
"meaning": "Lo stato precedente resta visibile mentre viene segnalato l'errore del rilevatore o della fonte upstream."
}
]
},
"management": {
"heading": "Gestione delle applicazioni salvate e suggerite",
"lead": "Le azioni in fondo alla scheda hanno ruoli distinti:",
"items": [
"<strong>Trova applicazioni</strong> aggiorna la ricerca solo per questo LXC.",
"<strong>Registra altra applicazione</strong> apre catalogo ed editor manuale senza una nuova scansione del LXC.",
"<strong>Modifica</strong> mostra su ogni scheda Rimuovi, Verifica, notifiche e Modifica campi.",
"<strong>Nascondi</strong> rimuove un suggerimento indesiderato. Le rilevazioni nascoste si ripristinano nella vista di registrazione.",
"<strong>Verifica</strong> aggiorna i dati di versione della app salvata scelta; non cerca nuove app."
]
},
"troubleshooting": {
"heading": "Situazioni comuni",
"colProblem": "Situazione",
"colResolution": "Risoluzione",
"rows": [
{
"problem": "Il software è stato installato dopo l'avvio di ProxMenux",
"resolution": "Premere Trova applicazioni. La scansione esplicita aggiorna i suggerimenti in cache per quel LXC."
},
{
"problem": "Nessun'applicazione è stata rilevata",
"resolution": "Registralo manualmente. Un nome e un link web sono sufficienti; il tracciamento può essere aggiunto in seguito."
},
{
"problem": "Il rivelatore suggerito restituisce la versione sbagliata",
"resolution": "Apri Modifica campi, seleziona il pacchetto, binario o percorso reale e prova il rilevatore prima di salvare."
},
{
"problem": "Un carico di lavoro Docker non è offerto come app LXC",
"resolution": "Registrare Docker e aggiungere l'interfaccia pubblicata del carico di lavoro come collegamento web Docker. Gli aggiornamenti delle immagini rimangono nella sezione Docker."
},
{
"problem": "Un'app salvata non ha nessun pulsante di aggiornamento",
"resolution": "Aprire la scheda Aggiornamenti e configurare il suo metodo di aggiornamento. Il tracciamento della versione da solo non definisce come viene installato un aggiornamento."
}
]
},
"figures": {
"catalog": {
"alt": "Catalogo di registrazione con risultati di ricerca, loghi, porte e campi del rilevatore",
"caption": "Catalogo metadati accelera la registrazione mentre ogni valore proposto rimane modificabile."
},
"webLinks": {
"alt": "Scheda di applicazione LXC salvata contenente un link web cliccabile",
"caption": "Un record con soli link è valido: il tracciamento può restare disattivato e il programma di aggiornamento si aggiunge separatamente."
},
"tracking": {
"alt": "Campi opzionali del rilevatore della versione installata e della fonte upstream",
"caption": "Il rilevamento della versione installata e la fonte upstream si configurano e provano separatamente."
},
"card": {
"alt": "Scheda di applicazione salvata con versioni installate e disponibili più un link web",
"caption": "La scheda combina identità, prove di versione e accesso web senza eseguire azioni di aggiornamento da questa scheda."
}
}
}
@@ -0,0 +1,203 @@
{
"meta": {
"title": "Aggiornamenti LXC: OS, applicazioni e Docker | ProxMenux",
"description": "Configura ed esegui aggiornamenti del sistema operativo, delle applicazioni, di Docker Engine e delle immagini Docker in un container LXC."
},
"header": {
"title": "Aggiornamenti LXC: OS, applicazioni e Docker",
"description": "Verificare ogni obiettivo di aggiornamento in un unico luogo, eseguirlo in modo indipendente, o combinare obiettivi selezionati in un'azione di massa controllata."
},
"intro": {
"p1": "La scheda <strong>Aggiornamenti</strong> separa il rilevamento delle versioni dalla loro installazione. Registrazione e tracciamento opzionale sono nella <link>scheda App</link>; i metodi eseguibili si gestiscono qui.",
"p2": "Un'app salvata appare in Aggiornamenti anche con un solo link web. Il tracciamento delle versioni è opzionale e il programma di aggiornamento può essere configurato separatamente.",
"callout": "Registrare un'app non seleziona il programma di aggiornamento. Se viene rilevato un programma Helper-Scripts corrispondente, scegli e salva <strong>Helper-Scripts</strong> o <strong>Comando personalizzato</strong>. Il rilevamento non garantisce la compatibilità. La scelta è per app, anche quando più app condividono un LXC."
},
"overview": {
"heading": "Cosa contiene la scheda",
"lead": "Ogni target disponibile ha la sua sezione e azione:",
"items": [
"<strong>Pacchetti del sistema</strong> per container Debian, Ubuntu e Alpine.",
"Una sezione per ogni <strong>applicazione registrata</strong>, inclusi i record con soli link.",
"Una sezione <strong>Docker</strong> quando Docker è registrato, con Docker Engine e immagini contrassegnate raggruppate insieme.",
"Una sezione <strong>Aggiornamento in blocco</strong> configurabile, seguita da opzioni di backup, riavvio e pianificazione."
]
},
"mechanisms": {
"heading": "Come viene selezionato un metodo di aggiornamento",
"lead": "Il percorso integrato Proxmox VE Helper-Scripts segue il meccanismo ufficiale <helper>update-apps </helper>. Altri tipi di installazione utilizzano il pacchetto corrispondente, Docker o percorso personalizzato.",
"officialReference": "Riferimento ufficiale: la <helper>documentazione update-apps di Proxmox VE Helper-Scripts</helper> descrive modalità interattiva e non presidiata, backup, simulazioni, risorse temporanee di compilazione, log e codici di uscita.",
"colSource": "Fonte",
"colAction": "Azione visualizzata",
"colNotes": "Cosa viene eseguito",
"rows": [
{
"source": "Pacchetti APT o APK",
"action": "Applicare aggiornamenti del sistema operativo",
"notes": "Aggiorna i pacchetti container. Le app registrate installate come pacchetti dpkg o apk sono coperte da questo stesso passaggio."
},
{
"source": "Proxmox VE Helper-Scripts",
"action": "Applica aggiornamento",
"notes": "Dopo la scelta esplicita di Helper-Scripts esegue lo script ufficiale identificato dal wrapper /usr/bin/update convalidato. Un marcatore o una corrispondenza nel catalogo da soli non abilitano mai l'esecuzione."
},
{
"source": "Comando personalizzato",
"action": "Esegui programma di aggiornamento",
"notes": "Esegue il comando salvato nel LXC e sostituisce qualsiasi programma integrato di aggiornamento di quel record."
},
{
"source": "Docker Engine",
"action": "Aggiorna Docker Engine",
"notes": "Aggiorna solo i pacchetti Docker installati e le dipendenze necessarie. Non modifica altri pacchetti del sistema o i container."
},
{
"source": "Immagine Docker",
"action": "Aggiorna immagine",
"notes": "Scarica l'immagine selezionata e ricrea il gruppo di servizi Compose o il container autonomo protetto."
}
],
"callout": "Un comando personalizzato <strong>sostituisce</strong> Helper-Scripts per quell'app. Le esecuzioni manuali, in blocco e pianificate rispettano la scelta salvata. Restano i comandi esistenti e le vecchie selezioni salvate esplicitamente nei piani in blocco o nelle pianificazioni attive; una nuova app non viene mai inclusa da una vecchia pianificazione."
},
"docker": {
"heading": "Docker Engine e immagini Docker",
"lead": "Dopo che Docker è registrato sulla scheda App, il suo motore e l'inventario delle immagini appaiono all'interno della stessa sezione <strong>Docker</strong>.",
"items": [
"Il monitoraggio della versione Docker Engine è separato dal contatore del pacchetto OS e ha il suo pulsante di aggiornamento.",
"Le immagini locali dotate di tag vengono confrontate con quelle del rispettivo registro tramite il digest immutabile. <strong>Controlla ora</strong> aggiorna questo inventario senza scaricare immagini né riavviare i container.",
"I servizi Compose sono aggiornati dal progetto dichiarato. Le immagini dello stesso gruppo sono gestite insieme per evitare di ricreare il progetto più volte.",
"Un contenitore standalone è ricreato dalla sua configurazione attuale. Il flusso protetto mantiene i dati di rollback e ripristina il contenitore precedente se la ricreazione fallisce.",
"Ogni immagine è selezionabile separatamente per aggiornamenti manuali, in blocco e pianificati, tranne le dipendenze Compose dichiarate che devono seguire il servizio principale."
],
"callout": "I contenitori che funzionano all'interno di Docker non sono indicati come applicazioni LXC indipendenti. Le loro porte web pubblicate possono essere salvate come link sotto la registrazione Docker, mentre gli aggiornamenti delle immagini rimangono nella sezione Docker."
},
"actions": {
"heading": "Azioni individuali e colori di stato",
"lead": "Ogni sezione rimane utilizzabile in modo indipendente, indipendentemente dal fatto che sia configurato o meno un aggiornamento collettivo.",
"items": [
"<strong>Configura</strong> apre la scelta del programma quando non è definito un metodo; <strong>Modifica</strong> cambia una scelta salvata. I pulsanti informativi spiegano le opzioni, collegano la documentazione ufficiale e mostrano un esempio di script personalizzato. Selezionare non esegue l'opzione.",
"Con tracciamento versione disattivato ma programma disponibile, appare l'azione neutra <strong>Esegui programma di aggiornamento</strong>. ProxMenux non afferma che ci sia un aggiornamento in attesa.",
"Senza un programma Helper-Scripts disponibile, configura un comando personalizzato. Disattivare un metodo non ne seleziona un altro; i piani e le pianificazioni conservano le scelte e segnalano gli obiettivi non disponibili.",
"<strong>Aggiorna immagine</strong> agisce solo sull'unità Docker selezionata; non aggiorna Docker Engine né immagini non correlate."
],
"statusColState": "Stato conosciuto",
"statusColAppearance": "Aspetto",
"statusColMeaning": "Significato",
"statusRows": [
{
"state": "Aggiornamento verificato disponibile",
"appearance": "Testo viola, icona con freccia verso l’alto e azione viola",
"meaning": "Le versioni installate e disponibili o i digest delle immagini differiscono."
},
{
"state": "Aggiornato e verificato",
"appearance": "Segno di spunta verde e azione Aggiornato in verde",
"meaning": "L'ultimo controllo completato conferma che l'obiettivo è attuale."
},
{
"state": "Versione sconosciuta",
"appearance": "Testo neutro e azione neutrale",
"meaning": "Il programma di aggiornamento è eseguibile, ma mancano dati di versione per stabilire se il target è aggiornato o ha un aggiornamento disponibile."
}
]
},
"custom": {
"heading": "Comandi di aggiornamento personalizzati",
"lead": "Usa un comando personalizzato quando manca un programma integrato verificato o quando occorre sostituire la procedura normale.",
"items": [
"Apri <strong>Configura</strong> se il campo è vuoto, oppure <strong>Modifica</strong> se esiste già un metodo.",
"Per un'app integrata o Docker Engine, l'editor mostra il comando attuale. Salvare un contenuto diverso lo rende la sostituzione esplicita per quel record.",
"Testare prima la procedura completa nel terminale LXC. Deve essere non interattivo, utilizzare la directory di lavoro corretta e restituire uno stato di uscita non zero su guasto.",
"Non includere <code>pct exec</code>; ProxMenux entra già nel contenitore ed esegue il comando come root."
],
"exampleLead": "Esempio di una procedura completa di in-container:",
"example": "cd /opt/my-app && ./update.sh",
"callout": "Un comando come <code>myapp --version</code> legge solo una versione; non è un programma di aggiornamento. I comandi hanno privilegi amministrativi: esamina il contenuto come un comando di shell root."
},
"bulk": {
"heading": "Aggiornamento in blocco",
"lead": "La funzione in blocco crea un'azione riutilizzabile per un insieme preciso di obiettivi nel LXC. Si trova dopo le sezioni delle app e Docker e prima di <strong>Opzioni</strong>.",
"items": [
"I pacchetti del sistema sono obbligatori. Seleziona almeno un'app, Docker Engine o un'unità di immagine Docker aggiuntiva.",
"App e unità Docker si selezionano singolarmente. Il servizio principale Compose mostra le dipendenze aggiornate insieme a esso.",
"Gli obiettivi rimossi o non disponibili sono contrassegnati come obsoleti e vanno rimossi prima di salvare.",
"<strong>Applica aggiornamenti</strong> è viola se un obiettivo ha un aggiornamento verificato, verde se tutti risultano aggiornati e neutro se il risultato è sconosciuto.",
"Rimuovere la configurazione di massa non rimuove i singoli metodi di aggiornamento o le impostazioni di aggiornamento programmate."
],
"callout": "Aggiornamento Bulk non sostituisce i singoli pulsanti. È una scorciatoia opzionale per una selezione che dovrebbe funzionare insieme."
},
"options": {
"heading": "Opzioni di backup e riavvio",
"lead": "Le stesse opzioni valgono per esecuzioni manuali, in blocco e pianificate:",
"items": [
"<strong>Snapshot prima di applicare</strong> crea un backup vzdump sullo storage selezionato. Se il backup richiesto fallisce, l'aggiornamento non inizia.",
"<strong>Riavvia dopo l'applicazione</strong> riavvia il LXC solo dopo un'esecuzione riuscita.",
"Le selezioni sono memorizzate per LXC e rimangono indipendenti dall'elenco di destinazione."
]
},
"scheduled": {
"heading": "Aggiornamenti pianificati",
"lead": "Gli aggiornamenti programmati utilizzano gli stessi obiettivi eseguibili e le opzioni di sicurezza delle azioni manuali.",
"items": [
"Scegliere un'espressione preimpostata o cron, quindi selezionare obiettivi esatti: pacchetti OS, app individuali, Docker Engine, unità Docker standalone o gruppi di servizi Compose.",
"Il ritardo dopo il rilascio vale solo per app selezionate con tracciamento versione. Le app senza tracciamento eseguono il programma a ogni scadenza.",
"Lo stato dell'ultima esecuzione distingue successo, completamento parziale, errore, sospensione di sicurezza e nessun aggiornamento in attesa. Dopo la prima esecuzione pianificata, <strong>Aggiornamenti → Aggiornamenti pianificati → Visualizza log</strong> apre l'output completo del programma di aggiornamento e degli script secondari invocati.",
"Dopo ogni esecuzione, ProxMenux controlla il marcatore standard Debian di riavvio richiesto. La scheda Aggiornamenti e la notifica finale segnalano quando serve riavviare; l'avviso si cancella quando quel LXC viene avviato o riavviato.",
"Sull'host Proxmox, i log in esecuzione programmata vengono memorizzati in <code>/usr/local/share/proxmenux/logs/lxc-updates/</code> utilizzando il nome <code>&lt;VMID&gt;-scheduled-&lt;run-id&gt;.log</code>. Gli ultimi dieci registri sono conservati per LXC e i file più vecchi vengono rimossi automaticamente.",
"Questa storia conservata si applica agli aggiornamenti programmati. Un aggiornamento manuale visualizza la sua uscita dal vivo nella finestra di esecuzione Monitor e non crea un registro in esecuzione programmata in quella directory.",
"Le pianificazioni esterne sull'host rilevate da Proxmox VE Helper-Scripts sono mostrate separatamente per evidenziare automazioni sovrapposte."
],
"callout": "Eseguire manualmente ogni metodo selezionato prima di attivare un programma. I comandi programmati non possono rispondere alle richieste."
},
"completion": {
"heading": "Cosa succede dopo un aggiornamento",
"lead": "L'aggiornamento non è considerato finito quando il comando terminale semplicemente esce.",
"items": [
"Lo stesso run registra il suo risultato finale e aggiorna lo stato del pacchetto OS, le versioni delle app registrate e l'inventario Docker come applicabile.",
"Le esecuzioni pianificate conservano l'output del terminale e indicano se serve ancora un riavvio per completare le modifiche ai pacchetti.",
"La cache LXC viene sostituita con lo stato post-aggiornamento verificato, quindi i badge e i pulsanti non conservano il risultato precedente.",
"Quando parte un LXC fermato o ripristinato, l'evento del ciclo di vita aggiorna di nuovo i dati. L'inventario Docker attende che il demone sia pronto senza salvare come definitivo un risultato iniziale vuoto.",
"Le notifiche abilitate vengono emesse dall'esecuzione finalizzata, compresi i guasti parziali e i risultati delle immagini raggruppati Docker."
]
},
"troubleshooting": {
"heading": "Situazioni comuni",
"colProblem": "Situazione",
"colResolution": "Risoluzione",
"rows": [
{
"problem": "Nessun metodo di aggiornamento è stato identificato",
"resolution": "Apri Configura, aggiungi la procedura ufficiale non interattiva e provala manualmente prima di pianificarla."
},
{
"problem": "Viene mostrata una identità Proxmox VE Helper-Scripts ma non esiste azione",
"resolution": "Il LXC ha dati di identificazione legacy ma nessun wrapper /usr/bin/update verificato. Aggiungere un metodo personalizzato solo dopo aver confermato la procedura corretta."
},
{
"problem": "Le immagini Docker sono temporaneamente vuote dopo l'avvio o il ripristino",
"resolution": "Attendi che Docker sia pronto o premi Controlla ora. Il rilevamento riprova durante l'avvio e non considera definitivo un risultato vuoto transitorio."
},
{
"problem": "Un obiettivo di massa salvato non è più disponibile",
"resolution": "Modifica la configurazione in blocco, rimuovi il target obsoleto e seleziona il sostituto attuale, se esiste."
},
{
"problem": "Un comando personalizzato fallisce",
"resolution": "Eseguilo nel terminale LXC e verifica percorso, dipendenze, opzioni non interattive e codice di uscita."
},
{
"problem": "Un aggiornamento programmato dice che è necessario un riavvio",
"resolution": "Apri Visualizza log per esaminare l'esecuzione completata, poi riavvia quel LXC. ProxMenux cancella l'avviso quando l'evento del ciclo di vita rileva il nuovo avvio."
}
]
},
"figures": {
"osPending": {
"alt": "Sezione pacchetti di sistema operativo con conteggi di aggiornamento in sospeso e di sicurezza",
"caption": "La sezione del sistema operativo mantiene gli aggiornamenti dei pacchetti indipendenti dalle azioni di applicazione e Docker."
},
"options": {
"alt": "Opzioni di aggiornamento LXC con backup pre-update e riavvio post-update",
"caption": "Le preferenze di backup e riavvio valgono per esecuzioni manuali, in blocco e pianificate."
}
}
}
@@ -0,0 +1,244 @@
{
"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."
},
"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.",
"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/&lt;vmid&gt;/control</code> con conferma esplicita e aggiornano la riga del guest. L'arresto forzato richiede il pulsante dedicato Forza arresto."
},
"topRow": {
"heading": "Riga superiore: quattro schede statistiche",
"intro": "Quattro schede riepilogano lo stato dei guest: totali, uso CPU, memoria assegnata rispetto alla capacità dell'host e spazio disco assegnato.",
"imageAlt": "scheda VM & LXCs — riga superiore di quattro schede statistiche: Total VMs & LXCs, Totale CPU, Memoria totale, Disco totale",
"imageCaption": "Riga superiore: totali e stati In esecuzione / Arrestati, uso CPU, memoria usata / assegnata ai guest attivi / assegnata totale con indicatore Entro i limiti e spazio disco assegnato.",
"headerCard": "Scheda",
"headerWhat": "Cosa mostra",
"totalLabel": "Totale VM e LXC",
"totalWhat": "Conto totale con due distintivi — <em>X Running</em> (verde) e <em>Y Stopped</em> (rosso, solo quando > 0). Il numero che guardi quando qualcosa non e' tornato dopo un riavvio.",
"cpuLabel": "CPU totale",
"cpuWhat": "Utilizzo CPU totale in tempo reale dei guest, come percentuale della CPU fisica dell'host, con il testo <em>“Utilizzo CPU assegnata”</em>.",
"memoryLabel": "Memoria totale",
"memoryIntro": "Tre letture impilate verticalmente:",
"memoryItems": [
"<strong>Usata attualmente</strong> — valore principale, come <em>15.4 GB</em>, e <em>X.X % di Y GB</em> rispetto alla RAM dell'host. La barra blu indica la percentuale.",
"<strong>Assegnata agli attivi</strong> + <strong>Assegnata totale</strong> — somma di <code>maxmem</code> dei guest <em>in esecuzione</em> e di <em>tutti</em>, inclusi quelli arrestati. La prima conta ora, la seconda quando li avvii tutti insieme.",
"<strong>Entro i limiti</strong>, verde, diventa <em>Sovra-allocata</em> se il totale supera la RAM dell'host. Una sovra-allocazione controllata può funzionare con KSM; lo indicatore avverte quando il margine diminuisce."
],
"diskLabel": "Spazio disco totale",
"diskWhat": "Somma di spazio su disco assegnato a tutti gli ospiti, nell'unità appropriata (GB / TB), con la linea di piè di pagina <em>\"Allocated disk space\"</em>."
},
"inventory": {
"heading": "Elenco di macchine virtuali e container",
"intro": "Una fila per ospite. L'elenco è basato su <code>/api/vms</code>, che consolida <code>qm list</code> + <code>pct list</code> + <code>pvesh /cluster/resources</code> sull'host.",
"imageAlt": "Elenco macchine e contenitori virtuali — una riga per ospite con stato, tipo distintivo, nome, ID e in linea CPU / percentuali di memoria / disco",
"imageCaption": "Il layout ottimizzato per dispositivi mobili dell'inventario — gli stessi dati mostrati dalla vista desktop, riprodotto in una singola colonna con le percentuali e gli indicatori di stato mantenuti compatti.",
"rowsIntro": "Ogni riga mostra:",
"rows": [
"<strong>Icona di stato</strong> — triangolo verde per In esecuzione o quadrato rosso per Arrestato. Il resto della riga si attenua per i guest arrestati.",
"<strong>Tipo</strong> — <em>LXC</em> in ciano per container, <em>VM</em> in viola per macchine virtuali.",
"<strong>Nome</strong> — hostname o nome visualizzato del guest.",
"<strong>VMID</strong> — l'ID numerico Proxmox sotto il nome.",
"<strong>Inline metrics</strong> — tre percentuali con la loro icona (CPU %, Memory %, Disk %). Ogni icona gira arancione quando la metrica attraversa una soglia di attenzione (ad esempio la memoria sopra il 90 %), quindi una scansione rapida ti dice quale ospite è sotto pressione senza aprirlo."
],
"clickHint": "Un clic su una riga apre i dettagli, sia per guest attivi sia per guest arrestati.",
"mobileTitle": "L'elenco è costruito mobile-first",
"mobileBody": "Su telefoni e finestre strette, tipo, nome, ID e tre percentuali si impilano in una colonna, come nella schermata. Le viste ampie li distribuiscono in orizzontale. In ogni caso tutta la riga è selezionabile per aprire i dettagli."
},
"drillIn": {
"heading": "Finestra dei dettagli del guest",
"intro": "La finestra mostra nome, VMID, tipo, stato e tempo di attività. Le schede si adattano al guest: <strong>Stato</strong>, <strong>App</strong> e <strong>Aggiornamenti</strong> per applicazioni LXC, <strong>Montaggi</strong> se presenti, <strong>Log</strong> per container OCI manager Apps, <strong>Backup</strong> e <strong>Firewall</strong>. La barra fissa mantiene disponibili controlli del ciclo di vita e terminale LXC.",
"statusTitle": "Tab 1 — Stato",
"statusImageAlt": "Dettagli del guest — Stato con CPU, memoria e disco in tempo reale, I/O disco e rete, logo del sistema e Risorse / Indirizzi IP",
"statusImageCaption": "Stato: CPU, memoria e disco con barre in alto; totali I/O (disco letto/scritto, rete ricevuta/inviata); poi Risorse con Note, + Info ed elenco degli indirizzi IP.",
"statusIntro": "La scheda iniziale permette di verificare lo stato del guest. Tre blocchi:",
"liveTitle": "1. Riga delle metriche in tempo reale",
"liveItems": [
"<strong>Utilizzo CPU (X core)</strong> — percentuale con barra. I core configurati nell'intestazione spiegano a cosa corrisponde il 100 %.",
"<strong>Memoria</strong> — <em>usata / massima</em> in GB con barra.",
"<strong>Disco</strong> — <em>usato / massimo</em> per l'immagine del disco principale, nello stesso formato."
],
"ioTitle": "2. Totale I/O + logo OS",
"ioItems": [
"<strong>I/O disco</strong> — letture (↓) e scritture (↑) totali dall'avvio. Aiuta a individuare aumenti improvvisi di I/O rispetto all'attività abituale del guest.",
"<strong>I/O rete</strong> — download (↓) e upload (↑) totali, con lo stesso principio.",
"<strong>Logo del sistema</strong> — icona Debian / Ubuntu / Alpine / Windows / ecc. secondo il sistema rilevato. Aiuta a identificare le finestre aperte."
],
"resourcesTitle": "3. Blocco risorse",
"resourcesIntro": "Configurazione secondo Proxmox: core CPU, memoria (<code>maxmem</code> configurato) e swap. Due sezioni espandibili nell'intestazione:",
"resourcesItems": [
"<strong>Note</strong> — descrizione modificabile del guest. Salvare richiama <code>PUT /api/vms/&lt;vmid&gt;/config</code> e scrive in <code>/etc/pve/qemu-server/&lt;vmid&gt;.conf</code> o <code>/etc/pve/lxc/&lt;vmid&gt;.conf</code>.",
"<strong>+ Info</strong> — campi extra troppo verbosi per la visualizzazione predefinita: modalità bios, tipo macchina, stato agente, voci passanti hostpci, punti di montaggio (CT), ordine di avvio."
],
"ipsTitle": "4. Indirizzi IP",
"ipsBody": "Ogni indirizzo IPv4 o IPv6 del guest appare in una etichetta verde. L'elenco è vuoto se il guest è fermo o se una VM non ha l'agente QEMU; i LXC comunicano gli indirizzi direttamente.",
"appTitle": "Tab 2 — App (solo LXC)",
"appIntro": "Registra app LXC, salva link web e confronta opzionalmente le versioni. I suggerimenti sono in cache dall'avvio; <strong>Trova applicazioni</strong> ripete la ricerca per questo LXC dopo nuove installazioni.",
"appLinkLead": "Vedere la",
"appLinkLabel": "pagina app dedicata",
"appLinkTail": "per la ricerca in cache, la registrazione assistita da catalogo, i collegamenti web Docker e i rivelatori di versione.",
"updatesTitle": "Tab 3 — Aggiornamenti (solo LXC)",
"updatesIntro": "<strong>Pacchetti del sistema</strong>, app, <strong>Docker Engine</strong> e immagini Docker restano obiettivi distinti. Ciascuno si esegue da solo o si seleziona per un'azione in blocco o pianificata.",
"updatesLinkLead": "Vedere la",
"updatesLinkLabel": "pagina dedicata agli aggiornamenti",
"updatesLinkTail": "per programmi di aggiornamento integrati e personalizzati, ricreazione Docker, selezione in blocco, opzioni di sicurezza e pianificazione.",
"mountsTitle": "Scheda 4 — Montaggi (solo LXC, se presenti)",
"mountsImageAlt": "Dettagli LXC, Montaggi: volumi PVE, bind mount dell'host o dello storage PVE e NFS/CIFS montati nel CT. Ogni scheda mostra tipo, capacità, byte usati/totali, opzioni e stato: verde sano, ambra sola lettura/divergente, rosso non raggiungibile.",
"mountsImageCaption": "La scheda Montaggi compare solo per i container LXC e solo se esiste almeno un punto di montaggio o un montaggio remoto temporaneo. Un CT senza montaggi non mostra questa scheda.",
"mountsIntro": "Proxmox mostra i montaggi configurati come <code>mpX</code>, ma non quelli aggiunti nel CT con <code>mount.cifs</code>, NFS tramite <code>autofs</code> e altri. Questa scheda unisce <strong>entrambe le viste</strong>: montaggi configurati <strong>e</strong> rilevati nel container, con stato per montaggio e capacità quando il server la può ricavare.",
"mountTypesTitle": "Tipi di montaggio rilevati",
"mountTypesItems": [
"<strong>Volume PVE</strong> — storage gestito da Proxmox, come subvolume ZFS, directory o Ceph RBD. La capacità deriva dalle statistiche PVE e coincide con Proxmox.",
"<strong>Bind da storage PVE</strong> — voce <code>mpX</code> che punta a un percorso di uno storage noto a PVE.",
"<strong>Bind dall'host</strong> — voce <code>mpX</code> con un percorso dell'host (<code>/mnt/something</code>). La capacità viene da <code>df</code> su quel percorso.",
"<strong>Montaggio temporaneo nel CT</strong> — esiste <em>solo</em> nel namespace dei montaggi del container, come una condivisione NFS montata dal CT stesso. La capacità viene letta tramite <code>pct exec &lt;vmid&gt; df</code>, l’unico modo per rilevarla: dall’host, <code>/proc/&lt;pid&gt;/root</code> non espone le statistiche effettive del montaggio remoto."
],
"mountStateTitle": "Punto di stato e avvisi per scheda",
"mountStateItems": [
"<green/> <strong>Verde</strong> — montaggio sano e raggiungibile.",
"<amber/> <strong>Ambra</strong> — configurato ma non montato, sola lettura o <em>bind zombie</em>. La sorgente sull'host è stata rimossa ma il CT la vede ancora montata, ad esempio dopo aver scollegato un disco USB o eseguito <code>umount</code> sull'host.",
"<red/> <strong>Rosso</strong> — non raggiungibile: la verifica non raggiunge il montaggio, per esempio una condivisione NFS con server inattivo."
],
"mountsCalloutTitle": "Informazioni aggiuntive rispetto a Proxmox",
"mountsCalloutBody": "Una vista dei percorsi da cui il container legge o su cui scrive, con la relativa capacità. Le condivisioni NFS o CIFS montate all’interno del CT, invisibili all’interfaccia web Proxmox, compaiono con la stessa presentazione e gli stessi controlli degli altri punti di montaggio. I montaggi remoti non più raggiungibili e i bind mount non più validi vengono segnalati prima che causino problemi durante un backup.",
"logsTitle": "Tab 5 — Log (solo contenitori OCI)",
"logsBody": "Solo per container OCI manager Apps. Mostra la console del processo principale dell'immagine da <code>/var/log/proxmenux/oci/VMID.console.log</code>: ultime 100, 500 o 1000 righe, aggiornamento in tempo reale durante il funzionamento, filtro e download. Rilegge il file all'apertura, anche a container fermo. Dettagli: <ociLink>Container OCI in ProxMenux Monitor</ociLink>.",
"backupsTitle": "Tab 6 — Backup",
"backupsImageAlt": "Dettagli del guest — Backup con elenco delle copie disponibili, destinazioni, dimensioni e pulsante Crea backup",
"backupsImageCaption": "Tutti i backup del guest sugli storage Proxmox configurati, dal più recente. L'intestazione indica il numero.",
"backupsIntro": "Elenca i backup del guest sugli storage Proxmox, dal più recente. Il contatore nel titolo permette di vedere se esistono backup. Ogni riga mostra:",
"backupsItems": [
"<strong>Data e ora</strong> — momento dell'esecuzione.",
"<strong>Destinazione</strong> — storage (PBS-Cloud, PBS-Local, NFS-Backup, …), colorato secondo lo stato.",
"<strong>Dimensione</strong> — dimensione finale del backup su disco."
],
"backupsOutro": "<strong>+ Crea backup</strong> avvia un backup sullo storage indicato come “Backup target” in Proxmox. Il ripristino si esegue nell'interfaccia web Proxmox; Monitor mostra i backup recenti del guest e permette di crearne.",
"firewallTitle": "Scheda 7 — Firewall",
"firewallIntro": "Legge il log firewall Proxmox del guest direttamente dall'host, senza servizi aggiuntivi né richieste periodiche. La scheda è sempre presente; il contenuto dipende dalla attivazione del firewall e dalla registrazione dei pacchetti da parte di una regola.",
"firewallItems": [
"<strong>Firewall disattivato</strong> — avviso ambra con il percorso per attivarlo in Proxmox (<em>&lt;Container|VM&gt; → Firewall → Options</em>) e il requisito di almeno una regola con <code>log: info</code> o superiore per mostrare i pacchetti.",
"<strong>Firewall attivo, nessun evento</strong> — la vista vuota ricorda il requisito di registrazione, utile subito dopo la attivazione.",
"<strong>Eventi presenti</strong> — pannello a spaziatura fissa scorrevole con voci originali per azione: <green>ACCEPT</green> verde, <orange>REJECT</orange> arancione, <red>DROP</red> rosso. Il contatore nell'intestazione indica le voci caricate."
],
"firewallRefresh": "<em>Aggiorna</em> carica le ultime voci su richiesta. Senza aggiornamento automatico, l'elenco mostra il momento dell'apertura o dell'ultimo clic. La fonte è <code>/var/log/pve-firewall.log</code>, filtrata per VMID tramite <code>GET /api/vms/&lt;vmid&gt;/firewall/log</code>.",
"firewallCalloutTitle": "Perché è qui quando l'UI Proxmox lo mostra già?",
"firewallCalloutBody": "Evita di passare a Proxmox e mantiene la vista dello stesso VMID: avvia il guest, controlla montaggi ed eventi firewall, poi fermalo dal pannello. Le regole si modificano in Proxmox; Monitor non le cambia.",
"actionBarTitle": "Barra di azione inferiore",
"actionBarIntro": "Sempre visibile ai piedi del modale indipendentemente da quale scheda è attiva:",
"consoleItem": "<strong>Console</strong>, solo per LXC attivi, apre <code>pct enter &lt;vmid&gt;</code> nel container. Usa xterm.js e WebSocket come la <link>scheda Terminale</link>, con la <strong>barra per dispositivi mobili</strong>: ESC, TAB, frecce, Invio e Ctrl+C / Ctrl+X / Ctrl+R. Funziona da telefono o tablet. Per le VM usa la console Proxmox noVNC.",
"lifecycleIntro": "Quattro pulsanti in griglia 2×2 inviano <code>POST /api/vms/&lt;vmid&gt;/control</code> con la <code>action</code> corrispondente. Si abilitano in base allo stato del guest.",
"headerButton": "Pulsante",
"headerEnabled": "Abilitato quando",
"headerAction": "Azione inviata all'host",
"lifecycleRows": [
{
"button": "Avvia",
"color": "green",
"enabled": "Il guest è arrestato.",
"action": "qm start / pct start"
},
{
"button": "Spegni",
"color": "blue",
"enabled": "Il guest è in esecuzione.",
"action": "qm shutdown / pct shutdown — spegnimento ordinato, ACPI"
},
{
"button": "Riavvia",
"color": "blue",
"enabled": "Il guest è in esecuzione.",
"action": "qm reboot / pct reboot — riavvio ordinato"
},
{
"button": "Forza arresto",
"color": "red",
"enabled": "Il guest è in esecuzione.",
"action": "qm stop / pct stop — spegnimento forzato"
}
],
"forceStopTitle": "Forza arresto interrompe subito l'esecuzione",
"forceStopBody": "<strong>Forza arresto</strong> salta lo spegnimento, come togliere l'alimentazione. Usa <strong>Spegni</strong> finché il guest risponde. Forza solo se lo spegnimento si blocca e accetti il rischio di perdita dei dati. Il pulsante rosso e l'etichetta aiutano a evitare clic accidentali."
},
"dataCollected": {
"heading": "Come vengono raccolti i dati",
"headerSection": "Sezione della scheda",
"headerEndpoint": "Endpoint",
"headerSource": "Fonte",
"rows": [
{
"section": "Elenco dell'inventario",
"endpoint": "/api/vms",
"source": "<code>pvesh get /cluster/resources --type vm</code> per VM e CT."
},
{
"section": "Pannello dettagli (configura, rete, dischi)",
"endpoint": "/api/vms/<vmid>",
"source": "<code>qm config &lt;id&gt;</code> per VM / <code>pct config &lt;id&gt;</code> per CT."
},
{
"section": "Grafico delle metriche del guest",
"endpoint": "/api/vms/<vmid>/metrics",
"source": "Dati RRD PVE (<code>pvesh get /nodes/&lt;node&gt;/qemu/&lt;id&gt;/rrddata</code>) adattati alla visualizzazione in grafico."
},
{
"section": "Risultati recenti del log Proxmox",
"endpoint": "/api/vms/<vmid>/logs",
"source": "<code>pvesh get /nodes/&lt;node&gt;/&lt;qemu|lxc&gt;/&lt;vmid&gt;/log --start 0 --limit 1000</code>. Se il comando fallisce restituisce uno elenco vuoto; non fornisce tutti i log interni del guest."
},
{
"section": "Backup disponibili per gli ospiti",
"endpoint": "/api/vms/<vmid>/backups",
"source": "<code>pvesm list &lt;storage&gt;</code> filtrato da VMID."
},
{
"section": "Log firewall del guest (scheda Firewall)",
"endpoint": "/api/vms/<vmid>/firewall/log",
"source": "<code>/var/log/pve-firewall.log</code> filtrato da VMID."
},
{
"section": "Pulsanti di alimentazione (Start / Stop / Reboot / Shutdown)",
"endpoint": "/api/vms/<vmid>/control",
"source": "<code>qm start|stop|reboot|shutdown</code> o equivalenti <code>pct</code>."
}
],
"codeComment1": "# Confronta i dati del pannello con PVE",
"codeComment2": "# Esamina la configurazione del guest come nella finestra",
"codeComment3": "# VM",
"codeComment4": "# CT"
},
"whereNext": {
"heading": "Dove proseguire",
"items": [
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tailRich": " — categoria VM e Container: avvio fallito, timeout QMP ed errori di arresto CT."
},
{
"label": "Notifiche",
"href": "/docs/monitor/notifications",
"tailRich": " — cosa attivano gli eventi <code>vm_*</code>, <code>ct_*</code>, <code>migration_*</code> e <code>backup_*</code> nelle fasi successive."
},
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tailRich": " — endpoint di VM e backup."
},
{
"label": "Indice del pannello",
"href": "/docs/monitor/dashboard",
"tailRich": "— le altre schede."
},
{
"label": "ProxMenux → Creare VM",
"href": "/docs/create-vm",
"tailRich": " — creazione dei sistemi: modelli NAS (Synology e altri), VM Linux/Windows e impostazioni adatte a Proxmox."
}
]
}
}
@@ -0,0 +1,372 @@
{
"meta": {
"title": "Monitoraggio Proxmox — CPU, memoria, archiviazione, SMART, ZFS, log | ProxMenux",
"description": "Monitoraggio proattivo di Proxmox VE: dieci categorie ogni cinque minuti (CPU e temperatura, memoria e swap, archiviazione, dischi/SMART, rete, VM, servizi, log, aggiornamenti e sicurezza), quattro livelli di gravità, silenziamento per categoria, pulizia degli errori risolti, cronologia permanente dei dischi e notifiche Telegram, Discord, Gotify o e-mail.",
"ogTitle": "Monitoraggio Proxmox — CPU, memoria, archiviazione, SMART, ZFS, log",
"ogDescription": "Monitoraggio proattivo di Proxmox VE in dieci categorie, con livelli di gravità, durata del silenziamento e notifiche per evento.",
"twitterTitle": "Monitoraggio dello stato di Proxmox | ProxMenux",
"twitterDescription": "Monitoraggio proattivo di Proxmox VE in dieci categorie, con livelli di gravità e notifiche."
},
"header": {
"title": "Monitoraggio integrità",
"description": "Il controllo continuo esamina dieci categorie dello stato dell’host ogni cinque minuti, raccoglie misure tra i cicli, deduplica i rilevamenti in eventi strutturati e alimenta dashboard, notifiche e riscrittura IA facoltativa da un’unica fonte.",
"section": "Monitor di ProxMenux"
},
"intro": {
"title": "Uno scanner, tre consumatori",
"body": "Un thread in background esegue il ciclo completo ogni cinque minuti e salva ogni rilevamento in SQLite con un <code>error_key</code> stabile. Così <strong>(1)</strong> la dashboard mostra lo stato attuale, <strong>(2)</strong> il sistema di notifiche distribuisce i nuovi eventi e <strong>(3)</strong> l’assistente IA facoltativo riscrive gli avvisi in linguaggio semplice. Un’unica configurazione alimenta tutti questi componenti."
},
"howItWorks": {
"heading": "Come funziona",
"intro": "Il monitor usa due thread paralleli. Un <strong>campionatore di metriche</strong> leggero riempie i buffer di CPU, memoria e temperatura. Il <strong>ciclo completo di controllo</strong> legge i buffer, valuta le condizioni prolungate ed esegue gli altri controlli circa ogni cinque minuti, poi salva i rilevamenti in SQLite per dashboard e notifiche.",
"scannerTitle": "Dal campione al ritrovamento memorizzato",
"scannerCaption": "Il campionatore riempie i buffer tra i cicli: CPU ogni 5 s, memoria ogni 30 s e temperatura ogni 15 s. Non valuta gli avvisi. Il ciclo completo analizza i buffer ed esegue i controlli più pesanti su SMART, ZFS, log e servizi prima di salvare i rilevamenti in SQLite.",
"scannerArrowLabel": "passo",
"scannerNodes": {
"samplerLabel": "Campionatore di metriche",
"samplerDetail": "Uso CPU 5 s\nMemoria 30 s\nTemperatura 15 s\n→ buffer storici",
"cycleLabel": "ciclo completo di salute",
"cycleDetail": "Ogni 5 min\nLegge i buffer\n+ controlli diretti\n(SMART, ZFS,\nservizi, log…)",
"checksLabel": "Controlli per categoria",
"checksDetail": "Dieci categorie\n(CPU, memoria,\narchiviazione, dischi,\nrete, VM,\nservizi, log,\naggiornamenti, sicurezza)",
"sqliteLabel": "SQLite",
"sqliteDetail": "tabella errors\n(attivi +\nsilenziati)\n+ disk_observations\n(cronologia permanente\nper disco)"
},
"notifTitle": "Dal rilevamento salvato all’utente",
"notifCaption": "Percorso delle notifiche. La stessa tabella degli errori alimenta anche la dashboard (elenchi degli avvisi attivi e silenziati) e la pulizia a fine ciclo che risolve automaticamente le voci obsolete. Entrambe leggono i dati direttamente, senza passare dal dispatcher.",
"notifArrowLabel": "evento",
"notifNodes": {
"errorsLabel": "errori tabella",
"errorsDetail": "Righe attive +\nsilenziate\nidentificate da\nerror_key",
"dispatcherLabel": "Inviatore di notifica",
"dispatcherDetail": "Eventi nuovi +\naggravati in coda\nSecondo le opzioni\n+ intervallo minimo",
"templatesLabel": "Modelli + riscrittura AI",
"templatesDetail": "Modello\nper evento\n→ riscrittura IA\nfacoltativa in\nlinguaggio semplice",
"channelsLabel": "Canali",
"channelsDetail": "Telegram\nDiscord\nGotify\nPosta elettronica (SMTP)"
}
},
"categories": {
"heading": "Le dieci categorie",
"imageAlt": "Vista del monitor di stato con le dieci categorie e i relativi stati: CPU, memoria, archiviazione, dischi, rete, VM, servizi, log, aggiornamenti e sicurezza",
"imageCaption": "Salute Monitor vista — le dieci categorie con il loro stato attuale. Le categorie su un host sano mostrano tutto OK; gli avvisi e gli eventi critici appaiono in linea con le righe che li hanno prodotti.",
"intro": "Ogni ciclo esegue dieci controlli indipendenti. Ciascuno restituisce uno dei quattro stati (<strong>OK</strong>, <strong>INFO</strong>, <strong>WARNING</strong>, <strong>CRITICAL</strong>) e dati strutturati, come nomi dei dispositivi, estratti dei log e soglie precise, mostrati nella dashboard e nelle notifiche.",
"headerCategory": "Categoria",
"headerChecks": "Sottocontrolli",
"headerEvents": "Eventi tipici",
"rows": [
{
"category": "CPU e temperatura",
"checks": "CPU utilizzo con isteresi, temperatura del sensore",
"events": "Uso elevato e prolungato della CPU; avvisi di temperatura basati sulle letture campionate."
},
{
"category": "Memoria e swap",
"checks": "RAM utilizzo, utilizzo swap",
"events": "Pressione prolungata sulla memoria; attività dell’OOM-killer; esaurimento dello swap."
},
{
"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."
},
{
"category": "Disco e SMART",
"checks": "SMART, errori I/O in dmesg, pool ZFS, LVM, errori del filesystem",
"events": "Controllo SMART fallito; settori riallocati o in attesa; errori I/O ATA; pool ZFS DEGRADED / FAULTED; ext4 rimontato in sola lettura."
},
{
"category": "Rete",
"checks": "Connettività, stato collegamento, latenza gateway",
"events": "Bridge o bond down; gateway irraggiungibile; persistenti picchi di latenza."
},
{
"category": "VM e container",
"checks": "Comunicazione QMP, avvio VM, avvio container",
"events": "Avvio della VM fallito; arresto del CT fallito; timeout del socket QMP; configurazione o disco mancanti dopo una clonazione."
},
{
"category": "Servizi PVE",
"checks": "<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>, modalità cluster",
"events": "Servizio arrestato in modo anomalo; quorum del cluster perso; <code>pmxcfs</code> bloccato."
},
{
"category": "Log di sistema",
"checks": "Errori persistenti, punte di errore, cascata di errore, messaggi critici del kernel",
"events": "Errori identici ripetuti; improvvisa scoppio di avvisi (modello cascata); <code>BUG:</code> / <code>OOPS:</code> / <code>oom-killer</code> in dmesg."
},
{
"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."
},
{
"category": "Sicurezza e certificati",
"checks": "Tentativi di accesso, certificati in scadenza, stato delle jail Fail2Ban se installato",
"events": "Ripetuti errori di autenticazione SSH o web; certificato PVE in scadenza tra meno di 30 giorni; blocchi Fail2Ban attivi."
}
]
},
"severity": {
"heading": "Modello di gravità",
"headerStatus": "Stato",
"headerColour": "Colore",
"headerMeaning": "Significato",
"headerNotification": "Notifica",
"rows": [
{
"status": "OK",
"colour": "Verde",
"meaning": "Stato regolare. Nessun rilevamento in questa categoria.",
"notification": "Silenzioso."
},
{
"status": "INFO",
"colour": "Blu",
"meaning": "Condizione transitoria o già risolta degna di nota una volta. Utilizzato anche per le categorie che hanno <em>solo</em> elementi abbandonati rimasti.",
"notification": "Facoltativa. Ogni tipo di evento può essere attivato o disattivato per ciascun canale."
},
{
"status": "WARNING",
"colour": "Giallo",
"meaning": "L'attenzione è necessaria ma l'host è ancora funzionale. Causa non banale — leggere i dettagli.",
"notification": "Inviata quando il tipo di evento è attivo per il canale."
},
{
"status": "CRITICAL",
"colour": "Rosso",
"meaning": "Funzionalità rotta o perdita di dati possibile. Azione richiesta.",
"notification": "Inviata se il tipo di evento è attivo per il canale. Un avviso di temperatura CPU CRITICAL si riattiva per sicurezza anche se era stato silenziato."
}
],
"infoNote": "Una categoria <strong>OK</strong> con eventi ancora nel periodo di silenziamento appare come <strong>INFO</strong>, per ricordare che alcuni avvisi sono stati silenziati.",
"unknownTitle": "UNKNOWN quando un controllo non può essere completato",
"unknownBody": "Un controllo non disponibile restituisce <code>UNKNOWN</code>; dopo tre cicli consecutivi viene salvato un rilevamento persistente. La dashboard lo mostra in giallo. Lo stato complessivo limita <code>UNKNOWN</code> a <strong>WARNING</strong>: il solo controllo non disponibile non rende critico l’host."
},
"dashboardView": {
"heading": "La vista del cruscotto",
"intro": "Il monitor si trova nella scheda <strong>Panoramica</strong>. L’indicatore nell’intestazione (Regolare / Avviso / Critico) apre una finestra con due elenchi:",
"items": [
"<strong>Attivi</strong> — categorie con rilevamenti irrisolti. Espandendo una riga si vedono i controlli coinvolti, il testo originale <code>reason</code>, l’ID del dispositivo o della VM e, se disponibile, un collegamento ad Archiviazione, Rete, VM, Log o Hardware.",
"<strong>Silenziati</strong> — elementi riconosciuti dall’utente e ancora nel periodo di silenziamento. Ogni riga mostra tempo restante e durata scelta. Alla scadenza esce dall’elenco; se la causa persiste e la categoria lo supporta, torna tra gli <em>Attivi</em>."
],
"pillTitle": "L’indicatore riflette la categoria più grave",
"pillBody": "Il colore dell’intestazione riflette la gravità massima: CRITICAL → rosso, altrimenti WARNING → giallo, altrimenti INFO → blu, altrimenti verde. La stessa logica controlla il punto della favicon e il badge PWA.",
"updateNowTitle": "Pulsante Aggiorna ora nell’intestazione della panoramica",
"updateNowBody1": "Se <em>Aggiornamenti di sistema</em> segnala aggiornamenti in attesa, appare <strong>Aggiorna ora</strong> accanto all’indicatore. La finestra esegue la procedura di <em>ProxMenux → Settings post-install Proxmox → Proxmox System Update</em>: pulizia dei repository, <code>apt full-upgrade</code> tramite <code>update-pve-safe.sh</code>, ricompilazione DKMS dei driver gestiti con un nuovo kernel, autoremove/autoclean e richiesta di riavvio se cambia il kernel. La finestra mostra l’avanzamento in tempo reale.",
"updateNowBody2": "Al termine, chiudere la finestra richiama <code>GET /api/health/details?refresh=1</code> e invalida la cache dell’endpoint. Aggiornamenti in attesa e gravità vengono ricalcolati dal nuovo stato dei pacchetti: il badge scompare senza attendere il ciclo successivo. Se l’host è già aggiornato, il pulsante resta nascosto."
},
"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:",
"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.",
"step2": "<strong>Durata del silenziamento per categoria</strong>. In Impostazioni → Monitoraggio, o tramite <code>POST /api/health/settings</code>, ciascuna delle dieci categorie ha una durata predefinita usata senza scelta individuale:",
"imageAlt": "Durata del silenziamento per categoria in Impostazioni → Monitoraggio",
"imageCaption": "Un menu per categoria. Scegli una durata lunga per eventi ripetitivi, come aggiornamenti in attesa, e breve per quelli da rivalutare presto. Sotto sono elencati i silenziamenti attivi.",
"outro": "Durante il silenziamento il controllo continua e aggiorna <code>last_seen</code>, senza nuove notifiche. Alla scadenza il ciclo successivo rivaluta la causa: l’avviso può riattivarsi oppure sparire se il problema è risolto.",
"activeSuppressionsTitle": "Rivedere e annullare i silenziamenti attivi",
"activeSuppressionsBody": "Gli avvisi silenziati, temporanei o permanenti, sono in <strong>Impostazioni → Monitoraggio → Silenziamenti attivi</strong>. Ogni riga mostra identificatore, categoria, gravità, data e tempo restante. <strong>Riattiva</strong> rimuove il riconoscimento per il prossimo controllo. Da qui si annullano i silenziamenti permanenti e si interrompono quelli temporanei. Attiva <em>Modifica</em>, scegli le righe da riattivare (bordo verde e testo barrato), poi salva. Annulla svuota la selezione.",
"autoTitle": "Silenziamento automatico al cambiare la durata",
"autoBody": "Scegliere una durata diversa dalle 24 ore predefinite ha un secondo effetto: <strong>i nuovi rilevamenti della categoria vengono salvati già riconosciuti</strong>. Una settimana scelta per i dischi vale quindi anche per i nuovi avvisi, senza silenziarli singolarmente. Appaiono direttamente tra i silenziati con la durata scelta. Le categorie lasciate a 24 ore mantengono il comportamento normale: i nuovi rilevamenti restano attivi finché intervieni.",
"tempTitle": "Eccezione per temperatura CPU CRITICAL",
"tempBody": "La persistenza prevede una regola speciale per <strong>Temperatura CPU CRITICAL</strong>: un tale record ignora il riconoscimento precedente e il silenziamento automatico. Ciò non significa che ogni controllo di temperatura generi un record critico al superamento di una soglia configurata.",
"nonDismissableTitle": "Quali rilevamenti si possono silenziare?",
"nonDismissableBody": "La finestra mostra Silenzia solo se il controllo restituisce esplicitamente dismissable = true. Un valore falso o assente nasconde il pulsante. La gravità non determina questo permesso: diversi controlli critici consentono il riconoscimento. Gli esempi descrivono i dati attuali; silenziare un avviso non ne risolve la causa.",
"headerFinding": "Rilevamento",
"headerWhy": "Comportamento del silenziamento",
"rows": [
{
"finding": "Temperatura CPU: avviso / critica",
"why": "L’avviso basato sui campioni di temperatura consente esplicitamente il silenziamento. Una regola separata ignora il riconoscimento se arriva un record di temperatura CPU con gravità CRITICAL."
},
{
"finding": "Spazio critico del filesystem radice",
"why": "I controlli dello spazio consentono il silenziamento anche con utilizzo critico. Riconoscere l’avviso non libera spazio né elimina il rischio di scritture fallite."
},
{
"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."
},
{
"finding": "Errori del disco I/O con SMART FAILED",
"why": "I rilevamenti del disco salvati dal journal possono consentire il silenziamento. SMART FAILED richiede comunque un’indagine; il pulsante dipende dall’indicatore del controllo, non dal solo testo dell’avviso."
},
{
"finding": "Interfaccia di rete DOWN",
"why": "I controlli persistenti di interfaccia DOWN consentono il silenziamento. Questo non ripristina bridge, bond, collegamento fisico o accesso remoto."
},
{
"finding": "Eventi I/O su dischi sani (INFO)",
"why": "Gli eventi ATA o dmesg transitori con SMART sano possono essere informativi e risolversi da soli. Le righe informative possono non offrire Silenzia; il controllo stabilisce quando la condizione è risolta."
}
],
"principle": "Usa il pulsante mostrato per il rilevamento effettivo, senza dedurne la disponibilità dalla categoria o gravità. Il riconoscimento controlla presentazione e notifiche. I controlli di ripristino e la cronologia del disco restano separati."
},
"autoresolve": {
"heading": "Autorisoluzione e pulizia",
"intro": "Molti avvisi devono sparire quando cessa la causa: una VM torna ad avviarsi, un disco viene rimosso o la temperatura torna normale. La pulizia alla fine di ogni ciclo di cinque minuti applica queste regole:",
"headerTrigger": "Trigger",
"headerAction": "Azione",
"rows": [
{
"trigger": "Uso CPU o temperatura tornati alla normalità.",
"action": "Segnato risolto. Esce dalla lista attiva."
},
{
"trigger": "Pressione di memoria indietro sotto la soglia di avvertimento dopo un OOM / avviso di memoria.",
"action": "Segnato risolto."
},
{
"trigger": "VM / CT richiamato dall'errore non esiste più (<code>qm status</code> / <code>pct status</code> non zero).",
"action": "Segnato risolto come risorsa rimosso."
},
{
"trigger": "Il disco richiamato dall'errore non è più presente in <code>/dev/</code>.",
"action": "Segnato risolto come dispositivo rimosso. La storia dell'osservazione permanente è conservata (vedi sezione successiva)."
},
{
"trigger": "Rilevamenti dal journal di sistema (categoria <code>logs</code>, voci SMART, errori ATA o I/O) alla scadenza del silenziamento.",
"action": "Vengono rimossi. Ogni scansione esamina le nuove voci del journal da quel momento; la stessa vecchia riga non viene emessa di nuovo."
},
{
"trigger": "Errori risolti da oltre sette giorni.",
"action": "Eliminati dal database per contenere la tabella. La cronologia delle notifiche è indipendente e viene conservata più a lungo."
}
],
"permanentTitle": "Silenziare permanentemente non significa risolvere",
"permanentBody": "Una durata di categoria pari a <code>-1</code> (<em>permanente</em>) silenzia i futuri avvisi degli elementi riconosciuti, senza saltare il controllo di risoluzione automatica. Se la causa scompare, per esempio dopo la rimozione della risorsa o il rientro sotto soglia, l’elemento viene comunque ripulito automaticamente."
},
"observations": {
"heading": "Osservazioni dei dischi — la cronologia permanente",
"intro": "Gli eventi dei dischi meritano di essere conservati. Un avviso SMART su <code>/dev/sdh</code> alle 02:14 resta utile dopo la fine della raffica di I/O e la risoluzione automatica: il disco ha ormai dei precedenti. Per questo il monitor mantiene una tabella <strong>permanente</strong> separata: <code>disk_observations</code>.",
"headerProperty": "Proprietà",
"headerErrors": "Tabella <code>errors</code> (Attiva)",
"headerObs": "Tabella <code>disk_observations</code>",
"rows": [
{
"property": "Scopo",
"errors": "Alimenta la vista dello stato <em>attuale</em> e l’invio delle notifiche.",
"obs": "Registro di controllo permanente per disco."
},
{
"property": "Risoluzione automatica",
"errors": "Sì — le righe sono cancellate quando la condizione scompare.",
"obs": "No: le voci restano finché l’utente non le archivia esplicitamente."
},
{
"property": "Chiave di deduplicazione",
"errors": "<code>error_key</code> (es. <code>smart_sdh</code>).",
"obs": "<code>(disk_registry_id, error_type, error_signature)</code> con firme stabili spogliate di dati volatili."
},
{
"property": "Dove appare",
"errors": "Finestra del monitor (elenchi Attivi / Silenziati).",
"obs": "Scheda del disco nella sezione <strong>Archiviazione</strong>, con un indicatore «X obs.» per disco."
},
{
"property": "Cosa registra",
"errors": "Qualunque cosa stia attualmente fallendo.",
"obs": "Avvisi SMART (settori, temperatura, CRC, test automatici falliti), errori I/O (ATA / NVMe / dm), errori del filesystem ed eventi dei pool ZFS."
}
],
"outro": "Un avviso può sparire dalla dashboard mentre l’incidente resta nella cronologia del disco. Aprendo il disco in Archiviazione, la scheda mostra il numero di osservazioni pendenti con date, gravità e messaggi originali non elaborati. Aiuta a decidere se sostituire l’unità.",
"renameTitle": "Le variazioni del nome del dispositivo vengono unite automaticamente",
"renameBody": "I dischi possono apparire inizialmente con nomi provvisori come <code>ata8</code> o <code>nvme0n1p3</code>. Le osservazioni vengono raggruppate per numero di serie noto: se un evento è registrato come <code>ata8</code> e il disco poi identificato come <code>sdh</code>, al ciclo seguente le vecchie osservazioni vengono associate a <code>sdh</code>, mantenendo unita la cronologia."
},
"notification": {
"heading": "Dal rilevamento alla notifica",
"intro": "Ogni errore attivo può anche generare una notifica. Il percorso:",
"items": [
"Lo scanner registra il risultato con la categoria + gravità + dettagli strutturati.",
"Se il tipo di evento è <strong>attivo</strong> nelle notifiche globali e il canale non ha silenziato la categoria, l’evento viene messo in coda.",
"Il motore dei modelli produce titolo e corpo dai dati strutturati. Se la riscrittura IA è attiva, la coppia passa anche al fornitore configurato per una versione in linguaggio semplice.",
"Il canale invia un messaggio Telegram, un embed Discord, una notifica push Gotify o un’e-mail. L’esito è salvato in <code>notification_history</code>.",
"Silenziare un avviso avvia il periodo di sospensione. Durante quel periodo nuove rilevazioni dello stesso <code>error_key</code> normalmente non generano notifiche né vengono accodate per la scadenza. Resta l’eccezione per la temperatura critica della CPU."
],
"outro": "La configurazione dei canali — token del bot Telegram, URL webhook, chiavi IA, opzioni per evento e per canale — è descritta in <notifLink>Notifiche</notifLink> e <aiLink>Assistente IA</aiLink>."
},
"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.",
"headerEndpoint": "Endpoint",
"headerMethod": "Metodo",
"headerUse": "Uso",
"rows": [
{
"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."
},
{
"endpoint": "/api/health/status",
"method": "GET",
"use": "Stato complessivo: un livello di gravità e una sintesi. Richiede autenticazione."
},
{
"endpoint": "/api/health/details",
"method": "GET",
"use": "Tutte le dieci categorie con i rispettivi stati e i dati strutturati che li hanno prodotti."
},
{
"endpoint": "/api/health/full",
"method": "GET",
"use": "Vista completa: categorie, errori attivi, silenziati e impostazioni personalizzate. Alimenta la finestra con una sola richiesta e usa una cache in background di sei minuti per risposte rapide."
},
{
"endpoint": "/api/health/active-errors",
"method": "GET",
"use": "Solo la lista attiva. Filtrabile da <code>?category=&lt;name&gt;</code>."
},
{
"endpoint": "/api/health/dismissed",
"method": "GET",
"use": "Solo l’elenco dei silenziati, con le ore restanti."
},
{
"endpoint": "/api/health/acknowledge",
"method": "POST",
"use": "Corpo: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Silenzia un avviso per la durata configurata della categoria."
},
{
"endpoint": "/api/health/settings",
"method": "GET / POST",
"use": "Leggere o salvare la durata del silenziamento per categoria."
},
{
"endpoint": "/api/health/cleanup-orphans",
"method": "POST",
"use": "Pulizia manuale degli errori di dispositivi o VM rimossi. Idempotente."
}
],
"codeComment1": "# Ottenere lo stato attuale per uno script",
"codeComment2": "# Silenziare un errore specifico",
"codeComment3": "# Imposta a una settimana la sospensione della categoria dischi"
},
"whereNext": {
"heading": "Come proseguire",
"items": [
{
"label": "Dashboard",
"href": "/docs/monitor/dashboard",
"tail": " — da qui si apre la finestra del monitor nell’interfaccia."
},
{
"label": "Notifiche",
"href": "/docs/monitor/notifications",
"tail": " — canali, opzioni per evento, riscrittura IA e cronologia."
},
{
"label": "Assistente AI",
"href": "/docs/monitor/ai-assistant",
"tail": " — fornitore (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), modalità del prompt, dettaglio per canale e lingua."
},
{
"label": "Architettura",
"href": "/docs/monitor/architecture",
"tailRich": " — schema SQLite (<code>errors</code>, <code>disk_observations</code>, <code>events</code>) e frequenza dei thread in background."
}
]
}
}
+151
View File
@@ -0,0 +1,151 @@
{
"meta": {
"title": "ProxMenux Monitor — Dashboard Web self-hosted per Proxmox VE | ProxMenux",
"description": "ProxMenux Monitor è un dashboard web self-hosted per Proxmox VE: parametri host in tempo reale, archiviazione e dati SMART, rete, VM e contenitori, hardware, log, un terminale web integrato, un monitoraggio dello stato proattivo, notifiche a Telegram / Discord / Email, un assistente AI opzionale, un REST API e integrazioni con strumenti come Homepage e Home Assistant.",
"ogTitle": "ProxMenux Monitor: dashboard Web self-hosted per Proxmox VE",
"ogDescription": "Dashboard Proxmox VE in tempo reale: parametri host, archiviazione SMART, rete, VM e contenitori, hardware, log, terminale web, Health Monitor, notifiche, assistente AI, REST API.",
"twitterTitle": "ProxMenux Monitor | ProxMenux",
"twitterDescription": "Dashboard Proxmox VE self-hosted con Health Monitor, notifiche, assistente AI e REST API."
},
"header": {
"title": "ProxMenux Monitor",
"description": "Una dashboard web per Proxmox VE sul proprio host, distribuita come AppImage. Funziona come singolo servizio systemd, ascolta sulla porta TCP 8008 e serve API e interfaccia dallo stesso processo.",
"section": "ProxMenux Monitor"
},
"atGlance": {
"title": "In sintesi",
"body": "Singolo AppImage sull'host Proxmox → Flask backend (porta 8008) che raccoglie dati in tempo reale tramite <code>psutil</code>, <code>pvesh</code>, <code>smartctl</code>, <code>journalctl</code> → Dashboard Next.js servito dallo stesso processo. Autenticazione opzionale (password + 2FA), assistente AI opzionale, notifiche opzionali, REST API per integrazioni."
},
"hero": {
"alt": "ProxMenux Monitor dashboard: schermata di panoramica del sistema con CPU, widget di memoria, temperatura e tempo di attività",
"caption": "Schermata di destinazione predefinita: parametri a livello di host e stato di integrità a colpo d'occhio."
},
"coverage": {
"heading": "Cosa copre il dashboard",
"intro": "Otto sezioni principali, ciascuna con i propri endpoint API:",
"tableSection": "Sezione",
"tableWhat": "Cosa mostra",
"sections": [
{
"name": "Monitoraggio dello stato",
"description": "Avvisi attivi e ignorati su CPU, memoria, archiviazione, dischi, rete, servizi, log, VM, aggiornamenti e sicurezza. Gestisce il motore di notifica."
},
{
"name": "Archiviazione",
"description": "Pool di archiviazione Proxmox, dischi fisici (SATA / NVMe / USB), attributi SMART, stato dei pool ZFS, usura e vita utile, attività I/O."
},
{
"name": "Rete",
"description": "Tutte le interfacce (fisiche, bond, bridge, OVS), IP/MAC/stato, grafici RX/TX in tempo reale, dati RRD storici per interfaccia."
},
{
"name": "VM e contenitori",
"description": "Inventario VM/LXC con stato, risorse e tempo di attività. I dettagli mostrano configurazione, metriche storiche, download dei log Proxmox e azioni avvio/arresto/riavvio/spegnimento. I log dipendono dall’endpoint Proxmox; non è un archivio completo del sistema guest."
},
{
"name": "Hardware",
"description": "CPU modello e topologia, layout della memoria, dispositivi PCIe, elenco GPU con driver e monitoraggio in tempo reale per slot (NVIDIA / Intel iGPU)."
},
{
"name": "Registri ed eventi",
"description": "<code>journalctl</code> in tempo reale con filtri di gravità/intervallo di tempo/parole chiave, cronologia delle attività Proxmox, registro delle notifiche, pacchetti di registri scaricabili."
},
{
"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."
},
{
"name": "Sicurezza",
"description": "Tentativi di autenticazione falliti, stato dei jail di Fail2Ban, blocchi recenti e integrazione con il jail <code>[proxmenux]</code> dell’host."
}
],
"footer": "Ogni sezione ha una pagina di documentazione dedicata sotto <link>Dashboard</link> nella barra laterale."
},
"howItRuns": {
"heading": "Come funziona",
"intro": "ProxMenux Monitor viene distribuito come AppImage autonoma. Una singola unità systemd (<code>proxmenux-monitor.service</code>) avvia un processo Flask che:",
"bullets": [
"Ascolta su <strong>TCP 8008</strong> sull'host (HTTP).",
"Serve la dashboard Next.js come file statici in <code>/</code> e l’API in <code>/api/*</code> dallo stesso processo.",
"Estrae dati in tempo reale con strumenti host standard: <code>psutil</code>, <code>pvesh</code>, <code>smartctl</code>, <code>journalctl</code>, <code>zpool</code>, <code>ip</code>, <code>nvidia-smi</code>, ecc.",
"Salva lo stato in un database SQLite locale (<code>/usr/local/share/proxmenux/health_monitor.db</code>): avvisi ignorati, osservazioni dei dischi, configurazioni notifiche e AI. L’autenticazione è conservata separatamente in <code>/root/.config/proxmenux-monitor/auth.json</code>."
],
"footer": "Il flusso completo della richiesta, il layout del file e l'integrazione di systemd sono descritti in <link>Architettura</link>."
},
"noAgent": {
"title": "Nessun agente sui guest",
"body": "Il Monitor legge tutti i dati dall’host. Non occorre installare agenti nelle VM o nei CT: i dati provengono dall’API di Proxmox e dalle informazioni che il kernel dell’host rende disponibili sui sistemi guest in esecuzione."
},
"access": {
"heading": "Accesso al dashboard",
"intro": "Sono supportati due modelli di accesso e l'applicazione rileva quale è in uso:",
"codeComment1": "# 1) Accesso diretto sull'host",
"codeComment2": "# 2) Tramite proxy inverso (Nginx / Caddy / Traefik)",
"afterCode": "Il proxy inverso deve impostare <code>X-Forwarded-For</code>, <code>X-Forwarded-Proto</code> e <code>X-Forwarded-Host</code> correttamente e inoltrare gli upgrade WebSocket. Sulle porte standard il browser usa l’origine attuale. Il backend considera attendibili gli IP inoltrati solo con PROXMENUX_TRUST_PROXY=1 esplicito; limita l’accesso diretto al backend quando lo abiliti.",
"footer": "La configurazione al primo avvio, la password + TOTP 2FA e gli snippet proxy inverso sono trattati in <link>Accesso e autenticazione</link>."
},
"mobile": {
"heading": "Utilizzo mobile e installazione dalla schermata iniziale",
"intro": "La dashboard è reattiva e viene fornita come app Web progressiva. Il pacchetto <code>public/manifest.json</code> dichiara <code>display: standalone</code> con il nome dell'app, l'icona e il colore del tema, quindi l'aggiunta dell'URL alla schermata iniziale produce un vero launcher autonomo: nessuna barra degli indirizzi del browser, splash personalizzato, tema scuro abbinato al dashboard.",
"phoneAlt": "ProxMenux Monitor in esecuzione su un telefono: visualizzazione dashboard principale",
"phoneCaption": "Dashboard principale su un telefono: il layout si adatta per le finestre di piccole dimensioni.",
"addHeading": "Aggiungi alla schermata iniziale",
"iosLabel": "iOS Safari:",
"iosBody": "pulsante di condivisione → <em>Aggiungi alla schermata principale</em>. L'icona proviene da <code>/apple-touch-icon.png</code> fornito in AppImage.",
"androidLabel": "Android Chrome/Edge:",
"androidBody": "menu a tre punti → <em>Installa app</em> (o <em>Aggiungi alla schermata Home</em> su versioni precedenti).",
"afterInstall": "Una volta installata, aprendo l'icona si avvia la dashboard in modalità autonoma con la propria voce di commutazione attività.",
"onlineOnlyTitle": "Richiede una connessione",
"onlineOnlyBody": "La PWA è installabile, ma <strong>non</strong> funziona offline: non include un service worker. Il collegamento si comporta come un’app nativa, ma il dispositivo deve comunque poter raggiungere l’host sulla porta TCP 8008, tramite LAN, VPN o HTTPS con proxy inverso, per caricare la dashboard."
},
"health": {
"heading": "Il monitoraggio dello stato e le notifiche",
"alt": "Schermata Health Monitor che mostra le 10 categorie tracciate (CPU, memoria, archiviazione, dischi, rete, servizi, registri, VM, aggiornamenti, sicurezza) con lo stato corrente",
"caption": "Vista Health Monitor: le categorie 10 monitorate, con il loro stato attuale. Gli avvisi attivi e ignorati vengono visualizzati qui quando il sistema ne genera qualcuno.",
"body1": "Il <strong>Health Monitor</strong> lavora continuamente in background e genera eventi strutturati: temperatura CPU elevata, avvisi SMART, degrado dei pool ZFS, terminazioni OOM, guasti VM/CT e incidenti di sicurezza. Ogni evento ha categoria, gravità (INFO / WARNING / CRITICAL) e una <code>error_key</code> stabile per raggruppare i duplicati senza riempire lo schermo.",
"feedsIntro": "Gli eventi alimentano tre cose contemporaneamente:",
"feedsHealth": "La <strong>vista Monitoraggio integrità</strong> nel dashboard (elenchi attivi + ignorati).",
"feedsChannels": "Il <strong>motore di notifica</strong> — Telegram, Discord, Email, Gotify, Pushover e Apprise (multicanale). Ogni canale è configurato in modo indipendente e le categorie per evento possono essere silenziate.",
"feedsAI": "L'<strong>assistente AI</strong> opzionale: se abilitato, il provider configurato (OpenAI, Anthropic, Gemini, Groq, Ollama o OpenRouter) spiega gli eventi in arrivo in un linguaggio semplice e, se abilitato nelle impostazioni AI, propone i passaggi successivi.",
"suppressionTitle": "Sopprimere singoli avvisi anziché silenziare tutto",
"suppressionBody": "Ogni categoria ha la propria <em>Durata di soppressione</em>: una volta ignorato un avviso, lo stesso avviso viene silenziato per quella finestra (predefinito 24 ore, configurabile per categoria fino a permanente). Escalation reali – ad es. CPU temperatura che supera la soglia critica: riattivazione sempre indipendentemente dalla soppressione."
},
"api": {
"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.",
"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": {
"heading": "Controllo del servizio",
"intro": "Giorno per giorno, il Monitor è gestito esattamente come qualsiasi altro servizio systemd. Viene inoltre esposto come due voci all'interno della TUI ProxMenux in <em>Impostazioni</em>:",
"codeComment": "# Controllo manuale",
"footer": "Vedi <link>Impostazioni → ProxMenux Monitor</link> per l'attivazione/disattivazione del menu e il flusso di verifica dello stato."
},
"nextSteps": {
"heading": "Dove proseguire",
"items": [
{
"label": "Architettura",
"description": "— Flask backend, unità systemd, schema SQLite, fornitori di intelligenza artificiale, canali di notifica."
},
{
"label": "Accesso e autenticazione",
"description": "— primo avvio, impostazione della password, TOTP 2FA, configurazione proxy inverso, integrazione Fail2Ban."
},
{
"label": "Dashboard",
"description": "— ogni sezione dell’interfaccia, una pagina per ciascuna."
},
{
"label": "Riferimento API",
"description": "— ogni endpoint, forma di richiesta/risposta e gestione dei token."
},
{
"label": "Integrazioni",
"description": "— Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma e modello cURL generico."
}
]
}
}
@@ -0,0 +1,255 @@
{
"meta": {
"title": "Integrazioni Proxmox — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor",
"description": "Esempi da copiare per collegare ProxMenux Monitor a Homepage, Home Assistant, Grafana tramite Prometheus e Uptime Kuma, con configurazione richiesta, endpoint API e intestazione di autenticazione.",
"ogTitle": "Integrazioni Proxmox — Homepage, Home Assistant, Grafana, Prometheus",
"ogDescription": "Guida per collegare ProxMenux Monitor a Homepage, Home Assistant, Grafana, Prometheus e Uptime Kuma.",
"twitterTitle": "Integrazioni Proxmox | ProxMenux Monitor",
"twitterDescription": "Ricette per Homepage, Home Assistant, Grafana, Prometheus e Uptime Kuma."
},
"header": {
"title": "Integrazioni",
"description": "Esempi da copiare per gli strumenti del tuo homelab: Homepage, Home Assistant, Grafana tramite Prometheus e Uptime Kuma. Ogni esempio mostra la configurazione richiesta, l’endpoint del Monitor utilizzato e l’intestazione di autenticazione necessaria.",
"section": "Monitor di ProxMenux"
},
"intro": {
"title": "Cosa puoi costruire da questa pagina",
"body": "Copia ogni esempio nello strumento scelto. Gli endpoint sono descritti nel <link>Riferimento API</link>; questa pagina spiega come usarli in Homepage, Home Assistant e Grafana. Le immagini mostrano il risultato delle configurazioni."
},
"auth": {
"heading": "Autenticazione: l'unica cosa che ogni ricetta ha bisogno",
"intro": "La maggior parte degli endpoint utilizzati da queste integrazioni sono autenticati. Hai due modi per soddisfare questo requisito.",
"optAtitle": "Opzione A — Token API (consigliato per le integrazioni)",
"optAbody1": "Apri <strong>Impostazioni → Sicurezza → Token API</strong>. Premi <em>Genera token</em>, assegna un nome come <em>homepage</em>, <em>home-assistant</em> o <em>prometheus</em> e copialo: appare <em>una sola volta</em>. Scade dopo un anno per impostazione predefinita ed è revocabile singolarmente. Usalo per i client esterni al browser.",
"optAbody2": "Da quel punto ogni richiesta è solo:",
"optBtitle": "Opzione B — flusso di login (username + password)",
"optBbody": "Utile per script che si autenticano come un utente. Il token restituito dura poco; per la maggior parte delle integrazioni scegli l’opzione A.",
"outro": "Il campo TOTP è obbligatorio solo se sull’account è attiva la 2FA. Rotazione e revoca dei token, criteri delle password e registro di controllo sono descritti in <link>Accesso e autenticazione</link>.",
"httpsTitle": "Utilizzando HTTPS invece di HTTP",
"httpsIntro": "Gli esempi usano <code>http://</code> per brevità. Se hai attivato TLS sul Monitor (<strong>Impostazioni → Sicurezza → SSL/HTTPS</strong>), sostituisci <code>http://</code> con <code>https://</code> in ogni URL. Due note per alcuni strumenti:",
"httpsItems": [
"<strong>Certificati autofirmati.</strong> L’integrazione Home Assistant <code>rest:</code> verifica TLS per impostazione predefinita. Per un certificato autofirmato del Monitor aggiungi <code>verify_ssl: false</code> a ogni blocco REST accanto a <code>scan_interval:</code>, oppure importa la CA del Monitor tra i certificati attendibili. Lo stesso vale per altri strumenti che verificano i certificati.",
"<strong>Prometheus</strong> include già <code>scheme: https</code> nell’esempio sotto. Attiva o mantieni <code>https</code> se TLS è attivo sul Monitor."
]
},
"homepage": {
"heading": "Homepage",
"headingHref": "https://gethomepage.dev",
"intro": "Homepage è una dashboard di applicazioni statica e personalizzabile. ProxMenux Monitor si collega con il widget integrato <code>customapi</code>: aggiungi un servizio a <code>services.yaml</code>, riavvia Homepage e la scheda mostra i valori aggiornati.",
"iconCalloutTitle": "Il logo ufficiale ProxMenux è su dashboardicons.com",
"iconCalloutBody": "Gli esempi usano <code>icon: proxmenux.png</code>. Homepage cerca automaticamente i nomi semplici su <a1>dashboardicons.com</a1>, una raccolta di icone per dashboard autogestite. La voce ProxMenux è su <a2>dashboardicons.com/icons/external/proxmenux</a2> e viene caricata alla prima visualizzazione. Funziona anche per migliaia di strumenti come Telegram, Discord, Grafana e Tailscale: indica <code>icon: &lt;name&gt;.png</code> nel servizio.",
"imageAlt": "Homepage cruscotto che mostra tre schede ProxMenux Monitor (EDGE, VOID, DREAM) con uptime, CPU, RAM e temperatura per ogni host Proxmox",
"imageCaption": "Tre istanze ProxMenux Monitor come schede Homepage: uptime, CPU, RAM e temperatura CPU letti da <code>/api/system</code> di ogni host ogni 10 s.",
"basicTitle": "widget di base — nessuna autenticazione",
"basicIntro": "Utilizzare questo quando ProxMenux Monitor è su una rete di fiducia e non hai ancora abilitato l'autenticazione sul lato Monitor. La voce <code>services.yaml</code> più semplice:",
"authedTitle": "widget autenticato",
"authedIntro": "Generare un token API in <strong>Impostazioni → Sicurezza → Token API</strong> sul Monitor, copiarlo e incollarlo nell'intestazione <code>Authorization</code> di seguito — sostituire il token di esempio mostrato dopo <code>Bearer</code> con quello appena copiato:",
"authedOutro": "Riavvia Homepage per visualizzare i valori aggiornati. Riutilizza lo stesso token nei widget che interrogano la stessa istanza del Monitor.",
"multiTitle": "Configurazione multi-widget — sistema, archiviazione, rete",
"multiIntro": "Per più dettagli crea tre schede con endpoint diversi: sistema, archiviazione e rete. Usa lo stesso token per questa istanza del Monitor.",
"multiCalloutTitle": "Più host Proxmox",
"multiCalloutBody": "Ripeti il blocco per ogni host per ottenere le schede mostrate. Ogni voce usa <code>http://&lt;host&gt;:8008</code> della propria istanza. Genera e conserva un token per host: le installazioni separate hanno chiavi di firma proprie, quindi non presumere che un token valga anche altrove."
},
"homeAssistant": {
"heading": "Home Assistant",
"headingHref": "https://www.home-assistant.io",
"intro": "Gli esempi usano l’integrazione <code>rest</code> di Home Assistant senza richiedere un componente HACS dedicato. Legge gli endpoint nel <link>Riferimento API</link> e crea sensori e attributi per le automazioni. La configurazione offre circa 25 sensori per risorse, stato, VM/CT, archiviazione, rete e aggiornamenti. Aggiungila a <code>configuration.yaml</code> e ricarica o riavvia HA.",
"imageAlt": "Dashboard Home Assistant con stato, indicatori CPU/RAM/temperatura, numero di VM, spazio occupato ed errori attivi",
"imageCaption": "ProxMenux Monitor come integrazione Home Assistant di prima classe — sensori costruiti dalla ricetta YAML qui sotto.",
"step1Title": "1 · Conservare il token API",
"step1Body": "Salva il token in <code>secrets.yaml</code> per separarlo dalla configurazione principale. Includi prefisso Bearer e token in un unico valore da usare come intestazione. Il file non è cifrato e deve restare privato. La posizione dipende dall’installazione, in genere <code>/config/secrets.yaml</code> su HA OS o Container.",
"step2Title": "2 · Aggiungere la configurazione REST",
"step2Body": "Sei blocchi REST coprono le aree principali. Il loro <code>scan_interval</code> segue la frequenza delle modifiche: risorse ogni 30 s, stato ogni 60 s, inventari ogni 5–10 minuti. Incolla in <code>configuration.yaml</code>:",
"step3Title": "3 · Aggiungi sensori binari e helper per modelli",
"step3Body": "Due sensori binari e due sensori basati su modello completano l’integrazione, semplificando automazioni e schede condizionali Lovelace senza ripetere espressioni Jinja ovunque.",
"step4Title": "4 · Ricarica e verifica",
"step4Body": "Verifica prima la sintassi in <em>Strumenti per sviluppatori → YAML → Controlla configurazione</em>. Ricarica poi <em>Tutta la configurazione YAML</em> o riavvia HA. In <em>Impostazioni → Dispositivi e servizi → Entità</em> filtra per <em>proxmenux</em>. Le circa 25 entità dovrebbero ricevere valori entro un intervallo di lettura.",
"replaceTitle": "Sostituzione di una versione precedente di questa ricetta?",
"replaceBody": "Dopo una versione precedente, il registro può conservare ID obsoleti e le schede mostrare <em>Entità non trovata</em>. Rimuovi i vecchi blocchi <code>rest:</code> e <code>template:</code> da <code>configuration.yaml</code> e ricarica. In <em>Impostazioni → Dispositivi e servizi → Entità</em> filtra per <em>proxmenux</em> ed elimina le vecchie voci ripristinate o non disponibili. Aggiungi il nuovo YAML e ricarica per registrare le nuove.",
"step5Title": "5 · Dashboard Lovelace",
"step5Body": "Il YAML crea una scheda <strong>vertical-stack</strong> con logo, indicatori, sistema, VM, archiviazione, rete e problemi condizionali. Apri la dashboard, premi la matita, <em>Aggiungi scheda</em>, poi <em>Manuale</em> in fondo e incolla:",
"viewTipTitle": "Lo vuoi come una vista completa del cruscotto invece di una singola carta?",
"viewTipBody": "Apri il menu a tre punti → <em>Editor di configurazione grezza</em> e aggiungi una vista con questa intestazione sopra l’elenco <code>cards:</code>:",
"viewTipOutro": "Questo ti dà una scheda/vista dedicata nel tuo cruscotto con la sua icona e titolo, invece di una lunga scheda su una vista esistente.",
"altViewTitle": "Alternativa — una vista dedicata del cruscotto",
"altViewIntro": "Per creare una scheda in una dashboard esistente, aggiungi una vista con il YAML sotto. Una vista è una scheda della dashboard e non crea una voce nella barra laterale. Passaggi:",
"altViewSteps": [
"Apri il cruscotto dove vuoi la nuova scheda.",
"Premi la matita (modifica dashboard) in alto a destra.",
"Fare clic sulla scheda <em>+</em> alla fine delle schede esistenti per creare una nuova vista.",
"Nella finestra scegli <em>Editor di codice</em> in alto a destra per passare dall’editor visivo a YAML.",
"Incolla la YAML qui sotto.",
"Salva. La vista <em>ProxMenux Monitor</em> appare come scheda nella dashboard con le sue carte."
],
"twoEditorsTitle": "Due editor YAML in HA — scegli quello giusto",
"twoEditorsIntro": "Home Assistant ha due editor YAML simili nell’aspetto ma con formati di input diversi:",
"twoEditorsItems": [
"<strong>Editor della singola vista</strong> — da <em>+</em> o <em>Modifica vista → Editor di codice</em>. Richiede una vista con <code>title:</code>, <code>path:</code> e <code>cards:</code> al livello principale, senza trattino iniziale.",
"<strong>Editor grezzo dell’intera dashboard</strong> — dal menu a tre punti. Richiede l’intero elenco <code>views:</code>, con ogni vista come elemento preceduto da <code>-</code>."
],
"twoEditorsOutro": "Il formato sbagliato può produrre una <em>Vista senza nome</em> e <code>cards: []</code>. Il YAML sotto è per l’editor di una singola vista: copialo esattamente.",
"viewImageAlt": "Vista Home Assistant per ProxMenux Monitor: intestazione picture-entity, indicatori glance e schede sistema, VM, archiviazione e rete su più colonne",
"viewImageCaption": "La vista <em>ProxMenux Monitor</em> su schermo ampio. Il layout Masonry distribuisce le schede in colonne; il risultato dipende dal tipo di vista configurato.",
"twoColTipTitle": "Vuoi un layout fisso a due colonne invece del layout auto?",
"twoColTipBody": "Raggruppa due schede, come <em>Sistema</em> + <em>VM</em> o <em>Archiviazione</em> + <em>Rete</em>, in un <code>horizontal-stack</code> per mostrarle affiancate a qualsiasi larghezza:",
"twoColTipOutro": "Sul telefono la riga resta compressa. Il layout automatico HA senza horizontal-stack si adatta meglio agli schermi stretti.",
"step6Title": "6 · Automazioni",
"step6Body": "Tre automazioni per gli scenari reattivi più comuni: sostituisci <code>notify.mobile_app_&lt;your_phone&gt;</code> con il servizio di notifica che usi.",
"logoTitle": "Informazioni sul logo ProxMenux",
"logoBody": "La scheda picture-entity carica il logo ufficiale da <a1>dashboardicons.com</a1>, una raccolta gratuita per dashboard autogestite. La voce è su <a2>dashboardicons.com/icons/external/proxmenux</a2>. Home Assistant scarica lo SVG via HTTPS alla prima visualizzazione e lo memorizza nella cache.",
"logoBrokenTitle": "Se la scheda logo mostra un'immagine rotta",
"logoBrokenIntro": "Alcune installazioni, reti filtrate o blocchi dei contenuti impediscono l’accesso a jsdelivr.net durante la visualizzazione. Usa una copia locale:",
"logoBrokenSteps": [
"Scarica la SVG da <a>cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg</a>.",
"Salvalo in <code>/config/www/icons/proxmenux.svg</code> sull’host HA.",
"Nel Lovelace YAML, sostituire l'URL <code>image:</code> con <code>/local/icons/proxmenux.svg</code>. Salvare e ricaricare — l'immagine rende dal file locale, nessun Internet necessario."
],
"scanTipTitle": "Regola pratica per scan_interval",
"scanTipBody": "Inizia leggendo <code>/api/system</code> ogni 30 s. <code>/api/health/full</code> usa normalmente un risultato valido fino a sei minuti; leggerlo ogni 60 s non aggira la cache. Prova cinque minuti per <code>/api/storage/summary</code> e un’ora per <code>/api/proxmenux/update-status</code>. Adatta gli intervalli all’hardware e al numero di host."
},
"grafana": {
"heading": "Prometheus + Grafana",
"promHref": "https://prometheus.io",
"grafanaHref": "https://grafana.com",
"intro": "ProxMenux Monitor espone <code>GET /api/prometheus</code> nel formato testuale Prometheus 0.0.4. Con autenticazione attiva serve un token Bearer. Configura Prometheus per raccogliere le metriche e Grafana per visualizzare il database di serie temporali.",
"imageAlt": "Dashboard Grafana con metriche ProxMenux: indicatore CPU, andamento memoria, numero di VM in esecuzione e traffico di rete",
"imageCaption": "Una dashboard Grafana con i dati ProxMenux raccolti da Prometheus: CPU, memoria, VM in esecuzione e traffico di rete. Il catalogo completo è in <link>Riferimento API → Metriche Prometheus</link>.",
"step1Title": "1 · Aggiungi il job di raccolta a Prometheus",
"step1Body": "Passa il token API tramite il blocco nativo <code>authorization</code> di Prometheus, che consente anche credenziali da file.",
"step1After": "Ricarica Prometheus con <code>kill -HUP &lt;PID&gt;</code> (sostituisci PID con il suo ID processo), <code>systemctl reload prometheus</code> se supportato o <code>docker compose restart prometheus</code> per il container. In <em>Status → Targets</em>, proxmenux dovrebbe diventare UP entro un intervallo. L’etichetta <code>node=\"&lt;hostname&gt;\"</code> distingue gli host.",
"tokenTipTitle": "Conserva il token in un file separato",
"tokenTipBody": "In produzione separa il token dalla configurazione. Con <code>credentials_file: /etc/prometheus/secrets/proxmenux.token</code>, Prometheus lo legge da un file con permessi 0600.",
"step2Title": "2 · Verifica la raccolta con alcune query",
"step2Body": "Prima di Grafana verifica che Prometheus abbia i dati. Apri <code>http://&lt;prometheus-host&gt;:9090</code>, scegli <em>Query</em> ed esegui una di queste query. Dovresti ottenere valori aggiornati dell’host Proxmox:",
"headerQuery": "Query",
"headerConfirms": "Cosa conferma",
"verifyRows": [
{
"query": "up{job=\"proxmenux\"}",
"confirms": "Restituisce <code>1</code> se Prometheus raccoglie correttamente i dati del Monitor, altrimenti <code>0</code>. Il controllo iniziale più rapido."
},
{
"query": "proxmox_cpu_usage",
"confirms": "Uso attuale della CPU dell’host Proxmox in percentuale. Il valore dovrebbe cambiare ripetendo la query dopo alcuni secondi."
},
{
"query": "proxmox_vms_running",
"confirms": "Numero di ospiti in esecuzione. Confronta con quello che vedi nell'UI Proxmox."
},
{
"query": "proxmox_uptime_seconds / 86400",
"confirms": "Host uptime in giorni. Dovrebbe corrispondere al valore che si vede in <code>uptime</code> sulla shell Proxmox."
}
],
"calloutTitle": "Un 401 aprendo direttamente l’URL dell’endpoint può essere normale",
"calloutBody": "Con autenticazione attiva, il collegamento in <em>Status → Targets</em> apre <code>/api/prometheus</code> nel browser senza l’intestazione Bearer di Prometheus. La risposta può contenere <code>'{'\"error\":\"Authentication required\"'}'</code>. Controlla il vero <em>State: UP</em> del target per confermare la raccolta di Prometheus.",
"step3Title": "3 · Aggiungi Prometheus come sorgente dati Grafana",
"step3Body": "In Grafana apri <em>Connections → Data sources → Add new → Prometheus</em>. Imposta l’URL, ad esempio <code>http://prometheus.lan:9090</code>, salva e prova. Se Prometheus richiede autenticazione, configurala qui separatamente. Il token del Monitor appartiene al job di raccolta Prometheus.",
"step4Title": "4 · Costruire pannelli con queste query PromQL",
"step4Body": "Una selezione iniziale delle metriche tipiche di un host Proxmox:",
"headerPanel": "Idea del pannello",
"headerPromql": "Query PromQL",
"panelRows": [
{
"panel": "Misuratore di utilizzo CPU per host",
"promql": "proxmox_cpu_usage"
},
{
"panel": "Misuratore di utilizzo della memoria per host",
"promql": "proxmox_memory_usage_percent"
},
{
"panel": "Memoria utilizzata vs totale (serie temporali)",
"promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024"
},
{
"panel": "VM/CT in esecuzione per host",
"promql": "proxmox_vms_running"
},
{
"panel": "Temperatura CPU",
"promql": "proxmox_cpu_temperature_celsius"
},
{
"panel": "Traffico di rete RX (byte/s)",
"promql": "rate(proxmox_interface_bytes_received_total[5m])"
},
{
"panel": "Traffico di rete TX (byte/s)",
"promql": "rate(proxmox_interface_bytes_sent_total[5m])"
},
{
"panel": "Media del carico (1m)",
"promql": "proxmox_load_average{period=\"1m\"}"
},
{
"panel": "Percentuale di spazio usato per punto di montaggio",
"promql": "proxmox_disk_usage_percent"
},
{
"panel": "Livello di carica della batteria UPS",
"promql": "proxmox_ups_battery_charge_percent"
},
{
"panel": "Temperatura GPU per slot",
"promql": "proxmox_gpu_temperature_celsius"
}
],
"outro": "Aggiungi ogni query come pannello Grafana, con <em>Stat</em> per i valori e <em>Time series</em> per le tendenze, e raggruppa per categoria. Usa <code>node</code> come variabile della dashboard (<em>Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)</em>) per filtrare per host."
},
"uptimeKuma": {
"heading": "Uptime Kuma e altri controlli di stato",
"href": "https://github.com/louislam/uptime-kuma",
"intro": "Per un controllo per parola chiave usa <code>GET /api/system-info</code>. La route non richiede token e restituisce nome host, uptime e stato come <code>healthy</code>, <code>warning</code> o <code>critical</code>. È pubblica, a differenza degli endpoint di stato dettagliati protetti.",
"kumaTitle": "Uptime Kuma — Monitor di parole chiave HTTP",
"kumaSteps": [
"In Uptime Kuma, fare clic su <em>+ Aggiungi nuovo monitor</em>.",
"Tipo di monitor: <em>HTTP(s) - Parola chiave</em>.",
"Nome descrittivo: <em>ProxMenux Monitor — pve01</em>.",
"URL: <code>http://pve01.lan:8008/api/system-info</code>.",
"Parola chiave: <code>healthy</code> (il valore di <code>health.status</code> quando l'host è OK).",
"Intervallo di controllo: 60 secondi sono sufficienti.",
"Salva. La route system-info non richiede un’intestazione Bearer."
],
"healthchecksTitle": "healthchecks.io / ping da attività cron",
"healthchecksBody": "Un’attività cron può leggere <code>/api/system-info</code> e verificare <code>.health.status == \"healthy\"</code>. Solo dopo il successo invia un ping alla propria URL Healthchecks.io. Il servizio riceve ping dalle attività e non interroga il Monitor. Un HTTP 2xx da solo non dimostra che l’host sia sano.",
"richTitle": "Vuoi dati più dettagliati sullo stato?",
"richBody": "Per lo stato completo — dieci categorie, errori attivi e silenziati — usa <code>GET /api/health/full</code>. Restituisce in una risposta i dati della finestra della dashboard e richiede un token Bearer con autenticazione attiva."
},
"workflows": {
"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>."
},
"pveWebhook": {
"heading": "Webhook nativo Proxmox VE (in ingresso)",
"intro1": "Il sistema di notifiche risale a PVE 8.1; i target webhook nativi richiedono Proxmox VE 8.3 o successivo. <em>Abilita notifiche</em> nelle impostazioni tenta di registrare il Monitor come destinazione. Gli avvisi PVE instradati lì, come rapporti di backup o replica, entrano nel suo flusso di invio. La configurazione deve essere disponibile e scrivibile.",
"intro2": "Funzionamento, modello inviato da PVE, voci in <code>/etc/pve/notifications.cfg</code> e comportamento in cluster sono in <link>Notifiche → Integrazione webhook PVE</link>."
},
"whereNext": {
"heading": "Come proseguire",
"items": [
{
"label": "Riferimento API",
"href": "/docs/monitor/api",
"tail": " — endpoint con metodo, percorso e catalogo completo delle metriche Prometheus."
},
{
"label": "Notifiche",
"href": "/docs/monitor/notifications",
"tail": " — fonti di eventi, canali, flusso di invio e integrazione webhook PVE."
},
{
"label": "Assistente AI",
"href": "/docs/monitor/ai-assistant",
"tail": " — riscrittura facoltativa dei modelli in linguaggio semplice prima dell’invio a Telegram, Discord, e-mail o Gotify."
},
{
"label": "Accesso e autenticazione",
"href": "/docs/monitor/access-auth",
"tail": " — creazione e revoca dei token API degli esempi, registro di controllo e configurazione TLS."
}
]
}
}
@@ -0,0 +1,535 @@
{
"meta": {
"title": "Notifiche Proxmox — Telegram, Discord, Email, Gotify, Pushover, Apprise | ProxMenux Monitor",
"description": "Invia notifiche Proxmox VE tramite Telegram, Discord, email, Gotify, Pushover e circa 80 servizi Apprise. Monitor unifica eventi di integrità, registro di sistema e webhook PVE, con deduplicazione, intervalli fra invii, riepiloghi, riscrittura IA facoltativa e cronologia.",
"ogTitle": "Notifiche Proxmox — Telegram, Discord, Email, Gotify, Pushover, Apprise",
"ogDescription": "Avvisi Proxmox VE sui sei canali, con servizi aggiuntivi Apprise, deduplicazione, intervalli fra invii, aggregazione e riscrittura IA facoltativa.",
"twitterTitle": "Notifiche Proxmox | ProxMenux Monitor",
"twitterDescription": "Invia avvisi Proxmox VE a Telegram, Discord, Email, Gotify, Pushover e ~80 servizi extra via Apprise."
},
"header": {
"title": "Notifiche",
"description": "Distribuisce gli eventi raccolti da Monitor ai canali configurati: Telegram, Discord, email, Gotify, Pushover e circa 80 servizi tramite Apprise. Offre deduplicazione, intervalli fra invii, raggruppamento degli eventi ravvicinati, filtri per evento e canale, riscrittura IA facoltativa e cronologia consultabile.",
"section": "ProxMenux Monitor"
},
"intro": {
"title": "Da dove provengono i messaggi",
"body": "Le notifiche utilizzano gli eventi già prodotti da <link>Health Monitor</link>, osservatori del registro e delle attività Proxmox, webhook PVE, controlli periodici e script ProxMenux. Non effettuano una scansione separata: gli eventi attraversano lo stesso processo di invio verso i canali configurati."
},
"howItWorks": {
"heading": "Come funziona",
"intro": "Raccoglitori indipendenti producono eventi strutturati. Il processo di invio stabilisce se inviarli e in quale forma; può riscriverli con un LLM e li distribuisce ai canali configurati.",
"arrowLabel": "evento",
"caption": "Ogni tentativo effettivo di invio, riuscito o fallito, viene registrato nella cronologia SQLite. Un gruppo aggregato compare come una voce; gli eventi soppressi dall’intervallo fra invii non vengono registrati.",
"nodes": {
"sourcesLabel": "Fonti",
"sourcesDetail": "Health Monitor\nMonitor del registro\nMonitor delle attività\nWebhook PVE\nControlli periodici\nEventi interni",
"dispatchLabel": "Processo di invio",
"dispatchDetail": "Aggregazione eventi ravvicinati\nControlli impronta/intervallo\nLimiti di frequenza per gruppo\nControlli per canale",
"aiLabel": "Riscrittura con IA (facoltativa)",
"aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(disattivata inizialmente)",
"channelsLabel": "Canali",
"channelsDetail": "Telegram\nDiscord\nEmail (SMTP)\nGotify\nPushover\nApprise (~80 servizi)"
}
},
"enabling": {
"heading": "Abilitare il pannello",
"intro": "All’inizio, la scheda Notifiche nelle Impostazioni mostra <em>Disattivate</em> e il pulsante <em>Abilita notifiche</em>. Finché non lo premi non invia messaggi né modifica la configurazione PVE.",
"disabledAlt": "Scheda Notifiche disattivata con il pulsante per abilitarla",
"disabledCaption": "Il primo stato — un clic per abilitare.",
"stepsIntro": "Premere il pulsante fa tre cose in sequenza:",
"steps": [
"Passa allo stato <em>Attive</em> e mostra il modulo dei canali.",
"Registra il destinatario webhook in <code>/etc/pve/notifications.cfg</code>. Senza HTTPS usa <code>POST http://127.0.0.1:8008/api/notifications/webhook</code>; con HTTPS usa il listener HTTP locale separato sulla porta 8009. Le notifiche PVE entrano così nel processo di Monitor. Vedi <pvelink>Integrazione webhook PVE</pvelink>.",
"Avvia il thread di invio in background, che legge la coda ed elabora gli eventi."
],
"activeAlt": "Notifiche attive: schede dei canali, nome visualizzato e sezione espandibile per la riscrittura IA",
"activeCaption": "Stato attivo: schede Telegram, Gotify, Discord, email, Pushover e Apprise, nome visualizzato, categorie per canale e sezione <em>Avanzate: miglioramento IA</em>."
},
"sources": {
"heading": "Fonti di evento",
"intro": "Sei tipi di fonti alimentano le notifiche: raccoglitori in background, ricevitore webhook ed eventi interni al processo. Producono oggetti <code>NotificationEvent</code> strutturati.",
"headerCollector": "Raccoglitore",
"headerWatches": "Cosa controlla",
"headerEvents": "Eventi tipici",
"rows": [
{
"collector": "Monitoraggio integrità",
"watches": "Dieci categorie, ogni 5 minuti",
"events": "<code>new_error</code>, <code>error_resolved</code>, <code>error_escalated</code>, <code>health_degraded</code>, <code>health_persistent</code>."
},
{
"collector": "Monitoraggio del registro di sistema",
"watches": "Segue <code>journalctl --follow</code> e riconosce errori di autenticazione SSH/web, blocchi Fail2Ban se la jail è installata, errori I/O, OOM ed eventi smartd.",
"events": "<code>auth_fail</code>, <code>ip_block</code>, <code>oom_kill</code>, <code>disk_io_error</code>, <code>service_fail</code>."
},
{
"collector": "Monitoraggio delle attività",
"watches": "Controlla <code>/var/log/pve/tasks/index</code> per trovare nuovi UPID e segue i rispettivi file di registro.",
"events": "<code>backup_start</code>, <code>backup_complete</code>, <code>backup_warning</code>, <code>backup_fail</code>, <code>migration_*</code>, <code>snapshot_complete</code>."
},
{
"collector": "Webhook Proxmox",
"watches": "Riceve <code>POST /api/notifications/webhook</code>. Le versioni PVE con destinatari webhook possono inoltrare qui le notifiche dopo la configurazione; vedi <pvelink>sotto</pvelink>.",
"events": "Qualsiasi cosa emette PVE — compresi gli eventi che il Monitor altrimenti perderebbe (HA, replica, vzdump dalla GUI)."
},
{
"collector": "Collettore di polling",
"watches": "Confronti periodici: nodi del cluster disponibili, scadenza certificati, assegnazione GPU e aggiornamenti PVE/ProxMenux.",
"events": "<code>node_disconnect</code>, <code>node_reconnect</code>, <code>pve_update</code>, <code>proxmenux_update</code>, <code>gpu_mode_switch</code>, <code>pci_passthrough_conflict</code>."
},
{
"collector": "Emettitori di processo",
"watches": "Chiamate dirette da ProxMenux scripts e dal Monitor stesso (<code>notification_manager.emit_event(...)</code>).",
"events": "<code>system_startup</code>, <code>system_shutdown</code>, <code>system_reboot</code>, <code>ai_model_migrated</code>, eventi di test personalizzati."
}
],
"after1": "Ogni evento ha un <code>event_type</code> stabile, una <code>severity</code> (<code>INFO</code>, <code>WARNING</code>, <code>CRITICAL</code>), una <code>category</code> per emoji e filtri e dati <code>data</code> per il modello, come <code>vmid</code>, <code>device</code>, <code>source_ip</code> e <code>reason</code>.",
"after2": "Il modello di ciascun <code>event_type</code> in <code>notification_templates.py</code> produce il testo inviato. La riscrittura IA facoltativa usa questo testo. La pagina <ailink>Assistente IA</ailink> spiega l’interazione fra modello e riscrittura."
},
"channels": {
"heading": "Configurazione dei canali",
"intro": "Sei canali sono attualmente supportati: Telegram, Discord, Gotify, Email (SMTP), Pushover e Apprise. I primi cinque sono integrazioni native con i propri campi di configurazione. Apprise è un hub generico che aggiunge circa 80 servizi aggiuntivi (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost...) attraverso un unico campo URL. Sono tutti documentati passo dopo passo.",
"credsTitle": "Dove sono salvate le credenziali",
"credsBody": "Token, chiavi, URL webhook e password SMTP vengono memorizzati localmente nel database SQLite del Monitor sotto <code>/usr/local/share/proxmenux/</code>. I valori sensibili sono protetti e mascherati nell'interfaccia. Non lasciano mai l'host tranne che per raggiungere i loro rispettivi servizi. Un backup di quella directory è sufficiente per recuperare i canali configurati."
},
"telegram": {
"heading": "Telegram",
"intro": "Servono un <strong>token del bot</strong>, riutilizzabile fra chat, e un <strong>ID chat</strong>, che identifica conversazione privata, gruppo o supergruppo. La guida integrata spiega i passaggi; seguono i formati di destinazione.",
"guideAlt": "Finestra della guida alla configurazione di un bot Telegram, con quattro sezioni numerate: creazione del bot con BotFather, recupero del token del bot, recupero del proprio ID chat e configurazione per gruppi o canali",
"guideCaption": "Il collegamento <em>+ guida alla configurazione</em> nella scheda Telegram apre la finestra con i quattro passaggi per configurare il canale.",
"step1Title": "1 · Creare un bot con BotFather",
"step1Items": [
"Aprire Telegram e avviare una chat con <a>@BotFather</a> (quello con la spunta di verifica blu — le copie sono comuni).",
"Invia <code>/newbot</code>.",
"Scegli un nome di visualizzazione (ad es. <em>ProxMenux Lab</em>). Può essere cambiato più tardi.",
"Scegli un nome utente univoco in Telegram che finisca in <code>bot</code>, per esempio <em>proxmenux_lab_bot</em>.",
"BotFather risponde con il token, per esempio <code>123456789:ABCdef…</code>. Trattalo come una password."
],
"step2Title": "2 · Ottieni l'ID Chat",
"step2Intro": "L’ID chat indica <em>dove</em> invia il bot. Il formato dipende dalla destinazione.",
"privateLabel": "chat privata (ricevi gli avvisi sul tuo account):",
"privateItems": [
"Inizia una chat con il tuo nuovo bot e invia qualsiasi messaggio (ad es. <code>/start</code>).",
"Aprire una chat con <a1>@userinfobot</a1> (o <a2>@myidbot</a2>) e inviare <code>/start</code>. Risponde con il tuo ID utente numerico — questo è l'ID Chat. È un numero positivo."
],
"privateAlt": "Modulo Telegram con token nascosto, ID chat positivo e ID argomento facoltativo vuoto",
"privateCaption": "chat privata con il bot — Chat ID è un numero positivo (il tuo ID utente personale).",
"groupLabel": "Gruppo o supergruppo con argomenti:",
"groupItems": [
"Aggiungi il bot al gruppo; rendilo amministratore solo se necessario per inviare messaggi.",
"Invia qualsiasi messaggio nel gruppo.",
"Aprire <code>https://api.telegram.org/bot&lt;YOUR_TOKEN&gt;/getUpdates</code> in un browser. Cercare <code>chat.id</code> nella risposta JSON — per i gruppi è un numero negativo, per i supergruppi inizia con <code>-100</code>.",
"Nei supergruppi con <em>Argomenti</em>, annota anche il <code>message_thread_id</code> della destinazione e inseriscilo nel campo facoltativo <em>ID argomento</em>."
],
"groupAlt": "Modulo Telegram per un supergruppo: token nascosto, ID chat negativo con prefisso -100 e ID argomento 3",
"groupCaption": "Supergruppo: l’ID chat inizia con <code>-100…</code>; <em>ID argomento</em> seleziona una conversazione specifica.",
"step3Title": "3 · Salva e prova",
"step3Body": "Inserisci token e ID chat, salva e premi <em>Invia prova</em>. Se non arriva, consulta la cronologia per l’errore: token non valido, bot assente dal gruppo o bloccato, ecc."
},
"discord": {
"heading": "Discord",
"intro": "I canali Discord accettano messaggi in arrivo tramite un <em>Webhook URL</em> legato ad un singolo canale. Il Monitor ha bisogno di quell'URL e nient'altro.",
"items": [
"In Discord apri il server e vai a <em>Impostazioni del server → Integrazioni → Webhook</em>.",
"Premi <em>Nuovo webhook</em>, assegna un nome come <em>ProxMenux</em> e scegli il canale. L’avatar è facoltativo.",
"Premi <em>Copia URL webhook</em>: il formato è <code>https://discord.com/api/webhooks/&lt;id&gt;/&lt;token&gt;</code>.",
"Incollalo nel campo URL Webhook della scheda Discord nel pannello delle notifiche e salva."
],
"imageAlt": "Modulo canale Discord con campo URL Webhook a partire da https://discord.com/api/webhooks/",
"imageCaption": "Discord: copia l’URL da <em>Impostazioni del server → Integrazioni → Webhook</em>."
},
"gotify": {
"heading": "Gotify",
"intro": "Gotify è un server di notifiche push ospitato da te. Servono il suo URL e un <em>token applicazione</em> generato nell’interfaccia amministrativa.",
"items": [
"Se non hai già un Gotify istanza, installarne uno — vedi <a>guida di installazione ufficiale</a>.",
"Accedi a Gotify come amministratore, apri <em>Applicazioni</em> → <em>Crea applicazione</em>, chiamala <em>ProxMenux</em> e copia il token.",
"Nella scheda Gotify del pannello Notifiche, impostare <em>Server URL</em> all'URL di base dell'istanza (ad es. <code>https://gotify.example.com</code>) e incollare il Token App.",
"Salva e premi <em>Invia prova</em>."
],
"imageAlt": "Modulo canale Gotify con campo URL Server impostato su https://gotify.example.com e un campo App Token con segnaposto A_valid_gotify_token",
"imageCaption": "Gotify — URL del server dell'istanza self-hosted più il Token App dall'interfaccia utente di amministrazione Gotify."
},
"email": {
"heading": "Posta elettronica (SMTP)",
"intro": "Per l’email servono server SMTP, porta, modalità TLS, eventuali credenziali, indirizzo mittente e almeno un destinatario.",
"imageAlt": "Modulo email: server SMTP, porta, TLS, utente, password, mittente, destinatari separati da virgola e prefisso oggetto",
"imageCaption": "Configura server SMTP, porta e TLS, eventuali credenziali, mittente, destinatari separati da virgola e prefisso dell’oggetto per filtrare gli avvisi.",
"appNote": "Monitor usa autenticazione SMTP con password. Gmail può richiedere una <strong>password per app</strong>. Per Microsoft dipende dal servizio e dalle regole del tenant: una password per app non aggira il blocco dell’autenticazione Basic. Verifica il metodo consentito.",
"gmailTitle": "password dell'app Gmail",
"gmailIntro": "Le password per app Gmail richiedono <strong>verifica in due passaggi</strong> attiva. Senza questa, la pagina <em>Password per le app</em> non è disponibile.",
"gmailItems": [
"Apri <a>myaccount.google.com/security</a> e attiva <em>Verifica in due passaggi</em>.",
"Vai a <a>myaccount.google.com/apppasswords</a>.",
"Inserisci un nome, per esempio <em>ProxMenux</em>, premi <em>Crea</em> e copia la password di 16 caratteri.",
"Imposta <em>Server</em> <code>smtp.gmail.com</code>, <em>Porta</em> <code>587</code>, <em>Modalità TLS</em> <code>STARTTLS</code>, <em>Nome utente</em> con l’indirizzo Gmail e <em>Password</em> con i 16 caratteri generati."
],
"outlookTitle": "Microsoft / password app Outlook",
"outlookIntro": "Microsoft richiede <strong>verifica in due passaggi</strong> per le password per app, ma ciò non garantisce compatibilità SMTP. Se il servizio o tenant impone OAuth2, il client SMTP di Monitor basato su password non può autenticarsi. Usa un relay con l’autenticazione richiesta a monte.",
"outlookItems": [
"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."
],
"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."
},
"pushover": {
"heading": "Pushover",
"intro": "Pushover è un servizio push per iOS, Android e browser desktop. Il canale ProxMenux usa direttamente l’<a>API Pushover</a>, senza richiedere un URL Apprise.",
"stepsTitle": "Impostazione",
"steps": [
"Crea un account <a>Pushover</a>, installa l'app ufficiale sui dispositivi che devono ricevere avvisi e accedere.",
"Copia la <em>chiave utente</em> dal pannello Pushover. Usa una chiave di gruppo se più persone o dispositivi devono ricevere lo stesso avviso.",
"Apri <a>Crea applicazione/token API</a>, crea <em>ProxMenux</em> e copia il token API di 30 caratteri.",
"In <em>Impostazioni → Notifiche → Pushover</em> inserisci chiave utente/gruppo e token API. Dispositivo e suono sono facoltativi.",
"Salva e premi <em>Invia prova</em>. Verifica la ricezione nell’app Pushover."
],
"priorityTitle": "Corrispondenza delle priorità",
"priorityBody": "Normalmente usa priorità Pushover 0. Con <strong>Alta priorità per avvisi critici</strong>, gli eventi CRITICAL usano 1 e superano il silenzio configurato dall’utente in Pushover. Non usa la priorità di emergenza 2, che richiederebbe ripetizioni e conferma di ricezione.",
"secretTitle": "Proteggere entrambi i valori",
"secretBody": "Chiave utente/gruppo e token API autorizzano entrambi gli invii. ProxMenux li protegge e li nasconde nell’interfaccia; non pubblicarli in schermate o registri di assistenza."
},
"apprise": {
"heading": "Apprise: accesso a circa 80 servizi",
"intro": "Apprise è una libreria open source che integra circa 80 servizi tramite URL. Il canale permette di raggiungere ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API e altri senza un’integrazione ProxMenux dedicata. Supporta anche Pushover, che dispone però di una scheda nativa più semplice per un solo destinatario.",
"listIntro": "L'elenco completo dei servizi supportati e l'esatto formato URL per ciascuno è disponibile nella documentazione ufficiale Apprise:",
"listItems": [
"<a>Documentazione dei servizi Apprise</a>: indice completo dei servizi supportati.",
"<a>Nozioni di base sugli URL</a>: struttura degli URL Apprise."
],
"stepsTitle": "Passi",
"steps": [
"Scegli il servizio nella <a>wiki Apprise</a> e copia il suo modello URL. La pagina indica schema (<code>ntfy://</code>, <code>matrix://</code>, <code>pover://</code>, <code>slack://</code>…), token, canali e nomi host necessari.",
"Compila i segnaposto con le tue credenziali. Ad esempio, un argomento ntfy.sh sembra <code>ntfy://ntfy.sh/my-topic</code>; un URL Pushover assomiglia a <code>pover://user@token</code>; un URL Matrix assomiglia a <code>matrix://user:pass@host:port/#room</code>.",
"Incolla l'URL finale nel campo <em>Apprise URL</em> nella scheda Apprise del pannello Notifiche e salva.",
"Premi <em>Invia prova</em> per verificare raggiungibilità e credenziali."
],
"deliveredTitle": "Cosa viene consegnato",
"deliveredBody": "Apprise riceve titolo, testo e gravità (info/success/warning/failure), convertita nel formato del servizio: icona, priorità o colore. Formattazione e riscrittura IA avvengono prima dell’invio, come negli altri canali.",
"fanoutTitle": "Un URL per canale Apprise",
"fanoutBody": "Monitor accetta un URL Apprise. Per distribuire a più servizi, per esempio ntfy.sh e Matrix, puoi usare un <a>server API Apprise</a> con configurazione per tag: Monitor chiama il suo endpoint e il server distribuisce ai destinatari del tag."
},
"rich": {
"heading": "Messaggi formattati, categorie e filtri per canale",
"intro": "Ogni canale offre <em>Messaggi formattati</em>, undici <em>Categorie di notifica</em> espandibili con interruttori per evento e <em>Invia prova</em> in fondo.",
"imageAlt": "Categorie di notifica con formattazione, gruppi VM/CT, backup, risorse, archiviazione, rete, sicurezza, cluster, servizi, Health Monitor e aggiornamenti, contatori e pulsante di prova",
"imageCaption": "La freccia indica <em>Messaggi formattati</em> del canale. Sotto ci sono undici categorie con opzioni per evento e <em>Invia prova</em>.",
"richTitle": "Messaggi formattati",
"richIntro": "Con <em>Messaggi formattati</em>, il titolo include l’emoji della categoria e il testo usa la formattazione del canale, come HTML Telegram o riquadro Discord con colore di gravità. Disattivandolo si invia lo stesso contenuto come testo semplice.",
"plainHeader": "Testo semplice: formattazione disattivata",
"richHeader": "Formattato: formattazione attiva",
"richOutro": "L’opzione è indipendente per canale: per esempio email semplice e Telegram/Discord formattati. I canali senza formattazione in linea, come email semplice e Gotify, ricevono comunque testo.",
"togglesTitle": "Categorie per evento",
"togglesIntro": "Ogni canale controlla indipendentemente categorie e singoli eventi. Disattivare una categoria sopprime i suoi eventi in quel canale; le opzioni individuali valgono nelle categorie attive. Non esiste un filtro globale principale degli eventi nel processo di invio.",
"togglesItems": [
"<strong>Categoria per canale.</strong> Disattivare VM/CT sopprime <code>vm_start</code> e gli eventi correlati del canale. Le preferenze sono in <code>&lt;channel&gt;.events.&lt;group&gt;</code>.",
"<strong>Evento per canale.</strong> In una categoria attiva puoi <em>inviare <code>backup_complete</code> a Discord ma non a Telegram</em>. La preferenza è in <code>&lt;channel&gt;.event.&lt;event_type&gt;</code>."
],
"togglesOutro": "Ogni categoria mostra eventi <em>attivi</em>/<em>totali</em> e un interruttore per attivarli o disattivarli insieme, per esempio backup <code>info</code> o aggiornamenti, senza aprire la sezione."
},
"quiet": {
"heading": "Orario silenzioso",
"intro": "In questa fascia oraria del canale passano subito solo eventi <strong>CRITICAL</strong>. INFO, WARNING e azioni vengono salvati e inviati in un unico riepilogo alla fine della fascia.",
"imageAlt": "Impostazioni del canale: orario silenzioso 22:00–07:00 con anteprima della transizione e riepilogo giornaliero alle 09:00; la nota su CRITICAL/WARNING riguarda il riepilogo",
"imageCaption": "Orario silenzioso in alto e riepilogo giornaliero sotto, indipendenti per ogni canale.",
"purposeTitle": "A cosa serve",
"purposeItems": [
"<strong>Niente avvisi di aggiornamento alle 03:00.</strong> La fascia silenziosa rinvia le notifiche INFO, come backup riusciti e aggiornamenti.",
"<strong>Le urgenze restano immediate.</strong> Solo gli eventi effettivamente CRITICAL superano l’orario silenzioso. Il nome non basta: il monitor del registro emette blocchi Fail2Ban e avvisi di spegnimento/riavvio come INFO, quindi possono attendere.",
"<strong>I messaggi restano salvati.</strong> Gli eventi rinviati rimangono nel buffer SQLite fino alla fine della fascia."
],
"howTitle": "Come funziona",
"howItems": [
"<strong>Opzione per canale.</strong> Telegram può restare silenzioso 22:00–07:00 mentre l’email continua gli invii 24/7.",
"<strong>Ora iniziale e finale</strong> nel fuso orario locale: inizio incluso e fine esclusa. Può attraversare mezzanotte, per esempio 22:00–07:00.",
"<strong>Anteprima in tempo reale</strong>: mostra se la fascia è attiva e quando cambierà stato.",
"<strong>Durante la fascia:</strong> CRITICAL continua l’invio normale. INFO e WARNING vanno nel buffer persistente <code>quiet_pending</code> del database SQLite.",
"<strong>Quando la finestra si chiude:</strong> viene inviata una singola notifica raggruppata con tutto ciò che si accumula: una linea per evento bufferizzato, in ordine cronologico. Il buffer viene sgomberato solo dopo che il canale conferma la consegna, quindi un'interruzione Telegram / SMTP transitoria non perde il contesto della notte.",
"<strong>Dopo un riavvio.</strong> Il buffer resta su disco. Se Monitor riparte dopo la chiusura della fascia, il ciclo successivo recupera le righe pendenti in un riepilogo."
],
"criticalTitle": "Quali eventi sono CRITICAL",
"criticalBody": "La fonte assegna la gravità a ogni evento. Un evento disco, spegnimento o sicurezza non è automaticamente CRITICAL. Il monitor del registro emette ip_block, system_shutdown e system_reboot come INFO. Il <link>Catalogo eventi</link> elenca i tipi; verifica la gravità effettiva nell’evento ricevuto e nel produttore."
},
"digest": {
"heading": "Riepilogo giornaliero eventi INFO",
"intro1": "Il riepilogo giornaliero è <strong>facoltativo</strong>: raccoglie eventi INFO idonei, come aggiornamenti disponibili, e li invia alle 09:00 o all’ora scelta. Risultati di backup/replica e azioni immediate ne sono esclusi. L’orario silenzioso rinvia invece i messaggi non critici in una fascia quotidiana.",
"intro2": "Si trova sotto l’orario silenzioso nella stessa scheda del canale; vedi <link>Orario silenzioso</link>. Le due funzioni si attivano indipendentemente.",
"purposeTitle": "A cosa serve",
"purposeItems": [
"<strong>Un riepilogo al mattino.</strong> Se controlli l’host una volta al giorno, puoi leggere alle 09:00 un unico riepilogo invece di 20 notifiche separate.",
"<strong>Separare informazioni e urgenze.</strong> Il riepilogo raccoglie gli eventi INFO idonei; CRITICAL e WARNING non attendono il riepilogo."
],
"howTitle": "Come funziona",
"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>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."
],
"neverDelayedSub": [
"Gli eventi <strong>CRITICAL</strong> vanno sempre attraverso immediatamente.",
"Gli eventi <strong>WARNING</strong> passano sempre immediatamente.",
"Avvio, arresto, spegnimento, riavvio ed errori VM/CT, avvio e risultati backup, risultati replica, spegnimento e riavvio host non entrano nel riepilogo, anche se INFO. L’orario silenzioso può comunque rinviare quelli non critici."
],
"comboTitle": "Combinare orario silenzioso e riepilogo giornaliero",
"comboBody": "Puoi attivare <em>entrambi</em>: silenzio 22:00–07:00 e riepilogo 09:00. I messaggi non critici durante il silenzio escono nel riepilogo delle 07:00; gli INFO idonei fuori fascia entrano in quello giornaliero. CRITICAL supera entrambi; WARNING supera il riepilogo ma attende nel silenzio. Scegli una <em>fascia silenziosa</em>, un <em>riepilogo a orario fisso</em> o entrambi."
},
"displayName": {
"heading": "Nome visualizzato",
"intro": "Il <em>nome visualizzato</em> identifica l’host di origine. Compare nei messaggi formattati, per esempio <code>🏠 home-lab</code>, e nel prefisso dell’oggetto email.",
"imageAlt": "Mostra il campo Nome con il valore amd indicato come esempio, etichetta Nome mostrato nelle notifiche - modifica per personalizzare o lasciare vuoto per utilizzare il nome host del sistema",
"imageCaption": "Lascia il campo vuoto per usare il nome host oppure inserisci un’etichetta personalizzata.",
"outro": "Se il campo è vuoto, il Monitor ritorna al nome host del sistema. L'override è per lo più utile quando si esegue diversi host ProxMenux che inviano alla stessa chat o casella di posta elettronica Telegram — un'etichetta più amichevole (<em>home-lab</em>, <em>office-pve</em>) è più facile da leggere rispetto a <code>pve01.lan</code> o <code>pmx-prod-01</code>."
},
"dispatch": {
"heading": "Processo di invio",
"intro": "La tabella descrive tre meccanismi correlati. Il flusso reale inizia con l’aggregazione degli eventi ravvicinati, poi controlli di invio/intervallo, limiti per gruppo, formattazione e controlli per canale.",
"headerStage": "Fase",
"headerWhat": "Che cosa fa",
"headerTunable": "Configurabile?",
"rows": [
{
"stage": "Deduplicazione per impronta",
"what": "Calcola un’impronta dell’evento (<code>event_type + key fields from data</code>). Impronte identiche ravvicinate sono considerate duplicati.",
"tunable": "No — logica interna del dispacciatore."
},
{
"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."
},
{
"stage": "Aggregazione eventi ravvicinati",
"what": "Più eventi dello stesso tipo in un intervallo breve, come tentativi SSH ripetuti, vengono uniti in un messaggio <code>burst_*</code> con conteggio ed esempio.",
"tunable": "No: finestra e soglia sono definite nel codice per tipo di evento."
}
],
"calloutTitle": "Gli invii avvengono in background",
"calloutBody": "Un thread dedicato elabora gli invii. La richiesta HTTP che produce l’evento termina quando lo mette in coda, senza attendere Telegram, SMTP o webhook. Il risultato di ogni invio viene registrato nella cronologia."
},
"aiRewrite": {
"heading": "Riscrittura IA facoltativa",
"body1": "Gli eventi idonei possono essere riscritti da un LLM. I risultati backup (backup_complete e backup_fail) sono esclusi. IA è disattivata inizialmente e, se attiva, lavora nel thread di invio. Se la chiamata fallisce o scade, usa il testo originale del modello.",
"body2": "Sei fornitori: OpenAI, Anthropic, Google Gemini, Groq, OpenRouter e Ollama. Ogni canale sceglie dettaglio (<code>brief</code>, <code>standard</code>, <code>detailed</code>), lingua, modalità del prompt (<code>default</code>/<code>custom</code>) e prompt personalizzato. Vedi <link>Assistente IA</link> per configurazione ed esempi.",
"privacyTitle": "Nota sulla privacy",
"privacyBody": "Le richieste IA possono includere titolo, gravità, testo, prompt e contesto: nomi host, IP, utenti, errori e righe del registro. Vanno all’endpoint scelto. Ollama resta locale solo con server e modello entrambi locali; server remoti o modelli cloud inviano dati fuori dall’host. Per mantenerli nella rete, disattiva la riscrittura o usa endpoint e modello locali controllati."
},
"pveWebhook": {
"heading": "Integrazione PVE webhook",
"intro1": "Proxmox dispone di <em>destinatari</em> sendmail, Gotify, SMTP e webhook dove supportato. Abilitare le notifiche Monitor registra un destinatario <code>webhook</code>. Gli eventi PVE, come HA, replica e report backup GUI, possono così usare lo stesso processo di invio.",
"intro2": "L'obiettivo è visibile dalla GUI Proxmox a <em>Datacenter → Notifiche → Obiettivi di notifica</em>:",
"imageAlt": "Webhook Proxmox con destinatario proxmenux-webhook, metodo POST, URL locale 8008 e modello JSON con escape dei valori e campi json",
"imageCaption": "L'obiettivo PVE-side webhook come Proxmox lo vede (la GUI è nel locale configurato dell'host — lo spagnolo in questo esempio). Gli stessi campi si applicano in qualsiasi lingua.",
"registeredIntro": "Cosa viene registrato:",
"registeredItems": [
"<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."
],
"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:",
"securityItems": [
"<strong>Fonti locali (<code>127.0.0.1</code>/<code>::1</code>).</strong> Applica limiti di frequenza, saltando controlli remoti su segreto, timestamp e ripetizioni. Anche gli indirizzi assegnati alle interfacce dell’host sono considerati locali. Il destinatario PVE automatico usa loopback.",
"<strong>Richieste remote.</strong> Oltre ai limiti, verifica il segreto <code>X-Webhook-Secret</code>, il timestamp in <code>X-ProxMenux-Timestamp</code> o JSON, le ripetizioni e l’eventuale lista IP. Il segreto è in SQLite e viene copiato in base64 in <code>/etc/pve/priv/notifications.cfg</code> per l’intestazione PVE."
],
"practiceTitle": "In pratica",
"practiceBody": "PVE usa <code>http://127.0.0.1:8008</code> senza HTTPS, oppure HTTP 8009 con HTTPS Monitor. Per chiamare <code>https://&lt;monitor-host&gt;:&lt;port&gt;/api/notifications/webhook</code> dall’esterno, invia <code>X-Webhook-Secret</code> e timestamp attuale e rispetta controlli IP e ripetizioni. Il solo segreto non basta.",
"actionsIntro": "Il Monitor gestisce questo obiettivo attraverso tre azioni nella scheda Impostazioni:",
"actionsItems": [
"<strong>Setup</strong> — viene eseguito automaticamente quando si abilitano le notifiche. Crea l'ingresso in <code>/etc/pve/notifications.cfg</code>. Il file è scritto solo quando il suo contenuto deve cambiare, e una copia del precedente è conservata in <code>/usr/local/share/proxmenux/backups/pve-notifications/</code> (le tre più recenti). Nulla è scritto mentre <code>/etc/pve</code> non è montato: un Monitor che inizia durante un riavvio di <code>pve-cluster</code> registra l'ingresso una volta tornato.",
"<strong>Pulizia</strong>: rimuove la voce e conserva il backup precedente.",
"<strong>Leggi configurazione</strong>: mostra destinatari e regole PVE correnti, per verificare il percorso effettivo quando sono configurati più invii."
],
"clusterTitle": "Nodi di cluster",
"clusterBody": "<code>/etc/pve/</code> è condiviso nel cluster, inclusi URL e segreto. Ogni nodo chiama il <em>proprio</em> listener: <code>127.0.0.1:8008</code> senza HTTPS o HTTP 8009 con HTTPS. Esegui Monitor su ogni nodo interessato e mantieni il destinatario condiviso coerente con tutti i listener."
},
"catalogue": {
"heading": "Catalogo eventi",
"intro": "Circa settanta tipi di eventi sono raggruppati in undici categorie UI. Il pannello Notifiche rende una sezione pieghevole per gruppo con una toggle per ogni evento al suo interno. Ogni evento è attivato per impostazione predefinita se non esplicitamente contrassegnato altrimenti.",
"headerGroup": "Gruppo",
"headerEvents": "Eventi",
"rows": [
{
"group": "VM/CT",
"events": "<code>vm_start</code>, <code>vm_start_warning</code>, <code>vm_stop</code>, <code>vm_shutdown</code>, <code>vm_fail</code>, <code>vm_restart</code>, oltre agli equivalenti <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": "Backup",
"events": "<code>backup_start</code>, <code>backup_complete</code>, <code>backup_warning</code>, <code>backup_fail</code>, <code>snapshot_complete</code>, <code>snapshot_fail</code>."
},
{
"group": "Risorse",
"events": "<code>cpu_high</code>, <code>ram_high</code>, <code>temp_high</code>, <code>load_high</code>."
},
{
"group": "Archiviazione",
"events": "<code>disk_space_low</code>, <code>disk_io_error</code>, <code>storage_unavailable</code>, <code>smart_test_complete</code>, <code>smart_test_failed</code>."
},
{
"group": "Rete",
"events": "<code>network_down</code>, <code>network_latency</code>."
},
{
"group": "Sicurezza",
"events": "<code>auth_fail</code>, <code>ip_block</code>, <code>firewall_issue</code>, <code>user_permission_change</code>."
},
{
"group": "Cluster",
"events": "<code>split_brain</code>, <code>node_disconnect</code>, <code>node_reconnect</code>."
},
{
"group": "Servizi",
"events": "<code>system_startup</code>, <code>system_shutdown</code>, <code>system_reboot</code>, <code>system_problem</code>, <code>service_fail</code>, <code>oom_kill</code>, <code>system_mail</code>."
},
{
"group": "Monitoraggio integrità",
"events": "<code>new_error</code>, <code>error_resolved</code>, <code>error_escalated</code>, <code>health_degraded</code>, <code>health_persistent</code>, <code>health_issue_new</code>, <code>health_issue_resolved</code>."
},
{
"group": "Aggiornamenti",
"events": "<code>update_summary</code>, <code>update_available</code>, <code>pve_update</code>, <code>update_complete</code>, <code>proxmenux_update</code>."
},
{
"group": "Hardware / GPU",
"events": "<code>gpu_mode_switch</code>, <code>gpu_passthrough_blocked</code>, <code>pci_passthrough_conflict</code>, <code>ai_model_migrated</code>."
}
],
"burstNote": "Gli eventi aggregati <code>burst_*</code>, come <code>burst_auth_fail</code>, <code>burst_ip_block</code> e <code>burst_disk_io</code>, sostituiscono più eventi con un riepilogo. Non hanno interruttori propri: ereditano lo stato dell’evento di origine.",
"backupResults": {
"heading": "Risultati di backup",
"intro": "La notifica descrive il risultato del backup riportato da Proxmox. Il risultato determina titolo, icona dei <em>Messaggi formattati</em> e riga di stato nell’email.",
"headerIcon": "Icon",
"headerResult": "Risultato",
"headerWhen": "Quando",
"rows": [
{
"icon": "💾✅",
"result": "Backup completato",
"when": "Tutti i guest sono terminati e il report non contiene avvisi."
},
{
"icon": "💾⚠️",
"result": "Backup completato con avvisi",
"when": "Ogni ospite ha finito e il rapporto porta almeno una linea di avvertimento."
},
{
"icon": "💾❌",
"result": "Errore di backup segnalato",
"when": "Un guest è fallito o il processo è terminato con errore."
},
{
"icon": "💾❔",
"result": "Esito di backup non confermato",
"when": "Il rapporto è incompleto o non dichiara un risultato per ogni ospite."
}
],
"items": [
"<strong>Il titolo identifica il processo.</strong> Include archiviazione e, con un solo guest, tipo, nome e ID. Se fallisce, identifica il guest coinvolto.",
"<strong>Il corpo elenca ogni ospite</strong> con il proprio risultato, dimensione, durata e archivio, seguito da una linea con i totali del lavoro.",
"<strong>Avvisi ed errori compaiono una sola volta.</strong> La causa principale è prima. Oltre otto righe, conta le altre in fondo; restano nel registro attività Proxmox.",
"<strong>Se fallisce prima del primo guest</strong>, mostra il motivo riportato da Proxmox, per esempio archiviazione inesistente.",
"<strong>I riepiloghi preservano il risultato.</strong> Nel riepilogo dell’orario silenzioso, il backup mantiene la propria icona. I risultati backup non entrano nel riepilogo giornaliero."
]
}
},
"history": {
"heading": "Cronologia",
"body1": "Ogni <em>tentativo</em> effettivo è registrato in <code>notification_history</code>: data <code>sent_at</code>, canale, evento, gravità, titolo, testo, esito <code>success</code> ed eventuale <code>error_message</code>. Un gruppo aggregato compare come una riga <code>burst_*</code>. Gli eventi soppressi dall’intervallo fra invii non generano tentativi né righe.",
"body2": "Impostazioni → Notifiche include la sezione <em>Cronologia notifiche</em>, inizialmente chiusa, con gli ultimi 20 invii, esito, canale, data, errore e risultato dei riepiloghi. Non offre cancellazione: Audit e report legge la stessa cronologia per verificare gli invii.",
"body3": "Gli stessi dati sono esposti a <code>GET /api/notifications/history</code> con parametri di query opzionali <code>limit</code>, <code>offset</code>, <code>severity</code> e <code>channel</code> e possono essere cancellati con <code>DELETE /api/notifications/history</code>."
},
"api": {
"heading": "Endpoint API",
"headerEndpoint": "Endpoint",
"headerMethod": "Metodo",
"headerUse": "Usa",
"rows": [
{
"endpoint": "/api/notifications/settings",
"method": "GET / POST",
"use": "Legge o salva configurazione di canali, eventi, riscrittura IA e nome visualizzato."
},
{
"endpoint": "/api/notifications/test",
"method": "POST",
"use": "Invia una notifica di prova a un canale: <code>'{'\"channel\":\"telegram\"'}'</code>."
},
{
"endpoint": "/api/notifications/test-ai",
"method": "POST",
"use": "Genera e riscrive un evento di esempio senza inviarlo."
},
{
"endpoint": "/api/notifications/provider-models",
"method": "POST",
"use": "Elenca i modelli disponibili per il fornitore AI selezionato."
},
{
"endpoint": "/api/notifications/send",
"method": "POST",
"use": "Emettere un evento dall'esterno (integrazione personalizzata)."
},
{
"endpoint": "/api/notifications/history",
"method": "GET / DELETE",
"use": "Leggi la storia con i filtri; cancellala."
},
{
"endpoint": "/api/notifications/webhook",
"method": "POST",
"use": "Riceve notifiche Proxmox. Gli indirizzi locali saltano i controlli remoti ma hanno limiti di frequenza. Per richieste remote verifica <code>X-Webhook-Secret</code>, timestamp in <code>X-ProxMenux-Timestamp</code> o JSON, ripetizioni ed eventuale lista IP."
},
{
"endpoint": "/api/notifications/proxmox/setup-webhook",
"method": "POST",
"use": "Registrare il Monitor come obiettivo in <code>/etc/pve/notifications.cfg</code>."
},
{
"endpoint": "/api/notifications/proxmox/cleanup-webhook",
"method": "POST",
"use": "Rimuovere l'obiettivo Monitor dalla configurazione di notifica di PVE."
},
{
"endpoint": "/api/notifications/proxmox/read-cfg",
"method": "GET",
"use": "Mostra la configurazione di notifica PVE corrente come PVE lo vede."
}
]
},
"whereNext": {
"heading": "Prossime letture",
"items": [
{
"label": "Assistente AI",
"href": "/docs/monitor/ai-assistant",
"tail": " — fornitori, modelli, modalità del prompt, lingue e dettaglio per canale."
},
{
"label": "Monitoraggio integrità",
"href": "/docs/monitor/health-monitor",
"tail": "— il più grande produttore unico di eventi, con le proprie durate di soppressione per categoria."
},
{
"label": "Architettura",
"href": "/docs/monitor/architecture",
"tailRich": " — collocazione delle tabelle SQLite <code>notification_last_sent</code>, <code>notification_history</code> e del thread di invio nell’architettura Monitor."
},
{
"label": "Accesso e autenticazione",
"href": "/docs/monitor/access-auth",
"tailRich": " — generazione di token API per gli script che chiamano <code>/api/notifications/send</code>."
},
{
"label": "Dashboard → Log di sistema",
"href": "/docs/monitor/dashboard/system-logs",
"tail": " — visualizzazione in tempo reale del registro usato dal relativo monitor."
}
]
}
}