Skip to main content

🖥️ 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

FeaturesQuick StartDocumentationConfigurationSupported 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

Docker (recommended)

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

Component Technology
Backend Python / FastAPI / Uvicorn
Frontend React / Vite / TypeScript / Recharts
Styling Tailwind CSS
Database SQLite (aiosqlite)
IPMI ipmitool (subprocess)
Packaging Docker / 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:

Vendor Fan control Tier Notes
Dell PowerEdge (iDRAC) Yes Tested Raw iDRAC fan commands, validated on real hardware (PowerEdge R720)
Supermicro (X10+) Yes Experimental Both fan zones
IBM System x (IMM) Yes Experimental Dual fan bank
HPE ProLiant (iLO) No Monitoring-only iLO exposes no IPMI fan-control interface
Lenovo ThinkSystem (XCC) No Monitoring-only No reliable in-band restore path
Generic / unknown BMC No Monitoring-only Never 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 Tanzillogithub.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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ipmideck-2.0.1.tar.gz (575.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ipmideck-2.0.1-py3-none-any.whl (618.6 kB view details)

Uploaded Python 3

File details

Details for the file ipmideck-2.0.1.tar.gz.

File metadata

  • Download URL: ipmideck-2.0.1.tar.gz
  • Upload date:
  • Size: 575.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for ipmideck-2.0.1.tar.gz
Algorithm Hash digest
SHA256 e4626871267618779e7b8c3c87520672992ae9105bc20bcc060471fa500ebb42
MD5 1619479fc85aac9cb00ef9076b2bcb7e
BLAKE2b-256 51b018caaa777e4257181ab252a45521b9822af815da75be54ff92837e1c6a59

See more details on using hashes here.

Provenance

The following attestation bundles were made for ipmideck-2.0.1.tar.gz:

Publisher: release.yml on ipmideck/IPMIDeck

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ipmideck-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: ipmideck-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 618.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for ipmideck-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1f2454326ce5e2a32e517731fa09c15a1fe00cd8315d1f85fe2693deba2ac487
MD5 45575bb0c5cfaa82838ca1425c4f33f1
BLAKE2b-256 0bb4fa308d1e856ee53b0e8469052255dee9173d22f69be0704d76eb24a3f31d

See more details on using hashes here.

Provenance

The following attestation bundles were made for ipmideck-2.0.1-py3-none-any.whl:

Publisher: release.yml on ipmideck/IPMIDeck

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

2.0.1 This release

2 files

2.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page