{ "meta": { "title": "Architektúra ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux", "description": "Ako je postavený ProxMenux Monitor: štruktúra AppImage, blueprinty Flask, úlohy na pozadí, údaje psutil, pvesh, smartctl a journalctl, ukladanie SQLite, terminál WebSocket, poskytovatelia AI, kanály oznámení, reverzný proxy a voliteľný Fail2Ban.", "ogTitle": "Architektúra ProxMenux Monitor", "ogDescription": "Vnútri ProxMenux Monitor: AppImage, blueprinty Flask, úlohy na pozadí, SQLite, WebSocket, poskytovatelia AI a kanály oznámení.", "twitterTitle": "Architektúra ProxMenux Monitor", "twitterDescription": "AppImage, Flask, SQLite, WebSocket, poskytovatelia AI a kanály oznámení vo vnútri Monitora." }, "header": { "title": "Architektúra", "description": "Ako sa distribuuje ProxMenux Monitor, čo obsahuje AppImage a ako požiadavky prehliadača prechádzajú cez Flask k nástrojom hostiteľa a úložisku SQLite.", "section": "ProxMenux Monitor" }, "intro": { "title": "Jeden proces, veľa povinností", "body": "Proces Python počúva na TCP 8008. Poskytuje statický web Next.js a REST API, spravuje terminál WebSocket, spúšťa Health Monitor a posiela oznámenia. Nepotrebuje samostatný webový server, sprostredkovateľa správ ani externú databázu." }, "requestFlow": { "heading": "Priebeh požiadavky", "intro": "Typická požiadavka na údaje prechádza touto cestou; nastavenia prehliadača sa môžu spracovať lokálne:", "diagramCaption": "Chránené cesty overujú JWT pri zapnutom overovaní. Hlavné cesty a blueprinty vracajú údaje z cache alebo čerstvého zberu. Voliteľná kontrola Fail2Ban používa zoznam blokovaní z cache. Preposlaným IP hlavičkám dôveruje iba pri PROXMENUX_TRUST_PROXY=1; inak použije adresu spojenia. Trvalý stav zahŕňa SQLite aj JSON súbory, napríklad auth.json.", "diagramArrowLabel": "HTTP / WS", "nodes": { "clientLabel": "Klient", "clientDetail": "Prehliadač alebo PWA\n+ voliteľný proxy\nNginx / Caddy /\nTraefik", "flaskLabel": "Flask :8008", "flaskDetail": "Blueprinty\nMiddleware JWT\nKontrola Fail2Ban\n(ak je nainštalovaný)", "hostLabel": "Hostiteľské nástroje", "hostDetail": "psutil\npvesh\nsmartctl\njournalctl", "stateLabel": "Lokálny stav", "stateDetail": "SQLite DB\n+ auth.json" }, "threadsIntro": "Proces spúšťa aj vlákna na pozadí. Tieto príklady zbierajú údaje, aktualizujú cache a SQLite a posielajú oznámenia. Existujú aj ďalšie úlohy; odosielanie musí byť zapnuté:", "headerThread": "Vlákno", "headerCadence": "Interval", "headerJob": "Plánovaná úloha", "rows": [ { "thread": "_temperature_collector_loop", "cadence": "60 s", "job": "Ukladá teplotu CPU a vzorky latencie do databázy histórie, aby mali grafy údaje aj bez pripojeného prehliadača." }, { "thread": "_health_collector_loop", "cadence": "5 min", "job": "Spúšťa cyklus Health Monitor s desiatimi kategóriami, ukladá chyby a pozorovania diskov, zohľadňuje potlačenia a odovzdáva nové udalosti oznamovaciemu systému." }, { "thread": "_vital_signs_sampler", "cadence": "CPU 5 s; teplota 15 s; pamäť 30 s", "job": "Vzorkuje využitie CPU, pamäť a teplotu CPU pre ukazovatele a trvalé podmienky, nezávisle od päťminútovej celkovej kontroly." }, { "thread": "notification_manager.start()", "cadence": "riadené udalosťami", "job": "Spustí sledovanie denníka, úloh a hookov (JournalWatcher, TaskWatcher, ProxmoxHookWatcher) a odosiela do nastavených kanálov s voliteľným preformulovaním AI." } ] }, "systemd": { "heading": "Jednotka systemd", "intro": "Inštalátor vytvorí jednotku /etc/systemd/system/proxmenux-monitor.service. Predvolená konfigurácia:", "items": [ "User=root: služba používa oprávnenia root na SMART, pvesh a správu ZFS. Procesy webového terminálu dedia tieto oprávnenia.", "Restart=on-failure s odstupom desať sekúnd: po chybovom ukončení sa služba automaticky reštartuje.", "After=network.target: zaradí štart po tomto cieli; nezaručuje pridelenú IP, DNS ani vonkajšie spojenie." ], "inspectTitle": "Kontrola aktuálnej jednotky" }, "appimage": { "heading": "Čo AppImage obsahuje", "intro": "AppImage obsahuje súborový systém pripojený pri spustení. AppRun v koreni pripraví prostredie a spustí flask_server.py:", "consequencesIntro": "Dva dôsledky tohto usporiadania:", "consequences": [ "Pribalené balíky Python. Balíky Python sú súčasťou AppImage a bežia na vlastnom interpretri Python hostiteľa 3.11 (PVE 8) alebo 3.13 (PVE 9), bez inštalácie čohokoľvek do systémového Pythonu hostiteľa. Aplikácia naďalej používa rozhrania jadra hostiteľa a externé nástroje hostiteľa.", "Pribalení klienti hardvéru. Obsahuje ipmitool, lm-sensors a upsc. Merania vyžadujú podporovaný hardvér, prístup k senzorom a pre UPS nastavený server NUT." ] }, "flask": { "heading": "Štruktúra aplikácie Flask", "intro": "flask_server.py vytvorí jednu inštanciu Flask(__name__) s obmedzenými pôvodmi CORS, priamo registruje desať blueprintov a inicializuje trasy terminálu. Tabuľka uvádza hlavné moduly; registrované sú aj blueprinty PBS, odkazov Monitora, auditu a záloh VM. Prednačítavanie špecifické pre PVE beží iba na hostiteľoch PVE.", "headerBlueprint": "Blueprint / modul", "headerPrefix": "Predpona ciest", "headerOwns": "Zodpovednosť", "rows": [ { "blueprint": "flask_server.py", "prefix": [ "/api/system", "/api/storage", "/api/network", "/api/vms", "/api/hardware", "/api/logs", "/api/prometheus" ], "owns": "Hlavné koncové body, statický web a voliteľná kontrola Fail2Ban, ak je na hostiteľovi jail proxmenux." }, { "blueprint": "flask_auth_routes.py", "prefix": [ "/api/auth/*" ], "owns": "Prihlásenie, vydávanie JWT, nastavenie a overenie TOTP, zmena hesla a tokeny API." }, { "blueprint": "flask_health_routes.py", "prefix": [ "/api/health/*" ], "owns": "Kontroly stavu, podrobnosti, aktívne a potlačené chyby a nastavenia potlačenia. Chránené cesty vyžadujú overenie, ak je zapnuté." }, { "blueprint": "flask_terminal_routes.py", "prefix": [ "/api/terminal/* + WS" ], "owns": "Pridelí PTY každej relácii a cez WebSocket ho prepojí s xterm.js v prehliadači." }, { "blueprint": "flask_notification_routes.py", "prefix": [ "/api/notifications/*" ], "owns": "Vytváranie, čítanie, úprava a odstránenie kanálov; testy, AI, história a ručné odosielanie." }, { "blueprint": "flask_security_routes.py", "prefix": [ "/api/security/*" ], "owns": "Zlyhania prihlásenia a pri nainštalovanom Fail2Ban stav jailu, blokovania a ručné odblokovanie." }, { "blueprint": "flask_proxmenux_routes.py", "prefix": [ "/api/proxmenux/*" ], "owns": "Číta optimalizácie ProxMenux zaznamenané na hostiteľovi." }, { "blueprint": "flask_oci_routes.py", "prefix": [ "/api/oci/*" ], "owns": "Funkcie nasadenia aplikácií OCI a kontajnerov na Proxmox VE 9.1+." } ], "endpointsLink": "Koncové body integrácií a ich formáty opisuje Referenčná príručka API." }, "dataSources": { "heading": "Zdroje údajov", "intro": "Údaje hostiteľa pochádzajú najmä zo štandardných knižníc, súborov a správcovských príkazov. Niektoré údaje hostí vyžadujú aj QEMU Guest Agent alebo príkazy v CT:", "headerSource": "Zdroj", "headerUsedFor": "Používa sa na", "rows": [ { "source": "psutil", "usedFor": "Záťaž CPU, pamäť, swap, využitie pripojených systémov, sieťové počítadlá a procesy." }, { "source": "pvesh / qm / pct", "usedFor": "Informácie uzla Proxmox, inventár a konfigurácia VM/CT, úložiská a história úloh." }, { "source": "smartctl", "usedFor": "Atribúty SATA/NVMe, stav SMART, opotrebenie, životnosť, model a sériové číslo." }, { "source": "zpool / zfs", "usedFor": "Stav fondu (ONLINE / DEGRADED / FAULTED / UNAVAIL), priebeh kontroly scrub a využitie datasetov." }, { "source": "journalctl", "usedFor": "Systémové protokoly, procesy ukončené pre OOM, chyby ATA/NVMe/dm, bezpečnostné udalosti a vlastné jednotky služieb." }, { "source": "ip / iproute2", "usedFor": "Rozhrania, adresy, mosty, agregácie spojení a zariadenia spravované OVS." }, { "source": "nvidia-smi · intel_gpu_top", "usedFor": "Dostupné údaje GPU o využití, VRAM, teplote a kódovaní/dekódovaní. Polia závisia od výrobcu, nástroja a ovládača." }, { "source": "lspci · lscpu · dmidecode", "usedFor": "Topológia PCIe, model a topológia CPU, základná doska a BIOS." }, { "source": "ipmitool · sensors", "usedFor": "Mimopásmové senzory, ventilátory a teploty základnej dosky, ak ich hardvér podporuje." }, { "source": "upsc (NUT)", "usedFor": "Stav batérie, záťaž a výdrž UPS pri nastavenom serveri NUT." } ], "cacheTitle": "Cache obmedzuje požiadavky na hostiteľa", "cacheBody": "Náročné výsledky smartctl -a a pvesh get sa dočasne ukladajú v procese Flask, čím sa znižuje počet volaní diskov a API klastra. Trvanie závisí od zdroja: sekundy pre metriky a minúty pre SMART." }, "persistence": { "heading": "Perzistencia", "intro": "Viaceré stavové súbory majú odlišný obsah a požiadavky na prístup:", "headerPath": "Path", "headerOwner": "Vlastník", "headerContents": "Obsah", "rows": [ { "path": "/usr/local/share/proxmenux/health_monitor.db", "owner": "root:root", "contents": "Databáza SQLite. Tabuľky: errors, events, disk_registry, disk_observations, user_settings, notification_history, excluded_storages, excluded_interfaces. Režim denníka WAL." }, { "path": "/usr/local/share/proxmenux/.notification_key", "owner": "root 0600", "contents": "Hlavný 32-bajtový kľúč pre tajné nastavenia oznámení ENC2. Používa náhodnú soľ pre každú hodnotu, odvodené kľúče a MAC. Staré hodnoty XOR podporuje na migráciu." }, { "path": "/root/.config/proxmenux-monitor/auth.json", "owner": "root:root", "contents": "Konfigurácia prístupu: zapnutie, meno, osolený hash hesla PBKDF2-HMAC-SHA256, tajomstvo TOTP, obnovovacie kódy, kľúč JWT inštalácie, metadáta tokenov API a hashe odvolania. Staré hashe SHA-256 sa migrujú po úspešnom prihlásení." }, { "path": "/var/log/proxmenux-auth.log", "owner": "root:root", "contents": "Textový protokol overovania nezávislý od Fail2Ban. Ak je jail [proxmenux] nainštalovaný a aktívny, číta ho na detekciu opakovaných zlyhaní prihlásenia. Bez jailu zostáva protokol dostupný na kontrolu." } ], "backupTitle": "Zálohujte auth.json pred reinštaláciou", "backupBody": "Výmena AppImage zvyčajne zachová /root/.config/proxmenux-monitor/auth.json a /usr/local/share/proxmenux/health_monitor.db. Zachovajte auth.json s jwt_secret pre platnosť a metadáta tokenov. Databáza nezávisle ukladá stav a oznámenia. S ňou zálohujte .notification_key na obnovu tajných nastavení kanálov; samotná databáza neobnoví overovanie API." }, "health": { "heading": "Cyklus Health Monitor", "intro": "Približne každých päť minút zberač na pozadí volá health_monitor.py na kontroly desiatich kategórií panela:", "items": [ "Kritické služby PVE (pveproxy, pvedaemon, pvestatd, pve-cluster).", "Úložiská Proxmox: pvesh get /storage a dostupnosť každého úložiska.", "Disky a súborové systémy: SMART, chyby I/O v dmesg, stav ZFS a kapacita pripojených systémov.", "VM a CT: zlyhania štartu, pády, chyby QMP a zlyhania vypnutia.", "Sieť: stav mostov a agregácií spojení, stav liniek a latencia k bráne.", "Aktualizácie: čakajúce balíky a bezpečnostné opravy.", "Protokoly: trvalé vzory, špičky a kaskády v systémovom denníku.", "Pamäť: zásahy OOM killer a dlhodobý tlak na RAM.", "CPU: využitie a teplota CPU sa porovnávajú s nastaviteľnými prahmi; dostupné senzory závisia od hardvéru.", "Bezpečnosť: zlyhania prihlásenia, blokovania a stav jailu Fail2Ban." ], "afterIntro": "Nálezy používajú stabilné error_key, kategóriu a závažnosť. Existujúce záznamy v errors sa aktualizujú na mieste (last_seen, závažnosť, dôvod) namiesto duplikovania. Odosielanie oznámení má aj vlastné pravidlá odtlačkov a časových odstupov.", "cycleEnd": "Čistenie môže vyriešiť staré chyby podľa trvania potlačenia kategórie a stavových pravidiel, odstrániť osirelé záznamy zrušených prostriedkov a vymazať events staršie než 30 dní. Kategórie opisuje Panel → Health Monitor." }, "notifications": { "heading": "Systém oznámení", "intro": "notification_manager.py riadi odosielanie: načíta kanály, spravuje rad a poskytuje Python API pre Flask a Health Monitor aj vstup CLI pre hooky .sh ProxMenux.", "items": [ "Sledovacie komponenty vytvárajú udalosti: JournalWatcher sleduje denník, TaskWatcher zisťuje úlohy Proxmox, ProxmoxHookWatcher prijíma hooky záloh, replikácie a snímok a PollingCollector spracúva pomalé zdroje.", "Šablóny prevedú udalosti na názov a text. Nastavený poskytovateľ AI (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) ich môže preformulovať bežným jazykom. Obe verzie sa ukladajú do notification_history.", "Kanály odosielajú cez služby ako Telegram, Discord, email, Gotify, Pushover a Apprise. Implementácie v notification_channels.py používajú spoločné rozhranie create_channel() / send().", "Šifrovanie. Citlivé nastavenia (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) sa pred uložením šifrujú kľúčom z .notification_key a v rozhraní sa zobrazujú maskované." ], "linksFooter": "Prepínače udalostí, nastavenia kanálov a AI opisujú Nastavenia → Oznámenia a Nastavenia → Asistent AI." }, "websocket": { "heading": "Terminál WebSocket", "intro": "Karta Terminál prepája ľahkého klienta xterm.js s PTY servera cez WebSocket. Existujú dva režimy:", "items": [ "Režim HTTP, predvolený: vstavaný server Flask s flask-sock spracúva prechod na protokol WebSocket.", "Režim HTTPS / WSS: server TLS používa gevent.pywsgi.WSGIServer s jeho predvoleným handlerom; flask-sock spracúva spojenia WebSocket cez TLS." ], "outro": "Podriadené procesy terminálu dedia User=root zo služby. Otvorenie WebSocketu vyžaduje krátkodobý jednorazový lístok získaný z overeného koncového bodu lístkov terminálu so správcovským oprávnením.", "proxyNote": "Pri reverznom proxy povoľte WebSocket a hlavičky Upgrade a Connection. Terminál potrebuje toto preposielanie." }, "proxy": { "heading": "Reverzný proxy a Fail2Ban", "intro": "Výber IP klienta a voliteľné blokovanie v aplikácii závisia od týchto nastavení a komponentov:", "items": [ "Výber IP klienta. Kontrola before_request a protokol prístupu dôverujú X-Forwarded-For a potom X-Real-IP iba pri PROXMENUX_TRUST_PROXY=1. Inak použijú request.remote_addr. Preposlané hlavičky sa neprijímajú automaticky.", "Voliteľný Fail2Ban v aplikácii. Spojenie cez proxy môže mať IP proxy ako TCP protistranu. Pri dôveryhodnej IP klienta a aktívnom jaile proxmenux Flask odmietne blokované IP stavom HTTP 403. Zoznam je v cache 30 sekúnd a obnoví ho spracovanie požiadavky po vypršaní, nie samostatný časovač." ], "calloutTitle": "Fail2Ban nie je pribalený", "calloutBody": "Fail2Ban nie je pribalený ani automaticky inštalovaný. Nainštalujete ho v Zabezpečení Monitora alebo cez Zabezpečenie → Fail2Ban v ProxMenux Scripts. Bez fail2ban-client či jailu proxmenux táto kontrola neblokuje požiadavky. Nastavená politika overovania zostáva v platnosti.", "outro": "Príklady Nginx/Caddy/Traefik a návod na jail sú v Prístup a overenie a Zabezpečenie → Fail2Ban." }, "whereNext": { "heading": "Kam ďalej", "items": [ { "label": "Prístup a overenie", "href": "/docs/monitor/access-auth", "tail": " — prvé spustenie, heslo a TOTP 2FA, príklady reverzného proxy a jail Fail2Ban." }, { "label": "Referenčná príručka API", "href": "/docs/monitor/api", "tail": " — koncové body integrácií, správa tokenov a pravidlá overovania." }, { "label": "Nastavenie → ProxMenux Monitor", "href": "/docs/settings/proxmenux-monitor", "tail": " — ovládanie služby a kontrola stavu v textovej ponuke ProxMenux." } ] } }