Proxmox VE Datacenter Summary widget showing full corosync quorum/voter status (incl. Qdevice) plus a reorderable panel layout.
Find a file
Jarvis a9a1eaf475 Translate all docs and comments to English
Also excludes __pycache__ from tracking (leaked in during py_compile checks).
2026-09-18 07:47:53 +02:00
collector Translate all docs and comments to English 2026-09-18 07:47:53 +02:00
patches Initial commit: Proxmox Quorum/Voters widget 2026-09-18 07:42:46 +02:00
systemd Initial commit: Proxmox Quorum/Voters widget 2026-09-18 07:42:46 +02:00
.gitignore Translate all docs and comments to English 2026-09-18 07:47:53 +02:00
DEVLOG.md Translate all docs and comments to English 2026-09-18 07:47:53 +02:00
install.sh Initial commit: Proxmox Quorum/Voters widget 2026-09-18 07:42:46 +02:00
README.md Initial commit: Proxmox Quorum/Voters widget 2026-09-18 07:42:46 +02:00

Proxmox Quorum/Voters Widget

Adds a "Quorum / Voters" tile to the Proxmox VE Datacenter Summary page, showing every corosync voter (cluster nodes and the Qdevice, if configured) with individual online/offline status and a clear overall quorum banner — something the stock Proxmox UI doesn't expose.

Also patches the stock Health tile to show offline node names (not just a count), and adds ▲▼ reorder buttons to every Summary panel so you can arrange the dashboard the way you want (order persists per-browser via Ext.state.Manager).

![screenshot placeholder — Quorum/Voters tile showing "Quorum OK, 3/4 votes, Quorum needs 3" banner with a 4-row voter list: herkules (local) online, erebus online, bkp01 offline, Qdevice online]

Why

Proxmox's built-in "Health" tile only ever shows Online: N / Offline: N as raw counts — never which node is down, and it has no concept of the Qdevice at all (the standard /cluster/status API endpoint doesn't return it). If your cluster loses a voter, the UI gives you no fast, glanceable answer to "do we still have quorum, and who's missing?"

How it works

corosync.conf (full configured node list, incl. offline)
        │
corosync-quorumtool -p (live membership + Qdevice + vote counts)
        │
        ▼
quorum-collector.py  ──(systemd timer, 10s)──▶  /usr/share/pve-manager/js/quorum-status.json
                                                          │
                                              served unauth by pveproxy
                                              at /pve2/js/quorum-status.json
                                              (standard static asset mount)
                                                          │
                                                          ▼
                                          PVE.dc.QuorumVoters (new ExtJS widget,
                                          polls the JSON every 10s, renders banner
                                          + voter list in the Datacenter Summary)

No Proxmox backend/Perl API changes. The collector writes into an existing static asset directory that pveproxy already serves without authentication (same as favicon.ico, proxmoxlib.js, etc.) — same sensitivity level as what's already public there.

Components

Path Purpose
collector/quorum-collector.py Reads corosync config + live quorum state, writes JSON atomically
systemd/quorum-collector.{service,timer} Runs the collector every 10s
patches/pvemanagerlib.patch Unified diff against stock pvemanagerlib.js (pve-manager 9.2.20 baseline)
install.sh Backs up, applies the patch, installs collector+timer, verifies

Install

# on a Proxmox VE node, as root
git clone <this-repo>
cd proxmox-quorum-widget
./install.sh            # or --dry-run to just check patch applicability first

Then hard-refresh the WebUI (Ctrl+F5).

Uninstall

cp /root/pvemanagerlib.js.bak-<timestamp> /usr/share/pve-manager/js/pvemanagerlib.js
systemctl disable --now quorum-collector.timer
rm /etc/systemd/system/quorum-collector.{service,timer} /usr/local/bin/quorum-collector.py
rm -f /usr/share/pve-manager/js/quorum-status.json

Known limitations

  • Survives pve-manager package upgrades? No. The JS patch touches /usr/share/pve-manager/js/pvemanagerlib.js, which is fully owned and overwritten by the pve-manager package. Re-run install.sh after any apt upgrade that touches pve-manager. The collector + systemd timer (outside the package tree) do survive upgrades untouched.
  • Panel reorder is per-browser, not synced. State lives in Ext.state.Manager (localStorage). Different browsers/devices/users see independent orderings.
  • No hide/show toggle for panels yet — "empty slots" are structurally supported by the reorder logic (a hidden panel just stays out of the way), but no UI toggle has been built for it.
  • Patch applies via exact string-context matching (not line numbers), which is more robust across small pve-manager point releases, but will still break on a real upstream rewrite of PVE.dc.Health / PVE.dc.Summary (install.sh --dry-run will catch that safely before touching anything).

Development notes

Full incident/dev log (bugs found, root causes, ExtJS API gotchas) is in DEVLOG.md — useful if you're extending this or hit a similar patch conflict after a Proxmox version bump.

Tested on

Proxmox VE 9.2.20 (pve-manager), ExtJS 7.0.0 (libjs-extjs), corosync + corosync-qdevice (net/ffsplit model). 3-node cluster + 1 Qdevice.