Skip to main content
Linux. --network host is required so the container can reach your BMCs directly on your local network over UDP port 623 (the IPMI/RMCP+ port). Without host networking, the container sits behind Docker’s NAT and cannot complete an IPMI session with your hardware.
Windows / macOS. Docker Desktop does not support host networking, so map the port instead:
Both commands mount a named volume (ipmideck-data) on /data. That volume holds your config.yaml, the SQLite database, and the encryption key that protects your stored BMC credentials, so they survive a restart, an upgrade, or a docker rm. Without -v you get a fresh, empty install every time the container is recreated. Once the container is up, open http://<your-ip>:3000 and follow the setup wizard.
The published image lives on Docker Hub at hub.docker.com/r/devluigi06/ipmideck.

pip

The pip package requires ipmitool to be installed on the host, ipmideck shells out to ipmitool for every IPMI operation. Install it from your distribution’s package manager first (for example apt install ipmitool or dnf install ipmitool).
On Debian 12+ and Ubuntu 23.04+, a plain pip install refuses to run and fails with error: externally-managed-environment. This is expected, see Installing on Debian and Ubuntu below.

Installing on Debian and Ubuntu (PEP 668)

On a stock Debian 12+ or Ubuntu 23.04+ system, pip install ipmideck stops with:
This is not a bug in ipmideck. The distribution reserves the system Python for its own package manager, apt depends on it, and blocks pip from writing into it. There are two supported ways to install ipmideck anyway. pipx installs a command-line Python application into its own isolated virtual environment and exposes the resulting command globally, without ever touching the system Python. That is exactly the shape of ipmideck, so this is the path we recommend:
pipx places the executable in ~/.local/bin. Debian and Ubuntu add that directory to your PATH automatically once it exists, but only for new shell sessions, so the very first install prints a warning and ipmideck is not yet found in the shell you ran it from:
Open a new terminal (or reconnect over SSH) and the command works. If your shell still cannot find it, add the directory explicitly and then start a new shell:
Verify the install with demo mode, which needs no real hardware:

venv

A virtual environment sidesteps PEP 668 the same way, and is the right choice if you are working from a source checkout:
The ipmideck command is available whenever that environment is activated.
pip install --break-system-packages ipmideck also works, but it writes straight into the system Python and can break apt if a dependency version collides. Prefer pipx or a venv.

Where ipmideck stores data

ipmideck writes its configuration and database under a data directory:
  • Docker: /data inside the container (the image sets IPMIDECK_DATA_DIR=/data; persist it with a volume).
  • pip on Linux: /data by default, which a non-root user normally cannot write to.
  • pip on Windows: ./data, relative to the directory you run ipmideck from.
On Linux, running ipmideck as a normal user without overriding the data directory fails at startup with PermissionError: [Errno 13] Permission denied: '/data'. Point IPMIDECK_DATA_DIR at a directory you own, as shown below.
Point the data directory somewhere writable:
You can override the location on any platform with the IPMIDECK_DATA_DIR environment variable. This directory holds config.yaml, the SQLite database, and the encryption key file used to protect your stored BMC credentials. See Configuration and Running ipmideck for details.

Running as a service (Linux)

ipmideck start in a terminal opens the interactive console and stops when you close the session. To keep ipmideck running in the background and start it on boot, run it under systemd instead. Create a dedicated user, install ipmideck for it with pipx, and give it a data directory it owns:
Then write the unit:
Enable and start it:
Under systemd there is no attached terminal, so ipmideck skips the interactive console and streams plain logs to the journal (journalctl -u ipmideck -f), exactly like the Docker container. systemctl stop sends SIGTERM, which triggers the same graceful shutdown that hands fan control back to your BMCs. See Headless / non-TTY mode.

Next steps