Sign inSign up

devluigi06/ipmideck

By devluigi06

โ€ขUpdated 2 months ago

Self-hosted IPMI dashboard: monitor sensors, control fan curves and power across all your servers.

Image
Monitoring & observability
1

3.3K

devluigi06/ipmideck repository overview

โ ๐Ÿ–ฅ๏ธ IPMIDeck

Web-based IPMI management platform โ€” monitor sensors, control fans, manage power, all from your browser.

IPMIDeck dashboard home โ€” live multi-server sensor monitoring with temperature, fan, power and energy widgets

Python 3.11+ License: Apache 2.0 Docker Hub pulls PyPI version Supported BMCs: Dell, Supermicro, IBM, HPE, Lenovo, Generic

Documentation: docs.ipmideck.comโ 

Featuresโ  โ€ข Quick Startโ  โ€ข Documentationโ  โ€ข Configurationโ  โ€ข Supported Hardwareโ 

IPMIDeck is a self-hosted dashboard that connects to your servers' BMC (Baseboard Management Controller) via IPMI. It provides real-time sensor monitoring, intelligent fan curve control (FanPilot), remote power management, and hardware event logs โ€” no CLI required.


โ Features

โ Sensor Monitoring
  • Real-time temperature, fan RPM, voltage, and power consumption
  • Live charts with historical data (up to 1 year)
  • Configurable alert thresholds with browser notifications
โ FanPilot โ€” Intelligent Fan Control
  • Visual drag-and-drop fan curve editor
  • Built-in profiles: Silent, Balanced, Performance, Full Speed, Custom
  • Configurable hysteresis to prevent fan oscillation
  • Safety override: fans go to 100% above critical temperature
  • Autonomous loop โ€” works independently of the dashboard

IPMIDeck FanPilot profile settings โ€” source sensor, hysteresis, and the 85ยฐC safety threshold that forces fans to 100%

โ Power Control
  • Power On, Soft Off, Hard Off, Reset, Power Cycle
  • Real-time power status indicator
  • Confirmation dialogs for destructive actions
  • Full command audit log

IPMIDeck power control widget โ€” live power draw with history graph and On / Soft Off / Hard Off / Reset / Cycle actions

โ System Event Log (SEL)
  • View BMC hardware event log with severity filtering
  • Search, date range filters, export to CSV/JSON
โ Hardware Inventory (FRU)
  • Serial numbers, part numbers, manufacturer info
  • Board, chassis, and product data at a glance
โ Multi-Server Dashboard
  • Manage multiple BMCs from a single instance
  • Panoramic view with status overview of all servers

IPMIDeck server switcher popover listing multiple servers across vendors from a single instance


โ Quick Start

Pull from Docker Hub (primary registry):

docker pull devluigi06/ipmideck:latest

# Linux (reaches BMCs on your LAN via UDP 623):
docker run -d --name ipmideck --network host \
  -v ipmideck-data:/data \
  devluigi06/ipmideck:latest

# Windows / macOS (Docker Desktop has no host networking โ€” map the port instead):
docker run -d --name ipmideck -p 3000:3000 \
  -v ipmideck-data:/data \
  devluigi06/ipmideck:latest

Or with Docker Compose:

docker compose up -d                                  # pull&go (docker-compose.yml)
docker compose -f docker-compose.dev.yml up --build   # build from source

Open http://<your-ip>:3000 and follow the setup wizard.

--network host (Linux) lets the container reach BMCs on your local network via UDP 623. On Windows/macOS use -p 3000:3000.

โ pip
pip install ipmideck
ipmideck start

Requires ipmitool installed on the system.


โ Documentation

Full documentation lives at docs.ipmideck.comโ  โ€” start with the Getting Started guideโ . The docs cover installation, first-run setup, per-vendor Enable IPMI guides (Dell iDRAC, HPE iLO, Supermicro, Lenovo XCC, IBM IMM), configuration, the CLI and interactive console, the FAQ, and troubleshooting.


โ Tech Stack

ComponentTechnology
BackendPython / FastAPI / Uvicorn
FrontendReact / Vite / TypeScript / Recharts
StylingTailwind CSS
DatabaseSQLite (aiosqlite)
IPMIipmitool (subprocess)
PackagingDocker / pip

โ Configuration

Configuration is auto-generated at first run at /data/config.yaml (Docker / Linux) or ./data/config.yaml (Windows). Override the data directory with IPMIDECK_DATA_DIR.

A documented subset of settings can be overridden with IPMIDECK_-prefixed environment variables:

IPMIDECK_SERVER_PORT=8080
IPMIDECK_IPMI_POLL_INTERVAL=30
IPMIDECK_LOGGING_LEVEL=info
IPMIDECK_DATA_RETENTION_DAYS=180

Every key is written to that config.yaml on first run โ€” read it for the full list. The same settings are also editable at runtime from the in-app Settings page.


โ Interactive Console

Launched on a host with an attached terminal (a TTY โ€” e.g. ipmideck start run directly, not under Docker, systemd, or a pipe), IPMIDeck opens an interactive operator console: a pinned header with keybindings above a live, streaming log. From it you can cycle log verbosity, inspect active sessions and configured servers, print the access URL, change the bind address, and restart or quit โ€” without leaving the terminal.

IPMIDeck interactive operator console โ€” pinned header with keybindings and a live log, plus the configured-servers view

Keys: [v] verbosity ยท [c] sessions ยท [s] servers ยท [u] url ยท [g] update ยท [b] change bind ยท [r] restart ยท [q] quit ยท [ESC] back. The console is not shown when IPMIDeck runs under Docker, systemd, or with piped output โ€” there it logs plainly to stdout.

The hosts shown are RFC5737 documentation addresses, not real servers.

See the Interactive Console docsโ  for full details.


โ Screenshots

โ FanPilot โ€” visual fan curve editor

IPMIDeck FanPilot page with the drag-and-drop fan curve editor

โ System Event Log โ€” BMC hardware events

IPMIDeck System Event Log with severity filtering

โ Hardware Inventory (FRU) โ€” board, chassis, and product data

IPMIDeck Hardware Inventory page showing FRU board, chassis, and product identifiers

Hardware identifiers are synthetic and the hosts shown are RFC5737 documentation addresses.


โ Development

โ Prerequisites
  • Python 3.11+
  • Node.js 20+ (for frontend development)
  • ipmitool
โ Setup
git clone https://github.com/ipmideck/IPMIDeck.git
cd IPMIDeck

# Backend โ€” run from the repo root (pyproject.toml lives here)
python -m venv .venv
source .venv/bin/activate  # Linux/Mac
# .venv\Scripts\activate   # Windows
pip install -e ".[dev]"

# Frontend
cd frontend
npm install
npm run dev
โ Run
# Backend โ€” from the repo root (serves API + static frontend build)
uvicorn backend.main:app --reload --port 3000
# or:  python -m backend.main --reload
# or:  ipmideck start --reload   (after `pip install -e ".[dev]"`)

# Frontend dev server (with HMR, proxies API to backend)
cd frontend
npm run dev

โ Project Structure

ipmideck/
โ”œโ”€โ”€ backend/
โ”‚   โ”œโ”€โ”€ main.py              # FastAPI app + lifespan + CLI entry point
โ”‚   โ”œโ”€โ”€ console.py           # interactive TTY operator console
โ”‚   โ”œโ”€โ”€ core/                # database, auth, crypto, config, branding, events,
โ”‚   โ”‚                        #   websocket, modules (loader), ipmi_service, ipmi_demo
โ”‚   โ”œโ”€โ”€ api/                 # auth / server / dashboard / system / module routes
โ”‚   โ”œโ”€โ”€ models/              # Pydantic schemas
โ”‚   โ”œโ”€โ”€ modules/             # self-contained feature modules
โ”‚   โ”‚   โ”‚                    #   (manifest + routes + tasks + migrations each)
โ”‚   โ”‚   โ”œโ”€โ”€ sensors/
โ”‚   โ”‚   โ”œโ”€โ”€ fanpilot/        #   + engine.py (curve / hysteresis / safety override)
โ”‚   โ”‚   โ”œโ”€โ”€ power/
โ”‚   โ”‚   โ”œโ”€โ”€ sel/
โ”‚   โ”‚   โ””โ”€โ”€ fru/
โ”‚   โ””โ”€โ”€ static/              # compiled React SPA (build artifact โ€” do not hand-edit)
โ”œโ”€โ”€ frontend/
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ pages/           # Dashboard, FanPilot, SEL, FRU, Settings, Login, Setup
โ”‚   โ”‚   โ”œโ”€โ”€ components/      # common/, dashboard/, layout/
โ”‚   โ”‚   โ”œโ”€โ”€ modules/         # per-module widgets (sensors, fanpilot, power)
โ”‚   โ”‚   โ”œโ”€โ”€ stores/          # Zustand stores
โ”‚   โ”‚   โ”œโ”€โ”€ hooks/           # useWebSocket, useKeyboardShortcuts, โ€ฆ
โ”‚   โ”‚   โ”œโ”€โ”€ i18n/locales/    # 12 language catalogs
โ”‚   โ”‚   โ”œโ”€โ”€ api/             # HTTP client
โ”‚   โ”‚   โ”œโ”€โ”€ lib/
โ”‚   โ”‚   โ””โ”€โ”€ styles/
โ”‚   โ””โ”€โ”€ vite.config.ts
โ”œโ”€โ”€ scripts/                 # rebuild-spa, check-spa-built, check-i18n-parity,
โ”‚                            #   check-wheel, lint-workflows, smoke-docker
โ”œโ”€โ”€ tests/                   # unit/, integration/, fixtures/ipmi/
โ”œโ”€โ”€ Dockerfile
โ”œโ”€โ”€ docker-compose.yml
โ”œโ”€โ”€ docker-compose.dev.yml
โ”œโ”€โ”€ .dockerignore
โ””โ”€โ”€ pyproject.toml

โ Security

  • Local authentication with bcrypt password hashing
  • Opaque session tokens, HMAC-SHA256 signed with a per-install secret, with configurable expiry (IPMIDECK_AUTH_SESSION_EXPIRY / the auth.session_expiry config key โ€” e.g. 24h, 90m, 1h; default 24h)
  • BMC credentials encrypted at rest with AES-256-CBC. The 32-byte key is randomly generated and stored in <data_dir>/encryption.key โ€” deliberately outside the database, so a stolen DB alone decrypts nothing (back the key file up separately)
  • BMC passwords are never placed on the command line โ€” ipmitool reads them from the environment (-E / IPMITOOL_PASSWORD), so they never appear in ps
  • No external network dependencies โ€” fully offline capable
  • ipmitool arguments are passed as a list, never through a shell (no shell-injection surface)
  • Optional HTTPS/TLS for the dashboard, with one-click self-signed certificate generation

IPMIDeck Settings โ€” optional HTTPS/TLS with one-click self-signed certificate generation

IPMIDeck Settings โ€” local authentication enabled, with a confirm-with-password flow to disable it


โ Supported Hardware

Sensor monitoring, power control, SEL and FRU work on any server with an IPMI 2.0 BMC.

Fan control (FanPilot) is vendor-specific. The table below is the honest support matrix โ€” it mirrors the vendor profiles the app actually ships, and the same tier badges appear in the vendor picker when you add a server:

VendorFan controlTierNotes
Dell PowerEdge (iDRAC)YesTestedRaw iDRAC fan commands, validated on real hardware (PowerEdge R720)
Supermicro (X10+)YesExperimentalBoth fan zones
IBM System x (IMM)YesExperimentalDual fan bank
HPE ProLiant (iLO)NoMonitoring-onlyiLO exposes no IPMI fan-control interface
Lenovo ThinkSystem (XCC)NoMonitoring-onlyNo reliable in-band restore path
Generic / unknown BMCNoMonitoring-onlyNever issues raw vendor writes it cannot verify

Monitoring-only vendors still get full sensor, power, SEL and FRU support โ€” FanPilot simply leaves their fans under BMC control rather than sending raw commands it cannot confirm.


โ License

Apache-2.0โ 


โ Author

Luigi Tanzillo โ€” github.com/dev-luigiโ 


โ Disclaimer

This tool is provided as-is for managing IPMI-enabled servers. Use at your own risk. Improper fan control can damage hardware. Always test in a non-production environment first. The author is not responsible for any damage caused by misuse of this application.


โ Star History

Star History Chart โ 

Tag summary

Content type

Image

Digest

sha256:4377dfeeaโ€ฆ

Size

76.9 MB

Last updated

2 months ago

docker pull devluigi06/ipmideck