main
- Flask backend + static SPA (HTML/CSS/JS) - Docker container discovery via unix socket (stdlib only, no docker SDK) - Host stats (CPU/mem/disk/load/uptime) via psutil - Live-updating UI with per-state filters and resource gauges - Dockerfile for containerized deployment
ServerDash
A lightweight, self-hosted server monitoring dashboard: it discovers Docker containers directly through the Docker socket and shows host resource stats (CPU, memory, disk, load, uptime). The frontend is a small static single-page app served by a Flask backend.
- No external services — no database, no reverse-engine Docker Python
package. It talks to the Docker Engine API over the Unix socket using only
the standard library, and collects host metrics with
psutil. - Live-updating cards + per-container status, CPU/mem gauges, filters, and a running/stopped/dead breakdown.
Features
- Discovers ~all Docker containers via
/var/run/docker.sock(all states). - Per-card: running/starting/paused/stopped/dead counts.
- Per-container: name, image, status, ports, restart policy, health, CPU/mem.
- Host cards: CPU %, memory %, disk %, load average, uptime.
- Filter containers by state pill; auto-refresh every 3s.
Quick start (local, no Docker)
cd app
python3 -m venv .venv
source .venv/bin/activate
pip install -r ../requirements.txt
export DOCKER_SOCKET=/var/run/docker.sock # must be readable by this user
export PORT=8787
python main.py
# open http://localhost:8787
The docker.sock must be accessible by the user running the app (add yourself
to the docker group, or run with sudo) — otherwise container discovery fails.
Running inside Docker
docker build -t serverdash .
docker run --rm -p 8787:8787 \
-v /var/run/docker.sock:/var/run/docker.sock \
serverdash
Access the dashboard at http://localhost:8787.
Configuration
All through environment variables:
| Variable | Default | Description |
|---|---|---|
DOCKER_SOCKET |
/var/run/docker.sock |
Path to the Docker socket. |
DOCKER_API_VERSION |
1.43 |
Docker Engine API version. |
PORT |
8787 |
HTTP port for the web UI. |
HOST_BIND |
0.0.0.0 |
Bind address. |
REFRESH_INTERVAL |
3 |
Background container refresh interval (seconds). |
API
| Endpoint | Description |
|---|---|
GET /api/v1/containers |
Normalized container list (?refresh=1 forces a pull). |
GET /api/v1/containers/summary |
Counts by state class. |
GET /api/v1/host |
Host CPU / memory / disk / load / uptime stats. |
GET /api/v1/healthz |
Liveness check. |
Project layout
serverdash/
├── app/
│ ├── main.py # Flask app + REST API + refresh loop
│ ├── docker_monitor.py # Docker socket discovery (stdlib only)
│ ├── host_stats.py # psutil host metrics
│ ├── templates/index.html
│ └── static/
│ ├── css/style.css
│ └── js/app.js
├── requirements.txt
├── Dockerfile
├── .gitignore
└── README.md
Notes
- Container CPU/memory percentages are surfaced by the backend when available; values above ~80% render as "high" (red) for quick scanning.
- The app is intentionally dependency-light: no DB, no build step, no config files to manage. Edit env vars to tune it.
Description
Self-hosted Docker container & host monitoring dashboard
40 KiB
0 Stars
1 Watchers
0 Forks
Languages
Python
51.9%
JavaScript
20.3%
CSS
17.4%
HTML
9.3%
Dockerfile
1.1%
