Self-hosted homelab dashboard — one place for every service you run.
3.5K
Self-hosted homelab dashboard — and a full Docker / Proxmox control plane — in one container.
Stashboard started as a dashboard for the services you run at home and grew into the place you actually manage them from: every container on every Docker host, every Compose stack, every LXC and VM on your Proxmox nodes, with health, updates, logs, shells and notifications in one UI.
Ships as a single image (vahac/stashboard) with SQLite inside — no separate database container, no migrator sidecar. ASP.NET Core 10 API serving a React 19 SPA.
curl -O https://raw.githubusercontent.com/VahaC/stashboard/main/docker-compose.yml
docker compose up -d
Open http://localhost:8080, register the first account, click + Add service.
No keys to configure. On first start the app generates its encryption key and JWT secret and persists them under /app/Data/.secrets on the stashboard-data volume, so an image update never re-keys your data. A .env file is optional — add one only to change the port, pin a tag, or supply your own secrets/SMTP.
Back up the
stashboard-datavolume. It holds the SQLite database and the encryption key. Lose the key and every stored credential is permanently undecryptable.
Minimal manual run:
docker run -d --name stashboard \
-p 8080:8080 \
-v stashboard-data:/app/Data \
-v stashboard-uploads:/app/wwwroot/uploads \
vahac/stashboard:latest
Each service is a card with its favicon (or an uploaded logo), live status dot, category badge and tags. Click it for a tabbed modal:
Plus: TLS certificate-expiry tracking with warn/critical thresholds, per-user categories and tags, light/dark/system theme synced across devices, deep links, and a command palette (Ctrl/⌘+K) that fuzzy-searches services, containers, Compose projects, Proxmox guests and every page.
A dedicated Docker page lists every container across every connected host — local socket, remote TCP+TLS, or SSH-tunnelled daemon — grouped by Compose project, with inline Start / Stop / Restart (and optional Remove), health state, and per-host summary and storage widgets.
compose pull + up -d <service> recreate that honours env_file, depends_on and profiles. Post-update health verification, and every attempt written to an immutable audit log. It can even update Stashboard itself, via a detached helper containerdocker compose config -q. A dependency graph view and a linter (port collisions, depends_on cycles, missing healthchecks, escaping bind mounts, :latest tags) round it outdocker-compose.yaml — paste or upload, dry-run parse + lint + config -q, then deploydocker run containers are reconstructed as a reviewed Compose file with existing volumes/networks declared external: true, with atomic rollbackexec shells inside containers (both xterm.js, both fully audited)image prune sweeps with a dry-run preview to reclaim what auto-updates leave behindA Proxmox page auto-discovers each node with its LXCs and VMs and monitors pending package updates one layer below Docker. New guests appear within minutes. Per guest: start/stop, resource stats, backups, restore, clone and snapshot rollback, an LXC console and a noVNC VM console, plus apt dist-upgrade from the UI. Hybrid transport — the Proxmox REST API (PVEAPIToken) for inventory and node updates, SSH for per-LXC update counts.
/metrics — the same derived signals as Prometheus gauges for Grafana, authenticated by a personal access token scoped to metrics and served from a 30 s cached snapshot (zero extra load on your hosts)Warning+ logs; off unless a host is setMulti-user JWT auth with optional TOTP two-factor and optional OIDC / SSO (Authentik, Authelia, Keycloak — Authorization Code + PKCE, configured in the UI), scoped personal access tokens, rotating refresh tokens with reuse detection, per-user JSON backup export/import covering the full schema, and an installable PWA with offline app-shell and drag-and-drop custom card ordering.
Stashboard is built to run your infrastructure, not just display it. Depending on what you enable it can hold the Docker socket (effectively root on the host), open shells on hosts and inside containers, and run destructive Proxmox operations.
:ro) is enough for tracking, inspect, logs and stats — Stashboard never mutates under :ro. A writable mount is required only for Update now.register returns 403 until you deliberately re-open it in Settings → Registration.| Tag | Meaning |
|---|---|
latest | newest release (moves on every release) |
X.Y.Z, X.Y, X | semver tags from a release — pin these for reproducible deploys |
edge | latest build from main, ahead of the last release |
sha-<commit> | immutable single build |
Pin a version by setting STASHBOARD_TAG=11.4.1 in .env. Platform: linux/amd64.
| Path | Holds |
|---|---|
/app/Data | SQLite database + auto-generated secrets (.secrets/) — back this up |
/app/wwwroot/uploads | uploaded service logos |
All settings can be overridden with STASHBOARD_-prefixed env vars (__ descends into a section).
| Variable | Default | Notes |
|---|---|---|
STASHBOARD_ConnectionStrings__DefaultConnection | Data Source=/app/Data/app.db | SQLite file on the data volume |
STASHBOARD_Encryption__Key | auto-generated | Base64 32 bytes; an explicit value wins and disables auto-generation |
STASHBOARD_Jwt__Secret | auto-generated | 32+ chars |
STASHBOARD_Jwt__AccessTokenMinutes | 15 | Access-token TTL |
STASHBOARD_Jwt__RefreshTokenDays | 30 | Refresh-token TTL |
STASHBOARD_Email__Provider | LogOnly | Smtp for real sending (or configure SMTP entirely in the UI) |
STASHBOARD_Graylog__Host | — | Set to enable GELF/UDP log shipping |
Migrations are applied by the app on startup. Updating is just docker compose pull && docker compose up -d.
Licensed under the terms in the repository.
Content type
Image
Digest
sha256:14ef9b8a6…
Size
150.1 MB
Last updated
about 13 hours ago
docker pull vahac/stashboard