Dashboard: VMs & LXCs tab

ProxMenux Monitor · Dashboard~12 min

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).

The control surface for guests

Other tabs are read-only; this is the one you act from. Anything that changes guest state goes through POST /api/vms/<vmid>/control 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.

Top row: four stat cards

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.

VMs & LXCs tab — top row of four stat cards: Total VMs & LXCs, Total CPU, Total Memory, Total Disk
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.
CardWhat it shows
Total VMs & LXCsTotal count with two badges — X Running (green) and Y Stopped (red, only when > 0). The number you watch when something didn't come back up after a reboot.
Total CPUAggregate live CPU utilisation across all guests as a percentage of the host's physical CPU, with a footer line "Allocated CPU usage".
Total MemoryThree readings stacked vertically:
  • Currently used — large value (e.g. 15.4 GB) plus X.X % of Y GB against the host's total RAM. A blue progress bar tracks the percentage.
  • Running allocated + Total allocated — sum of maxmem across guests that are currently up next to the same sum across every guest including stopped ones. The first matters today; the second matters when you start everything at once.
  • Within Limits badge (green) — flips to Over-committed 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.
Total DiskSum of disk space allocated across all guests, in the appropriate unit (GB / TB), with the footer line "Allocated disk space".

Virtual Machines & Containers list

One row per guest. The list is single-sourced from /api/vms, which consolidates qm list + pct list + pvesh /cluster/resources on the host.

Virtual Machines & Containers list — one row per guest with status, type badge, name, ID and inline CPU / memory / disk percentages
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.

Each row shows:

  • Status icon — green play (running) or red square (stopped). For stopped guests, the rest of the row dims so you instantly see what's offline.
  • Type badgeLXC (cyan) for containers, VM (purple) for virtual machines.
  • Name — guest hostname / display name.
  • VMID — the Proxmox numeric ID below the name.
  • Inline metrics — 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.

Clicking any row — running or stopped — opens the drill-in modal described below.

The list is built mobile-first

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.

Per-guest drill-in modal

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 two tabsStatus and Backups — 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.

Tab 1 — Status

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
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.

The default tab — the "is this guest behaving?" view. Three blocks:

1. Live metrics row

  • CPU Usage (X cores) — current percentage with a progress bar. The header shows the configured core count so you know what 100 % would mean.
  • Memoryused / max in GB with a progress bar.
  • Diskused / max across the guest's primary disk image, same shape.

2. I/O totals + OS logo

  • Disk I/O — accumulated read (↓) and write (↑) totals since boot. Useful to spot a guest that's suddenly become I/O-heavy compared to its baseline.
  • Network I/O — accumulated download (↓) and upload (↑). Same idea on the network side.
  • OS distro logo — the Debian / Ubuntu / Alpine / Windows / etc. icon detected from the guest's OS type. A quick visual cue when scrolling several modals open.

3. Resources block

The configuration of the guest as Proxmox sees it — CPU Cores, Memory (configured maxmem), Swap. Two collapsible buttons in the block header:

  • Notes — the guest's description field. Editable: typing here and saving calls PUT /api/vms/<vmid>/config and writes back to /etc/pve/qemu-server/<vmid>.conf or /etc/pve/lxc/<vmid>.conf.
  • + Info — extra fields that are too verbose for the default view: bios mode, machine type, agent state, hostpci passthrough entries, mount points (CT), boot order.

4. IP Addresses

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).

Tab 2 — Mounts (LXC only)

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)
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.

Proxmox's own UI shows the mount-point entries defined in the container config (mpX) but stops there — anything you mount from inside the CT later (mount.cifs, NFS via autofs, …) is invisible. This tab merges both views: the configured mounts and 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.

Types of mount detected

  • PVE volume — 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.
  • Bind from PVE storagempX entry pointing at a path on a PVE-known storage.
  • Bind from hostmpX entry pointing at an arbitrary host path (/mnt/something). Capacity is the df of that host path.
  • Ad-hoc inside CT — mount that only exists in the container's mount namespace (e.g. an NFS share that the CT mounts on its own). Capacity is read via pct exec <vmid> df, which is the only way to see it — /proc/<pid>/root from the host doesn't expose the remote mount's real stats.

Per-card state dot and warnings

  • <green/> Green — mount is healthy and reachable.
  • <amber/> Amber — divergent (configured but not actually mounted), read-only, or zombie bind (the host source was removed but the CT still sees the bind as mounted — typical when a USB drive was unplugged or a manual umount happened on the host).
  • <red/> Red — stale: the runtime probe couldn't reach the mount (common with NFS exports whose server is down).

What this gives you over the native UI

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.

Tab 3 — Backups

Per-guest drill-in modal — Backups tab with the available backups list, destination tag, sizes and the Create Backup button
Backups tab — every backup stored on configured Proxmox storages for this guest, sorted newest first. The tab header carries the count badge.

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:

  • Timestamp — date and time of the run.
  • Destination tag — the storage where it lives (PBS-Cloud, PBS-Local, NFS-Backup, …) coloured by status.
  • Size — final on-disk size of the backup.

The + Create Backup 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.

Updates badge (LXC only)

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
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.

ProxMenux probes every running container on the host once a day and counts the upgradable packages. Currently supported in this phase: Debian / Ubuntu via apt list --upgradable and Alpine via apk list -u. Containers running other distributions (CentOS, Arch, …) are skipped for now — they show no badge instead of a misleading zero.

What the panel shows

  • Total upgradable count at the top, plus a separate security 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.
  • Per-package list with name, current version and target version. Use this to decide whether to run the upgrade now or wait for a maintenance window.

What the system tracks vs what the script counts

This update detector follows whatever is already installed inside the container — it does not install anything new and does not 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 /usr/local/bin). It is a package-manager view, not an application view. Future phases of this work will integrate community-script application metadata so per-app upstream tracking (Vaultwarden, Jellyfin, …) becomes possible.

Detection vs notification — toggle semantics

Detection is always on; the toggle only controls the notification

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 lxc_updates_available notification toggle in Settings → Notifications 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.

Applying the updates

Open the container shell from the bottom action bar, or use pct exec &lt;vmid&gt; -- apt full-upgrade -y / pct exec &lt;vmid&gt; -- apk upgrade -y from the host. The dashboard re-scans on its 24h cycle (or after the next manual refresh) and the badge updates.

Tab 5 — Firewall

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:

  • Firewall disabled — an amber notice explains exactly where to enable it in the Proxmox UI (&lt;Container|VM&gt; → Firewall → Options) and reminds you that at least one rule needs log: info (or higher) before packets show up.
  • Firewall enabled, no events yet — empty-state hint with the same logging requirement, useful when you just turned the firewall on.
  • Events present — a scrollable monospace pane with the raw entries coloured by action: ACCEPT (green), REJECT (orange), DROP (red). A count badge in the header shows how many entries are currently loaded.

A Refresh 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 /var/log/pve-firewall.log filtered by VMID, exposed via GET /api/vms/&lt;vmid&gt;/firewall/log.

Why have it here when the Proxmox UI already shows it?

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.

Bottom action bar

Always visible at the foot of the modal regardless of which tab is active:

  • Console (LXC only, running) — opens a modal that runs pct enter &lt;vmid&gt; and lands you inside the container. Same xterm.js + WebSocket plumbing as the standalone Terminal tab, including the mobile-friendly toolbar 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.

Below it, four lifecycle buttons in a 2×2 grid. Each fires POST /api/vms/&lt;vmid&gt;/control with the matching action; enabled state depends on whether the guest is currently running:

ButtonEnabled whenAction sent to host
StartGuest is stopped.qm start / pct start
ShutdownGuest is running.qm shutdown / pct shutdown — graceful, ACPI
RebootGuest is running.qm reboot / pct reboot — graceful restart
Force StopGuest is running.qm stop / pct stop — hard power-off

Force Stop is the kill switch, not the polite option

Force Stop bypasses the guest's shutdown sequence — equivalent to pulling the power cable. Use Shutdown 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.

How the data is collected

Section of the tabEndpointSource
Inventory list/api/vmspvesh get /cluster/resources --type vm for VMs and CTs.
Detail panel (config, network, disks)/api/vms/<vmid>qm config &lt;id&gt; for VMs / pct config &lt;id&gt; for CTs.
Per-guest metrics chart/api/vms/<vmid>/metricsPVE RRD data (pvesh get /nodes/&lt;node&gt;/qemu/&lt;id&gt;/rrddata) condensed to a chart-friendly shape.
Recent task logs (modal)/api/vms/<vmid>/logsTasks for that vmid from /var/log/pve/tasks/index.
Backups available for guest/api/vms/<vmid>/backupspvesm list &lt;storage&gt; filtered by VMID.
Per-guest firewall log (Firewall tab)/api/vms/<vmid>/firewall/log/var/log/pve-firewall.log filtered by VMID.
Power buttons (Start / Stop / Reboot / Shutdown)/api/vms/<vmid>/controlqm start|stop|reboot|shutdown or pct equivalents.
# Cross-check what the dashboard sees against PVE
pvesh get /cluster/resources --type vm --output-format=json | jq

# Inspect a specific guest's config exactly as the modal sees it
qm config 100   # VM
pct config 100  # CT

Where to next

  • Health Monitor — the VMs & Containers category (failed boot, QMP timeouts, CT shutdown failures).
  • Notifications — what the vm_*, ct_*, migration_* and backup_* events trigger downstream.
  • API Reference — the VM and backup endpoints.
  • Dashboard index — the other tabs.
  • ProxMenux → Create VM — provisioning side: System NAS templates (Synology and others), Linux / Windows VMs, defaults tailored for Proxmox.