Beszel
Lightweight server monitoring without Prometheus complexity.
Beszel is a minimal, modern server monitoring stack — one hub container plus tiny agents on each server you want to watch. Built on SQLite + PocketBase, it ships a polished web UI, Docker stats, alerts via email/SMS/Telegram/Discord/Slack/Gotify, and a sub-50 MB resource footprint. The "I just want server CPU graphs and alerts" answer without standing up Prometheus + Grafana + Alertmanager.
Deploy with Pier
- 1 Open the Pier dashboard and click Add service.
- 2 Pick Beszel from the template list.
- 3 Choose the version, set a service name, and Pier provisions the container, storage, and ports automatically.
- 4 Attach a domain if you want HTTPS. Traefik auto-provisions the Let's Encrypt certificate.
What is Beszel?
Beszel is a lightweight, modern, web-based server monitoring system built by Henry Gressmann. It exists to fill the gap between “I’ll SSH in and run htop” and “I’ll deploy Prometheus + Grafana + Alertmanager + node_exporter
- Loki + cAdvisor + Pushgateway.”
The architecture is two pieces — a hub (the web UI plus a SQLite database, packaged as a PocketBase app) and an agent (a tiny Go binary or container running on each server you want to monitor). The hub initiates outbound connections to agents (so no inbound firewall holes on the monitored side), scrapes metrics every minute, stores them, and renders the dashboard.
You get CPU, memory, disk I/O, network throughput, system load, uptime, per-Docker-container stats, alerts to every common chat platform, public status pages — all from a 50 MB hub binary plus 10 MB agents.
How Pier deploys it
Pier uses the official henrygd/beszel image. Default port: 8090 (web UI,
behind Traefik). The data volume mounts at /app/data — SQLite database
plus PocketBase application files.
First-time setup creates the admin user via the web UI prompt. From there, add servers from Settings → Servers, run the printed agent install one-liner on each remote host, and metrics start flowing.
To monitor the Pier host itself, deploy the agent in network_mode: host
alongside Pier (in this template the hub auto-discovers the local Docker
daemon for container stats).
When NOT to use Beszel
If you already run Prometheus / Grafana / Alertmanager for application
metrics, adding Beszel just for host metrics may be redundant — node_exporter
covers the same ground inside that stack. If you need sub-second
granularity for performance debugging, Netdata is purpose-built for that.
If you only care about whether public URLs respond, Uptime Kuma is the
right tool. Beszel hits a specific sweet spot — “I have a handful of
servers and I want a simple dashboard plus alerts.”
Key features
Tiny footprint
Hub container ~50 MB RAM, agents ~10 MB each. Runs comfortably alongside everything else on a $5 VPS — no dedicated monitoring host required.
Hub + agents architecture
One web hub aggregates metrics from many remote servers. Each remote runs the tiny beszel-agent and reports back over WireGuard, Tailscale, or plain SSH-tunneled connection.
Built-in Docker stats
Per-container CPU, memory, network, and disk I/O for every running Docker container — no separate exporter.
Alerts to every chat platform
Email, SMS (via Twilio), Telegram, Discord, Slack, Gotify, ntfy, webhook. Threshold + duration + cooldown configurable per metric.
SQLite-backed (PocketBase)
Whole hub is a single binary plus a SQLite file. Backups are trivial; no migrations to manage; restore is a copy.
Public status pages
Share a read-only status page for a service or fleet — uptime percentages, last 24 h graphs, no auth required.
Use cases
Multi-VPS small-fleet monitoring
You run 3-30 servers across providers — Hetzner, Vultr, OVH, dedicated boxes. Beszel aggregates them all into one dashboard.
Homelab dashboards
Single pane of glass for your home server fleet — NAS, Proxmox boxes, Raspberry Pis, OPNsense, Synology.
SLA / status pages
Public "is X up?" page for customers without paying StatusPage / Atlassian.
Docker-host health
Per-container resource use over time — find the leaking memory or the runaway worker process.
Replacing heavy stacks for small ops
Prometheus + Grafana + Alertmanager + node_exporter is overkill for "I want to know if my server is dying". Beszel covers 90% of small-team monitoring with 5% of the operational surface.
Code examples
curl -sL https://get.beszel.dev | sh -s -- \
--hub https://beszel.example.com \
--token <token-from-hub-ui> services:
beszel-agent:
image: henrygd/beszel-agent:latest
container_name: beszel-agent
restart: unless-stopped
network_mode: host
environment:
LISTEN: 45876
KEY: "your-public-key"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data:/var/lib/beszel-agent Alert: CPU
Threshold: > 90%
For: 5 minutes
Channel: Discord
Webhook URL: https://discord.com/api/webhooks/... # Stop hub, snapshot SQLite, restart
docker stop pier-beszel
tar czf beszel-backup-$(date +%Y%m%d).tgz /opt/pier/data/beszel
docker start pier-beszel How it compares
| vs Prometheus + Grafana + Alertmanager | The "standard" cloud-native stack — powerful, complex, resource-heavy. Beszel is the simpler answer for small fleets where you don't need PromQL or 30 dashboards. |
| vs Netdata | Netdata is per-host real-time monitoring with second-level granularity. Beszel is multi-host aggregated monitoring with minute-level granularity. Use both for different goals. |
| vs Uptime Kuma | Uptime Kuma monitors endpoints from outside (HTTP/HTTPS/TCP/ping). Beszel monitors servers from inside (CPU, RAM, Docker stats). Pair them — Kuma for "is the URL reachable?", Beszel for "is the host healthy?". |
| vs Zabbix | Zabbix is heavyweight enterprise monitoring. Beszel is lightweight homelab/small-team monitoring. Different worlds; pick by team size and metric requirements. |
Frequently asked questions
How do agents authenticate?
What metrics does Beszel collect?
Retention policy?
Alerting channels supported?
Multi-user / RBAC?
How is it different from PRTG / Nagios?
What version does Pier deploy?
Related services
Deploy on your VPS
Beszel is a minimal, modern server monitoring stack — one hub container plus tiny agents on each server you want to watch. Built on SQLite + PocketBase, it ships a polished web UI, Docker stats, alerts via email/SMS/Telegram/Discord/Slack/Gotify, and a sub-50 MB resource footprint. The "I just want server CPU graphs and alerts" answer without standing up Prometheus + Grafana + Alertmanager.
Deploy this service →