Multi-rack power and infrastructure monitoring for PDUs, HP/Dell/Lenovo servers, PVE nodes, NAS, switches, and GPU hosts. Stores history locally, shows a live terminal dashboard, and optionally serves a web dashboard with alerting.
Evolved from PDU-Power-Monitor — same rack dashboard UX, RackPulse backend for all device types.
Setup guides: Mac · Linux (CLI)
| Install | What you get |
|---|---|
pip install -e . |
CLI, terminal dashboard, polling engine (no HTTP deps) |
pip install -e ".[api]" |
JSON HTTP API |
pip install -e ".[web]" |
Web dashboard + config UI + API |
pip install -e ".[everything]" |
Same as [web] (convenience alias) |
Alert delivery (email + webhooks) is built into the core package and activates when configured in config.yaml.
python -m venv .venv
source .venv/bin/activate
./scripts/bootstrap_venv.sh
cp config.example.yaml config.yaml
# Edit config.yaml — use $secret for passwords (stored in data/secrets.db)
rackpulse list
rackpulse test pdu-1
rackpulse poll
rackpulse watchpip install -e ".[web]"
rackpulse serve --web- Dashboard:
http://127.0.0.1:8080/ - Config UI:
http://127.0.0.1:8080/config
Enable auth before exposing beyond localhost:
auth:
enabled: true
api_key: $secret # stored in data/secrets.db when saved via config UIThe browser prompts for your API key on first visit (stored in session storage).
Sensitive values use $secret in config.yaml and are stored in a local SQLite secrets database (default ./data/secrets.db):
secrets:
path: ./data/secrets.db
devices:
- name: hp-server
type: hp_server
password: $secretThe config UI writes secrets to the database automatically. Config export never includes plaintext passwords.
You can also use environment variables: password: $env:MY_BMC_PASSWORD
Configure in config.yaml:
alerts:
cooldown_minutes: 15
smtp:
host: smtp.company.com
port: 587
security: tls
username: alerts@company.com
password: $secret
from_address: rackpulse@company.com
recipients:
- ops@company.com
webhooks:
- name: Ops Slack
url: https://hooks.slack.com/services/...
format: slack
enabled: true
maintenance:
enabled: false
silence_alerts: true
message: ""
until: nullAlerts fire on rack Warning/Danger threshold crossings, device unreachable events, and recoveries. Cooldown prevents repeat notifications. Maintenance mode suppresses delivery while polling continues.
| Type | What it covers | Metrics |
|---|---|---|
pdu |
Rack PDU (SNMP) | Power (W), energy (kWh) |
hp_server |
HP server BMC (iLO / Redfish) | Power (W), temperature |
dell_server |
Dell server BMC (iDRAC / Redfish) | Power (W), temperature |
lenovo_server |
Lenovo server BMC (XCC / Redfish) | Power (W), temperature |
pve |
Proxmox VE node | CPU/RAM, VM inventory |
nas |
NAS appliance (SNMP) | CPU, RAM, temperature |
arista_switch / cisco_switch / dell_switch |
Switches (ENTITY-SENSOR-MIB) | Power (W), volts, amps |
gpu |
GPU workstation (nvidia-smi) | GPU power, utilization |
See config.example.yaml for full examples (PVE tokens, GPU over SSH, PDU divisors, etc.).
rackpulse poll [--json]
rackpulse watch
rackpulse test <device>
rackpulse history <device> [--hours 168]
rackpulse list
rackpulse serve # JSON API only ([api])
rackpulse serve --web # dashboard + config UI ([web])
rackpulse dashboard # shortcut for serve --web
rackpulse migrate-config # convert PDU-Power-Monitor / v1 → v2
rackpulse migrate-config --dry-run old-config.yaml
python scripts/migrate_config.py config.yaml| Legacy key | RackPulse key |
|---|---|
racks[].pdus[] |
racks[].devices[] with type: pdu |
racks[].description |
racks[].location |
racks[].warning_kw / critical_kw |
same |
snmp.power_oid / power_divisor |
pdu.power_oid / pdu.power_divisor |
alert_cooldown_minutes |
alerts.cooldown_minutes |
smtp / webhooks |
alerts.smtp / alerts.webhooks |
maintenance |
same |
| Plaintext passwords | $secret (stored in data/secrets.db) |
Run the web UI with rackpulse serve --web for the same dashboard experience, now covering all RackPulse device types.
Migrate an existing config:
# From PDU-Power-Monitor or RackPulse v1 config.yaml:
rackpulse migrate-config
# Or: python scripts/migrate_config.py /path/to/old-config.yaml -o config.yamlCreates a .bak backup, converts structure to v2, and moves passwords into secrets.db.
cp config.example.yaml config.yaml
docker compose up rackpulse # web dashboard + API on :8080rackpulse/
cli.py Terminal commands
config.py YAML configuration + secrets resolution
secrets.py SQLite secrets store
storage.py SQLite history
collectors/ Device-specific collectors
engine/poller.py Polling engine + alert hook
display/terminal.py Rich terminal dashboard
presentation/ Dashboard JSON for web UI
alerts/ Email + webhook delivery
api/ FastAPI (JSON + optional web routes)
web/ Dashboard templates + static assets
MIT