A lightweight self-hosted server monitoring panel — live CPU, RAM, GPU, disk, network, and process metrics over WebSocket, with service management, disk management, app/port scanning, and JWT + TOTP authentication.
docker run -d \
--name carbonpanel \
--network host \
--restart unless-stopped \
-v carbonpanel_data:/app \
-e SECRET_KEY=$(openssl rand -hex 32) \
-e ADMIN_PASSWORD=yourpassword \
ghcr.io/leodenglovescode/carbonpanel:latestOpen http://localhost:8787. Default username is admin.
--network hostis required so the panel can read host-level metrics (network interfaces, processes, etc.). The-v carbonpanel_data:/appvolume keeps your database across container restarts.
Docker Compose alternative:
services:
carbonpanel:
image: ghcr.io/leodenglovescode/carbonpanel:latest
network_mode: host
restart: unless-stopped
volumes:
- carbonpanel_data:/app
environment:
APP_PORT: 8787
SECRET_KEY: your-secret-key-here
ADMIN_PASSWORD: yourpassword
volumes:
carbonpanel_data:docker compose up -dInstalls as a native systemd service with nginx. Requires root, Ubuntu/Debian.
curl -fsSL https://raw.githubusercontent.com/leodenglovescode/CarbonPanel/master/scripts/install-carbonpanel.sh | sudo bashInitial credentials are saved to /opt/carbonpanel/shared/first-install.txt after install.
docker pull ghcr.io/leodenglovescode/carbonpanel:latest
docker stop carbonpanel && docker rm carbonpanel
docker run -d ... # same command as above — the volume keeps your dataOr with Compose: docker compose pull && docker compose up -d
The Settings page shows available updates and provides a ready-to-copy pull command.
Use the Settings → Install Update button in the panel, or SSH in and run:
sudo carbonpanelctl updateUpdates clone the new release, run DB migrations, health-check, and auto-rollback on failure. To roll back manually: sudo carbonpanelctl rollback.
All settings are environment variables (Docker) or written to backend/.env (local dev / install script).
| Variable | Default | Description |
|---|---|---|
SECRET_KEY |
dev-secret-... |
JWT signing key — change this in production |
ADMIN_USERNAME |
admin |
Initial admin username |
ADMIN_PASSWORD |
changeme |
Initial admin password |
APP_PORT |
8787 |
Port nginx listens on |
DATABASE_URL |
sqlite+aiosqlite:///./carbonpanel.db |
Database connection string |
METRICS_INTERVAL_SECONDS |
2.0 |
How often metrics are collected |
PROCESS_LIMIT |
25 |
Max processes shown in the dashboard |
- Live CPU, RAM, GPU, disk, network, and process metrics over WebSocket
- Disk management — partition info, filesystem check, unmount (USB/removable only)
- App/port scanner — lists all listening ports with process info, custom labels, kill
- System services — browse, start/stop/restart, enable/disable, star and reorder
- Sites — manage tracked services with log streaming and config file editing
- Customizable UI — dark/light/auto theme, custom colors, fonts, gradients, background images
- JWT auth with optional TOTP 2FA
- In-panel updates — version check via GitHub API, one-click update (self-hosted) or pull command (Docker)
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
make setup # create venv, install deps, migrate DB, seed admin
make dev # run backend + frontend together| URL | Service |
|---|---|
http://localhost:5173 |
Frontend (Vite HMR) |
http://localhost:8000/api/v1 |
Backend API |
Other commands: make backend, make frontend, make lint
Backend — Python 3.11+, FastAPI, SQLAlchemy + Alembic, SQLite (aiosqlite), psutil
Frontend — Vue 3, TypeScript, Vite, Pinia, Chart.js
Idea and logic by @leodenglovescode, code assisted by Claude Code.