The DigitalRCC admin dashboard (https://my.digitalrcc.com/admin/lab-status)
shows live lab health so non-technical staff never have to open Proxmox.
Everything in this path is read-only: the monitor account cannot start, stop,
reconfigure, or console into a VM.
Proxmox port 8006 stays off the public internet, and Vercel cannot reach the
lab network — API_REACHABLE_FROM_VERCEL=no, so
RECOMMENDED_INTEGRATION=internal-poller.
pve1:8006 <--(read-only token, LAN)-- lab-status-poller (on pve1)
|
v POST + bearer secret
https://my.digitalrcc.com/api/lab-status/ingest
|
v
Supabase: public.lab_status_snapshots
|
v
admin dashboard card + /admin/lab-status
The poller publishes every ~45 seconds (46 resources, 1 node) together with
utilization: CPU, memory, disk, network traffic, disk I/O and uptime.
| Item | Value |
|---|---|
| Account | drcc-monitor@pve (no shell, no VM rights) |
| Role | DRCCStatus — Sys.Audit, VM.Audit only, granted at / |
| Token | drcc-monitor@pve!lab-status, privilege-separated |
| Allowed (verified) | GET /api2/json/nodes, GET /api2/json/cluster/resources?type=vm |
| Denied (verified 403) | VM start/stop, vncproxy console, storage content |
| TLS | PVE cluster CA (CN=pve1.cyberlab.tcecure.com, valid to 2027-09-20), pinned by the poller at /etc/drcc/pve-root-ca.pem — TLS_CERTIFICATE_VALID=yes for that CA, which is not publicly trusted |
The token secret exists only in /etc/drcc/lab-status-poller.env on pve1. It
is not in git, not in Vercel, and not in any log.
pve1 is a standalone node (no corosync.conf), so PROXMOX_EXPECTED_NODES=pve1.
The two core domain controllers are virtual machines, not Proxmox nodes:
| Resource | VMID | Node | Type |
|---|---|---|---|
| DC01 | 200 | pve1 | qemu |
| DC02 | 221 | pve1 | qemu |
| Pod components | Pattern |
|---|---|
| Gateways | PodXX-GW, VMIDs 300–319 (all 20 pods) |
| Member servers | PODXX-SRV, VMIDs 403–415 (pods 03–15 only) |
Pods 01–02 and 16–20 are configured gateway-only; add their member servers to
PROXMOX_EXPECTED_PODS as they are built, or the card turns yellow.
| Colour | Meaning |
|---|---|
| Green | Both core DCs and every expected pod component running |
| Yellow | Both DCs running, but a pod component or expected node is stopped/missing |
| Red | A core DC is stopped or missing |
| Gray / Unknown | Monitor cannot reach Proxmox, no snapshot yet, or data older than LAB_STATUS_MAX_AGE_SECONDS |
Every result carries checkedAt and a failed[] list naming the exact resources
at fault (e.g. POD07-SRV (stopped)). Gray is never reported as an outage —
when Proxmox cannot be read the poller publishes nothing and the card ages out.
drcc-web)PROXMOX_CORE_DC_RESOURCES=DC01,DC02
PROXMOX_EXPECTED_NODES=pve1
PROXMOX_EXPECTED_PODS=Pod01=Pod01-GW;...;Pod20=Pod20-GW
LAB_STATUS_MAX_AGE_SECONDS=180
LAB_STATUS_INGEST_SECRET=<shared with the poller only>
Do not set PROXMOX_API_BASE_URL / PROXMOX_API_TOKEN_ID /
PROXMOX_API_TOKEN_SECRET in Vercel.
sudo install -o drcc-monitor -m 0644 \
scripts/lab-status-poller/poller.py /opt/drcc/lab-status-poller/poller.py
sudo systemctl restart lab-status-poller
sudo systemctl status --no-pager lab-status-poller
python3 poller.py --once publishes a single snapshot — use it to smoke-test./etc/drcc must stay group-readable by drcc-monitor, or the service cannotscripts/lab-status-poller/ anddocs/lab-health-monitoring.md in tcecure/drcc-lab-companion.| Page | Purpose |
|---|---|
| Portal Integration | Student progress and portal wiring |
| VM Inventory | Full VM list |
| Network & Firewall | Why 8006 stays internal |