Skip to main content

Self-Host Beszel: Lightweight Server Monitoring 2026

·OSSAlt Team
beszelmonitoringserverself-hostingdockerdevops2026

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

FeatureBeszelNetdataUptime Kuma
FocusServer metricsDeep system metricsUptime/HTTP checks
Agent size~5MB~100MBN/A (agentless)
RAM per agent~10MB~200MBN/A
Docker statsYes (per container)YesDocker ping only
Granularity10s-60s1s20s-300s
SetupVery simpleModerateVery simple
AlertingEmail, webhook, ntfyEmail, Slack, PD90+ channels
Status pageNoNoYes

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

  1. Hub → + Add System
  2. Name: prod-server-1
  3. Host: 192.168.1.10 (or hostname)
  4. Port: 45876
  5. Copy the KEY → set it as KEY env var on the agent
  6. 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:

MetricThresholdDurationSeverity
CPU> 90%5 minWarning
RAM> 85%5 minWarning
Disk> 90%ImmediateCritical
Network> 100 MB/s1 minInfo

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.

Comments