Real-time, responsive system monitoring dashboard for any Linux system β with built-in watchdog.
Live WebSocket metrics, service management, auto-restart on crash, HTTPS, token auth. Works on Raspberry Pi, Ubuntu servers, Debian, Arch, Proxmox β anything running systemd.
- Real-time metrics β WebSocket updates every 2 seconds
- CPU usage (per-core breakdown)
- CPU temperature (ARM
/sys/class/thermal, x86lm-sensors/hwmon, auto-detected) - RAM + Swap
- Disk usage
- Network speed (upload/download rate)
- System uptime
- Load average
- Top processes by CPU
- Service management β view, restart, and stop systemd services from the UI
- Watchdog β automatically restarts crashed services (configurable threshold)
- System health alerts β logs warnings for high temp, disk, and memory
- Responsive UI β works on phone, tablet, and desktop (dark theme, PWA-ready)
- Secure β HTTPS (self-signed cert), token-based auth, Tailscale VPN access
- One-command install β
./install.shsets up everything - Cross-platform β ARM (Pi, Odroid, NanoPi) and x86 (Intel/AMD servers, VPS)
git clone https://github.com/pitee33/pi-dashboard.git
cd pi-dashboard
chmod +x install.sh
./install.shThe installer will:
- Create a Python venv and install dependencies
- Generate a self-signed TLS certificate
- Create
config.jsonwith a random token - Install systemd services (
pi-dashboard+pi-watchdog) - Set up sudoers for service restart permissions
- Start everything
After install, open:
https://localhost:8443
Enter the token shown at the end of the install script.
Edit config.json (created from config.example.json):
{
"token": "your-secure-token",
"host": "0.0.0.0",
"port": 8443,
"services": {
"SSH": "ssh.service",
"Docker": "docker.service",
"Nginx": "nginx.service",
"PostgreSQL": "postgresql.service"
},
"watchdog_services": {
"Nginx": "nginx.service",
"PostgreSQL": "postgresql.service"
},
"watchdog_max_fails": 3,
"watchdog_check_interval": 30,
"temp_threshold": 85,
"disk_threshold": 95,
"mem_threshold": 95
}| Key | Description |
|---|---|
token |
Auth token for dashboard access |
host |
Bind address (0.0.0.0 = all interfaces) |
port |
HTTP/HTTPS port |
services |
Services shown in the dashboard UI |
watchdog_services |
Services the watchdog monitors and auto-restarts |
watchdog_max_fails |
Consecutive failures before restart |
watchdog_check_interval |
Seconds between service checks |
temp_threshold |
Β°C β log warning above this |
disk_threshold |
% β log warning above this |
mem_threshold |
% β log warning above this |
After editing, restart:
sudo systemctl restart pi-dashboard pi-watchdogThe dashboard auto-detects CPU temperature from multiple sources:
| Platform | Source | Requirements |
|---|---|---|
| Raspberry Pi (ARM) | /sys/class/thermal/thermal_zone0/temp |
None (built-in) |
| x86 (Intel/AMD) | psutil.sensors_temperatures() |
lm-sensors installed (sudo apt install lm-sensors && sudo sensors-detect) |
| Other ARM (Odroid, NanoPi) | /sys/class/hwmon/hwmon*/temp1_input |
None |
| VPS / Cloud | Often not available | Shows "N/A" in the UI |
If temperature shows "N/A" on an x86 system, install lm-sensors:
sudo apt install lm-sensors
sudo sensors-detect --auto
# Restart the dashboard:
sudo systemctl restart pi-dashboardThe dashboard listens on all interfaces, so if Tailscale is running:
tailscale up
# Then access from any device on your tailnet:
https://<tailscale-ip>:8443Tailscale provides WireGuard encryption, so the self-signed cert is fine β the connection is secured by the VPN tunnel.
To expose the dashboard publicly with a Tailscale-issued certificate:
- Enable Serve on your tailnet: https://login.tailscale.com/f/serve
- Run:
tailscale serve --bg --https 8443 http://127.0.0.1:8443- Access via
https://<hostname>.<tailnet>.ts.net
For internet-facing deployments, put a reverse proxy with a real TLS cert (Let's Encrypt) in front:
server {
listen 443 ssl;
server_name monitor.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass https://127.0.0.1:8443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}Never expose the dashboard directly to the internet without a strong token.
| Action | Command |
|---|---|
| View dashboard | https://<ip>:8443 |
| Dashboard logs | journalctl -u pi-dashboard -f |
| Watchdog logs | journalctl -u pi-watchdog -f |
| Watchdog log file | cat ~/pi-dashboard/watchdog.log |
| Stop | sudo systemctl stop pi-dashboard pi-watchdog |
| Start | sudo systemctl start pi-dashboard pi-watchdog |
| Restart | sudo systemctl restart pi-dashboard |
| Check status | systemctl is-active pi-dashboard pi-watchdog |
βββββββββββββββββββββββββββββββββββββββββββ
β Browser (phone/desktop) β
β https://<ip>:8443?token=... β
ββββββββββββββββ¬βββββββββββββββββββββββββββ
β HTTPS + WebSocket (2s updates)
β
ββββββββββββββββΌβββββββββββββββββββββββββββ
β Dashboard (FastAPI + Uvicorn) β
β βββ /api/metrics β JSON snapshot β
β βββ /ws β WebSocket stream β
β βββ /api/service β restart/stop β
β βββ / β HTML dashboard β
ββββββββββββββββ¬βββββββββββββββββββββββββββ
β psutil + systemctl
β
ββββββββββββββββΌβββββββββββββββββββββββββββ
β Watchdog (background daemon) β
β βββ Checks services every 30s β
β βββ Restarts after 3 consecutive fails β
β βββ Checks dashboard health every 10s β
β βββ Logs CPU temp / disk / mem warnings β
βββββββββββββββββββββββββββββββββββββββββββ
- Python 3.11+
- Linux (systemd-based β Debian, Ubuntu, Raspberry Pi OS, Arch, Proxmox, etc.)
- systemd (for service management)
- Optional: Tailscale for remote access
- Optional:
uvfor faster dependency installation - Optional:
lm-sensorsfor CPU temperature on x86
| Platform | Status | Notes |
|---|---|---|
| Raspberry Pi (all models) | β Full | Temp works out of the box |
| Ubuntu / Debian servers | β Full | Install lm-sensors for temp |
| Arch Linux | β Full | Install lm-sensors for temp |
| Proxmox VE | β Full | Run in a VM or CT with systemd |
| Odroid / NanoPi (ARM) | β Full | Temp via hwmon |
| VPS (DigitalOcean, Hetzner) | β Full | Temp usually N/A (no sensor) |
| Non-systemd (Alpine, Void) | Service management won't work |
pi-dashboard/
βββ app.py # FastAPI dashboard backend + embedded frontend
βββ watchdog.py # Service watchdog daemon
βββ install.sh # One-command installer
βββ requirements.txt # Python dependencies
βββ config.example.json # Template config (committed)
βββ config.json # Your config (gitignored)
βββ certs/ # TLS certs (gitignored, auto-generated)
βββ LICENSE # MIT
βββ README.md
MIT β free for personal and commercial use.
PRs welcome! Fork β branch β PR.
git checkout -b feat/my-feature
# ... changes ...
git commit -m "feat: add my feature"
git push -u origin feat/my-feature
# Then create a PR on GitHubBuilt by pitee33.