Deploy

Up and running in one command.

Rackpad is built for local ownership: Docker for production, Vite + Fastify for development, and SQLite for a small, portable data store. No cloud account, ever.

Pick your method

One container to run it. A checkout to hack on it.

The one-line installer pulls the published image from GitHub Container Registry and starts it for you.

  • Installer pulls the published GHCR image
  • Data lives in a single mounted SQLite volume
  • Air-gap friendly — self-hosted fonts, no external calls

Set RACKPAD_TAG=beta before the installer to track pre-releases instead of stable.

curl -fsSL https://raw.githubusercontent.com/Kobii-git/Rackpad/main/scripts/install-docker.sh | bash

Recommended. Then open http://SERVER_IP:3000.

Requirements

It really is this light.

Docker host

Any machine with Docker Engine and the Compose plugin. A small VM, NAS or Pi-class box is plenty.

A little disk

One SQLite database plus uploaded device images. Back it up by copying a single volume.

Node 22 — dev only

Only needed if you run from source. Production installs need nothing but Docker.

First run

From zero to your first rack.

Start the container

Run the installer, then open http://SERVER_IP:3000 in your browser.

Create your admin account

The first account you make becomes the admin. Sign in to continue.

Empty or demo

Start from a blank slate, or preload the expanded demo environment to explore the features first.

Document your infrastructure

Add a room and a rack, drop in devices, then let discovery and imports fill in the rest.

Configuration

Key environment variables.

Sensible defaults out of the box — set these when you put Rackpad behind a proxy or turn on extras.

VariableWhat it does
RACKPAD_SECRET_KEYStored secret encryption key used for encrypted credentials and secrets such as SNMP credentials and integration secrets.
TRUST_PROXY=1Honor X-Forwarded-* when running behind a reverse proxy.
TRUSTED_HOSTS / ORIGINSAllowed hostnames and origins for proxied deployments.
MONITOR_INTERVAL_MSHealth-check frequency. Defaults to 300000 (5 minutes).
OIDC_ENABLED + issuer/clientTurn on OIDC single sign-on alongside local accounts.
SNMP_TRAP_ENABLED=1Enable the SNMP trap receiver; pair with SNMP_INVENTORY_SYNC=1.
Behind a reverse proxy

Terminate TLS at your proxy.

Rackpad serves plain HTTP on port 3000. Front it with your proxy of choice for HTTPS, then set TRUST_PROXY=1 and your trusted hosts.

rackpad.example.com {
    reverse_proxy localhost:3000
}

Caddy fetches and renews TLS automatically — this is the whole config.

Backup & restore

Your whole instance is one volume.

No database server to dump, no external state — back up by copying a single folder.

Quiesce writes

Stop the container with docker compose down so nothing is mid-write.

Copy the data volume

Archive the mounted /data volume — that's the SQLite database plus uploaded device and rack images.

Restore anywhere

Drop the volume back on any host, start the container, and Rackpad applies any migrations on boot.

FAQ

Questions people actually ask.

Where is my data stored?

In a single SQLite database inside the mounted /data volume, on your own machine. There's no cloud component and no telemetry — back up by copying the volume.

How do I update Rackpad?

Pull the new image and recreate the container (docker compose pull && docker compose up -d, or re-run the installer). Your data volume is untouched and migrations run automatically on start.

Can I run it behind a reverse proxy?

Yes. Set TRUST_PROXY=1 and configure TRUSTED_HOSTS/TRUSTED_ORIGINS so Rackpad knows its public address. Terminate TLS at your proxy (Caddy, Traefik, nginx, etc.).

Does it need internet access?

No. Fonts are self-hosted and there are no outbound calls, so it runs happily air-gapped. You only need network access for the features you point at it — SNMP, discovery scans, imports and alert delivery.

What if I lose the admin password?

Run the Docker CLI recovery command (node dist-server/cli/reset-password.js --username admin) from inside the container to set a new password — no public reset endpoint is exposed.

Guides

Deeper docs, straight from the repo.

That's the whole setup.

One command, one container, your data on your box.