mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-06-14 12:27:02 +00:00
complete i18n migration to /[locale]/ with EN+ES content
Full rewrite of the docs site under app/[locale]/ with next-intl in localePrefix:"always" mode. Every page now exists at both /en/<path> and /es/<path>; the root / shows a meta-refresh + JS redirect to /<defaultLocale>/ so GitHub Pages serves something on the apex URL. Highlights: - 107 doc pages migrated to file-per-page JSON namespaces under messages/en/ and messages/es/. Spanish content is fully translated (no copy-of-English placeholders). - New documentation for the Active Suppressions section in the Settings tab and the per-event Dismiss dropdown in the Health Monitor modal. - New screenshots: dismiss-duration-dropdown.png and an updated health-suppression-settings.png. - Pagefind integrated for client-side search; index is built on every CI deploy (not committed). - RSS feeds: per-locale at /<locale>/rss.xml plus root /rss.xml for backward compat. - Removed the dead app/[locale]/guides/[slug]/ route — every guide now has its own static page and no markdown source remains. - Fixed orphan link /guides/nvidia -> /guides/nvidia-manual in docs/hardware/nvidia-host. - Removed obsolete components (footer2, calendar, drawer). Verified locally with `npm ci && npm run build`: 2804 files in out/, 231 pages indexed by pagefind, root redirect intact, both locale roots and the new Active Suppressions docs render OK.
This commit is contained in:
246
web/messages/en/docs/monitor/dashboard/hardware.json
Normal file
246
web/messages/en/docs/monitor/dashboard/hardware.json
Normal file
@@ -0,0 +1,246 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Hardware tab | ProxMenux Documentation",
|
||||
"description": "The Hardware tab inventories the physical machine: CPU and motherboard, memory modules, thermal sensors, GPUs (with per-slot real-time monitoring and one-click driver installer), Coral TPU accelerators, storage summary with link-speed checks, full PCI and USB device lists, power consumption, PSUs, fans and UPS state."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Hardware tab",
|
||||
"description": "The physical machine in one screen — CPU and motherboard identity, every memory module, thermal sensors across all subsystems, GPUs with live utilisation and a built-in driver installer, Coral TPUs, every PCI and USB device with its kernel driver, the full disk inventory with negotiated link speeds, plus power, cooling and the UPS.",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Built from standard tools",
|
||||
"body": "Most of this tab is parsed from <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> and <code>upsc</code>. Sections only render when the relevant tool returns data, so a host without a UPS won't show the UPS card and a host without IPMI won't show out-of-band power figures."
|
||||
},
|
||||
"thresholds": {
|
||||
"title": "Status colours and thresholds applied here",
|
||||
"intro": "Every temperature chip and reading on this tab follows the same classification — <green/> <strong>green</strong> below Warning, <amber/> <strong>amber</strong> from Warning to Critical, <red/> <strong>red</strong> at Critical and above. Recommended defaults shipped with ProxMenux:",
|
||||
"items": [
|
||||
"<strong>CPU temperature</strong> — Warning 80 °C, Critical 90 °C.",
|
||||
"<strong>Disk temperature</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (warning / critical)."
|
||||
],
|
||||
"outro": "Every value is configurable per host — <link>Settings → Health Monitor Thresholds</link> is the single source of truth and explains how to tune them."
|
||||
},
|
||||
"sections": {
|
||||
"heading": "Sections",
|
||||
"intro": "The tab renders top-to-bottom in this order. Some sections only appear when the host has the corresponding hardware or tool installed — they're marked <em>(conditional)</em> below.",
|
||||
"systemInfoTitle": "System Information",
|
||||
"systemInfoIntro": "Two side-by-side blocks, always present:",
|
||||
"systemInfoItems": [
|
||||
"<strong>CPU</strong> — model name, microarchitecture, sockets / cores / threads, base / boost frequency, virtualisation flags (VT-x / AMD-V), cache topology.",
|
||||
"<strong>Motherboard</strong> — vendor, model, BIOS version, BIOS date, SMBIOS UUID. Useful for matching to vendor download pages when looking for firmware updates."
|
||||
],
|
||||
"memoryTitle": "Memory Modules",
|
||||
"memoryBody": "One row per populated slot from <code>dmidecode</code>: slot label, module size, type (DDR4 / DDR5 / ECC variants), speed (configured and rated), manufacturer, part number and serial. Empty slots are listed greyed-out so you can see the upgrade headroom at a glance.",
|
||||
"thermalTitle": "Thermal Monitoring",
|
||||
"thermalIntro": "Five sub-blocks, each fed by <code>lm-sensors</code> + tool-specific scrapers. A block hides itself when no sensors are reported in that category.",
|
||||
"thermalItems": [
|
||||
"<strong>CPU</strong> — package and per-core temperatures.",
|
||||
"<strong>GPU</strong> — discrete-GPU sensors via <code>nvidia-smi</code> / <code>amdgpu_top</code> / Intel iGPU. Includes hot-spot and memory-junction when the driver exposes them.",
|
||||
"<strong>NVME</strong> — composite + per-sensor temperatures from <code>nvme</code>.",
|
||||
"<strong>PCI</strong> — sensors that surface as PCI-attached devices (HBAs, network cards with internal sensors).",
|
||||
"<strong>OTHER</strong> — chipset, VRM, ambient sensors that don't fit elsewhere."
|
||||
]
|
||||
},
|
||||
"graphics": {
|
||||
"heading": "Graphics Cards",
|
||||
"intro": "Each detected video controller renders as its own card with vendor, model, kind (<em>Integrated</em> / <em>PCI</em> / BMC), PCI slot (BDF), kernel driver and module list. The card also exposes an inline <strong>Switch Mode</strong> control that flips the GPU between LXC sharing (native driver) and VM passthrough (<code>vfio-pci</code>) — see <link>Switch GPU Mode (VM ↔ LXC)</link> for what happens on the host when you press it.",
|
||||
"vfioImageAlt": "Graphics Cards section showing a Matrox G200EH integrated GPU bound to mgag200 (Ready for LXC) and an NVIDIA Quadro P400 bound to vfio-pci (Ready for VM passthrough)",
|
||||
"vfioImageCaption": "Two GPUs detected: the Matrox BMC chip is on the native driver and ready for LXC; the NVIDIA Quadro P400 is bound to <code>vfio-pci</code>, ready for VM passthrough.",
|
||||
"lxcImageAlt": "Graphics Cards section showing an Intel UHD Graphics iGPU on i915 and an NVIDIA Quadro P1000 on the nvidia driver, both labelled Ready for LXC containers",
|
||||
"lxcImageCaption": "Same node after switching the NVIDIA card back to the native driver — both GPUs now Ready for LXC containers.",
|
||||
"realtimeTitle": "Real-time monitoring modal",
|
||||
"realtimeBody": "Clicking a GPU card opens a per-slot monitoring modal that polls the appropriate vendor tool every three seconds. The modal exposes vendor, type, PCI slot, driver, kernel module(s), live engine utilisation (Render/3D, Video, Blitter, VideoEnhance), graphics & memory clocks, temperature, power draw (when reported), VRAM usage, and an Active Processes table with per-process engine load. Data is served from <code>/api/gpu/<slot>/realtime</code>.",
|
||||
"toolsIntro": "The vendor tool used per GPU:",
|
||||
"headerVendor": "Vendor",
|
||||
"headerTool": "Tool",
|
||||
"headerProject": "Project",
|
||||
"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": "— (display only)",
|
||||
"projectLabel": "Detected and labelled as BMC; no realtime block."
|
||||
}
|
||||
],
|
||||
"nvidiaImageAlt": "GPU monitoring modal for an NVIDIA Quadro P1000: vendor NVIDIA, driver nvidia loaded, graphics clock 1.26 GHz, memory clock 2.50 GHz, temperature 50 °C, all engine utilisation bars at 0 %, no active processes, total memory 4096 MiB",
|
||||
"nvidiaImageCaption": "NVIDIA Quadro P1000 with the proprietary driver loaded — clocks, temperature, engine bars and active processes all visible.",
|
||||
"intelImageAlt": "GPU monitoring modal for an Intel UHD Graphics iGPU on i915 driver, showing 11.31 W power draw, 1 % video engine load and an ffmpeg process consuming 8 MB",
|
||||
"intelImageCaption": "Intel iGPU with <code>i915</code> active. The Active Processes table picks up an ffmpeg job using the video engine.",
|
||||
"amdImageAlt": "GPU monitoring modal for an AMD Lucienne integrated GPU on amdgpu driver, with engine utilisation bars at 0 % and amdgpu_top listed as an active process",
|
||||
"amdImageCaption": "AMD iGPU monitored through <code>amdgpu_top</code> — the tool itself shows up as an active process because it's the live polling backend.",
|
||||
"installTitle": "Installing the NVIDIA driver from the modal",
|
||||
"installBody": "When an NVIDIA GPU is bound to <code>nouveau</code>/<code>nvidiafb</code> (no proprietary driver installed), the realtime block can't read clocks, power or per-process load. The modal then replaces the metrics with an <strong>Install NVIDIA Drivers</strong> button that wires straight into the same script documented at <link>Install NVIDIA Drivers (Host)</link>.",
|
||||
"noDriverAlt": "GPU monitoring modal for an NVIDIA Quadro P620 with kernel modules nvidiafb and nouveau loaded, an Extended Monitoring Not Available callout and a blue Install NVIDIA Drivers button",
|
||||
"noDriverCaption": "No proprietary driver installed yet — the modal shows a one-click installer.",
|
||||
"promptAlt": "NVIDIA GPU Driver Installation confirmation dialog listing detected GPUs, LXC containers with NVIDIA passthrough and a Yes/Cancel pair",
|
||||
"promptCaption": "Pre-install summary: detected GPUs, LXC containers that already have NVIDIA passthrough, and what the script will do. Nothing is touched until you confirm.",
|
||||
"successAlt": "Terminal output showing the NVIDIA driver 580.105.08 installed successfully and nvidia-smi reporting a Quadro P620",
|
||||
"successCaption": "Successful install — the NVIDIA <code>.run</code> built via DKMS, the persistence service is in place, and <code>nvidia-smi</code> reports the GPU.",
|
||||
"warningTitle": "Pick a driver version your GPU actually supports",
|
||||
"warningBody": "Newer NVIDIA driver branches drop support for older GPU families (e.g. Maxwell / Kepler). If the install finishes but <code>nvidia-smi</code> reports <em>\"No devices were found\"</em> or DKMS errors out, the chosen branch most likely doesn't cover your GPU — re-run the installer and pick an older branch (legacy 470.x for Kepler-era cards, etc.). NVIDIA publishes the per-GPU compatibility on the <a>official driver lookup page</a>.",
|
||||
"whereGoIntro": "Where to go from here:",
|
||||
"whereGoItems": [
|
||||
"<link1>Install NVIDIA Drivers (Host)</link1> — full walk-through of the installer, kernel-compatibility matrix, optional NVENC patch and LXC propagation.",
|
||||
"<link2>Switch GPU Mode (VM ↔ LXC)</link2> — what the inline <em>Switch Mode</em> control actually does.",
|
||||
"<link3>Add GPU to VM (Passthrough)</link3> and <link4>Add GPU to LXC</link4> — first-time assignment of an unbound GPU."
|
||||
]
|
||||
},
|
||||
"coral": {
|
||||
"heading": "Coral TPU / AI Accelerators",
|
||||
"subHeading": "(conditional)",
|
||||
"intro": "Renders when the host has Google Coral or other AI-accelerator devices wired up. Each device opens a modal with its connection type (M.2 / mini-PCIe / USB), PCIe link width, vendor / product ID, kernel driver (<code>apex</code> for PCIe, <code>libedgetpu</code> for USB), kernel modules (<code>gasket</code> + <code>apex</code>), device nodes (<code>/dev/apex_*</code>), Edge TPU runtime status, live temperature and the firmware hardware-warning thresholds.",
|
||||
"imageAlt": "Coral Edge TPU detail modal: PCIe / M.2 connection, PCIe 5.0 GT/s x1 link, vendor 1ac1:089a, kernel driver apex, gasket and apex modules loaded, /dev/apex_0 present, Edge TPU Runtime not installed, temperature 53.5 °C with hardware warning thresholds",
|
||||
"imageCaption": "M.2 Coral with the host kernel modules loaded, the device node up and the firmware temperature warnings exposed. The runtime line goes green once the matching Edge TPU runtime is installed.",
|
||||
"pathsIntro": "Two install paths exist depending on the form factor:",
|
||||
"pathsItems": [
|
||||
"<strong>M.2 / Mini-PCIe</strong> — the host needs the <code>gasket</code> + <code>apex</code> kernel modules built via DKMS so the device node <code>/dev/apex_0</code> appears at boot.",
|
||||
"<strong>USB Accelerator</strong> — the host only needs the Edge TPU user-space runtime (<code>libedgetpu1-std</code>) from Google's APT repository."
|
||||
],
|
||||
"outro": "Both are handled by a single ProxMenux entry — <installLink>Install Coral TPU on the Host</installLink> — which auto-detects what you have. Background and the official runtime live at <a>coral.ai/docs</a>. Once the host side is ready, hand the device to a container with <lxcLink>Add Coral TPU to LXC</lxcLink>."
|
||||
},
|
||||
"storage": {
|
||||
"heading": "Storage Summary",
|
||||
"intro": "Every block device the kernel knows about, grouped by type. For each disk you get the kernel name (<code>sda</code>, <code>nvme0n1</code>, <code>zram0</code> …), the type tag (<em>SSD</em>, <em>HDD</em>, <em>NVMe SSD</em>), the model string and the negotiated link information. Click any disk to open a hardware-info modal with model, serial, capacity, interface and current vs maximum link speed.",
|
||||
"imageAlt": "Storage Summary card listing eleven block devices (SATA SSDs, SATA HDDs, NVMe SSDs and zram) with model strings and negotiated link speeds; the two NVMe drives show 3.0 x4 with the current speed highlighted",
|
||||
"imageCaption": "Eleven devices on this node. SATA links print as <em>SATA <version>, <Gb/s> (current: ...)</em>; NVMe drives print as <em><PCIe gen> x<width></em>.",
|
||||
"nvmeBody": "For NVMe drives the per-card line shows both the negotiated link and the maximum the device supports. When the two don't match (e.g. a Gen3 x4 SSD running at <strong>3.0 x1</strong> because it's sitting in a chipset slot wired to a single lane), the current speed is rendered in amber so the downgrade is visible at a glance — useful when troubleshooting unexpectedly slow disks or after a BIOS update remaps the lanes.",
|
||||
"nvmeModalAlt": "NVMe drive detail modal for nvme0n1: NVMe SSD type, 953.9 GB capacity, current link speed 3.0 x1 highlighted in amber, maximum link speed 3.0 x4, model WDC CL SN720, serial number, PCIe/NVMe interface",
|
||||
"nvmeModalCaption": "NVMe modal showing the lane downgrade — drive supports x4 but the slot is wired x1.",
|
||||
"outro": "SMART data, self-tests, history and the PDF disk report all live one tab over, in <storageLink>Dashboard: Storage tab</storageLink>. The same data feeds the script at <smartLink>SMART Disk Health & Test</smartLink> — running a long test from the script writes the JSON the Monitor displays in <em>Storage → History</em>."
|
||||
},
|
||||
"pci": {
|
||||
"heading": "PCI Devices",
|
||||
"intro": "Every PCI-addressable device, identified by its <strong>PCI BDF</strong> (Bus:Device.Function — e.g. <code>03:00.0</code>) and its device class (<em>Storage Controller</em>, <em>USB Controller</em>, <em>Graphics Card</em>, <em>Network Controller</em>, <em>Audio Controller</em> …). Each card shows the manufacturer, the device name and the <strong>kernel driver currently bound</strong> — which is the field you actually want when troubleshooting passthrough, IOMMU groups or a card the host isn't driving correctly.",
|
||||
"imageAlt": "PCI Devices section listing fifteen devices grouped by class: storage controllers on ahci/nvme, USB controllers, graphics cards (one on vfio-pci, one on the native driver), network controllers on igb / tg3, an audio controller alongside a passed-through GPU",
|
||||
"imageCaption": "Fifteen devices on this node. Note the GPU and its companion audio function both bound to <code>vfio-pci</code> — that's a card prepared for VM passthrough.",
|
||||
"bdfTitle": "Reading the BDF",
|
||||
"bdfBody": "<code>03:00.0</code> means PCI bus <code>03</code>, device <code>00</code>, function <code>0</code>. Multifunction devices like discrete GPUs typically claim <code>.0</code> for the GPU and <code>.1</code> for the HDMI audio function — both have to be passed through together, which is why <link>Switch GPU Mode</link> also handles the orphan-audio cleanup when leaving VM mode."
|
||||
},
|
||||
"usb": {
|
||||
"heading": "USB Devices",
|
||||
"intro": "Every USB device the host enumerates, with manufacturer / product strings, USB version, the <code>bus:device</code> address, the <code>vendor:product</code> ID pair and the kernel driver. The renderer also classifies common roles — <em>Communications</em> (Z-Wave / Zigbee sticks), <em>UPS</em>, storage, HID — so you can spot at a glance which of your sticks is which without cross-referencing IDs.",
|
||||
"imageAlt": "USB Devices card listing three devices: an Aeotec Z-Wave Z-Stick, a ConBee II Zigbee coordinator and an Ellipse ECO UPS, each with USB version, address, vendor:product ID and bound driver",
|
||||
"imageCaption": "Three USB devices — two home-automation radios on <code>usbfs</code> and a UPS on <code>usbfs</code> (NUT talks to it through libusb)."
|
||||
},
|
||||
"power": {
|
||||
"heading": "Power Consumption",
|
||||
"subHeading": "(conditional)",
|
||||
"intro": "Renders only when the host exposes power telemetry. Two independent sources are surfaced when available:",
|
||||
"items": [
|
||||
"<strong>ACPI / IPMI total draw</strong> — whole-system wattage from a board-level sensor or the BMC. Typical on server boards.",
|
||||
"<strong>CPU package power</strong> — read from the Intel RAPL counters (or AMD equivalent). Useful to separate CPU draw from the rest of the system on consumer boards that don't expose a total figure."
|
||||
],
|
||||
"supplyImageAlt": "Power Consumption section showing 198 W total draw via ACPI interface, plus a Power Supplies card with two PSUs both reporting OK (185 W and 5 W output)",
|
||||
"supplyImageCaption": "Server board with a single ACPI power sensor and dual PSUs reported through IPMI — the second PSU is the redundant one, idling at 5 W.",
|
||||
"cpuImageAlt": "Power Consumption section on a consumer board showing only CPU Power 8.7 W via Intel RAPL",
|
||||
"cpuImageCaption": "Consumer board with no whole-system sensor — the section falls back to RAPL CPU-only."
|
||||
},
|
||||
"psu": {
|
||||
"heading": "Power Supplies",
|
||||
"subHeading": "(conditional)",
|
||||
"body": "Server-board / dual-PSU machines via IPMI: presence (PSU 1 / PSU 2 / …), input voltage, output wattage, OK / failed flag. The first thing you check after a power blip on a node with redundant PSUs."
|
||||
},
|
||||
"fans": {
|
||||
"heading": "System Fans",
|
||||
"subHeading": "(conditional)",
|
||||
"body": "Per-fan RPM with a small sparkline (when supported). On boards without per-fan reporting the section falls back to a single chassis-fan reading."
|
||||
},
|
||||
"ups": {
|
||||
"heading": "UPS Status",
|
||||
"subHeading": "(conditional)",
|
||||
"body": "Renders when a NUT (Network UPS Tools) server is configured and reachable. Shows: state (online / on battery / charging / low battery), battery charge percentage, runtime estimate, load percentage, input voltage, model and firmware. The same data feeds the <em>Security & Certificates</em> category of the Health Monitor — a UPS that goes on-battery surfaces immediately."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "How the data is collected",
|
||||
"headerSection": "Section of the tab",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Static inventory (PCI, CPU, BIOS)",
|
||||
"endpoint": "/api/hardware",
|
||||
"source": "<code>lspci -vmm</code>, <code>/proc/cpuinfo</code>, <code>dmidecode</code>; cached for the lifetime of the process."
|
||||
},
|
||||
{
|
||||
"section": "Live sensor values",
|
||||
"endpoint": "/api/hardware/live",
|
||||
"source": "<code>sensors</code> (lm-sensors), package temperatures, fan RPM. Refreshed each request."
|
||||
},
|
||||
{
|
||||
"section": "CPU temperature history",
|
||||
"endpoint": "/api/temperature/history",
|
||||
"source": "Time series sampled by the Health Monitor every 5 min and persisted to SQLite."
|
||||
},
|
||||
{
|
||||
"section": "GPU live metrics",
|
||||
"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": "# Cross-check inventory against the OS view",
|
||||
"codeComment2": "# Confirm the GPU card the dashboard sees"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Install NVIDIA Drivers (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — what the GPU modal's install button runs."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — what the inline mode switch on each GPU card does to the host."
|
||||
},
|
||||
{
|
||||
"label": "Install Coral TPU on the Host",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — the Coral kernel module / runtime install."
|
||||
},
|
||||
{
|
||||
"label": "SMART Disk Health & Test",
|
||||
"href": "/docs/disk-manager/smart-disk-test",
|
||||
"tail": " — the script behind the SMART data shown in the Storage tab's disk drill-in."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard: Storage tab",
|
||||
"href": "/docs/monitor/dashboard/storage",
|
||||
"tail": " — full SMART attribute table, self-test history and PDF report."
|
||||
},
|
||||
{
|
||||
"label": "Health Monitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — the CPU & Temperature category that consumes the same sensors."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — the hardware and GPU endpoints."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — the other tabs."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
91
web/messages/en/docs/monitor/dashboard/index.json
Normal file
91
web/messages/en/docs/monitor/dashboard/index.json
Normal file
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard | ProxMenux Documentation",
|
||||
"description": "The dashboard is the main UI of ProxMenux Monitor: nine tabs (System Overview, Storage, Network, VMs & LXCs, Hardware, System Logs, Terminal, Security, Settings) plus the global header with the Health Monitor status pill."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard",
|
||||
"description": "The dashboard is the everyday view of ProxMenux Monitor — nine tabs each focused on one slice of the host plus a global header with the Health Monitor status pill, the node identity and the quick-refresh control.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"oneHeader": {
|
||||
"title": "One header, nine tabs",
|
||||
"body": "The header (logo, node name, status pill, uptime, refresh, theme toggle) stays visible everywhere. The active tab below it changes the entire content area. The status pill colour mirrors the worst category of the <link>Health Monitor</link> — it's the same data point seen from the dashboard."
|
||||
},
|
||||
"tabs": {
|
||||
"heading": "The nine tabs",
|
||||
"intro": "Each tab has its own dedicated page. Pages are added incrementally as the documentation is filled in; below is the full list and what each one is responsible for.",
|
||||
"headerTab": "Tab",
|
||||
"headerOwns": "What it owns",
|
||||
"rows": [
|
||||
{
|
||||
"name": "System Overview",
|
||||
"linksTo": "/docs/monitor/dashboard/system-overview",
|
||||
"owns": "CPU / memory / temperature widgets, active VM & LXC count, historical metrics charts, storage and network summaries. Default landing tab."
|
||||
},
|
||||
{
|
||||
"name": "Storage",
|
||||
"owns": "Proxmox pools, physical disks, SMART data, ZFS state, wear & lifetime, observation history."
|
||||
},
|
||||
{
|
||||
"name": "Network",
|
||||
"owns": "Every interface (physical / bond / bridge / OVS), IP/MAC, RX/TX graphs, historical RRD per interface."
|
||||
},
|
||||
{
|
||||
"name": "VMs & LXCs",
|
||||
"owns": "Inventory of guests, drill-in for config / metrics / logs, start / stop / reboot / shutdown actions."
|
||||
},
|
||||
{
|
||||
"name": "Hardware",
|
||||
"owns": "CPU model and topology, memory layout, PCIe topology, GPUs with per-slot real-time monitoring."
|
||||
},
|
||||
{
|
||||
"name": "System Logs",
|
||||
"owns": "Live <code>journalctl</code> with filters, Proxmox task history, notification log, downloadable log bundles."
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"owns": "Browser shell to host or to any VM/CT, powered by <code>xterm.js</code> over WebSockets."
|
||||
},
|
||||
{
|
||||
"name": "Security",
|
||||
"owns": "Auth setup, password / 2FA / API tokens, audit log, optional Fail2Ban panel, Secure Gateway deployment."
|
||||
},
|
||||
{
|
||||
"name": "Settings",
|
||||
"owns": "Notification channels, AI provider, suppression durations, branding, advanced flags."
|
||||
}
|
||||
]
|
||||
},
|
||||
"headerAnatomy": {
|
||||
"heading": "Header anatomy",
|
||||
"items": [
|
||||
"<strong>Logo + product name</strong> on the left. The logo turns into an \"update available\" variant when a newer Monitor release is detected.",
|
||||
"<strong>Node identity</strong> — the Proxmox node name resolved from <code>pvesh get /nodes</code>, falling back to <code>hostname</code>.",
|
||||
"<strong>Health status pill</strong> — Healthy (green), Warning (yellow), Critical (red). Click it to open the Health Monitor modal. An extra blue <em>info</em> badge appears when there are dismissed items still inside their suppression window.",
|
||||
"<strong>Uptime</strong> — host uptime, formatted human-readable.",
|
||||
"<strong>Refresh button</strong> — re-issues all the live API calls without a full page reload.",
|
||||
"<strong>Theme toggle</strong> — light / dark / system. Persisted in <code>localStorage</code>."
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "System Overview tab",
|
||||
"href": "/docs/monitor/dashboard/system-overview",
|
||||
"tail": " — the landing tab, fully documented."
|
||||
},
|
||||
{
|
||||
"label": "Health Monitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — the modal behind the header status pill, ten categories deep-dive."
|
||||
},
|
||||
{
|
||||
"label": "Architecture",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": " — how the dashboard talks to the Flask backend."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
225
web/messages/en/docs/monitor/dashboard/network.json
Normal file
225
web/messages/en/docs/monitor/dashboard/network.json
Normal file
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Network tab | ProxMenux Documentation",
|
||||
"description": "The Network tab inventories every interface on the host: physical NICs, bridges, bonds, VLANs and the VM/LXC virtual interfaces. Per-interface drill-in shows IP / MAC / state / bond members / traffic since boot and a historical RRD chart."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Network tab",
|
||||
"description": "Every interface the kernel reports — physical NICs, bridges, bonds, VLANs and VM/LXC virtual ports — grouped into three cards. Each row is clickable and opens a drill-in with addressing, traffic counters and historical RRD data.",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Live + historical, both included",
|
||||
"body": "Live state comes from <code>psutil.net_if_stats()</code> and <code>ip</code>; historical bandwidth from Proxmox's RRD store via <code>/api/network/<interface>/metrics</code>. The page refreshes every ~5 seconds for live counters and pulls fresh RRD data on demand for the chart."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Top row: four stat cards",
|
||||
"headerCard": "Card",
|
||||
"headerWhat": "What it shows",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Network Traffic",
|
||||
"what": "Aggregate RX / TX rate across all interfaces, formatted in the right unit (bps / Kbps / Mbps / Gbps)."
|
||||
},
|
||||
{
|
||||
"card": "Active Interfaces",
|
||||
"what": "Two counters: <em>Physical X / Y</em> and <em>Bridges X / Y</em> (active over total). The first counter you watch when something stops working."
|
||||
},
|
||||
{
|
||||
"card": "Network Status",
|
||||
"what": "Quick verdict — Healthy / Warning / Critical based on link state, gateway reachability and bridge integrity. Mirrors the <em>Network Interfaces</em> category of the Health Monitor."
|
||||
},
|
||||
{
|
||||
"card": "Network Latency",
|
||||
"what": "Round-trip time to the gateway with a sparkline. Clicking the card opens the <strong>Network Latency modal</strong> documented further down — historical view + on-demand ping test against gateway / Cloudflare / Google with a downloadable PDF report."
|
||||
}
|
||||
]
|
||||
},
|
||||
"groups": {
|
||||
"heading": "Three interface groups",
|
||||
"intro": "Below the top row, three cards split the inventory by role. Each card has its own active-count badge in the header. Interface <strong>type</strong> is identified at a glance by a coloured badge on every row:",
|
||||
"badges": [
|
||||
"Blue <strong>Physical</strong> — real NIC.",
|
||||
"Green <strong>Bridge</strong> — Linux bridge or OVS bridge (<code>vmbr*</code>).",
|
||||
"Purple <strong>Bond</strong> — bond / LACP / active-backup aggregator.",
|
||||
"Cyan <strong>VLAN</strong> — VLAN sub-interface (<code>vmbr0.10</code>, <code>eno1.42</code>, …)."
|
||||
],
|
||||
"clickable": "<strong>Every row is clickable</strong> — physical, virtual, bridge or bond — and opens the per-interface drill-in described further down (basic info, IPs, traffic counters, historical RX/TX chart from Proxmox's RRD store).",
|
||||
"physicalTitle": "Physical Interfaces",
|
||||
"physicalBody": "Every NIC the kernel sees as a real device — <code>eno1</code>, <code>enp4s0</code>, <code>eth0</code>, <code>wlp3s0</code>, etc. One row per device with the blue <strong>Physical</strong> badge and the link state. <em>Bond members</em> (NICs enslaved to a bond) are shown here too, with a hint pointing to the parent bond.",
|
||||
"bridgeTitle": "Bridge Interfaces",
|
||||
"bridgeBody": "Linux bridges (<code>vmbr0</code>, <code>vmbr1</code>, …) and the OVS bridges Proxmox manages. Each row shows the green <strong>Bridge</strong> badge, the underlying physical interface (when it's a single-port bridge), and the bridge state. Bonds visible at this layer get the purple <strong>Bond</strong> badge; VLAN sub-interfaces get the cyan <strong>VLAN</strong> badge.",
|
||||
"vmTitle": "VM / LXC Interfaces",
|
||||
"vmBody": "The <code>tap*</code> and <code>veth*</code> interfaces created when guests start — one per virtual NIC. The card header shows <em>X / Y Active</em>; rows are linked to the VM/CT they belong to so you can jump directly to the guest in the VMs & LXCs tab. Inactive entries hang around briefly after a guest stops; they age out within a refresh cycle."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Per-interface drill-in",
|
||||
"intro": "Clicking any row opens a modal with five blocks:",
|
||||
"headerBlock": "Block",
|
||||
"headerContents": "Contents",
|
||||
"rows": [
|
||||
{
|
||||
"block": "Basic Information",
|
||||
"contents": "Interface name, type (physical / bridge / bond / VLAN / vm), MAC address, state (up / down), MTU, and the underlying physical interface for non-physical types."
|
||||
},
|
||||
{
|
||||
"block": "Bond Members",
|
||||
"contents": "Only for bonds. Lists each enslaved NIC with the active / failed flag, the bond mode (active-backup / 802.3ad / balance-alb / …) and the primary interface when configured."
|
||||
},
|
||||
{
|
||||
"block": "IP Addresses",
|
||||
"contents": "Every IPv4 / IPv6 address with the prefix length. Auto-configured link-local addresses are listed but greyed out."
|
||||
},
|
||||
{
|
||||
"block": "Historical chart",
|
||||
"contents": "RX / TX bandwidth over the selected timeframe (1 hour / 24 hours / 7 days / 30 days / 1 year), pulled from <code>/api/network/<interface>/metrics</code> (Proxmox RRD)."
|
||||
},
|
||||
{
|
||||
"block": "Traffic since last boot",
|
||||
"contents": "Total RX / TX bytes and packets since the host last booted, plus error and drop counters."
|
||||
}
|
||||
],
|
||||
"inactiveTitle": "Inactive interfaces still open the drill-in",
|
||||
"inactiveBody": "For an interface that is <em>down</em>, the modal renders a small \"Interface Inactive\" banner and skips the live counters. Configuration (addresses, bond members) and historical data are still shown — useful when diagnosing why something failed and when."
|
||||
},
|
||||
"latency": {
|
||||
"heading": "Network Latency modal",
|
||||
"intro": "Clicking the <em>Network Latency</em> card in the top row opens a dedicated modal. It has two modes (historical and on-demand test), three target options and a downloadable PDF report.",
|
||||
"targetsTitle": "Targets",
|
||||
"targetsIntro": "A target dropdown at the top of the modal selects what gets pinged:",
|
||||
"targets": [
|
||||
"<strong>Gateway</strong> — your LAN router. Tests the local-network leg only; useful when you suspect a switch / cabling issue and want to rule out the WAN.",
|
||||
"<strong>Cloudflare (1.1.1.1)</strong> — public DNS resolver, anycast network. Tests the WAN leg.",
|
||||
"<strong>Google (8.8.8.8)</strong> — alternative public target, useful as a sanity check or when Cloudflare is regionally degraded."
|
||||
],
|
||||
"mode1Title": "Mode 1 — Historical view",
|
||||
"mode1Alt": "Network Latency modal in historical mode — Gateway target with a 1-hour timeframe and the past samples plotted",
|
||||
"mode1Caption": "Historical view — Gateway target over the last hour, fed from the latency-history database written every 60 seconds by the temperature/latency collector thread.",
|
||||
"mode1Body1": "The default mode when the modal opens. A second dropdown picks the timeframe (<em>1 Hour / 24 Hours / 7 Days / 30 Days / 1 Year</em>); data resolution drops with the window so the chart stays readable. Headline stats — Current / Min / Avg / Max — render above the chart, with a status pill (Excellent / Good / Fair / Poor) reflecting the current value against the thresholds below.",
|
||||
"mode1Body2": "Source: the same latency samples the Health Monitor uses to detect persistent network slowdowns — sampled every 60 seconds against the gateway by the background <code>_temperature_collector_loop</code> thread, written to a local SQLite history.",
|
||||
"mode2Title": "Mode 2 — Real-time test",
|
||||
"mode2Alt": "Network Latency modal running a real-time ping test against Cloudflare — progress bar at 50%, live samples accumulating on the chart",
|
||||
"mode2Caption": "Real-time test against Cloudflare — 2-minute run with one reading every 5 seconds, samples plotted as they arrive. Click <em>Stop</em> to end early; <em>Test Again</em> appends more samples to the same dataset.",
|
||||
"mode2Intro": "Switching the target to Cloudflare or Google starts an on-demand ping test. Behaviour:",
|
||||
"mode2Items": [
|
||||
"<strong>Duration</strong> — 2 minutes per run, with a progress bar and a remaining-seconds counter.",
|
||||
"<strong>Cadence</strong> — one reading every 5 seconds (24 readings per run).",
|
||||
"<strong>Method</strong> — ICMP Echo Request (<code>ping</code>), 3 consecutive pings per sample, latency averaged.",
|
||||
"<strong>Stop</strong> — ends the test immediately; partial data is preserved.",
|
||||
"<strong>Test Again</strong> — appends new samples to the existing dataset rather than starting fresh, so you can build a longer record across several runs.",
|
||||
"<strong>Live status pill</strong> — re-evaluates after every sample using the same Excellent / Good / Fair / Poor thresholds."
|
||||
],
|
||||
"thresholdsTitle": "Performance thresholds",
|
||||
"headerStatus": "Status",
|
||||
"headerRange": "Range",
|
||||
"headerImpact": "Practical impact",
|
||||
"thresholdRows": [
|
||||
{
|
||||
"status": "Excellent",
|
||||
"range": "< 50 ms",
|
||||
"impact": "Optimal for real-time apps, gaming and video calls."
|
||||
},
|
||||
{
|
||||
"status": "Good",
|
||||
"range": "50 – 100 ms",
|
||||
"impact": "Acceptable for most applications with minimal impact."
|
||||
},
|
||||
{
|
||||
"status": "Fair",
|
||||
"range": "100 – 200 ms",
|
||||
"impact": "Noticeable delay. May affect VoIP and interactive apps."
|
||||
},
|
||||
{
|
||||
"status": "Poor",
|
||||
"range": "> 200 ms",
|
||||
"impact": "Significant latency. Investigation recommended."
|
||||
}
|
||||
],
|
||||
"reportTitle": "Network Latency Report (PDF)",
|
||||
"reportIntro": "Both modes have a <strong>Report</strong> button next to the target selector. Clicking it generates a PDF with everything you'd send to your ISP if you wanted to make a case for poor service.",
|
||||
"reportPreviewAlt": "First page of the Network Latency Report PDF — Executive Summary with the gauge, latency statistics, the latency graph and the threshold guide",
|
||||
"reportPreviewCaption": "First page of the Network Latency Report — Executive Summary with the gauge dial and headline stats, the per-second latency graph, and the threshold guide. Page 2 onwards has the per-sample table and methodology.",
|
||||
"downloadLabel": "Download sample Network Latency report (PDF)",
|
||||
"sectionsIntro": "The report has six sections:",
|
||||
"sections": [
|
||||
"<strong>Executive Summary</strong> — gauge dial (0–300+ ms with green / yellow / red zones), the status verdict (EXCELLENT / GOOD / FAIR / POOR), the target / mode / sample count and a one-line packet-loss summary.",
|
||||
"<strong>Latency Statistics</strong> — Current / Min / Avg / Max as four large tiles, plus Sample Count, Packet Loss (avg) and Test Period.",
|
||||
"<strong>Latency Graph</strong> — area chart of every sample over the test window with a min/avg/max y-axis grid.",
|
||||
"<strong>Performance Thresholds</strong> — the same four-tier scale documented above, with a coloured dot per tier.",
|
||||
"<strong>Detailed Test Results</strong> — numbered table with timestamp, latency, packet loss and status for every sample. Useful for spotting micro-bursts that the headline averages hide.",
|
||||
"<strong>Methodology</strong> — test method (ICMP Echo Request), samples per test (3 consecutive pings), target name, target IP and a final \"Performance Assessment\" paragraph derived from the verdict."
|
||||
],
|
||||
"useCaseTitle": "Use case: claims to your ISP",
|
||||
"useCaseBody": "Run the real-time test against Cloudflare for 2 minutes during a moment of perceived slowness, then click <em>Test Again</em> a few times to extend the dataset, and finally <em>Report</em>. The PDF carries the full per-sample table plus the methodology block — ISPs typically accept this as evidence, especially when correlated with timestamps from a separate complaint."
|
||||
},
|
||||
"excluding": {
|
||||
"heading": "Excluding noisy interfaces",
|
||||
"body1": "Like storages, individual interfaces can be excluded from health monitoring — useful for intentionally disabled bridges, test interfaces or NICs that are physically removed but still in the config. The flag is stored in the <code>excluded_interfaces</code> table and respected by the Health Monitor cycle: no warnings, no notifications, no contribution to the header status pill.",
|
||||
"body2": "From the row's context menu, pick <em>Exclude from monitoring</em>. The interface stays visible in the dashboard with a purple <strong>excluded</strong> badge, and you can re-enable monitoring from the same menu."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "How the data is collected",
|
||||
"headerSection": "Section of the tab",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Interface inventory",
|
||||
"endpoint": "/api/network",
|
||||
"source": "<code>ip -j addr</code> + <code>ip -j link</code> + bond / bridge introspection."
|
||||
},
|
||||
{
|
||||
"section": "Summary cards",
|
||||
"endpoint": "/api/network/summary",
|
||||
"source": "Aggregation over the inventory plus per-interface up/down counts."
|
||||
},
|
||||
{
|
||||
"section": "Per-interface RX/TX time series",
|
||||
"endpoint": "/api/network/<iface>/metrics",
|
||||
"source": "<code>/proc/net/dev</code> sampled by the Health Monitor with byte-rate calculation."
|
||||
},
|
||||
{
|
||||
"section": "Latency: current",
|
||||
"endpoint": "/api/network/latency/current",
|
||||
"source": "A short <code>ping</code> burst against the configured gateway / target."
|
||||
},
|
||||
{
|
||||
"section": "Latency: historical",
|
||||
"endpoint": "/api/network/latency/history",
|
||||
"source": "Persisted samples — every 5 min by the Health Monitor cycle."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Cross-check the interface state seen by the dashboard",
|
||||
"codeComment2": "# Verify a current latency probe end-to-end"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Health Monitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — the Network category and the latency-history thresholds."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — the network and latency endpoints."
|
||||
},
|
||||
{
|
||||
"label": "Integrations",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — Prometheus scrape exposes the same network metrics."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — the other tabs."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Network",
|
||||
"href": "/docs/network",
|
||||
"tail": " — the actions side: bridge analysis, persistent interface names, backup & restart, iperf3."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
246
web/messages/en/docs/monitor/dashboard/security.json
Normal file
246
web/messages/en/docs/monitor/dashboard/security.json
Normal file
@@ -0,0 +1,246 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Security tab | ProxMenux Documentation",
|
||||
"description": "The Security tab groups every protection-related control in two columns: ProxMenux Monitor (Authentication, SSL/HTTPS, API tokens, Secure Gateway) and Proxmox VE (Firewall, Fail2Ban, Lynis audit). Step-by-step Secure Gateway wizard, Lynis audit walkthrough, Fail2Ban install and rule tuning."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Security tab",
|
||||
"description": "Every security control in the dashboard, grouped into two clearly-labelled blocks: configuration of the Monitor itself (auth, SSL, tokens, Secure Gateway) and configuration of the Proxmox host it watches (firewall, Fail2Ban, Lynis).",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Two scopes, one tab",
|
||||
"body": "The Security tab is divided into two clearly separated sections: <strong>ProxMenux Monitor</strong> (settings for the dashboard itself) and <strong>Proxmox VE</strong> (settings for the host underneath). Cards render conditionally — Fail2Ban and Lynis only appear once installed."
|
||||
},
|
||||
"monitor": {
|
||||
"heading": "ProxMenux Monitor",
|
||||
"intro": "Four cards control how the dashboard itself is reached and authenticated."
|
||||
},
|
||||
"auth": {
|
||||
"heading": "Authentication",
|
||||
"imageAlt": "Authentication card showing status Enabled, Logout, Change Password, Two-Factor Authentication info, Enable Two-Factor Authentication and Disable Authentication buttons",
|
||||
"imageCaption": "Authentication card with auth enabled — status badge, Change Password, Enable 2FA and the (destructive) Disable Authentication action.",
|
||||
"intro": "The card lets you manage the dashboard's own login. The full first-launch flow, password policy, TOTP enrolment screens and lost-authenticator recovery are documented in <link>Access & Authentication</link> — this card is the day-to-day surface for those settings:",
|
||||
"items": [
|
||||
"<strong>Authentication Status</strong> — badge showing <em>Enabled</em> / <em>Disabled</em> / <em>Declined</em>.",
|
||||
"<strong>Change Password</strong> — current password + new password + confirmation.",
|
||||
"<strong>Enable / Disable Two-Factor Authentication</strong> — opens the QR enrolment dialog when enabling, asks for the current password when disabling.",
|
||||
"<strong>Disable Authentication</strong> — destructive action that re-shows the first-launch <em>Protect your dashboard?</em> dialog on next visit."
|
||||
]
|
||||
},
|
||||
"ssl": {
|
||||
"heading": "SSL / HTTPS",
|
||||
"imageAlt": "SSL / HTTPS card showing HTTP No SSL status, detected Proxmox host certificate with Subject, Issuer, Expires, Use Proxmox Certificate button and Use Custom Certificate option",
|
||||
"imageCaption": "SSL / HTTPS card with HTTPS off. The Monitor detects the certificate already installed on the Proxmox host and offers it as a one-click option, with a fallback to <em>Use Custom Certificate</em> if you have your own files elsewhere.",
|
||||
"intro": "Serves the dashboard over HTTPS without any reverse proxy in front. The card auto-detects the certificate that Proxmox itself uses (under <code>/etc/pve/local/</code>) and shows the subject, issuer and expiry so you can verify it before activating. Two paths to enable HTTPS:",
|
||||
"items": [
|
||||
"<strong>Use Proxmox Certificate</strong> — one click. The Monitor reuses the certificate installed on the host. Good fit for users who already have their PVE running on the same DNS name as the dashboard.",
|
||||
"<strong>Use Custom Certificate</strong> — paste absolute paths to your own <code>.pem</code> certificate and <code>.key</code> private key. The paths are validated before the service restarts; if loading fails, the dashboard falls back to HTTP automatically (no broken state)."
|
||||
],
|
||||
"enabledAlt": "SSL/HTTPS card with HTTPS Enabled status, Active Certificate showing pve-ssl.pem and pve-ssl.key paths, and a Disable HTTPS button",
|
||||
"enabledCaption": "HTTPS active — the card surfaces the certificate currently in use, the file paths and a <em>Disable HTTPS</em> action that drops back to HTTP on the same port.",
|
||||
"acmeTitle": "ACME / Let's Encrypt via Proxmox",
|
||||
"acmeBody": "If your Proxmox node already has Let's Encrypt configured at <em>Datacenter → Certificates → ACME</em>, that's the certificate the host serves to browsers — and that's what the dashboard reuses when you click <em>Use Proxmox Certificate</em>. You don't need separate ACME plumbing for the Monitor.",
|
||||
"walkthroughLink": "For a step-by-step walkthrough — including how the Monitor auto-detects the ACME-uploaded certificate, what gets written to disk, and how to fall back to a custom <code>.pem</code> / <code>.key</code> pair — see <link>HTTPS for ProxMenux Monitor</link>."
|
||||
},
|
||||
"apiTokens": {
|
||||
"heading": "API Access Tokens",
|
||||
"emptyAlt": "API Access Tokens card empty state with About API Tokens info box and Generate New API Token button",
|
||||
"emptyCaption": "API Access Tokens card on a fresh installation — the <em>About API Tokens</em> box summarises lifetime, usage and how to embed the token in <code>Authorization: Bearer</code> headers.",
|
||||
"intro": "Long-lived tokens (1 year) for unattended integrations — Homepage widgets, Home Assistant REST sensors, Grafana scrapers, n8n flows, custom scripts. The card walks you through three states: empty → form → generated.",
|
||||
"generateBody": "<strong>Generate a token.</strong> Click <em>Generate New API Token</em>. The form asks for a descriptive <em>Token Name</em> (helps you identify it in the active list later) and your <em>password</em> as second-factor confirmation. If 2FA is enabled, the form additionally asks for the current TOTP code.",
|
||||
"generateAlt": "API Access Tokens generate form with Token Name input, Password input, Generate Token and Cancel buttons",
|
||||
"generateCaption": "The Generate API Token form — fill in a name and confirm with your password (and TOTP if 2FA is on).",
|
||||
"saveBody": "<strong>Save the token immediately.</strong> The full token string is shown <strong>only once</strong> after generation. The card highlights this with an amber notice and a copy button. There's no way to retrieve it later — you'll only see the prefix in the Active Tokens list.",
|
||||
"generatedAlt": "API token generated successfully with masked token, copy button, instructions for Authorization Bearer header and Active Tokens list with prefix",
|
||||
"generatedCaption": "Token generated — the value is shown once with a copy button and the exact <code>Authorization: Bearer</code> snippet. Below, the Active Tokens list keeps name + prefix + creation date so you can revoke individual tokens later.",
|
||||
"outro": "The card shows every active token with a <em>Revoke</em> button per row. Revoking invalidates the token immediately; any integration using it stops working from that moment. Cookbooks for Homepage, Home Assistant, n8n and Prometheus are in <link>Integrations</link>."
|
||||
},
|
||||
"gateway": {
|
||||
"heading": "Secure Gateway",
|
||||
"cardAlt": "Secure Gateway card with Deploy Secure Gateway button before any gateway has been deployed",
|
||||
"cardCaption": "Secure Gateway card on a fresh setup — one button starts the wizard.",
|
||||
"intro": "Reach the dashboard, the Proxmox web UI and any guest from anywhere on your <a>Tailscale</a> tailnet, without exposing any port to the public internet. The Monitor deploys an Alpine LXC container on the host running <code>tailscaled</code> as a subnet router; once approved in the Tailscale admin console, your remote devices reach the host's LAN IP from anywhere.",
|
||||
"wizardTitle": "Step-by-step wizard",
|
||||
"wizardIntro": "Before clicking <em>Deploy Secure Gateway</em>, generate an auth key in your Tailscale admin console — the wizard will ask for it in step 2.",
|
||||
"step0Title": "0. Generate the Tailscale auth key",
|
||||
"step0Body": "Sign in to <a>login.tailscale.com/admin/settings/keys</a> and click <em>Generate auth key…</em>. Choose a <em>pre-authenticated</em> key (so the gateway doesn't need an interactive Tailscale login), and copy the value — it's shown only once.",
|
||||
"step0Alt": "Tailscale admin console Settings Keys page with Generate auth key button highlighted",
|
||||
"step0Caption": "Tailscale admin console — <em>Settings → Keys → Generate auth key…</em>. Use a free Tailscale account if you don't have one yet (link inside the wizard).",
|
||||
"step1Title": "1. Open the wizard",
|
||||
"step1Body": "Back on the Security tab, click <em>Deploy Secure Gateway</em>. The first step is an intro with what you'll get and what you need.",
|
||||
"step1Alt": "Secure Gateway Setup wizard intro step explaining what the gateway provides: VPN access, no port forwarding, end-to-end encryption",
|
||||
"step1Caption": "Step 1 — overview of what the Secure Gateway provides and a reminder that you'll need a free Tailscale account.",
|
||||
"step2Title": "2. Tailscale Authentication",
|
||||
"step2Body": "Paste the auth key from step 0 and pick a hostname (this is what the gateway will appear as in the Tailscale admin console — typically <code>proxmox-gateway</code> or your node name).",
|
||||
"step2Alt": "Secure Gateway wizard step asking for Tailscale Auth Key and Device Hostname with link to generate the key",
|
||||
"step2Caption": "Step 2 — paste the pre-auth key and choose the device hostname. The link below the field opens the Tailscale page from step 0 if you skipped ahead.",
|
||||
"step3Title": "3. Access Scope",
|
||||
"step3Intro": "Choose what your tailnet can reach through the gateway:",
|
||||
"step3Items": [
|
||||
"<strong>Proxmox Only</strong> — only the Proxmox UI and the Monitor. Smallest attack surface.",
|
||||
"<strong>Full Local Network</strong> — the entire LAN subnet (auto-detected from the host's primary interface). Lets you reach NAS, printers, VMs and any other LAN device.",
|
||||
"<strong>Custom Subnets</strong> — list specific CIDRs. For multi-VLAN setups where you want to expose some segments but not others."
|
||||
],
|
||||
"step3Alt": "Secure Gateway wizard Access Scope step with three options: Proxmox Only, Full Local Network, Custom Subnets",
|
||||
"step3Caption": "Step 3 — pick the access scope. <em>Full Local Network</em> auto-fills with the detected LAN subnet.",
|
||||
"step4Title": "4. Advanced Options (optional)",
|
||||
"step4Intro": "Two optional toggles. Both are <strong>off by default</strong>:",
|
||||
"step4Items": [
|
||||
"<strong>Exit Node</strong> — when enabled and selected from a remote device, all that device's internet traffic exits through the Proxmox host's WAN. Useful for travel scenarios where you want your phone's traffic to look like home.",
|
||||
"<strong>Accept Routes</strong> — let this gateway reach networks advertised by <em>other</em> tailnet subnet routers (for multi-site setups)."
|
||||
],
|
||||
"step4Alt": "Secure Gateway wizard Advanced Options step with Exit Node and Accept Routes checkboxes",
|
||||
"step4Caption": "Step 4 — Exit Node and Accept Routes. Skip both if all you want is dashboard access from your phone or laptop.",
|
||||
"step5Title": "5. Review & Deploy",
|
||||
"step5Body": "Final summary before the deploy starts. The wizard reminds you that one manual step in Tailscale admin is still pending after deploy: <strong>approving the subnet route</strong>.",
|
||||
"step5Alt": "Secure Gateway wizard Review and Deploy step with Configuration Summary showing hostname, access mode, networks, exit node, accept routes and a Deploy Gateway button",
|
||||
"step5Caption": "Step 5 — review the configuration and deploy. The blue notice at the bottom flags the pending route approval.",
|
||||
"approvalTitle": "One last manual step in Tailscale admin",
|
||||
"approvalBody": "After deploy, go back to <a>login.tailscale.com/admin/machines</a> and approve the subnet route the gateway is advertising. Until you do, remote devices on your tailnet won't actually be able to reach LAN IPs through the gateway. Tailscale marks pending routes with a yellow warning on the device row — click <em>Edit route settings</em> and tick the route box."
|
||||
},
|
||||
"pve": {
|
||||
"heading": "Proxmox VE",
|
||||
"intro": "The host's own protections — firewall, intrusion prevention and security audit. Last two only render when their respective tools are installed."
|
||||
},
|
||||
"firewall": {
|
||||
"heading": "Proxmox Firewall",
|
||||
"imageAlt": "Proxmox Firewall card showing Cluster Firewall and Host Firewall status, Quick Access Rules for ProxMenux Monitor and Proxmox Web UI, Rules Overview counters and a list of Firewall Rules with Add Rule button",
|
||||
"imageCaption": "Proxmox Firewall card — cluster-level and host-level enable / disable toggles, common ports as <em>Quick Access Rules</em>, totals across <em>Rules Overview</em>, and the full rule list with <em>+ Add Rule</em>.",
|
||||
"intro": "The card surfaces the Proxmox VE built-in firewall (which is independent from any host-level <code>iptables</code> / <code>nftables</code> you may run alongside). Three blocks:",
|
||||
"items": [
|
||||
"<strong>Cluster Firewall + Host Firewall</strong> — global toggles. The cluster firewall must be active for any host-level rule to take effect; the card flags this dependency inline.",
|
||||
"<strong>Quick Access Rules</strong> — pre-defined rows for ports that matter to ProxMenux itself: <code>8008/TCP</code> (Monitor), <code>8006/TCP</code> (Proxmox Web UI). Each row shows the current allow / deny / unprotected state. The Proxmox Web UI is allowed via the <em>built-in</em> Proxmox firewall macro and can't be removed accidentally.",
|
||||
"<strong>Rules Overview</strong> — counters for total rules, accept rules, drop / reject rules and distinct ports protected. Numbers are read from <code>/etc/pve/firewall/cluster.fw</code> and <code>/etc/pve/nodes/<node>/host.fw</code>.",
|
||||
"<strong>Firewall Rules</strong> — full list with action / protocol / port / source / level. <em>+ Add Rule</em> opens an inline editor; the trash icon on each row removes the rule. Edits write to the same files Proxmox uses, so changes also appear in the Proxmox UI (Datacenter / Node → Firewall)."
|
||||
]
|
||||
},
|
||||
"fail2ban": {
|
||||
"heading": "Fail2Ban",
|
||||
"subHeading": "(conditional)",
|
||||
"whatIs": "<strong>What it is.</strong> Fail2Ban is an open-source intrusion-prevention daemon that watches log files for repeated failed login attempts and bans the offending IP at the firewall level. It's the de-facto answer to brute-force scanners that hit SSH and web login forms 24/7. ProxMenux wires it to three jails by default: SSH, the Proxmox web UI login (port 8006), and the ProxMenux Monitor login (port 8008).",
|
||||
"notBundled": "Fail2Ban is <strong>not bundled</strong>. The card detects whether it's installed and adapts: when missing it offers a one-click install; once installed it shows live jail status, banned IPs and lets you tune retries / ban time per jail.",
|
||||
"notInstalledAlt": "Fail2Ban card showing Not Installed state with explanation of what it would configure: SSH, Proxmox web UI and ProxMenux Monitor protection with nftables backend, plus an Install and Configure Fail2Ban button",
|
||||
"notInstalledCaption": "Fail2Ban card before install — the blue box previews what the install would configure.",
|
||||
"clickBody": "Click <em>Install and Configure Fail2Ban</em> and you get a confirmation modal listing every change the script will make on the host:",
|
||||
"confirmAlt": "Install Fail2Ban confirmation modal listing SSH protection aggressive mode, Proxmox web interface protection port 8006, ProxMenux Monitor protection port 8008, auto-detected nftables backend, journald log level adjustment and SSH MaxAuthTries hardening",
|
||||
"confirmCaption": "Install confirmation — explicit list of jails, tweaks to journald log level (so the auth jail can read SSH events) and an SSH-hardening side effect (<code>MaxAuthTries=3</code>).",
|
||||
"confirmIntro": "Confirmation triggers a streaming install panel (apt + jail config + tests). Same plumbing as the ProxMenux CLI installer.",
|
||||
"progressAlt": "Fail2Ban Installation panel showing live install log: package install, journald MaxLevelStore tuned for auth logging, jails configured, nftables backend detected, MaxAuthTries hardening, fail2ban-client communication test, completion message",
|
||||
"progressCaption": "Install in progress — every step is logged in the panel. Connection-closed at the bottom marks the end of the streaming session.",
|
||||
"afterInstall": "After install the card flips to the live status view: jails configured, banned IPs counter, recent ban events. The big tabs split <em>Jails & Banned IPs</em> from <em>Recent Activity</em> (the last N entries from the Fail2Ban log).",
|
||||
"activeAlt": "Fail2Ban card after install with Active status, three jails configured (proxmenux, proxmox, sshd), Banned IPs counter, Total Bans, Failed Attempts, and per-jail rows with retries, ban time, window and gear icon",
|
||||
"activeCaption": "Fail2Ban active — the three default jails (<code>proxmenux</code>, <code>proxmox</code>, <code>sshd</code>) with their retries / ban time / window settings.",
|
||||
"tuneBody": "<strong>Tune jail rules.</strong> Click the gear icon on any jail row to adjust <em>Max Retries</em>, <em>Ban Time</em> (use a permanent ban if you want offenders blocked until you manually unban) and <em>Find Time</em> (the rolling window for counting retries). Common values are documented inside the form.",
|
||||
"configAlt": "Configure sshd jail form with Max Retries, Ban Time in seconds with Permanent Ban option, Find Time, common values reminder, and Save Configuration button",
|
||||
"configCaption": "Editing the sshd jail — pick a stricter <em>Max Retries</em> for SSH if you only ever log in from your own subnet, or extend <em>Ban Time</em> for the public-facing dashboard.",
|
||||
"outro": "The full <em>What it installs / how it's configured / how to uninstall</em> walkthrough — including the manual install path, the SSH MaxAuthTries side effect, and the relationship with the <code>proxmenux-auth.log</code> journal — is in <link>ProxMenux → Security → Fail2Ban</link>.",
|
||||
"calloutTitle": "Without Fail2Ban, brute-force protection is best-effort",
|
||||
"calloutBody": "ProxMenux Monitor has its own <em>application-level</em> ban hook in the Flask request pipeline — but it only takes effect if Fail2Ban is installed and writes to the bans table. Without Fail2Ban, the Monitor logs failed logins to <code>proxmenux-auth.log</code> for future inspection but doesn't actively block IPs."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Lynis Security Audit",
|
||||
"subHeading": "(conditional)",
|
||||
"whatIs": "<strong>What it is.</strong> Lynis is an open-source security auditing tool that runs ~280 tests across the host (file permissions, kernel hardening, SSH config, package vulnerabilities, crypto policy, scheduled tasks, banner grabbing, etc.) and produces a hardening score 0–100, a list of warnings and a list of suggestions. It's the de-facto baseline for \"is this server in good shape\" on Debian-based servers.",
|
||||
"whyUseful": "<strong>Why it's useful.</strong> Knowing the security posture of your server is hard to do by reading config files one by one. Lynis catches the things that are routinely overlooked: kernel hardening flags missing, weak SSH ciphers enabled, journal not persistent, sudoers <code>NOPASSWD</code> on default accounts, and many more. Re-running it after applying ProxMenux post-install tweaks gives you an objective number for the improvement.",
|
||||
"notInstalledAlt": "Lynis Security Audit card with Not Installed state and Install Lynis button, listing features: hardening scoring, vulnerability detection, compliance checking and GitHub source",
|
||||
"notInstalledCaption": "Lynis card before install — the blue box summarises what the tool does.",
|
||||
"notBundled": "Lynis is also <strong>not bundled</strong>. ProxMenux installs the latest release directly from the official GitHub source (not the Debian package, which lags several minor versions).",
|
||||
"confirmAlt": "Install Lynis confirmation modal listing what Lynis does: hardening scoring, vulnerability detection, configuration analysis, compliance checking, source from official GitHub repository",
|
||||
"confirmCaption": "Install confirmation — explicit about the GitHub source.",
|
||||
"progressAlt": "Lynis Installation streaming panel: installing latest scan tool, version 3.1.6 confirmed, installation completed message",
|
||||
"progressCaption": "Install in progress — same streaming panel pattern as Fail2Ban.",
|
||||
"afterInstall": "After install the card shows the version and an empty audit history. Click <em>Run Security Audit</em> to start the first scan.",
|
||||
"installedAlt": "Lynis Security Audit card after install with version 3.1.6 Installed badge, Last Scan timestamp, Hardening Index 0, Warnings 0, Suggestions 0, an empty audit report row and a Run Security Audit button",
|
||||
"installedCaption": "Lynis installed, no audit yet. The card prefills the metric tiles with zeros.",
|
||||
"runningAlt": "Lynis Security Audit card while audit is running showing Security audit in progress message, estimated 2-5 minutes duration, and a disabled Running Audit button",
|
||||
"runningCaption": "Audit in progress — the action button shows a spinner and the card explicitly warns that the scan can take 2–5 minutes.",
|
||||
"finishedBody": "When it finishes, the card flips to the results view: hardening index, warnings, suggestions and an <em>Audit Reports</em> list with each historical scan.",
|
||||
"resultsAlt": "Lynis Security Audit card with results: Hardening Index 71 with Lynis 66 PVE 71 breakdown, 3 warnings, 40 suggestions, Security Hardening Score progress bar Proxmox Adjusted 71 of 100 in the Good range, audit reports list with PDF download and Run Security Audit button",
|
||||
"resultsCaption": "Audit results — Hardening Index <strong>71/100 (Good)</strong> on a sample run. The card also shows the \"Lynis raw score\" (66) versus the Proxmox-adjusted score (71) which adds back 11 points for findings the Lynis test corpus flags but are expected behaviour on Proxmox VE.",
|
||||
"scoreTitle": "Lynis raw score vs Proxmox-adjusted score",
|
||||
"scoreIntro": "Lynis ships rules tuned for general-purpose Debian. Proxmox legitimately diverges from some of them (services running as root for cluster reasons, custom <code>journald</code> tuning, etc.). The card shows both numbers so you can:",
|
||||
"scoreItems": [
|
||||
"Track your <em>Lynis raw score</em> the same way external auditors would.",
|
||||
"Track the <em>Proxmox-adjusted</em> score — a fairer baseline if you're comparing nodes inside the same cluster."
|
||||
],
|
||||
"reportBody": "<strong>The full report.</strong> Each audit row in the list has a <em>PDF</em> button that downloads a multi-page report with the executive summary, system info, security posture, every warning with explanation, every suggestion ranked by impact, and the package inventory. It's the artifact you would attach to a security review.",
|
||||
"reportAlt": "Sample first page of the Lynis Security Audit Report PDF showing executive summary with hardening 71 of 100, warnings and suggestions counts, system information block with hostname, kernel, Lynis version, report date, security posture overview",
|
||||
"reportCaption": "First page of a downloaded report — executive summary, system information and security posture overview. The full report continues with detailed warnings, suggestions and the installed-packages list. A <a>sample PDF</a> is attached for reference.",
|
||||
"runPeriodically": "Run the audit periodically (after major Proxmox upgrades, after applying post-install tweaks, before opening a remote-access path) and keep the reports — the trend matters more than any single number.",
|
||||
"outro": "The full <em>What it installs / how it's configured / how to uninstall</em> walkthrough and a written sample report breakdown are in <link>ProxMenux → Security → Lynis</link>."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "How the data is collected",
|
||||
"headerCard": "Card",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Authentication, 2FA, password change",
|
||||
"endpoint": "/api/auth/*",
|
||||
"source": "Local SQLite + JWT issued by the Monitor."
|
||||
},
|
||||
{
|
||||
"card": "SSL / HTTPS",
|
||||
"endpoint": "/api/auth/ssl/*",
|
||||
"source": "<code>openssl x509</code> on <code>/etc/pve/local/pve-ssl.pem</code> + <code>/etc/proxmenux/ssl_config.json</code>."
|
||||
},
|
||||
{
|
||||
"card": "API tokens list / mint / revoke",
|
||||
"endpoint": "/api/auth/api-tokens",
|
||||
"source": "Token rows kept locally; nothing leaves the host."
|
||||
},
|
||||
{
|
||||
"card": "Secure Gateway (deploy + status)",
|
||||
"endpoint": "/api/oci/*",
|
||||
"source": "Provisions Alpine LXC + <code>tailscaled</code> via <code>pct create</code> / <code>pct exec</code>."
|
||||
},
|
||||
{
|
||||
"card": "Firewall status & rules",
|
||||
"endpoint": "/api/security/firewall/*",
|
||||
"source": "<code>pve-firewall</code> + <code>/etc/pve/firewall/<cluster|host>.fw</code>."
|
||||
},
|
||||
{
|
||||
"card": "Fail2Ban (only when installed)",
|
||||
"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 (only when installed)",
|
||||
"endpoint": "/api/security/lynis/*",
|
||||
"source": "Runs <code>lynis audit system</code> in the background; report parsed from <code>/var/log/lynis-report.dat</code>."
|
||||
}
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Access & Authentication",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — full first-launch flow, 2FA app picker, lost-authenticator recovery, reverse-proxy snippets."
|
||||
},
|
||||
{
|
||||
"label": "Integrations",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — cookbooks for using API tokens with Homepage, Home Assistant, Prometheus, n8n and the Secure Gateway end-to-end."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tailRich": " — every <code>/api/auth</code>, <code>/api/security</code> and <code>/api/oci</code> endpoint with method, body and curl examples."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Security → Fail2Ban",
|
||||
"href": "/docs/security/fail2ban",
|
||||
"tail": " — install walkthrough, jails configured, manual install path."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Security → Lynis",
|
||||
"href": "/docs/security/lynis",
|
||||
"tail": " — sample report, score interpretation, when to re-run."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
327
web/messages/en/docs/monitor/dashboard/settings.json
Normal file
327
web/messages/en/docs/monitor/dashboard/settings.json
Normal file
@@ -0,0 +1,327 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Settings tab | ProxMenux Documentation",
|
||||
"description": "The Settings tab groups dashboard preferences (network units, suppression durations, storage / interface exclusions), the embedded notification + AI panel, and a transparent inventory of every ProxMenux post-install optimization currently active on the host with click-through to its source code."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Settings tab",
|
||||
"description": "Dashboard preferences, monitoring exclusions, the embedded notification + AI configuration panel, and a live inventory of the ProxMenux post-install optimizations currently active on the host.",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Where each setting actually lives",
|
||||
"body": "The Settings tab is a single surface for several distinct concerns: how the dashboard renders, what gets watched by the Health Monitor, how alerts go out, and what ProxMenux has already changed on the host. Cards that have their own deep documentation page link out rather than duplicating content here — Settings is the entry point, not the manual."
|
||||
},
|
||||
"networkUnits": {
|
||||
"heading": "Network Units",
|
||||
"imageAlt": "Network Units card with Network Unit Display dropdown set to Bytes",
|
||||
"imageCaption": "Choose between bits per second and bytes per second for every network rate displayed in the dashboard.",
|
||||
"body": "Choose how network throughput is displayed across the dashboard: <strong>bits per second</strong> (Mbps / Gbps) or <strong>bytes per second</strong> (MB/s / GB/s). Bits is the default because it's what NIC vendors and ISPs label their products with; bytes is what most file-transfer tools report. The setting affects every chart, badge and tooltip that shows network rate — applied immediately, no reload needed."
|
||||
},
|
||||
"health": {
|
||||
"heading": "Health Monitor",
|
||||
"intro": "The card surfaces the per-category <strong>Suppression Duration</strong> setting — once an alert is dismissed, how long before the scanner is allowed to re-fire it. Each of the ten Health Monitor categories (CPU, Memory, Storage, Disks, Network, VMs, PVE Services, Logs, Updates, Security) has its own dropdown with these values:",
|
||||
"items": [
|
||||
"<strong>24 h</strong> — default for most transient categories.",
|
||||
"<strong>72 h</strong> — for events you want a few days of silence on.",
|
||||
"<strong>168 h</strong> (1 week) and <strong>720 h</strong> (1 month) — periodic checks.",
|
||||
"<strong>8760 h</strong> (1 year) — effectively \"quiet for the foreseeable future\".",
|
||||
"<strong>-1</strong> — permanent silence until you re-enable it manually.",
|
||||
"<strong>Custom hours</strong> — any integer if you need an in-between value."
|
||||
],
|
||||
"imageAlt": "Settings → Health Monitor card with the per-category suppression dropdowns and the Active Suppressions section",
|
||||
"imageCaption": "Health Monitor card — the per-category dropdowns set defaults for new dismisses; the Active Suppressions section below lists every alert currently silenced and lets you revert them.",
|
||||
"editTitle": "Edit mode",
|
||||
"editBody": "The card is read-only by default. Click <strong>Edit</strong> in the top-right of the card to enable the dropdowns and the Re-enable buttons. <strong>Save</strong> commits every pending change (suppression-duration changes and queued re-enables) in a single batch; <strong>Cancel</strong> discards them all. The Save button only activates when there is at least one pending change.",
|
||||
"activeTitle": "Active Suppressions",
|
||||
"activeIntro": "Below the suppression-duration dropdowns, the <strong>Active Suppressions</strong> section lists every alert that is currently silenced — both time-limited dismisses (24 h, 7 days, custom windows) and <em>Permanent</em> ones. Each row shows:",
|
||||
"activeItems": [
|
||||
"A coloured badge — <strong>Permanent</strong> (amber) or a countdown such as <strong>24h remaining</strong> / <strong>7d remaining</strong> (blue).",
|
||||
"The alert identifier, normalized for readability (e.g. <code>pve_storage_full_PBS-Cloud</code> → <em>PVE Storage Full: PBS-Cloud</em>).",
|
||||
"Category, severity and the timestamp the alert was dismissed.",
|
||||
"A <strong>Re-enable</strong> button (active only in Edit mode) that queues the alert to be un-acknowledged on the next Save."
|
||||
],
|
||||
"activeReenableTitle": "Re-enable flow",
|
||||
"activeReenableBody": "Clicking <strong>Re-enable</strong> in Edit mode marks the row in green and strikes its identifier — it is queued but not yet applied. Click again on the same row to <strong>Undo</strong> the queue. When you press <strong>Save</strong>, every queued re-enable fires <code>POST /api/health/un-acknowledge</code> in parallel and the affected rows disappear from the list. If the underlying condition is still present and the category supports re-firing, the alert reappears in the Health Monitor's Active list on the next scan cycle.",
|
||||
"activePermanentNote": "Permanent dismisses (alerts dismissed with <em>Permanently</em> from the Health Monitor modal, or those whose category default is set to <code>-1</code>) <strong>can only be reverted from here</strong>. The dashboard modal does not expose an un-dismiss button for them — the Active Suppressions panel is the single audit log + revert UI.",
|
||||
"activeAutoRefreshTitle": "Auto-refresh",
|
||||
"activeAutoRefreshBody": "The list refreshes automatically when you dismiss or un-dismiss an alert from the Health Monitor modal (via an in-browser event), when the browser tab regains focus, and on visibility change. You do not need to reload the page after dismissing an alert from the dashboard.",
|
||||
"calloutTitle": "Full semantics live in the Health Monitor page",
|
||||
"calloutBody": "The escalation rules (when a re-fire becomes critical), the auto-resolve behaviour for events whose underlying device disappears, and the difference between dismissed and resolved — all documented under <link>Health Monitor → Dismissing alerts and the Suppression Duration</link>. This card just exposes the per-category dropdowns and the Active Suppressions panel."
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Health Monitor Thresholds",
|
||||
"intro": "Where the previous card decides <em>how long to stay quiet after a dismiss</em>, this one decides <strong>at what value an alert fires in the first place</strong>. Every check the Health Monitor runs is parameterised by a pair of numbers — a <strong>Warning</strong> threshold and a <strong>Critical</strong> threshold — and both are exposed here for the operator to tune.",
|
||||
"whatForTitle": "What it is for",
|
||||
"whatForIntro": "Defaults that ship with ProxMenux are sane for the average Proxmox host, but every environment has its own envelope:",
|
||||
"whatForItems": [
|
||||
"A small homelab with a single-disk SSD may want to page earlier on capacity (75 / 90 %) to leave room for snapshots.",
|
||||
"A datacenter host with redundant Ceph nodes can be more relaxed on memory warnings (a 90 % working set is normal under ZFS ARC).",
|
||||
"A passively-cooled mini-PC needs lower temperature thresholds than a server with forced-air cooling — same drive class, different physical envelope.",
|
||||
"A heavily-virtualized host that pegs CPU during builds should not page on every 80 % spike, but must still alert on sustained pressure."
|
||||
],
|
||||
"whatForOutro": "Editing a threshold takes effect <strong>on the next scan</strong> — the Health Monitor re-reads the values from <code>/usr/local/share/proxmenux/health_thresholds.json</code> on every cycle, no service restart needed. The same numbers also feed the colour ranges of the dashboard widgets (the temperature line in the disk-temperature modal, the bars on the storage cards) so the visual classification matches what triggers the alert.",
|
||||
"coloursTitle": "Status colours: how Warning and Critical render in the dashboard",
|
||||
"coloursIntro": "Every threshold below produces the same three-state classification across the dashboard — same colours for storage bars, CPU/memory rings, temperature chips, and the dot on the disk modal. Reading a colour anywhere in the Monitor maps to a definite range relative to the configured pair:",
|
||||
"headerColour": "Colour",
|
||||
"headerRange": "Range",
|
||||
"headerMeaning": "Meaning",
|
||||
"colourRows": [
|
||||
{
|
||||
"colour": "Green",
|
||||
"range": "value < Warning",
|
||||
"meaning": "Normal operating range. No alert fires."
|
||||
},
|
||||
{
|
||||
"colour": "Amber",
|
||||
"range": "Warning ≤ value < Critical",
|
||||
"meaning": "Warning state. The Health Monitor fires a WARNING-severity event; notifications respect the channel filters and Quiet Hours."
|
||||
},
|
||||
{
|
||||
"colour": "Red",
|
||||
"range": "value ≥ Critical",
|
||||
"meaning": "Critical state. The Health Monitor fires a CRITICAL event; CRITICAL bypasses Quiet Hours and always reaches the channel."
|
||||
}
|
||||
],
|
||||
"sectionsTitle": "Sections and recommended defaults",
|
||||
"sectionsIntro": "These are the values ProxMenux ships with — the recommended baseline. They're what you see on a fresh host until you override anything. Sections are ordered top-to-bottom from <em>compute</em> → <em>heat</em> → <em>storage capacity</em> so reading down moves from concrete (current load) to accumulated state (free space).",
|
||||
"headerSection": "Section",
|
||||
"headerWarning": "Warning",
|
||||
"headerCritical": "Critical",
|
||||
"headerGates": "What it gates",
|
||||
"thresholdRows": [
|
||||
{
|
||||
"section": "CPU usage",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Sustained-load alert when CPU averages above the threshold for the scan window."
|
||||
},
|
||||
{
|
||||
"section": "Memory",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "RAM pressure on the host."
|
||||
},
|
||||
{
|
||||
"section": "Swap (critical only)",
|
||||
"warning": "—",
|
||||
"critical": "5 %",
|
||||
"gates": "Swap actually being used. The number is intentionally low: a healthy Proxmox host should rarely touch swap, so even 5 % is a meaningful signal of RAM pressure."
|
||||
},
|
||||
{
|
||||
"section": "CPU temperature",
|
||||
"warning": "80 °C",
|
||||
"critical": "90 °C",
|
||||
"gates": "CPU package / core temperature reading from <code>lm-sensors</code>."
|
||||
},
|
||||
{
|
||||
"section": "Disk temp — HDD",
|
||||
"warning": "60 °C",
|
||||
"critical": "65 °C",
|
||||
"gates": "Standard spinning drives. Manufacturer envelope tops out around 60–65 °C, so Critical is set right at the hard limit."
|
||||
},
|
||||
{
|
||||
"section": "Disk temp — SSD",
|
||||
"warning": "70 °C",
|
||||
"critical": "75 °C",
|
||||
"gates": "2.5'' / M.2 SATA SSDs — run cooler than NVMe but warmer than HDDs."
|
||||
},
|
||||
{
|
||||
"section": "Disk temp — NVMe",
|
||||
"warning": "80 °C",
|
||||
"critical": "85 °C",
|
||||
"gates": "NVMe drives run hotter by design; controllers self-throttle above ~85 °C, so Warning catches the climb before throttling kicks in."
|
||||
},
|
||||
{
|
||||
"section": "Disk temp — SAS",
|
||||
"warning": "55 °C",
|
||||
"critical": "65 °C",
|
||||
"gates": "Enterprise SAS drives share the same ~65 °C manufacturer limit as HDDs, but are normally deployed in rack chassis with active cooling. A reading at 55 °C already signals a cooling problem (failed fan, HVAC issue) <em>before</em> the drive itself is at risk — hence a lower Warning than HDD, not because SAS is less heat-tolerant."
|
||||
},
|
||||
{
|
||||
"section": "Disk space — host",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Capacity of <code>/</code> and every host mountpoint (<code>/var/lib/vz</code>, <code>/mnt/*</code>…)."
|
||||
},
|
||||
{
|
||||
"section": "Disk space — LXC rootfs",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Per-container root disk, evaluated against the rootfs size from PVE."
|
||||
},
|
||||
{
|
||||
"section": "LXC mount points",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Capacity of mountpoints inside running CTs (mp0, mp1, NFS, bind mounts). Excludes rootfs."
|
||||
},
|
||||
{
|
||||
"section": "PVE storage",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Block-style PVE storages (LVM, LVM-thin, ZFS-pool, RBD/Ceph, PBS)."
|
||||
},
|
||||
{
|
||||
"section": "ZFS pool",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "ZFS pools at host level — independent of PVE registration."
|
||||
}
|
||||
],
|
||||
"defaultsTitle": "Defaults, overrides and reset",
|
||||
"defaultsBody": "The backend exposes a merged view: every section starts from the ProxMenux defaults (the values you see when the host is fresh) and you override only the knobs you care about. The card shows the <em>effective</em> value — the override if you set one, otherwise the default. A <strong>Reset</strong> button wipes every override and goes back to defaults across all sections at once.",
|
||||
"validationTitle": "Validation",
|
||||
"validationBody": "Saving rejects values that don't make sense (percentages outside 0–100, critical below warning, negative temperatures). The frontend shows the inline error; the backend validates again before persisting, so the API can't be tricked into a broken threshold by a hand-crafted PUT."
|
||||
},
|
||||
"lxcDetection": {
|
||||
"heading": "LXC Update Detection",
|
||||
"imageAlt": "LXC Update Detection card with a single switch — when enabled, the Monitor periodically scans running Debian/Ubuntu/Alpine LXC containers for pending package updates.",
|
||||
"imageCaption": "The toggle for the periodic <code>apt list --upgradable</code> / <code>apk list -u</code> scan across every running CT. Default is ON. The matching notification toggle in Notifications → Services only appears while detection is enabled.",
|
||||
"intro": "A dedicated toggle for the LXC update scan, sitting between the Health Monitor Thresholds and the Notifications card. When ON, ProxMenux walks every running CT on the host and queries the in-container package manager for pending updates; results land in the Hardware tab badge counts and feed the <code>lxc_updates_available</code> notification. When OFF, the scan stops entirely (no <code>pct exec</code> calls) and any existing LXC entries in <code>managed_installs.json</code> are purged immediately, so the dashboard and the <code>/api/managed-installs</code> endpoint stop reporting LXC update state without waiting for the next 24h cycle.",
|
||||
"whatRunsTitle": "What the scan actually runs",
|
||||
"whatRunsIntro": "For each CT in <code>running</code> state with a supported package manager:",
|
||||
"whatRunsItems": [
|
||||
"<strong>Cache freshness gate.</strong> If the in-container apt/apk metadata cache is older than <strong>24 hours</strong>, a best-effort refresh runs first (<code>apt-get update -qq</code> on Debian/Ubuntu, <code>apk update</code> on Alpine) with a 60 s timeout. Any failure (no network, broken repo, timeout) is swallowed silently — the listing below still runs against whatever cache exists, so a transient repo issue can never make detection worse than before.",
|
||||
"<strong>Listing.</strong> Then ProxMenux runs <code>apt list --upgradable</code> / <code>apk list -u</code> and parses the output into a structured count plus a sample of the top package names.",
|
||||
"<strong>Per-CT dedup.</strong> A fingerprint built from count, security-count and the sorted top names is stored so a stable set of pending updates doesn't re-notify daily, while a meaningfully different set does."
|
||||
],
|
||||
"selfUpdateTitle": "CTs that self-update outside apt may legitimately report 0",
|
||||
"selfUpdateBody": "Detection only sees what the in-container package manager knows about. A CT whose key software updates itself outside apt (Plex's <code>plexupdate</code> cron, Docker containers updated via <code>docker pull</code>, Frigate's built-in updater, etc.) will keep reporting low or zero apt updates even when the appliance is actively staying current — that's correct, not a bug. The apt-level base system on the same CT may still have its own pending updates, which the scan does surface.",
|
||||
"refreshTitle": "Why the 24 h auto-refresh",
|
||||
"refreshBody": "Long-running appliance CTs frequently end up with apt caches months out of date because nobody routinely runs <code>apt update</code> inside them. Without the refresh, <code>apt list --upgradable</code> reports 0 updates from a frozen snapshot and the operator never sees the backlog. The threshold matches the rest of the check cycle — if the CT was refreshed within the last 24 h, ProxMenux trusts that signal and skips the refresh.",
|
||||
"toggleTitle": "Conditional notification toggle",
|
||||
"toggleBody": "The <code>lxc_updates_available</code> per-channel notification toggle in <strong>Notifications → Services</strong> only renders while detection is enabled. When you turn detection OFF, that row disappears from every channel's category list — but its stored preference is preserved in the DB, so re-enabling detection brings the toggle back at the value it had before.",
|
||||
"purgeTitle": "What gets purged when you disable detection",
|
||||
"purgeBody": "Turning the switch OFF immediately removes every <code>type=lxc</code> entry from <code>/usr/local/share/proxmenux/managed_installs.json</code>. The Hardware tab badges drop to zero on the next dashboard refresh. Turning it back ON repopulates the registry on the next detection cycle (or sooner if you trigger a manual refresh from the API)."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Remote Storage Exclusions",
|
||||
"imageAlt": "Remote Storage Exclusions card listing PBS-Cloud, PBS and PBS2 storages with Health and Alerts toggles per row",
|
||||
"imageCaption": "Per-storage <em>Health</em> and <em>Alerts</em> toggles. Storages with both toggles off stop counting against the Health Monitor and stop generating notifications — but still render on the Storage tab marked as excluded.",
|
||||
"intro": "Mark Proxmox-managed storages (NFS / CIFS / PBS / Ceph / iSCSI / etc.) as excluded from monitoring. Two independent toggles per storage:",
|
||||
"items": [
|
||||
"<strong>Health</strong> — when off, the storage stops contributing to the Storage category of the Health Monitor. Useful for archive volumes that are intentionally offline most of the time or remote backup targets only powered up on schedule.",
|
||||
"<strong>Alerts</strong> — when off, alerts about this storage no longer go out through configured channels, even if Health checks remain enabled. Useful when you want the dashboard view but not the notifications."
|
||||
],
|
||||
"outro": "Excluded storages still render on the <link>Storage tab</link> with a purple <em>excluded</em> badge so the entry doesn't silently disappear from your inventory. State is persisted in the <code>excluded_storages</code> SQLite table."
|
||||
},
|
||||
"interfaceExclusions": {
|
||||
"heading": "Network Interface Exclusions",
|
||||
"imageAlt": "Network Interface Exclusions card listing vmbr0, vmbr1, vmbr2, bond0 and eno1 with Health and Alerts toggles per interface",
|
||||
"imageCaption": "Same shape as Storage Exclusions — per-interface <em>Health</em> and <em>Alerts</em> toggles. Each row shows the interface, type badge (bridge / bond / physical), the IP and the link speed.",
|
||||
"intro": "Same shape as Storage Exclusions but for network interfaces. Per interface: exclude from Health checks and / or exclude from notifications. Typical use cases:",
|
||||
"items": [
|
||||
"An intentionally-down spare bridge.",
|
||||
"A NIC that was physically removed but still references in <code>/etc/network/interfaces</code>.",
|
||||
"A VLAN sub-interface used only during maintenance windows.",
|
||||
"A management bridge that is up but doesn't carry traffic — flapping noisily on every cycle."
|
||||
],
|
||||
"outro": "State is persisted in the <code>excluded_interfaces</code> SQLite table. Same purple <em>excluded</em> badge on the <link>Network tab</link> so excluded interfaces stay visible."
|
||||
},
|
||||
"notifications": {
|
||||
"heading": "Notifications & AI",
|
||||
"body1": "This section of the Settings tab is where ProxMenux Monitor notifications and the AI rewriter are turned on. Pressing <em>Enable Notifications</em> starts the dispatch background thread, registers a Proxmox VE webhook target on the host so PVE-emitted events flow into the same pipeline, and unfolds the channel form so you can connect Telegram, Discord, Email, Gotify and the rest. The AI rewriter sits inside the same panel as a collapsible advanced section.",
|
||||
"body2": "Both surfaces have a lot of moving parts — channels, per-event toggles, Rich messages, the Display Name, the dispatch pipeline (dedup, cooldown, aggregation, quiet hours), the PVE webhook integration, AI providers, prompt modes — and live on their own dedicated pages rather than being repeated here:",
|
||||
"items": [
|
||||
"<notifLink>Notifications</notifLink> — channel walk-throughs (Telegram, Discord, Gotify, Email + Gmail / Microsoft app passwords, ntfy, Slack, Teams, generic webhook), per-event categories, Rich messages, Display Name, dispatch pipeline, PVE webhook integration, history and API.",
|
||||
"<aiLink>AI Assistant</aiLink> — providers (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), model selection, prompt modes (default / custom), output language, per-channel detail levels and AI suggestions."
|
||||
]
|
||||
},
|
||||
"optimizations": {
|
||||
"heading": "ProxMenux Optimizations",
|
||||
"intro": "A live, transparent inventory of every ProxMenux post-install optimization currently active on the host. Every time you apply a post-install option from the Scripts side — either via the <autoLink>Automated post-install</autoLink> or via the à-la-carte <customLink>Customizable post-install</customLink> — the corresponding script registers itself in <code>/usr/local/share/proxmenux/installed_tools.json</code>. The Monitor reads that file and renders this card so you can see, at a glance, what's been changed on your server.",
|
||||
"imageAlt": "ProxMenux Optimizations card with grid of installed tools, each row showing a green dot, tool name and version. Examples 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 with Legacy badge, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal, VFIO IOMMU Passthrough — 14 active total",
|
||||
"imageCaption": "The card lists every active optimization with its name, version, a coloured dot and an orange <em>14 active</em> counter at the top right. Tools whose source is reachable are clickable.",
|
||||
"dotsTitle": "What the dots mean",
|
||||
"dotsItems": [
|
||||
"<green/> <strong>Green dot</strong> — current optimization, registered by the active version of ProxMenux. Source code is reachable: click the row to open it.",
|
||||
"<amber/> <strong>Amber dot + <em>legacy</em> badge</strong> — applied by an older ProxMenux version whose script has since been renamed or replaced. Still active on the host; the source opens in \"legacy\" mode (with an amber accent) so you can audit what was actually run."
|
||||
],
|
||||
"clickTitle": "Click-through to source code",
|
||||
"clickBody": "Clicking a tool opens a modal with the exact bash function that applied the change, plus the script file path it lives in (<code>auto_post_install.sh</code> for the Automated bundle, <code>customizable_post_install.sh</code> for the à-la-carte side). Comments and shell constructs are syntax-highlighted; a Copy button puts the source on your clipboard. This is the \"show your work\" surface — verify what ProxMenux did to your host before any manual change you make on top.",
|
||||
"detailAlt": "Tool source code modal for APT IPv4 Force showing the bash function force_apt_ipv4 from customizable_post_install.sh version 1.0 with syntax-highlighted code that configures /etc/apt/apt.conf.d/99-force-ipv4 with Acquire ForceIPv4 true, registers the tool and emits a translate APT IPv4 configuration completed message",
|
||||
"detailCaption": "Source modal for <em>APT IPv4 Force</em> — exact <code>force_apt_ipv4()</code> function from <code>customizable_post_install.sh v1.0</code>, with syntax highlighting and a one-click Copy.",
|
||||
"whyTitle": "Why this matters",
|
||||
"whyBody": "ProxMenux changes things on your host: kernel parameters, repository configuration, network bits, log rotation, GPU passthrough, etc. Knowing exactly what's active is essential before you start adding manual customisation on top — and even more so if a different admin runs the host than the one who set it up. This card is the auditable record of every optimisation currently in effect, with the exact code that produced it.",
|
||||
"updatesTitle": "Updates available banner",
|
||||
"updatesBody": "When a post-install optimization gets a newer version on disk than the one currently registered on the host, the card shows an \"Updates available\" banner at the top with the count and an <strong>Apply</strong> button. Clicking <strong>Apply</strong> opens a per-optimization picker (the same one available from the Post-Install menu's <em>Apply available updates</em> entry). Pick which optimizations to lift; ProxMenux re-runs the corresponding function and refreshes the version in the registry. When everything is current the banner disappears.",
|
||||
"updatesAlt": "ProxMenux Optimizations card with an Updates available banner at the top — count of pending updates plus an Apply button that opens the per-optimization picker",
|
||||
"updatesCaption": "The banner only renders when at least one optimization has a newer version on disk. See <link>Apply Available Updates</link> for the full update flow and the Path-A equivalent in the shell menu.",
|
||||
"revertTitle": "Reverting an optimization",
|
||||
"revertBody": "The card is read-only — to undo an optimization, run the corresponding <link>Uninstall Optimizations</link> option from the ProxMenux Scripts menu. The uninstall step removes the entry from <code>installed_tools.json</code>, so it disappears from this card on the next refresh."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "How the data is collected",
|
||||
"headerCard": "Card",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Network Units",
|
||||
"endpoint": "/api/settings",
|
||||
"source": "Persisted in the dashboard's SQLite settings table."
|
||||
},
|
||||
{
|
||||
"card": "Health Monitor durations",
|
||||
"endpoint": "/api/health/settings",
|
||||
"source": "Per-category suppression durations in the Health DB."
|
||||
},
|
||||
{
|
||||
"card": "Storage / interface exclusions",
|
||||
"endpoint": "/api/storage/exclusions, /api/network/exclusions",
|
||||
"source": "SQLite tables <code>excluded_storages</code> and <code>excluded_interfaces</code>."
|
||||
},
|
||||
{
|
||||
"card": "Notifications & AI panel",
|
||||
"endpoint": "/api/notifications/*",
|
||||
"source": "See the dedicated <notifLink>Notifications</notifLink> / <aiLink>AI Assistant</aiLink> pages."
|
||||
},
|
||||
{
|
||||
"card": "ProxMenux Optimizations list",
|
||||
"endpoint": "/api/proxmenux/installed-tools",
|
||||
"source": "Reads <code>/usr/local/share/proxmenux/installed_tools.json</code>, written by <code>register_tool</code> calls inside the post-install scripts."
|
||||
},
|
||||
{
|
||||
"card": "Optimization source-code modal",
|
||||
"endpoint": "/api/proxmenux/tool-source",
|
||||
"source": "Extracts the matching bash function from <code>auto_post_install.sh</code> or <code>customizable_post_install.sh</code> on the host."
|
||||
}
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — channels, per-event toggles, channel overrides, history, test-send."
|
||||
},
|
||||
{
|
||||
"label": "AI Assistant",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tail": " — providers, models, prompt modes, languages, per-channel detail levels."
|
||||
},
|
||||
{
|
||||
"label": "Health Monitor → Dismissing alerts and the Suppression Duration",
|
||||
"href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration",
|
||||
"tail": " — the semantics behind the per-category dropdowns above."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Scripts → Automated post-install",
|
||||
"href": "/docs/post-install/automated",
|
||||
"tailRich": " and <customLink>Customizable post-install</customLink> — the actual scripts that register themselves in the optimization list above."
|
||||
},
|
||||
{
|
||||
"label": "Uninstall Optimizations",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — how to revert an optimization registered above."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — back to the tab overview."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
268
web/messages/en/docs/monitor/dashboard/storage.json
Normal file
268
web/messages/en/docs/monitor/dashboard/storage.json
Normal file
@@ -0,0 +1,268 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Storage tab | ProxMenux Documentation",
|
||||
"description": "The Storage tab consolidates four views: Proxmox-managed storages with their state, ZFS pools, internal physical disks with SMART data, and external (USB) drives. Each disk drill-in exposes SMART attributes, wear & lifetime and the permanent observation history."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Storage tab",
|
||||
"description": "The host's storage state in one screen — Proxmox pools (NFS / CIFS / LVM / ZFS / dir), ZFS pool health, internal SATA / NVMe disks with SMART, and external USB drives. Click any disk to open a drill-in with the full SMART attribute table and the per-disk observation history.",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Backed by three sources",
|
||||
"body": "Proxmox storages come from <code>pvesm status</code>; ZFS state from <code>zpool status</code>; physical disks from <code>lsblk</code> + <code>smartctl</code> (and <code>nvme</code> for NVMe-specific fields). The tab refreshes every ~60 seconds; the per-disk drill-in triggers a fresh SMART read on demand."
|
||||
},
|
||||
"thresholds": {
|
||||
"title": "Status colours and thresholds applied here",
|
||||
"intro": "Every bar, chip, and dot on this tab follows the same three-state classification — <green/> <strong>green</strong> below Warning, <amber/> <strong>amber</strong> from Warning to Critical, <red/> <strong>red</strong> at Critical and above. Recommended defaults shipped with ProxMenux:",
|
||||
"items": [
|
||||
"<strong>Capacity</strong> (host disks, PVE storages, ZFS pools, LXC mounts) — Warning 85 %, Critical 95 %.",
|
||||
"<strong>Disk temperature</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (warning / critical)."
|
||||
],
|
||||
"outro": "Every value is configurable per host — <link>Settings → Health Monitor Thresholds</link> is the single source of truth and explains how to tune them."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Top row: storage at-a-glance",
|
||||
"intro": "Opening the Storage tab lands you on a four-card summary of the host's storage state — total capacity, what's used locally, what's used on remote storages, and the physical-disk inventory. Each card is a one-line answer to a common question; the cards below the row are where you drill into the detail.",
|
||||
"imageAlt": "Storage tab — top row of four stat cards: Total Storage, Local Used, Remote Used, Physical Disks",
|
||||
"imageCaption": "Top row of the Storage tab — total capacity and disk count, used bytes split into local vs remote storages, and a typed breakdown of physical disks with their health summary.",
|
||||
"headerCard": "Card",
|
||||
"headerWhat": "What it shows",
|
||||
"totalLabel": "Total Storage",
|
||||
"totalWhat": "Combined raw capacity across every physical disk. Footer line shows the count of physical disks discovered.",
|
||||
"localLabel": "Local Used",
|
||||
"localWhat": "Bytes used on local storages (LVM / LVM-thin / ZFS / dir on the host's own disks). Shows the used bytes prominently, with a footer line of <em>X.XX % of Y TB</em> so you see the fill-percentage at the same time.",
|
||||
"remoteLabel": "Remote Used",
|
||||
"remoteWhat": "Same shape as Local Used but for remote storages (NFS / CIFS / PBS / Ceph / iSCSI). Counted separately because remote outages don't affect local data and you typically size and monitor them differently.",
|
||||
"disksLabel": "Physical Disks",
|
||||
"disksIntro": "Two lines of breakdown for the inventory:",
|
||||
"disksItems": [
|
||||
"<strong>By type</strong> — counts of NVMe (purple), SSD (blue) and HDD (blue) discovered. Mixed-disk hosts get all three; an all-NVMe host shows only the NVMe count.",
|
||||
"<strong>By health</strong> — counts of <em>normal</em> (green), <em>warning</em> (yellow) and <em>critical</em> (red) disks. The healthy state usually shows just \"X normal\"; warnings and critical only appear when something escalated."
|
||||
]
|
||||
},
|
||||
"pveStorage": {
|
||||
"heading": "Proxmox Storage card",
|
||||
"intro": "One row per storage configured in <code>/etc/pve/storage.cfg</code>. Each row shows the type badge (<code>nfs</code> / <code>cifs</code> / <code>zfspool</code> / <code>lvm</code> / <code>lvmthin</code> / <code>dir</code> / <code>pbs</code>), the storage name, an active / error / not-monitored badge, the usage percentage and a coloured progress bar:",
|
||||
"items": [
|
||||
"<strong>< 75 %</strong> — blue progress bar, value in blue.",
|
||||
"<strong>75 – 90 %</strong> — yellow progress bar, value in yellow (Health Monitor warns at this point).",
|
||||
"<strong>> 90 %</strong> — red progress bar, value in red (Health Monitor escalates).",
|
||||
"<strong>error</strong> — full row outlined in red, used when the storage is configured but unreachable (NFS server down, CIFS creds expired).",
|
||||
"<strong>excluded</strong> — purple outline + the badge \"not monitored\". Storages explicitly excluded by the user from health checks (handy for manual / archive volumes that are intentionally offline)."
|
||||
],
|
||||
"calloutTitle": "Excluding a noisy storage",
|
||||
"calloutBody": "From the storage row, the per-storage menu lets you mark it as <em>excluded from monitoring</em>. The flag is stored in the <code>excluded_storages</code> table and respected by both the dashboard view and the Health Monitor cycle — no notifications fire for excluded storages, and they don't bump the header pill."
|
||||
},
|
||||
"zfs": {
|
||||
"heading": "ZFS Pools card",
|
||||
"intro": "Renders only when ZFS is installed and at least one pool exists. One row per pool with a health badge, size / allocated / free, and an icon mirroring the health state:",
|
||||
"items": [
|
||||
"<strong>ONLINE</strong> — green. Everything healthy.",
|
||||
"<strong>DEGRADED</strong> — yellow. Pool is serving data but at least one device is unavailable; replacement window starts.",
|
||||
"<strong>FAULTED</strong> / <strong>UNAVAIL</strong> / <strong>SUSPENDED</strong> — red. Pool not serving data; immediate intervention required."
|
||||
],
|
||||
"outro": "Both ZFS state and the per-disk SMART status feed the <em>Disks & I/O</em> category of the <link>Health Monitor</link>."
|
||||
},
|
||||
"physical": {
|
||||
"heading": "Physical Disks & SMART Status",
|
||||
"intro": "Internal disks (SATA / NVMe). Each row condenses the most useful fields at a glance:",
|
||||
"items": [
|
||||
"<strong>Device path</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Type badge</strong> — SATA / NVMe (and the relevant icon).",
|
||||
"<strong>System badge</strong> — orange tag that marks disks the host's OS is running from. The dashboard derives this from the mountpoints of <code>/</code> and <code>/boot</code>: any physical disk hosting them gets the <em>System</em> tag so you don't accidentally wipe or repurpose it. Disks without the tag are pure data drives.",
|
||||
"<strong>Model</strong> — vendor + model string from <code>smartctl -i</code>.",
|
||||
"<strong>Capacity</strong> — formatted human-readable.",
|
||||
"<strong>Temperature</strong> — current °C, coloured by the disk-type threshold (NVMe runs warmer than SATA).",
|
||||
"<strong>SMART status</strong> — passed / failed / unknown.",
|
||||
"<strong>Observations badge</strong> — when the permanent <code>disk_observations</code> history has un-dismissed entries for this disk, a blue badge with the count appears (e.g. <em>3 obs.</em>). Click the disk to drill in and review them.",
|
||||
"<strong>Health badge</strong> — Healthy / Warning / Critical, derived from the SMART check + recent observations."
|
||||
],
|
||||
"clickHint": "The whole row is clickable and opens the per-disk drill-in described below.",
|
||||
"warningTitle": "Don't touch System-tagged disks lightly",
|
||||
"warningBody": "Disks with the orange <strong>System</strong> badge host the running OS. The dashboard surfaces the tag as a guard rail — destructive actions launched from <link>ProxMenux → Disk Manager → Format / Wipe</link> explicitly refuse to act on them. If you really need to repurpose the boot disk, do it from a rescue environment, not from inside Proxmox."
|
||||
},
|
||||
"external": {
|
||||
"heading": "External Storage (USB)",
|
||||
"body": "A separate card for USB-attached drives, only renders when at least one is present. Same fields as internal disks plus an orange <strong>USB</strong> tag. USB drives often appear and disappear (cold backups, occasional offload jobs), so the Health Monitor is conservative about them — observations are retained, but I/O errors on a disconnected USB drive don't escalate."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Disk drill-in modal",
|
||||
"intro": "Clicking any disk row opens a four-tab modal: <strong>Overview</strong> · <strong>SMART</strong> · <strong>History</strong> · <strong>Schedule</strong>. The header always shows the device path, the model + capacity and the orange <em>System</em> badge if applicable.",
|
||||
"overviewTitle": "Tab 1 — Overview",
|
||||
"overviewImageAlt": "Disk drill-in modal — Overview tab with health status, Wear & Lifetime ring, and quick SMART attributes",
|
||||
"overviewImageCaption": "Overview tab — identity, health badge, life-remaining ring with current wear and data written, plus a quick block of the most-watched SMART attributes.",
|
||||
"overviewIntro": "The default landing tab — everything you need to answer \"is this disk OK?\" without running a test. Three blocks:",
|
||||
"overviewItems": [
|
||||
"<strong>Identity</strong> — model, serial, capacity, Health badge (Healthy / Warning / Critical).",
|
||||
"<strong>Wear & Lifetime</strong> — large life-remaining ring (97 %, 50 %, …) with the source attribute spelled out (<em>Media Wearout Indicator</em>, <em>Percentage Used</em>, …), a wear bar (current consumption %), an <em>Est. Life</em> projection in years and the total Data Written. NVMe drives also show <em>Available Spare</em>.",
|
||||
"<strong>SMART Attributes</strong> — six headline fields on a 2-column grid: Temperature, Power On Hours (with humanised duration like <em>3y 116d</em>), Rotation Rate (or <em>SSD</em>), Power Cycles, SMART Status, Reallocated Sectors, Pending Sectors, CRC Errors. The full attribute table lives in the SMART tab."
|
||||
],
|
||||
"smartTitle": "Tab 2 — SMART",
|
||||
"smartImageAlt": "Disk drill-in modal — SMART tab with Run SMART Test buttons (Short / Extended), last-test result and the full SMART attribute table",
|
||||
"smartImageCaption": "SMART tab — run a Short or Extended test, see the last-test outcome, scroll the full SMART attribute table, and generate the full PDF health report.",
|
||||
"smartIntro": "Where the actions live. Three sections:",
|
||||
"smartItems": [
|
||||
"<strong>Run SMART Test</strong> — two buttons. <em>Short Test (~2 min)</em> runs synchronously and shows the result inline. <em>Extended Test (background)</em> can take hours on big drives, runs server-side and fires a notification when it completes.",
|
||||
"<strong>Last Test</strong> — type, status badge (<em>passed</em> / <em>failed</em>) and timestamp of the most recent run.",
|
||||
"<strong>SMART Attributes</strong> — the full attribute table (ID / name / value / worst / status with OK / warning / critical icons). For SATA / SAS, the classical numbered list. For NVMe, the structured fields from <code>nvme smart-log</code> (temperature, available spare, percentage used, data units written / read, host reads / writes, controller busy time, power cycles, unsafe shutdowns, media errors, error-log entries, warning / critical composite temperature time)."
|
||||
],
|
||||
"pdfTitle": "View Full SMART Report (PDF)",
|
||||
"pdfIntro": "At the bottom of the SMART tab, the <strong>View Full SMART Report</strong> button generates a printable, archive-ready PDF — the same structured report you'd send to a vendor for an RMA.",
|
||||
"pdfPreviewAlt": "First page of the generated SMART Health Report PDF — Executive Summary with the PASSED ring + Disk Information block",
|
||||
"pdfPreviewCaption": "First page of the SMART Health Report — Executive Summary with the PASSED ring and the full Disk Information block. The full PDF below has the SSD wear ring, every SMART attribute and the test history.",
|
||||
"pdfDownloadLabel": "Download sample SMART report (PDF)",
|
||||
"pdfSectionsIntro": "The report has five top-level sections:",
|
||||
"pdfSections": [
|
||||
"<strong>Executive Summary</strong> — large PASSED / FAILED verdict, plain-language disk health assessment paragraph (\"your disk is healthy / showing signs of wear / failing\"), and four quick stats (report timestamp, last-test type, test result, attributes checked).",
|
||||
"<strong>Disk Information</strong> — model, serial, capacity, type (HDD / SSD / NVMe), family, form factor, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM support, current temperature with the optimal threshold, power-on time, power cycles, SMART status, plus the headline counters (pending sectors, CRC errors, reallocated sectors).",
|
||||
"<strong>SSD Wear & Lifetime</strong> (SSD / NVMe only) — life-remaining ring, source attribute, current wear level, data written, power-on hours.",
|
||||
"<strong>SMART Attributes (full)</strong> — every attribute the drive reports, with ID, name, value, worst, threshold, raw value and a status pill. The most user-relevant ones (Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, …) include a one-line plain-language explanation under the row.",
|
||||
"<strong>Last Self-Test Result + Full Self-Test History</strong> — the latest test (type, result, completion message, at which power-on-hours mark) plus a numbered table of every retained test.",
|
||||
"<strong>Recommendations</strong> — action items based on the verdict: <em>Disk is Healthy / Schedule periodic tests / Backup strategy</em> for healthy drives, escalating language with replacement guidance when attributes are out of range."
|
||||
],
|
||||
"pdfOutro": "The PDF is produced server-side and downloaded with a stable filename pattern (<code>SMART-<short-id>.pdf</code>) so multiple snapshots over time can sit side-by-side in your archive. Useful when you're tracking degradation across months or sending evidence to vendor support.",
|
||||
"historyTitle": "Tab 3 — History",
|
||||
"historyImageAlt": "Disk drill-in modal — History tab listing past SMART tests with download and delete actions",
|
||||
"historyImageCaption": "History tab — every retained SMART test for this disk. Per row: type, timestamp, \"X days ago\" tag, latest marker, download (raw <code>smartctl</code> output) and delete actions.",
|
||||
"historyIntro": "The retained pool of SMART tests for this disk — both short and extended runs that completed. Each entry is the raw <code>smartctl</code> output captured at run time, plus the structured fields the Monitor parsed out for the dashboard. Per-row actions:",
|
||||
"historyItems": [
|
||||
"<strong>Download</strong> — saves the raw <code>smartctl -a</code> output as a text file. Identical to what the PDF report parses, useful when you need the exact line a vendor asks for.",
|
||||
"<strong>Delete</strong> — removes the test from history. The retention limit set in the Schedule tab (<em>Last 5 / 10 / 20</em>) deletes oldest-first automatically; this action is the manual override."
|
||||
],
|
||||
"scheduleTitle": "Tab 4 — Schedule",
|
||||
"scheduleImageAlt": "Disk drill-in modal — Schedule tab with the toggle for Automatic SMART Tests, the configured-schedules list and the Add Schedule button",
|
||||
"scheduleImageCaption": "Schedule tab — pick test type, frequency and retention; the Monitor wires it into <code>cron</code> so tests run unattended.",
|
||||
"scheduleIntro": "Cron-driven automatic SMART tests, no shell needed. The page has three areas:",
|
||||
"scheduleItems": [
|
||||
"<strong>Automatic SMART Tests toggle</strong> — global on/off switch for every schedule on this disk. Useful when you want to pause everything during maintenance without losing the schedule definitions.",
|
||||
"<strong>Configured Schedules</strong> — one row per existing schedule with the test type badge (<em>short</em> / <em>long</em>), the cron expression in human form (<em>\"Day 1 of month at 03:00\"</em>, <em>\"Every Sunday at 02:00\"</em>), the disks it covers and the retention setting.",
|
||||
"<strong>Add Schedule / Edit Schedule</strong> — form with: Test Type (<em>Short ~2 min</em> / <em>Long 1-4 h</em>), Frequency (<em>Daily / Weekly / Monthly</em>), Day of Month / Day of Week, Time, Keep Results (<em>Last 5 / 10 / 20</em>)."
|
||||
],
|
||||
"scheduleOutro": "The schedule is materialised as a cron entry on the host that calls back into the Monitor; results are saved to the same SMART history shown in Tab 3, and the retention setting auto-prunes the oldest test when a new one finishes.",
|
||||
"tempTitle": "Temperature history modal",
|
||||
"tempIntro": "Every disk that exposes a temperature sensor has its readings sampled continuously by the Monitor and persisted to a local time-series. The current value appears as one of the six headline SMART attributes in the Overview tab; clicking that block opens a dedicated temperature-history modal with the full picture.",
|
||||
"tempImageAlt": "Disk temperature history modal — header with the disk path and model, a timeframe selector (1 Hour / 24 Hours / 7 Days / 30 Days), a row of four stat cards (Current / Min / Avg / Max), and a line chart of the temperature over the selected range coloured by the per-disk-type thresholds",
|
||||
"tempImageCaption": "Temperature detail — opens from the Overview tab on any disk whose sensor returns a non-zero reading. The chart is coloured against the disk-type threshold (HDD / SSD / NVMe / SAS).",
|
||||
"tempShowsTitle": "What the modal shows",
|
||||
"tempShowsItems": [
|
||||
"<strong>Timeframe selector</strong> with four ranges: <em>1 Hour</em>, <em>24 Hours</em> (default), <em>7 Days</em>, <em>30 Days</em>. Each one queries the same backend with a different downsampling so the chart stays readable at every horizon.",
|
||||
"<strong>Four stat cards</strong> at the top of the modal: <em>Current</em>, <em>Min</em>, <em>Avg</em>, <em>Max</em> for the selected range. The <em>Current</em> card is coloured by the same status thresholds the Storage tab and the notifications use, so you can see at a glance whether the disk is in normal / warm / hot territory.",
|
||||
"<strong>Line chart</strong> of the temperature over time, with the line and shaded area coloured by disk type:"
|
||||
],
|
||||
"tempDiskTypes": [
|
||||
"HDD — typically cooler thresholds.",
|
||||
"SSD — moderate thresholds.",
|
||||
"NVMe — higher thresholds (NVMe runs hotter by design).",
|
||||
"SAS — same defaults as HDD."
|
||||
],
|
||||
"tempConfigurable": "All four are configurable from <em>Settings → Health Monitor Thresholds</em>.",
|
||||
"tempWhyTitle": "Why a history matters here",
|
||||
"tempWhyItems": [
|
||||
"<strong>Drift detection.</strong> Disks that progressively heat up over weeks (failing fan, dust build-up, neighbour disk dying and pushing hot air across) are invisible to a single \"current temperature\" readout. The 7-day and 30-day views surface the drift.",
|
||||
"<strong>Spike correlation.</strong> When a backup window or a rebuild pushed the disk briefly over its threshold, the 1-hour and 24-hour ranges show whether it was a one-off or a recurring pattern.",
|
||||
"<strong>Threshold tuning.</strong> Before raising or lowering a threshold in <em>Settings → Health Monitor Thresholds</em>, the 30-day chart shows the disk's actual operating range so the new value lines up with what the hardware really does rather than a guess."
|
||||
],
|
||||
"obsTitle": "Observation history (across tabs)",
|
||||
"obsIntro": "Modern disks fail gradually. A disk can report SMART <strong>PASSED</strong> and still log occasional read errors in dmesg, drop SATA links, or expose pending sectors that come and go. The standard Proxmox UI shows you the current SMART verdict — it does not keep a history of those <em>signals</em>. ProxMenux does, and surfaces them right inside the disk modal.",
|
||||
"obsImageAlt": "Disk Details modal Overview tab showing a healthy disk with SMART status Passed, 0 reallocated/pending/CRC errors, and an Observations section listing one recorded I/O Error event with the raw kernel message, a human translation of the ATA error code, first and last occurrence timestamps and an occurrence count",
|
||||
"obsImageCaption": "A disk that <strong>SMART says is fine</strong> can still have an observation history. The card is the historical signal layer underneath the SMART verdict.",
|
||||
"obsWhatTitle": "What an observation is",
|
||||
"obsWhatIntro": "Anything ProxMenux catches in the kernel log, dmesg or SMART output that looks like a disk-level event — and that on its own would be too granular for a notification — is recorded as an <strong>observation</strong>. Each row shows:",
|
||||
"obsWhatItems": [
|
||||
"<strong>Type badge</strong> (I/O Error, SMART Error, Filesystem Error, ZFS Pool Error, Connection Error).",
|
||||
"<strong>Raw kernel message</strong> as it appeared in dmesg — useful when copy-pasting into a search engine or a support ticket.",
|
||||
"<strong>A human one-liner</strong> under the raw message for known ATA codes (<code>IDNF</code> → \"Sector address not found — possible bad sector or cable issue\", <code>UNC</code> → \"Uncorrectable read error — bad sector\", and the rest of the standard codes).",
|
||||
"<strong>First and last occurrence timestamps</strong>, plus an <strong>occurrence count</strong> deduplicated by error signature."
|
||||
],
|
||||
"obsWhyTitle": "Why ProxMenux records and shows them",
|
||||
"obsWhyItems": [
|
||||
"<strong>Disk failure is rarely a single event.</strong> It usually starts with sporadic ATA bus errors, the odd UNC sector, or a couple of medium errors weeks before SMART flips to <em>FAILED</em>. Without persistence those early warnings disappear from dmesg on the next boot.",
|
||||
"<strong>SMART can lie.</strong> A drive can show all attributes green and still be on the way out — the observation layer catches the symptoms SMART doesn't expose (especially ICRC, IDNF, link resets at lower SATA speeds).",
|
||||
"<strong>It separates \"is happening now\" from \"happened recently\".</strong> The Health Monitor auto-resolves transient errors as soon as they stop firing, which is great for keeping the active alert list clean — but you still want to see, days later, that this disk had three I/O errors that night. The observation table is the answer.",
|
||||
"<strong>It feeds the tiered notification model.</strong> The disk_io detector reads observation rate from this table to decide silent / WARNING / CRITICAL (the sliding 24h window introduced in 1.2.1.2). The history is what makes that classification possible."
|
||||
],
|
||||
"obsDedupTitle": "How dedup and re-notification work",
|
||||
"obsDedupBody1": "Observations are deduplicated by their <strong>signature</strong> — a stable fingerprint of the error type, device and key fields of the kernel line. The same event repeating bumps the <code>occurrence_count</code> on the existing row rather than creating a new one. A <strong>different signature</strong> on the same disk creates a new observation and is treated as a new event for notification purposes.",
|
||||
"obsDedupBody2": "Notifications follow an anti-cascade rule: the first occurrence of a given (disk, signature, severity) combination pages the operator, and ProxMenux then waits 24 hours before pinging again about the same combination — even if the count keeps climbing. Escalating severity (WARNING → CRITICAL) breaks the cooldown so the operator is told when things get worse, not just when they happen.",
|
||||
"obsDismissTitle": "Dismissing vs resolving",
|
||||
"obsDismissBody1": "Each row has a <strong>dismiss</strong> action. Dismissing an observation tells ProxMenux \"I've seen this, stop notifying me about it\". It does <strong>not</strong> freeze the occurrence counter — if the same fault keeps happening the count keeps climbing in the background, ready to alert again if it ever escalates to a different severity tier or signature. A dismissed observation stays visible on the card with a muted style, so a future operator can still see \"this disk had history here\".",
|
||||
"obsDismissBody2": "Resolving on the active-error side (Health Monitor) is independent of observation dismiss — the observation persists past the active error's auto-resolve. That's the whole point: it survives, so a transient warning from last week is still visible on the disk card today. See <link>Health Monitor</link> for the active-error side of the same picture."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "How the data is collected",
|
||||
"headerSection": "Section of the tab",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Top summary cards",
|
||||
"endpoint": "/api/storage/summary",
|
||||
"source": "Aggregated from <code>lsblk</code>, <code>zpool list</code>, <code>vgs</code> / <code>lvs</code>."
|
||||
},
|
||||
{
|
||||
"section": "Per-disk inventory",
|
||||
"endpoint": "/api/storage",
|
||||
"source": "<code>lsblk -O</code> + <code>smartctl -i</code> per device, with stable disk identity cache (cleared on hot-plug events)."
|
||||
},
|
||||
{
|
||||
"section": "Proxmox storages",
|
||||
"endpoint": "/api/proxmox-storage",
|
||||
"source": "<code>pvesh get /nodes/<node>/storage</code> with the active/online state of each."
|
||||
},
|
||||
{
|
||||
"section": "SMART current values",
|
||||
"endpoint": "/api/storage/smart/<disk>",
|
||||
"source": "<code>smartctl -A <dev></code> — refreshed on demand, not cached."
|
||||
},
|
||||
{
|
||||
"section": "SMART self-test history",
|
||||
"endpoint": "/api/storage/smart/<disk>/history",
|
||||
"source": "Stored under <code>/var/lib/proxmenux-monitor/smart/<disk>/</code> as JSON snapshots."
|
||||
},
|
||||
{
|
||||
"section": "Permanent observations",
|
||||
"endpoint": "/api/storage/observations",
|
||||
"source": "SQLite table fed by the Health Monitor every cycle (kept across auto-resolve)."
|
||||
}
|
||||
],
|
||||
"outro": "Verifying the collection chain on the host:",
|
||||
"codeComment1": "# Pull the current snapshot from a script",
|
||||
"codeComment2": "# Cross-check what the dashboard sees against the raw OS view"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Health Monitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — the disks-and-I/O category and the suppression model."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — the storage and SMART endpoints."
|
||||
},
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tailRich": " — what <code>disk_io_error</code>, <code>storage_unavailable</code> and <code>smart_test_failed</code> trigger downstream."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — the other tabs."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Disk Manager",
|
||||
"href": "/docs/disk-manager",
|
||||
"tail": " — the actions side: format / wipe / SMART tests / import disks into VMs and CTs from the TUI."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → SMART Disk Health & Test",
|
||||
"href": "/docs/disk-manager/smart-disk-test",
|
||||
"tail": " — the CLI counterpart of this tab: schedule SMART tests, export the JSON the dashboard renders, and the deeper test-type / interpretation reference."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
120
web/messages/en/docs/monitor/dashboard/system-logs.json
Normal file
120
web/messages/en/docs/monitor/dashboard/system-logs.json
Normal file
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: System Logs tab | ProxMenux Documentation",
|
||||
"description": "The System Logs tab consolidates three sources into one screen: live journalctl with filters and download, Proxmox task history (UPIDs), and notification log — all searchable, filterable by severity / time range, and downloadable as text bundles."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: System Logs tab",
|
||||
"description": "Three sub-tabs under one roof: the system journal (journalctl with filters), Proxmox task history, and the notification log. All three are searchable, filterable and downloadable as text bundles.",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"readOnly": {
|
||||
"title": "Read-only by design",
|
||||
"body": "Nothing on this tab modifies log files. Filters live in the URL / state, downloads are server-side bundles. The dashboard never deletes log entries — for housekeeping use the host's own <code>journalctl --vacuum-time=<N></code> or <code>logrotate</code>."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Top row: four counters",
|
||||
"items": [
|
||||
"<strong>Total Entries</strong> — number of log records inside the active filter window.",
|
||||
"<strong>Errors</strong> — count of severity ≤ 3 (<code>err</code> / <code>crit</code> / <code>alert</code> / <code>emerg</code>).",
|
||||
"<strong>Warnings</strong> — count of severity 4 (<code>warning</code>).",
|
||||
"<strong>Backups</strong> — count of vzdump / PBS task entries in the same window."
|
||||
]
|
||||
},
|
||||
"subtabs": {
|
||||
"heading": "Three sub-tabs",
|
||||
"logsTitle": "Logs",
|
||||
"logsIntro": "The system journal, served by <code>journalctl</code> on the backend. Filters available in the toolbar:",
|
||||
"logsFilters": [
|
||||
"<strong>Severity</strong> — emerg / alert / crit / err / warning / notice / info / debug, or any combination.",
|
||||
"<strong>Time range</strong> — last 5 min / 15 min / 1 h / 6 h / 24 h / 7 d / custom.",
|
||||
"<strong>Free-text search</strong> — substring or regex (<code>journalctl --grep</code>).",
|
||||
"<strong>Unit filter</strong> — restrict to a specific systemd unit (<code>pveproxy.service</code>, <code>nginx.service</code>, …)."
|
||||
],
|
||||
"logsRowsAfter": "Each row shows timestamp, severity badge, source unit and the message. Long messages collapse with a \"show more\" toggle. The <strong>Download</strong> action bundles the current filter into a single <code>.txt</code> file via <code>GET /api/logs/download</code> — useful when you want to share a slice of journal with someone.",
|
||||
"logDetailsModalTitle": "Log Details modal",
|
||||
"logDetailsBody": "Clicking any row opens a <strong>Log Details</strong> modal with every structured field journald captured for that single entry — the same view you'd build by hand running <code>journalctl --output=verbose</code> on the host.",
|
||||
"logDetailsImageAlt": "Log Details modal — single journal entry expanded with Level, Service, Timestamp, Source, Systemd Unit, Process ID, Hostname and the full Message",
|
||||
"logDetailsImageCaption": "Log Details modal — every structured field journald carries for this entry, with the full untruncated message at the bottom. Useful for cron and service logs where the executed command line matters.",
|
||||
"fieldsIntro": "Fields shown:",
|
||||
"fields": [
|
||||
"<strong>Level</strong> — coloured severity badge (INFO / WARNING / ERROR / CRITICAL).",
|
||||
"<strong>Service</strong> — short name of the unit / process that emitted the entry.",
|
||||
"<strong>Timestamp</strong> — full date and time of the log line.",
|
||||
"<strong>Source</strong> — origin of the entry (journal, kernel, audit, …).",
|
||||
"<strong>Systemd Unit</strong> — the actual <code>.service</code> / <code>.timer</code> / <code>.socket</code> unit if the entry was associated with one.",
|
||||
"<strong>Process ID</strong> — PID of the emitting process.",
|
||||
"<strong>Hostname</strong> — useful when journals are forwarded across cluster nodes.",
|
||||
"<strong>Message</strong> — the full untruncated message in a monospace block, ready to copy."
|
||||
],
|
||||
"maxLevelStoreTitle": "Journald MaxLevelStore",
|
||||
"maxLevelStoreBody": "On a fresh Proxmox install, journald defaults to <code>MaxLevelStore=warning</code>, which silently drops info-level messages. The Monitor detects this on startup and adds a drop-in (<code>/etc/systemd/journald.conf.d/proxmenux-loglevel.conf</code>) raising the threshold to <code>info</code> so the Logs tab actually has something to show across all severities.",
|
||||
"backupsTitle": "Backups",
|
||||
"backupsBody": "Proxmox task history filtered to backup-related entries. One row per task (<code>vzdump</code>, PBS transfers, Garbage Collect, Verify) with the status (OK / WARNINGS / ERROR), guest involved, source storage, duration and the UPID. Click a row to load the full task log via <code>GET /api/task-log/<upid></code> — the same data Proxmox exposes through <em>Datacenter → Tasks</em>, scoped to backups.",
|
||||
"notificationsTitle": "Notifications",
|
||||
"notificationsBody1": "Every notification dispatched by the Monitor — Telegram, Discord, Email, Gotify, ntfy, Slack, Teams, webhook. Each row: timestamp, channel, event type, severity, the rendered title, the rendered body, and (if AI is enabled) a toggle to view the AI rewrite next to the original.",
|
||||
"notificationsBody2": "Use this tab to verify a channel is actually delivering and to compare what the AI rewrite produced vs the template baseline. Channel configuration lives in the <link>Notifications</link> deep page."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "How the data is collected",
|
||||
"headerSubtab": "Sub-tab",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"subtab": "Logs (live filter)",
|
||||
"endpoint": "/api/logs",
|
||||
"source": "<code>journalctl --output json --since <range></code> with severity / unit / search filters applied server-side."
|
||||
},
|
||||
{
|
||||
"subtab": "Download",
|
||||
"endpoint": "/api/logs/download",
|
||||
"source": "Same query, returned as plain text for grep / less."
|
||||
},
|
||||
{
|
||||
"subtab": "Backups",
|
||||
"endpoint": "/api/backups",
|
||||
"source": "PVE task history filtered by <code>vzdump</code>, PBS transfers, Garbage Collect, Verify."
|
||||
},
|
||||
{
|
||||
"subtab": "Backup task drill-in",
|
||||
"endpoint": "/api/task-log/<upid>",
|
||||
"source": "Plain-text full task log read from <code>/var/log/pve/tasks/<index>/<upid></code>."
|
||||
},
|
||||
{
|
||||
"subtab": "Notifications history",
|
||||
"endpoint": "/api/notifications/history",
|
||||
"source": "SQLite <code>notification_history</code> table fed by the dispatch loop."
|
||||
}
|
||||
],
|
||||
"apiIntro": "Both the live filter and the downloads are also reachable via the API:",
|
||||
"codeComment1": "# Last hour of errors and worse, with a keyword",
|
||||
"codeComment2": "# Download the full journal of the last 6 hours as plain text",
|
||||
"codeComment3": "# Look up the full output of a specific task by UPID"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Health Monitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — the System Logs category that watches for persistent / spike / cascade patterns."
|
||||
},
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — the journal watcher reads the same source and turns matches into notifications."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — the logs and task-log endpoints with their query parameters."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — the other tabs."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
153
web/messages/en/docs/monitor/dashboard/system-overview.json
Normal file
153
web/messages/en/docs/monitor/dashboard/system-overview.json
Normal file
@@ -0,0 +1,153 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: System Overview tab | ProxMenux Documentation",
|
||||
"description": "The default landing tab of ProxMenux Monitor: four metric cards (CPU, Memory, Active VMs & LXCs, Temperature) with live updates and sparkline, the historical metrics chart, and condensed Storage and Network panels with click-through to their dedicated tabs."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: System Overview tab",
|
||||
"description": "The first tab the dashboard opens on. Four live metric cards across the top, the historical-metrics chart in the middle, and condensed storage / network panels at the bottom — all derived from the same APIs that drive the dedicated tabs.",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"readOnly": {
|
||||
"title": "A read-only snapshot",
|
||||
"body": "Nothing on this tab is a control surface — every panel is informational. Actions live in the dedicated tabs they link to: drill into Storage to manage disks, into VMs & LXCs to start / stop guests, into the Security tab to configure auth, and so on."
|
||||
},
|
||||
"captureAlt": "System Overview tab — four metric cards (CPU, Memory, Active VMs, Temperature), node metrics chart, and Storage / Network summary cards",
|
||||
"captureCaption": "The System Overview tab — what the dashboard opens on. The four cards are live, the chart below is historical, and the two cards at the bottom summarise Storage and Network.",
|
||||
"topRow": {
|
||||
"heading": "Top row: live metric cards",
|
||||
"intro": "Four cards in a 2×2 grid on mobile, single row on desktop. Each updates from <code>/api/system</code> every few seconds.",
|
||||
"headerCard": "Card",
|
||||
"headerWhat": "What it shows",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"card": "CPU Usage",
|
||||
"what": "Current percentage with a progress bar. Updates ~1 s via the vital-signs sampler.",
|
||||
"source": "psutil.cpu_percent()"
|
||||
},
|
||||
{
|
||||
"card": "Memory Usage",
|
||||
"what": "Used GB, percentage, total GB. Progress bar tracks the percentage.",
|
||||
"source": "psutil.virtual_memory()"
|
||||
},
|
||||
{
|
||||
"card": "Active VM & LXC",
|
||||
"what": "Count of currently running guests, with a Running / Stopped breakdown badge and a footer line for total VMs and LXCs.",
|
||||
"source": "/api/vms (consolidated)"
|
||||
},
|
||||
{
|
||||
"card": "Temperature",
|
||||
"what": "CPU temperature in °C with status badge (cool / warm / hot) and a 5-minute sparkline behind it. Shows <em>N/A</em> when no sensor is detected. Click to open the temperature detail modal.",
|
||||
"source": "sensors / coretemp"
|
||||
}
|
||||
],
|
||||
"thresholdsTitle": "Status colours and thresholds applied here",
|
||||
"thresholdsIntro": "Every ring, bar, and sparkline on the four metric cards follows the same classification — <green/> <strong>green</strong> below Warning, <amber/> <strong>amber</strong> from Warning to Critical, <red/> <strong>red</strong> at Critical and above. Recommended defaults shipped with ProxMenux:",
|
||||
"thresholdsItems": [
|
||||
"<strong>CPU usage</strong> — Warning 85 %, Critical 95 %.",
|
||||
"<strong>Memory</strong> — Warning 85 %, Critical 95 % (Swap also fires Critical at 5 % used — a healthy Proxmox host should rarely touch swap).",
|
||||
"<strong>CPU temperature</strong> — Warning 80 °C, Critical 90 °C."
|
||||
],
|
||||
"thresholdsOutro": "Every value is configurable per host — <link>Settings → Health Monitor Thresholds</link> is the single source of truth and explains how to tune them.",
|
||||
"sparklineTitle": "The sparkline is meaningful",
|
||||
"sparklineBody": "The temperature card draws a 5-minute trace under the value, with the line and gradient colour following the same Warning/Critical pair documented above. It's the fastest way to see whether the host is in a thermal climb without opening the detail modal."
|
||||
},
|
||||
"middle": {
|
||||
"heading": "Middle: node metrics charts",
|
||||
"body1": "Below the top row sits the <code>NodeMetricsCharts</code> component — historical CPU, memory and disk-I/O graphs sourced from Proxmox's own RRD store via <code>/api/node/metrics</code>. A timeframe selector switches between <em>1 hour / 24 hours / 7 days / 30 days / 1 year</em>; data resolution drops as the window grows so the chart stays smooth.",
|
||||
"body2": "These are the same graphs that the Proxmox web UI renders for a node, just consolidated into the Monitor's dark theme and aligned with the other panels."
|
||||
},
|
||||
"bottom": {
|
||||
"heading": "Bottom row: Storage & Network summaries",
|
||||
"storageTitle": "Storage Overview card",
|
||||
"storageIntro": "A condensed view of the host's storage state, broken into three blocks:",
|
||||
"storageItems": [
|
||||
"<strong>Total Node Capacity</strong> — sum of all VM/LXC storages plus the local system storage, with a gradient progress bar of the total used / free split.",
|
||||
"<strong>Total Capacity / Physical Disks</strong> — raw capacity headline and the count of physical disks discovered.",
|
||||
"<strong>VM/LXC Storage</strong> — used / free / percentage for the storages where guests live, plus a counter when more than one is configured.",
|
||||
"<strong>Local Storage (System)</strong> — the host's own root / system mount, separately from the guest pool."
|
||||
],
|
||||
"storageDrillIn": "Drill-in lives in the <link>Storage tab</link> — per-disk SMART, ZFS pool details, observation history, etc.",
|
||||
"networkTitle": "Network Overview card",
|
||||
"networkBody1": "Top line shows the count of active interfaces (physical + bridges combined). Below that, two rows of coloured badges for the interfaces that are <code>up</code> — physical NICs in blue, bridges in a secondary colour. A timeframe selector at the top right (1 hour / 24 hours / 7 days / 30 days / 1 year) controls a small RX / TX traffic chart.",
|
||||
"networkBody2": "Per-interface drill-in (IP/MAC, RRD chart, bridge members, bond mode, etc.) lives in the <link>Network tab</link>."
|
||||
},
|
||||
"refresh": {
|
||||
"heading": "Refresh model",
|
||||
"intro": "Each panel manages its own loading state (<code>loadingStates.cpu</code>, <code>loadingStates.storage</code>, …) so a slow source doesn't block the rest. While a panel is fetching, it shows a pulse-animated skeleton; failed fetches degrade gracefully — for example, a missing temperature sensor renders the card as <em>N/A</em> instead of an error.",
|
||||
"items": [
|
||||
"<strong>Top metric cards</strong> — refresh every ~5 s. The CPU and temperature panels also receive a 1 s push from the vital-signs sampler.",
|
||||
"<strong>Node metrics chart</strong> — refresh every 30 s, or on timeframe change.",
|
||||
"<strong>Storage card</strong> — refresh every 60 s. SMART data is cached longer (the Storage tab triggers a fresh read on demand).",
|
||||
"<strong>Network card</strong> — refresh every 5 s on the active timeframe.",
|
||||
"<strong>Manual refresh</strong> — the Refresh button in the header forces all panels to re-fetch immediately."
|
||||
]
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "How the data is collected",
|
||||
"headerCard": "Card",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Header status pill",
|
||||
"endpoint": "/api/health",
|
||||
"source": "The cached overall status produced by the Health Monitor each cycle."
|
||||
},
|
||||
{
|
||||
"card": "CPU / RAM / Swap / Uptime",
|
||||
"endpoint": "/api/system",
|
||||
"source": "<code>/proc/stat</code>, <code>/proc/meminfo</code>, <code>/proc/uptime</code> with short-window CPU sampling."
|
||||
},
|
||||
{
|
||||
"card": "Host info (kernel, BIOS, distro)",
|
||||
"endpoint": "/api/info",
|
||||
"source": "<code>uname -a</code>, <code>dmidecode</code>, PVE version. Cached per process."
|
||||
},
|
||||
{
|
||||
"card": "Storage / network / VMs cards",
|
||||
"endpoint": "/api/storage/summary, /api/network/summary, /api/vms",
|
||||
"source": "See the dedicated tabs for each. The header cards show a compacted view from the same endpoints."
|
||||
},
|
||||
{
|
||||
"card": "Refresh cadence",
|
||||
"endpoint": "—",
|
||||
"source": "CPU / network 5 s; storage / VMs 30 s; static info every 5 min. The Refresh button in the header forces an immediate re-fetch on every panel."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Single call that backs the header pill",
|
||||
"codeComment2": "# public, no token",
|
||||
"codeComment3": "# Authenticated snapshot used by the cards"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Health Monitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — the modal behind the header status pill (ten categories, dismissals, suppression)."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — the system, info and health endpoints."
|
||||
},
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — how the same statuses turn into Telegram / Discord / Email messages."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — the other eight tabs at a glance."
|
||||
},
|
||||
{
|
||||
"label": "Architecture",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": " — the background threads and APIs that power this view."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
169
web/messages/en/docs/monitor/dashboard/terminal.json
Normal file
169
web/messages/en/docs/monitor/dashboard/terminal.json
Normal file
@@ -0,0 +1,169 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Terminal tab | ProxMenux Documentation",
|
||||
"description": "Browser-based shell to the Proxmox host: up to 4 terminals at once with grid view, mobile-friendly keyboard helpers (ESC, TAB, arrows, Ctrl combos), an integrated commands cheatsheet powered by cheat.sh, JWT-protected."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Terminal tab",
|
||||
"description": "A real shell session in the browser, on the Proxmox host. Up to four terminals at once, mobile-friendly keyboard helpers, an integrated commands cheatsheet — all in the same theme as the rest of the dashboard.",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "A real PTY in the browser",
|
||||
"body": "The terminal allocates a server-side PTY through <code>flask_terminal_routes</code>, pipes it over a WebSocket to <code>xterm.js</code> in the browser, and runs as <code>root</code> (the systemd unit's user). Anything you can do in <code>ssh root@<host></code> works here — including <code>vim</code>, <code>tmux</code>, ncurses tools and Proxmox CLIs (<code>qm</code>, <code>pct</code>, <code>pvesh</code>, <code>pvecm</code>)."
|
||||
},
|
||||
"singleAlt": "ProxMenux Monitor Terminal tab — single terminal session showing Fastfetch system summary on login",
|
||||
"singleCaption": "One host terminal open — the toolbar above shows the count (<em>1 / 4 terminals</em>), <em>+ New</em>, <em>Search</em>, <em>Clear</em> and <em>Close</em>. The mobile keyboard helpers appear under the terminal on touch devices.",
|
||||
"target": {
|
||||
"heading": "Connection target",
|
||||
"body1": "The Terminal tab opens a shell on the <strong>Proxmox host itself</strong> — the same login you would get over SSH. Each tab opens a brand-new host terminal.",
|
||||
"body2": "To reach an <strong>LXC container</strong> from the browser, use the dedicated <em>Console</em> button on every running CT card in the <link>VMs & LXCs tab</link>. It opens a modal that runs <code>pct enter <vmid></code> and reuses the same mobile-friendly toolbar described below."
|
||||
},
|
||||
"fourTerminals": {
|
||||
"heading": "Up to four terminals at once",
|
||||
"intro": "The tab lets you open up to four host terminals simultaneously. Each one gets its own PTY and its own WebSocket — they are fully independent sessions. Two layouts switch with the icons next to the \"New\" button:",
|
||||
"items": [
|
||||
"<strong>Tabs view</strong> — one terminal visible at a time, the others as named tabs at the top (<em>Terminal 1</em>, <em>Terminal 2</em>…). Best for working on one task with the rest as background.",
|
||||
"<strong>Grid view</strong> — all open terminals visible at once in a 2×2 grid. Useful for watching <code>htop</code> on one panel, <code>iftop</code> on another, and editing on a third without switching back and forth."
|
||||
],
|
||||
"outro": "The toolbar shows the current count (<em>1/4 terminals</em>, <em>4/4 terminals</em>). New tabs open with <strong>+ New</strong> and individual ones close from the small <code>×</code> on the tab header. The big red <strong>Close</strong> button at the top tears down all terminals at once."
|
||||
},
|
||||
"gridAlt": "ProxMenux Monitor Terminal tab — grid view with four host terminals running ls, network config, iftop and the ProxMenux main menu side by side",
|
||||
"gridCaption": "Grid view (4 / 4 terminals) — four independent host PTYs running in parallel: directory listing, <code>/etc/network/interfaces</code> on one side, <code>iftop</code> on another, and the ProxMenux main menu on the fourth. Switch between grid and tabs with the layout toggle in the toolbar.",
|
||||
"keyboard": {
|
||||
"heading": "Mobile-friendly keyboard helpers",
|
||||
"intro": "Phone and tablet keyboards usually don't expose ESC, TAB, the arrow keys or modifier combinations. Without them, navigating <code>vim</code>, <code>nano</code>, <code>htop</code> or any TUI menu is impossible. The Terminal tab solves that by rendering a row of touch-friendly buttons under the terminal whenever the device is small enough or touch-capable:",
|
||||
"headerButton": "Button",
|
||||
"headerSends": "Sends",
|
||||
"headerUse": "Typical use",
|
||||
"rows": [
|
||||
{
|
||||
"button": "ESC",
|
||||
"sends": "\\x1b",
|
||||
"use": "Exit insert mode in <code>vim</code>, cancel a TUI dialog, leave a search."
|
||||
},
|
||||
{
|
||||
"button": "TAB",
|
||||
"sends": "\\t",
|
||||
"use": "Path autocompletion, field navigation in dialog/whiptail."
|
||||
},
|
||||
{
|
||||
"button": "↑ ↓ ← →",
|
||||
"sends": "\\x1bO[ABCD]",
|
||||
"use": "Shell history, cursor movement, menu navigation."
|
||||
},
|
||||
{
|
||||
"button": "↵ Enter",
|
||||
"sends": "\\r",
|
||||
"use": "Confirm. Some on-screen keyboards swap Enter for Go/Done — this button is unambiguous."
|
||||
},
|
||||
{
|
||||
"button": "Ctrl ▾",
|
||||
"sends": "Dropdown",
|
||||
"useRich": true
|
||||
}
|
||||
],
|
||||
"ctrlIntro": "Three control sequences:",
|
||||
"ctrlItems": [
|
||||
"<code>Ctrl+C</code> — cancel / interrupt the running command (<code>\\x03</code>).",
|
||||
"<code>Ctrl+X</code> — exit <code>nano</code> (<code>\\x18</code>).",
|
||||
"<code>Ctrl+R</code> — reverse history search in bash (<code>\\x12</code>)."
|
||||
],
|
||||
"modalTitle": "Same toolbar in the LXC console modal",
|
||||
"modalBody": "The container console you launch from <link>VMs & LXCs → Console</link> renders the same keyboard helpers under the modal. The modal also auto-types <code>pct enter <vmid></code> on connect, so you land directly inside the container."
|
||||
},
|
||||
"lxcAlt": "ProxMenux Monitor LXC console modal — Terminal: ubuntu (ID: 103) with the same mobile-friendly toolbar (ESC, TAB, arrows, Enter, Ctrl) under the terminal",
|
||||
"lxcCaption": "The LXC console modal — opened from <em>VMs & LXCs → Console</em>. The header shows the target container (<em>Terminal: ubuntu (ID: 103)</em>) and the same touch-friendly toolbar appears under the terminal.",
|
||||
"search": {
|
||||
"heading": "Search Commands — integrated cheatsheet",
|
||||
"intro": "The blue <strong>Search</strong> button in the toolbar opens a modal with a fuzzy command lookup. Type a few letters of any Linux or Proxmox command (<code>ls</code>, <code>tar</code>, <code>qm</code>, <code>pct</code>, <code>zpool</code>, <code>systemctl</code>…) and the modal lists usage examples with one-tap <em>Send to active terminal</em>. It removes the \"wait, what flag was that\" round-trip to a separate browser tab.",
|
||||
"modalAlt": "ProxMenux Monitor Search Commands modal — fuzzy lookup for Linux and Proxmox commands powered by cheat.sh, showing several ls usage examples",
|
||||
"modalCaption": "The Search Commands modal querying <code>ls</code> — each result shows the command, its description and a small \"send\" arrow that pipes it to the active terminal. Bottom-right corner indicates the data source (<em>Powered by cheat.sh</em>).",
|
||||
"aboutLabel": "About cheat.sh:",
|
||||
"aboutBody": "is a community-curated, open-source unified cheatsheet that aggregates short, practical usage examples for hundreds of Linux commands, sysadmin tools and programming languages. Originally designed to be queried from a terminal with <code>curl cheat.sh/<command></code>, it's also reachable from any browser. ProxMenux Monitor proxies the queries server-side so the modal keeps working under the same origin as the dashboard.",
|
||||
"headerSource": "Source",
|
||||
"headerWhen": "When it's used",
|
||||
"headerWhat": "What you see",
|
||||
"onlineLabel": "(online)",
|
||||
"onlineWhen": "When the host has internet access and the cheat.sh proxy responds.",
|
||||
"onlineWhat": "Several real-world examples per command, typed with their description on top. The status dot in the modal header is <green>green</green>.",
|
||||
"fallbackLabel": "Local fallback",
|
||||
"fallbackWhen": "When cheat.sh is unreachable (offline host, restrictive firewall, cheat.sh outage).",
|
||||
"fallbackWhat": "A bundled list of common Linux + Proxmox commands. Smaller catalogue but always available. The status dot is <red>red</red>.",
|
||||
"sendingNote": "<strong>How sending works</strong>: clicking the small \"send\" arrow next to a result forwards the command text to whichever terminal is currently active (the focused tab, or the one you last clicked in grid view). The modal closes automatically so you can hit Enter immediately."
|
||||
},
|
||||
"auth": {
|
||||
"heading": "Authentication",
|
||||
"items": [
|
||||
"The WebSocket upgrade carries the JWT in the <code>Authorization</code> header. If auth is enabled and the token is missing or expired, the connection is rejected with HTTP 401 before a PTY is allocated.",
|
||||
"If the Monitor sits behind a reverse proxy, the proxy must forward WebSocket upgrades. See the <link>Access & Authentication</link> page for Nginx / Caddy / Traefik snippets."
|
||||
]
|
||||
},
|
||||
"clipboard": {
|
||||
"heading": "Clipboard, scrollback and resize",
|
||||
"items": [
|
||||
"<strong>Copy / paste</strong> — uses the browser's native clipboard. Select text with mouse / trackpad and use the OS shortcut (<code>Cmd+C</code> on macOS, <code>Ctrl+Shift+C</code> on Linux/Windows). Linux desktops also support middle-click paste.",
|
||||
"<strong>Scrollback</strong> — wheel / two-finger scroll. xterm.js keeps the last several thousand lines in memory.",
|
||||
"<strong>Resize</strong> — the terminal re-negotiates the PTY window size when you resize the dashboard pane, so <code>htop</code> and <code>vim</code> render properly.",
|
||||
"<strong>Reconnect on tab focus</strong> — if you switch apps on a phone or tablet (a common iPad behaviour), the WebSocket would normally drop. The Terminal tab detects the visibility change and reconnects automatically when you come back, with a 15-second timeout for slow VPN paths."
|
||||
]
|
||||
},
|
||||
"disconnect": {
|
||||
"heading": "Disconnect causes",
|
||||
"intro": "The most common reasons a session ends and what to do about each:",
|
||||
"headerCause": "Cause",
|
||||
"headerFix": "Fix",
|
||||
"rows": [
|
||||
{
|
||||
"cause": "Session JWT expired (24 h window).",
|
||||
"fix": "Refresh the page and log in again. The terminal isn't designed for unattended sessions, so the JWT lifetime matches the regular dashboard login."
|
||||
},
|
||||
{
|
||||
"cause": "Reverse proxy idle timeout.",
|
||||
"fix": "Bump <code>proxy_read_timeout</code> on Nginx or the equivalent on Caddy / Traefik (snippets in Access & Authentication)."
|
||||
},
|
||||
{
|
||||
"cause": "Phone or tablet sleep.",
|
||||
"fix": "When the device wakes back up the tab auto-reconnects (15 s timeout for VPN paths). If it doesn't, reload the tab."
|
||||
},
|
||||
{
|
||||
"cause": "Service restart on the host.",
|
||||
"fix": "Any restart of <code>proxmenux-monitor.service</code> drops every PTY. Open new terminals after the dashboard finishes reloading."
|
||||
}
|
||||
]
|
||||
},
|
||||
"warning": {
|
||||
"title": "The terminal is a root shell on the host",
|
||||
"body": "The terminal inherits the systemd unit's identity (<code>root</code>) and therefore has full privileges over the Proxmox host. Configure a username, password and 2FA in <authLink>Access & Authentication</authLink> before exposing the dashboard beyond your local network: anyone who reaches port 8008 without authentication would land directly in a root shell — no extra prompts, no SSH credentials. For access from outside the LAN, route the dashboard through <gatewayLink>Secure Gateway</gatewayLink> (Tailscale) or a reverse proxy with HTTPS, instead of opening the port to the public internet."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Access & Authentication",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — reverse-proxy snippets including the WebSocket upgrade lines required for the terminal."
|
||||
},
|
||||
{
|
||||
"label": "Architecture",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": " — the WebSocket transport (HTTP via flask-sock vs HTTPS / WSS via gevent)."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — the /ws/terminal and /ws/script/<sid> WebSocket endpoints alongside the rest of the API."
|
||||
},
|
||||
{
|
||||
"label": "Integrations → Secure Gateway",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — when you want terminal access from outside the LAN without exposing port 8008."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — the other tabs."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
248
web/messages/en/docs/monitor/dashboard/vms-lxcs.json
Normal file
248
web/messages/en/docs/monitor/dashboard/vms-lxcs.json
Normal file
@@ -0,0 +1,248 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: VMs & LXCs tab | ProxMenux Documentation",
|
||||
"description": "The VMs & LXCs tab inventories every guest on the host with live CPU / memory / disk usage. Per-guest drill-in shows configuration, resources, backups, full guest logs, notes, and Start / Shutdown / Reboot / Stop controls."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: VMs & LXCs tab",
|
||||
"description": "The full inventory of guests on the node. Four headline metrics across the top, a sortable list of every VM and LXC below, and a drill-in per guest with config, resources, backups, logs and the four lifecycle controls (Start / Shutdown / Reboot / Stop).",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "The control surface for guests",
|
||||
"body": "Other tabs are read-only; this is the one you act from. Anything that changes guest state goes through <code>POST /api/vms/<vmid>/control</code> with an explicit confirmation and the response is reflected back in the guest's row. There is no force-shutdown without going through the dedicated Stop button."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Top row: four stat cards",
|
||||
"intro": "Opening the VMs & LXCs tab lands you on a four-card summary of guest state — totals, CPU utilisation, memory commitment vs host capacity, and disk allocation.",
|
||||
"imageAlt": "VMs & LXCs tab — top row of four stat cards: Total VMs & LXCs, Total CPU, Total Memory, Total Disk",
|
||||
"imageCaption": "Top row of the VMs & LXCs tab — totals + Running / Stopped badges, current CPU utilisation, memory broken down into used / running-allocated / total-allocated (with a Within Limits badge), and allocated disk space.",
|
||||
"headerCard": "Card",
|
||||
"headerWhat": "What it shows",
|
||||
"totalLabel": "Total VMs & LXCs",
|
||||
"totalWhat": "Total count with two badges — <em>X Running</em> (green) and <em>Y Stopped</em> (red, only when > 0). The number you watch when something didn't come back up after a reboot.",
|
||||
"cpuLabel": "Total CPU",
|
||||
"cpuWhat": "Aggregate live CPU utilisation across all guests as a percentage of the host's physical CPU, with a footer line <em>\"Allocated CPU usage\"</em>.",
|
||||
"memoryLabel": "Total Memory",
|
||||
"memoryIntro": "Three readings stacked vertically:",
|
||||
"memoryItems": [
|
||||
"<strong>Currently used</strong> — large value (e.g. <em>15.4 GB</em>) plus <em>X.X % of Y GB</em> against the host's total RAM. A blue progress bar tracks the percentage.",
|
||||
"<strong>Running allocated</strong> + <strong>Total allocated</strong> — sum of <code>maxmem</code> across guests that are <em>currently up</em> next to the same sum across <em>every</em> guest including stopped ones. The first matters today; the second matters when you start everything at once.",
|
||||
"<strong>Within Limits</strong> badge (green) — flips to <em>Over-committed</em> if total allocated exceeds the host's RAM. Healthy memory over-commit is fine on hosts with KSM, but the badge is the early warning when it's no longer comfortable."
|
||||
],
|
||||
"diskLabel": "Total Disk",
|
||||
"diskWhat": "Sum of disk space allocated across all guests, in the appropriate unit (GB / TB), with the footer line <em>\"Allocated disk space\"</em>."
|
||||
},
|
||||
"inventory": {
|
||||
"heading": "Virtual Machines & Containers list",
|
||||
"intro": "One row per guest. The list is single-sourced from <code>/api/vms</code>, which consolidates <code>qm list</code> + <code>pct list</code> + <code>pvesh /cluster/resources</code> on the host.",
|
||||
"imageAlt": "Virtual Machines & Containers list — one row per guest with status, type badge, name, ID and inline CPU / memory / disk percentages",
|
||||
"imageCaption": "The mobile-optimized layout of the inventory — the same data the desktop view shows, restacked into a single column with the percentages and status indicators kept compact.",
|
||||
"rowsIntro": "Each row shows:",
|
||||
"rows": [
|
||||
"<strong>Status icon</strong> — green play (running) or red square (stopped). For stopped guests, the rest of the row dims so you instantly see what's offline.",
|
||||
"<strong>Type badge</strong> — <em>LXC</em> (cyan) for containers, <em>VM</em> (purple) for virtual machines.",
|
||||
"<strong>Name</strong> — guest hostname / display name.",
|
||||
"<strong>VMID</strong> — the Proxmox numeric ID below the name.",
|
||||
"<strong>Inline metrics</strong> — three percentages with their icon (CPU %, Memory %, Disk %). Each icon turns orange when the metric crosses an attention threshold (e.g. memory above 90 %), so a quick scan tells you which guest is under pressure without opening it."
|
||||
],
|
||||
"clickHint": "Clicking any row — running or stopped — opens the drill-in modal described below.",
|
||||
"mobileTitle": "The list is built mobile-first",
|
||||
"mobileBody": "On phones and narrow windows the inventory reflows into a single column with type badge, name, ID and the three metric percentages on one line each — exactly the screenshot above. On wider viewports the same data spreads horizontally with extra room for the percentages. Either way, every row is the same full target: tap to drill in."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Per-guest drill-in modal",
|
||||
"intro": "The modal opens with a header showing the guest name, VMID, type badge (LXC / VM), state badge (RUNNING / STOPPED / …) and current uptime. Below the header are <strong>two tabs</strong> — <em>Status</em> and <em>Backups</em> — and a fixed action bar at the bottom of the modal with the four lifecycle controls (Start / Shutdown / Reboot / Force Stop) and, on running LXC containers, a Console button.",
|
||||
"statusTitle": "Tab 1 — Status",
|
||||
"statusImageAlt": "Per-guest drill-in modal — Status tab with CPU / Memory / Disk live cards, Disk and Network I/O totals, the OS distro logo, and the Resources / IP Addresses block",
|
||||
"statusImageCaption": "Status tab — live CPU / Memory / Disk with progress bars at the top, accumulated I/O totals (disk read/write, network down/up) below, then the static Resources block with Notes and + Info expansions and the IP Addresses pill list.",
|
||||
"statusIntro": "The default tab — the \"is this guest behaving?\" view. Three blocks:",
|
||||
"liveTitle": "1. Live metrics row",
|
||||
"liveItems": [
|
||||
"<strong>CPU Usage (X cores)</strong> — current percentage with a progress bar. The header shows the configured core count so you know what 100 % would mean.",
|
||||
"<strong>Memory</strong> — <em>used / max</em> in GB with a progress bar.",
|
||||
"<strong>Disk</strong> — <em>used / max</em> across the guest's primary disk image, same shape."
|
||||
],
|
||||
"ioTitle": "2. I/O totals + OS logo",
|
||||
"ioItems": [
|
||||
"<strong>Disk I/O</strong> — accumulated read (↓) and write (↑) totals since boot. Useful to spot a guest that's suddenly become I/O-heavy compared to its baseline.",
|
||||
"<strong>Network I/O</strong> — accumulated download (↓) and upload (↑). Same idea on the network side.",
|
||||
"<strong>OS distro logo</strong> — the Debian / Ubuntu / Alpine / Windows / etc. icon detected from the guest's OS type. A quick visual cue when scrolling several modals open."
|
||||
],
|
||||
"resourcesTitle": "3. Resources block",
|
||||
"resourcesIntro": "The configuration of the guest as Proxmox sees it — CPU Cores, Memory (configured <code>maxmem</code>), Swap. Two collapsible buttons in the block header:",
|
||||
"resourcesItems": [
|
||||
"<strong>Notes</strong> — the guest's description field. Editable: typing here and saving calls <code>PUT /api/vms/<vmid>/config</code> and writes back to <code>/etc/pve/qemu-server/<vmid>.conf</code> or <code>/etc/pve/lxc/<vmid>.conf</code>.",
|
||||
"<strong>+ Info</strong> — extra fields that are too verbose for the default view: bios mode, machine type, agent state, hostpci passthrough entries, mount points (CT), boot order."
|
||||
],
|
||||
"ipsTitle": "4. IP Addresses",
|
||||
"ipsBody": "Pill list of every IPv4 / IPv6 address the guest currently exposes — green pill per address. Empty when the guest is stopped or when the QEMU agent isn't installed in a VM (LXCs always report addresses directly).",
|
||||
"mountsTitle": "Tab 2 — Mounts (LXC only)",
|
||||
"mountsImageAlt": "LXC drill-in modal — Mounts tab listing every mount point the container is using: PVE volumes, host binds, binds from PVE storage and ad-hoc NFS/CIFS mounts the operator mounted from inside the CT. Each card carries a type badge, capacity bar, used/total bytes, mount options, and a colour-coded state dot (green healthy, amber readonly/divergent, red stale)",
|
||||
"mountsImageCaption": "Mounts tab — only renders for LXC containers, and only when at least one mount point or ad-hoc remote mount is present. A CT without mounts gets no tab.",
|
||||
"mountsIntro": "Proxmox's own UI shows the mount-point entries defined in the container config (<code>mpX</code>) but stops there — anything you mount from inside the CT later (<code>mount.cifs</code>, NFS via <code>autofs</code>, …) is invisible. This tab merges <strong>both views</strong>: the configured mounts <strong>and</strong> the runtime mounts ProxMenux probes from inside the container, with a per-mount health status and a capacity bar wherever the backend can resolve one.",
|
||||
"mountTypesTitle": "Types of mount detected",
|
||||
"mountTypesItems": [
|
||||
"<strong>PVE volume</strong> — backed by a Proxmox-managed storage (a ZFS subvol, a directory entry, a Ceph RBD, …). Capacity comes from the PVE storage stats so the bar matches what Proxmox itself shows.",
|
||||
"<strong>Bind from PVE storage</strong> — <code>mpX</code> entry pointing at a path on a PVE-known storage.",
|
||||
"<strong>Bind from host</strong> — <code>mpX</code> entry pointing at an arbitrary host path (<code>/mnt/something</code>). Capacity is the <code>df</code> of that host path.",
|
||||
"<strong>Ad-hoc inside CT</strong> — mount that <em>only</em> exists in the container's mount namespace (e.g. an NFS share that the CT mounts on its own). Capacity is read via <code>pct exec <vmid> df</code>, which is the only way to see it — <code>/proc/<pid>/root</code> from the host doesn't expose the remote mount's real stats."
|
||||
],
|
||||
"mountStateTitle": "Per-card state dot and warnings",
|
||||
"mountStateItems": [
|
||||
"<green/> <strong>Green</strong> — mount is healthy and reachable.",
|
||||
"<amber/> <strong>Amber</strong> — divergent (configured but not actually mounted), read-only, or <em>zombie bind</em> (the host source was removed but the CT still sees the bind as mounted — typical when a USB drive was unplugged or a manual <code>umount</code> happened on the host).",
|
||||
"<red/> <strong>Red</strong> — stale: the runtime probe couldn't reach the mount (common with NFS exports whose server is down)."
|
||||
],
|
||||
"mountsCalloutTitle": "What this gives you over the native UI",
|
||||
"mountsCalloutBody": "A truthful, capacity-aware view of every place the container reads or writes. NFS or CIFS shares mounted from inside the CT — invisible to the Proxmox web UI — appear here with the same look and the same health probe as any configured mount point. Stale remote mounts and zombie binds are flagged before they bite during a backup.",
|
||||
"backupsTitle": "Tab 3 — Backups",
|
||||
"backupsImageAlt": "Per-guest drill-in modal — Backups tab with the available backups list, destination tag, sizes and the Create Backup button",
|
||||
"backupsImageCaption": "Backups tab — every backup stored on configured Proxmox storages for this guest, sorted newest first. The tab header carries the count badge.",
|
||||
"backupsIntro": "Lists every backup stored across configured Proxmox storages for this guest, sorted newest first. The tab title carries a count badge so you see at a glance whether the guest is backed up. Per row:",
|
||||
"backupsItems": [
|
||||
"<strong>Timestamp</strong> — date and time of the run.",
|
||||
"<strong>Destination tag</strong> — the storage where it lives (PBS-Cloud, PBS-Local, NFS-Backup, …) coloured by status.",
|
||||
"<strong>Size</strong> — final on-disk size of the backup."
|
||||
],
|
||||
"backupsOutro": "The <strong>+ Create Backup</strong> button at the top right kicks off a new run on the storage marked as \"Backup target\" in the Proxmox storage config. Restore lives in the Proxmox web UI — the Monitor exposes the \"is this guest backed up recently?\" view, not the recovery flow.",
|
||||
"updatesTitle": "Updates badge (LXC only)",
|
||||
"updatesImageAlt": "LXC drill-in modal — clickable violet 'updates available' badge in the header of a container that has pending apt or apk updates. Clicking it expands a panel listing every upgradable package with its current and target versions, plus a security-only counter when the underlying repo flags any of them as security",
|
||||
"updatesImageCaption": "The badge only appears on running LXC containers that have at least one upgradable package. Click it to open the package list inside the modal — no separate tab in the nav strip.",
|
||||
"updatesIntro": "ProxMenux probes every running container on the host once a day and counts the upgradable packages. Currently supported in this phase: <strong>Debian / Ubuntu</strong> via <code>apt list --upgradable</code> and <strong>Alpine</strong> via <code>apk list -u</code>. Containers running other distributions (CentOS, Arch, …) are skipped for now — they show no badge instead of a misleading zero.",
|
||||
"updatesPanelTitle": "What the panel shows",
|
||||
"updatesPanelItems": [
|
||||
"<strong>Total upgradable count</strong> at the top, plus a separate <strong>security</strong> counter when the underlying repository flags any of the packages as security (Debian/Ubuntu \"-security\" suite). Alpine doesn't expose a separate security suite via apk metadata, so security is always 0 on Alpine containers.",
|
||||
"<strong>Per-package list</strong> with name, current version and target version. Use this to decide whether to run the upgrade now or wait for a maintenance window."
|
||||
],
|
||||
"updatesScopeTitle": "What the system tracks vs what the script counts",
|
||||
"updatesScopeBody": "This update detector follows whatever is already installed inside the container — it does <strong>not</strong> install anything new and does <strong>not</strong> know about applications that were deployed outside apt / apk (a Docker container running inside the LXC, a Vaultwarden installed from source, a binary dropped into <code>/usr/local/bin</code>). It is a <em>package-manager</em> view, not an <em>application</em> view. Future phases of this work will integrate community-script application metadata so per-app upstream tracking (Vaultwarden, Jellyfin, …) becomes possible.",
|
||||
"updatesToggleTitle": "Detection vs notification — toggle semantics",
|
||||
"updatesToggleCalloutTitle": "Detection is always on; the toggle only controls the notification",
|
||||
"updatesToggleCalloutBody": "The package-update detection on running containers runs unconditionally — the badge appears in this modal whenever there are updates pending, regardless of any other setting. The <code>lxc_updates_available</code> notification toggle in <strong>Settings → Notifications</strong> only controls whether a grouped \"N CT(s) have pending updates\" message is delivered to your channels. This keeps the toggle semantics consistent with every other update stream (NVIDIA driver, Coral driver, ProxMenux optimizations): turning notifications off never hides the information in the dashboard.",
|
||||
"updatesApplyTitle": "Applying the updates",
|
||||
"updatesApplyBody": "Open the container shell from the bottom action bar, or use <code>pct exec <vmid> -- apt full-upgrade -y</code> / <code>pct exec <vmid> -- apk upgrade -y</code> from the host. The dashboard re-scans on its 24h cycle (or after the next manual refresh) and the badge updates.",
|
||||
"firewallTitle": "Tab 5 — Firewall",
|
||||
"firewallIntro": "Reads the per-guest Proxmox firewall log straight from the host (no extra service, no polling). The tab is always present in the navigation strip; the panel decides what to render depending on whether the firewall is enabled for that guest and whether any rule is actually logging:",
|
||||
"firewallItems": [
|
||||
"<strong>Firewall disabled</strong> — an amber notice explains exactly where to enable it in the Proxmox UI (<em><Container|VM> → Firewall → Options</em>) and reminds you that at least one rule needs <code>log: info</code> (or higher) before packets show up.",
|
||||
"<strong>Firewall enabled, no events yet</strong> — empty-state hint with the same logging requirement, useful when you just turned the firewall on.",
|
||||
"<strong>Events present</strong> — a scrollable monospace pane with the raw entries coloured by action: <green>ACCEPT</green> (green), <orange>REJECT</orange> (orange), <red>DROP</red> (red). A count badge in the header shows how many entries are currently loaded."
|
||||
],
|
||||
"firewallRefresh": "A <em>Refresh</em> button at the top right of the panel pulls the latest entries on demand — there is no auto-refresh inside the modal, so the list is a snapshot of the moment you opened the tab or pressed refresh. The data comes from the per-guest log file that Proxmox writes under <code>/var/log/pve-firewall.log</code> filtered by VMID, exposed via <code>GET /api/vms/<vmid>/firewall/log</code>.",
|
||||
"firewallCalloutTitle": "Why have it here when the Proxmox UI already shows it?",
|
||||
"firewallCalloutBody": "Two reasons: it removes the round-trip through the Proxmox web UI when you're already inspecting a guest from the dashboard, and it keeps the same VMID-scoped view the rest of the modal uses — start the guest, check its mounts, look at recent firewall hits and stop it again without leaving the panel. The Monitor never edits firewall rules; rule editing stays in the native Proxmox interface where it belongs.",
|
||||
"actionBarTitle": "Bottom action bar",
|
||||
"actionBarIntro": "Always visible at the foot of the modal regardless of which tab is active:",
|
||||
"consoleItem": "<strong>Console</strong> (LXC only, running) — opens a modal that runs <code>pct enter <vmid></code> and lands you inside the container. Same xterm.js + WebSocket plumbing as the standalone <link>Terminal tab</link>, including the <strong>mobile-friendly toolbar</strong> with ESC, TAB, arrow keys, Enter and the Ctrl combos (Ctrl+C / Ctrl+X / Ctrl+R) under the terminal — making the modal usable from a phone or tablet keyboard. VMs do not expose a Console button here; use the Proxmox web console (noVNC) for guest access.",
|
||||
"lifecycleIntro": "Below it, four lifecycle buttons in a 2×2 grid. Each fires <code>POST /api/vms/<vmid>/control</code> with the matching <code>action</code>; enabled state depends on whether the guest is currently running:",
|
||||
"headerButton": "Button",
|
||||
"headerEnabled": "Enabled when",
|
||||
"headerAction": "Action sent to host",
|
||||
"lifecycleRows": [
|
||||
{
|
||||
"button": "Start",
|
||||
"color": "green",
|
||||
"enabled": "Guest is stopped.",
|
||||
"action": "qm start / pct start"
|
||||
},
|
||||
{
|
||||
"button": "Shutdown",
|
||||
"color": "blue",
|
||||
"enabled": "Guest is running.",
|
||||
"action": "qm shutdown / pct shutdown — graceful, ACPI"
|
||||
},
|
||||
{
|
||||
"button": "Reboot",
|
||||
"color": "blue",
|
||||
"enabled": "Guest is running.",
|
||||
"action": "qm reboot / pct reboot — graceful restart"
|
||||
},
|
||||
{
|
||||
"button": "Force Stop",
|
||||
"color": "red",
|
||||
"enabled": "Guest is running.",
|
||||
"action": "qm stop / pct stop — hard power-off"
|
||||
}
|
||||
],
|
||||
"forceStopTitle": "Force Stop is the kill switch, not the polite option",
|
||||
"forceStopBody": "<strong>Force Stop</strong> bypasses the guest's shutdown sequence — equivalent to pulling the power cable. Use <strong>Shutdown</strong> when the guest is responsive; reach for Force Stop only when Shutdown hangs and you accept the data-loss risk of an uncoordinated power-off. The button is red and labelled deliberately so you don't click it by reflex."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "How the data is collected",
|
||||
"headerSection": "Section of the tab",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Inventory list",
|
||||
"endpoint": "/api/vms",
|
||||
"source": "<code>pvesh get /cluster/resources --type vm</code> for VMs and CTs."
|
||||
},
|
||||
{
|
||||
"section": "Detail panel (config, network, disks)",
|
||||
"endpoint": "/api/vms/<vmid>",
|
||||
"source": "<code>qm config <id></code> for VMs / <code>pct config <id></code> for CTs."
|
||||
},
|
||||
{
|
||||
"section": "Per-guest metrics chart",
|
||||
"endpoint": "/api/vms/<vmid>/metrics",
|
||||
"source": "PVE RRD data (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) condensed to a chart-friendly shape."
|
||||
},
|
||||
{
|
||||
"section": "Recent task logs (modal)",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "Tasks for that <code>vmid</code> from <code>/var/log/pve/tasks/index</code>."
|
||||
},
|
||||
{
|
||||
"section": "Backups available for guest",
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
"source": "<code>pvesm list <storage></code> filtered by VMID."
|
||||
},
|
||||
{
|
||||
"section": "Per-guest firewall log (Firewall tab)",
|
||||
"endpoint": "/api/vms/<vmid>/firewall/log",
|
||||
"source": "<code>/var/log/pve-firewall.log</code> filtered by VMID."
|
||||
},
|
||||
{
|
||||
"section": "Power buttons (Start / Stop / Reboot / Shutdown)",
|
||||
"endpoint": "/api/vms/<vmid>/control",
|
||||
"source": "<code>qm start|stop|reboot|shutdown</code> or <code>pct</code> equivalents."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Cross-check what the dashboard sees against PVE",
|
||||
"codeComment2": "# Inspect a specific guest's config exactly as the modal sees it",
|
||||
"codeComment3": "# VM",
|
||||
"codeComment4": "# CT"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Health Monitor",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tailRich": " — the VMs & Containers category (failed boot, QMP timeouts, CT shutdown failures)."
|
||||
},
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tailRich": " — what the <code>vm_*</code>, <code>ct_*</code>, <code>migration_*</code> and <code>backup_*</code> events trigger downstream."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tailRich": " — the VM and backup endpoints."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard index",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tailRich": " — the other tabs."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Create VM",
|
||||
"href": "/docs/create-vm",
|
||||
"tailRich": " — provisioning side: System NAS templates (Synology and others), Linux / Windows VMs, defaults tailored for Proxmox."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user