Skip to main content
[ PIER ]

Beszel

Lightweight server monitoring without Prometheus complexity.

Service #monitoring#server#docker#alerts#metrics

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. 1 Open the Pier dashboard and click Add service.
  2. 2 Pick Beszel from the template list.
  3. 3 Choose the version, set a service name, and Pier provisions the container, storage, and ports automatically.
  4. 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

Install agent on a remote server (one-liner) bash
curl -sL https://get.beszel.dev | sh -s -- \
  --hub https://beszel.example.com \
  --token <token-from-hub-ui>
Docker compose agent (alternative install) yaml
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
Discord webhook alert config (in UI) text
Alert: CPU
Threshold: > 90%
For: 5 minutes
Channel: Discord
Webhook URL: https://discord.com/api/webhooks/...
Backup hub data bash
# 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?
Each agent has a public key registered in the hub. The hub initiates connections to agents over WireGuard or SSH tunnels — no inbound ports required on the agent side.
What metrics does Beszel collect?
CPU, memory, swap, disk space, disk I/O, network throughput per interface, system load, uptime, plus per-Docker-container CPU/memory/network/IO. Custom metrics via shell exec are on the roadmap.
Retention policy?
1-minute granularity for 1 day, 10-minute for 1 week, hourly for 30 days, daily forever. Configurable in hub settings.
Alerting channels supported?
Email (SMTP), Discord, Slack, Telegram, Gotify, ntfy, Twilio SMS, generic webhook. Multiple channels per alert.
Multi-user / RBAC?
PocketBase auth backs Beszel — basic users + read-only viewers. No granular per-server permissions yet; everyone with login sees all hosts.
How is it different from PRTG / Nagios?
Modern UI, sub-1 MB agent binary, sub-100 MB hub. PRTG and Nagios are 15-year-old enterprise tools with very different operational models.
What version does Pier deploy?
The official henrygd/beszel image, defaulting to the latest tag. Pin a version in the selector if you need stability across upgrades.

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 →