|
|
||
|---|---|---|
| collector | ||
| patches | ||
| systemd | ||
| .gitignore | ||
| DEVLOG.md | ||
| install.sh | ||
| README.md | ||
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-managerpackage upgrades? No. The JS patch touches/usr/share/pve-manager/js/pvemanagerlib.js, which is fully owned and overwritten by thepve-managerpackage. Re-runinstall.shafter anyapt upgradethat touchespve-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-runwill 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.