Self-Host Beszel: Lightweight Server Monitoring 2026
TL;DR
Beszel (MIT, ~4K GitHub stars, Go) is a lightweight server monitoring dashboard using a hub + agent architecture. Install a tiny agent on each server, and the hub collects and displays CPU, RAM, disk, network, and Docker container metrics with clean charts. No Prometheus, no Grafana, no complex setup — just a single binary agent and a web dashboard. Datadog charges per host per month; Beszel monitors unlimited servers for free.
Key Takeaways
- Beszel: MIT, ~4K stars, Go — lightweight monitoring with hub + agent
- Agent-based: Tiny Go binary per server — ~10MB RAM, zero dependencies
- Docker stats: Per-container CPU, memory, and network metrics
- Alerts: Email, webhook, and ntfy notifications for thresholds
- Historical data: Charts with configurable retention
- Multi-server: Monitor all your servers from one dashboard
Beszel vs Netdata vs Uptime Kuma
| Feature | Beszel | Netdata | Uptime Kuma |
|---|---|---|---|
| Focus | Server metrics | Deep system metrics | Uptime/HTTP checks |
| Agent size | ~5MB | ~100MB | N/A (agentless) |
| RAM per agent | ~10MB | ~200MB | N/A |
| Docker stats | Yes (per container) | Yes | Docker ping only |
| Granularity | 10s-60s | 1s | 20s-300s |
| Setup | Very simple | Moderate | Very simple |
| Alerting | Email, webhook, ntfy | Email, Slack, PD | 90+ channels |
| Status page | No | No | Yes |
Part 1: Hub Setup (Docker)
# docker-compose.yml (on your monitoring server)
services:
beszel:
image: henrygd/beszel:latest
container_name: beszel
restart: unless-stopped
ports:
- "8090:8090"
volumes:
- beszel_data:/beszel_data
volumes:
beszel_data:
docker compose up -d
Visit http://your-server:8090 → create admin account.
Part 2: HTTPS with Caddy
monitor.yourdomain.com {
reverse_proxy localhost:8090
}
Part 3: Add Agents
Install agent on each server
Docker agent
# On each monitored server:
services:
beszel-agent:
image: henrygd/beszel-agent:latest
container_name: beszel-agent
restart: unless-stopped
network_mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
PORT: 45876
KEY: "${AGENT_KEY}" # Generated by the hub
Binary agent (no Docker)
# Download and run the agent binary:
curl -sL https://github.com/henrygd/beszel/releases/latest/download/beszel-agent_linux_amd64 \
-o /usr/local/bin/beszel-agent
chmod +x /usr/local/bin/beszel-agent
# Run:
KEY="your-agent-key" PORT=45876 beszel-agent
Register agent with hub
- Hub → + Add System
- Name:
prod-server-1 - Host:
192.168.1.10(or hostname) - Port:
45876 - → Copy the KEY → set it as
KEYenv var on the agent - Agent connects → data starts flowing
Part 4: Dashboard
System overview
Each server card shows:
- CPU: Usage percentage with historical chart
- RAM: Used vs total with chart
- Disk: Usage percentage per mount
- Network: Bytes in/out per second
- Uptime: How long the server has been running
Docker container view
Click a server → Containers tab:
- Per-container CPU usage
- Per-container memory usage
- Per-container network I/O
- Container status (running, stopped, etc.)
Charts
- Time range: 1h, 6h, 24h, 7d, 30d
- Granularity: Automatic based on range
- Overlay: Compare metrics across servers
Part 5: Alerts
Email alerts
Settings → Notifications → Email:
SMTP Host: mail.yourdomain.com
SMTP Port: 587
Username: alerts@yourdomain.com
Password: ***
From: alerts@yourdomain.com
Webhook alerts
Settings → Notifications → Webhook:
URL: https://ntfy.yourdomain.com/server-alerts
Headers:
Priority: high
Tags: computer
Alert rules
Alerts → + Add Alert:
System: prod-server-1
Metric: CPU Usage
Condition: > 90%
Duration: 5 minutes
Notification: Email + Webhook
Common alert patterns:
| Metric | Threshold | Duration | Severity |
|---|---|---|---|
| CPU | > 90% | 5 min | Warning |
| RAM | > 85% | 5 min | Warning |
| Disk | > 90% | Immediate | Critical |
| Network | > 100 MB/s | 1 min | Info |
Part 6: Multi-Server Setup
Architecture
┌─────────────┐ ┌───────────────┐
│ Beszel Hub │←────│ Agent: Web │ (192.168.1.10)
│ (dashboard) │←────│ Agent: DB │ (192.168.1.11)
│ │←────│ Agent: Media │ (192.168.1.12)
│ │←────│ Agent: VPS │ (remote server)
└─────────────┘ └───────────────┘
Remote agents (over internet)
For monitoring remote VPS servers, the agent needs to be reachable from the hub:
Option 1: Open port 45876 on the remote server's firewall Option 2: Use a VPN (WireGuard/Tailscale) for private connectivity Option 3: Reverse tunnel via SSH
# On remote server, create a reverse SSH tunnel:
ssh -R 45876:localhost:45876 user@hub-server -N
Part 7: Data Retention
Settings → Data:
Raw data retention: 7 days
Hourly aggregates: 90 days
Daily aggregates: 1 year
Beszel stores data efficiently — a server with 10 monitored systems typically uses <500MB of storage after a year.
Maintenance
# Update hub:
docker compose pull
docker compose up -d
# Update agents:
docker pull henrygd/beszel-agent:latest
docker compose up -d beszel-agent
# Or for binary: download latest release and restart
# Backup:
tar -czf beszel-backup-$(date +%Y%m%d).tar.gz \
$(docker volume inspect beszel_beszel_data --format '{{.Mountpoint}}')
# Logs:
docker compose logs -f beszel
See also: Uptime Kuma — for HTTP/TCP uptime monitoring and status pages
See all open source monitoring tools at OSSAlt.com/categories/monitoring.