Self-Hosting with Beszel: Monitor Your Entire VPS Fleet
Once you have more than one server, you need visibility โ and you need it without paying for SaaS monitoring tools or running a heavyweight observability stack. Beszel fills that gap cleanly. It is a lightweight, self-hosted server monitoring dashboard that aggregates system metrics from multiple machines into a single interface. This article covers why Beszel stands out, how to set it up for multi-server environments, and how to make it work in production.
Why Beszel for Self-Hosted Monitoring?
Most self-hosted monitoring solutions fall into two camps: too simple (just uptime checks) or too complex (full Prometheus + Grafana stacks). Beszel sits in between โ it provides actionable system metrics without requiring you to learn PromQL or maintain a multi-container observability platform.
Key advantages:
- Minimal resource footprint: Hub runs on 512 MB RAM. Agents use under 10 MB RAM each.
- Zero external dependencies: SQLite-backed, no Postgres or Redis required.
- Hub + Agent architecture: One hub, unlimited monitored servers.
- Clean default UI: Charts for CPU, memory, disk I/O, and network โ no configuration required.
- Runs anywhere: VPS, homelab, bare metal, Raspberry Pi.
Recommended VPS for Running the Beszel Hub
| Provider | Price | RAM | Storage | Standout Feature |
|---|---|---|---|---|
| Hetzner Cloud | 4.15 EUR/mo | 4 GB | 40 GB NVMe | Best EU value |
| Contabo VPS | 5.99 EUR/mo | 8 GB | 200 GB NVMe | Max storage retention |
| Linode (Akamai) | 5 USD/mo | 1 GB | 25 GB SSD | Affordable global |
| Vultr | 6 USD/mo | 1 GB | 25 GB SSD | 32 locations |
| DigitalOcean | 6 USD/mo | 1 GB | 25 GB SSD | Easiest onboarding |
Monitoring Use Cases
1. Homelab Fleet Monitoring
If you run several VPS instances, a NAS, and a local server, Beszel gives you a single pane of glass. Install the agent on every machine and view all metrics from one URL. No need to SSH into each box to check if a disk is filling up.
2. Production VPS Oversight
Self-hosters running apps like Nextcloud, Gitea, or Mastodon can use Beszel to correlate spikes in CPU or memory usage with traffic events. The historical charts make it easy to identify resource trends before they become outages.
3. CI/CD Build Server Monitoring
If you run Woodpecker CI, Drone, or Gitea Actions, build jobs can spike CPU and memory. Beszel lets you see exactly when build jobs are taxing your server and make rightsizing decisions.
4. VPN and Network Appliance Monitoring
Agents can run on WireGuard or headscale nodes, reporting network throughput and system health without exposing those servers to public internet.
Multi-Server Setup
Architecture
[Monitored Server 1] -- beszel-agent --> [Beszel Hub VPS:8090]
[Monitored Server 2] -- beszel-agent --> [Beszel Hub VPS:8090]
[Monitored Server N] -- beszel-agent --> [Beszel Hub VPS:8090]
The hub is your central VPS. Each monitored server runs the agent, which polls local metrics and reports them to the hub.
Deploying the Hub
docker run -d \
--name beszel \
--restart unless-stopped \
-p 8090:8090 \
-v beszel_data:/beszel_data \
henrygd/beszel
Deploying Agents at Scale
For each monitored server, generate a key in the Beszel dashboard (Add Server), then run:
docker run -d \
--name beszel-agent \
--restart unless-stopped \
--network host \
-e KEY="<server-specific-key>" \
henrygd/beszel-agent
You can automate agent deployment across your fleet with Ansible. Example task:
- name: Deploy Beszel agent
community.docker.docker_container:
name: beszel-agent
image: henrygd/beszel-agent:latest
restart_policy: unless-stopped
network_mode: host
env:
KEY: "{{ beszel_agent_key }}"
Alerts and Notifications
Beszel supports webhook-based alerts. You can configure thresholds for:
- CPU usage (e.g., alert when > 85% sustained)
- Memory usage (e.g., alert when > 90%)
- Disk usage (e.g., alert when > 80%)
Setting Up a Discord Alert
- In your Discord server, go to Server Settings > Integrations > Webhooks and create a new webhook.
- Copy the webhook URL.
- In Beszel, go to Settings > Notifications, add a new webhook, and paste the URL.
- Configure per-server alert thresholds in the server settings panel.
Setting Up a Slack Alert
Use the same webhook flow โ create an incoming webhook in Slackโs app directory, copy the URL, and add it in Beszelโs notification settings.
Integrations
Reverse Proxy with Caddy
monitor.yourdomain.com {
reverse_proxy localhost:8090
}
Caddy handles automatic HTTPS via Letโs Encrypt.
Backup with Restic
Since Beszel uses SQLite, backups are simple:
restic -r s3:s3.amazonaws.com/your-bucket backup /var/lib/docker/volumes/beszel_data/_data/
Schedule with cron:
0 3 * * * restic -r s3:s3.amazonaws.com/your-bucket backup /var/lib/docker/volumes/beszel_data/_data/ --quiet
Uptime Kuma Companion
Beszel handles system metrics; Uptime Kuma handles service health checks. Running both on the same VPS gives you comprehensive coverage โ Beszel tells you if a server is struggling, Uptime Kuma tells you if a specific service is down.
Performance and Retention
Beszelโs SQLite database grows as you add servers and increase retention windows. Rough estimates:
- 1 server, default retention: ~50 MB/year
- 10 servers, default retention: ~500 MB/year
- 50 servers, default retention: ~2.5 GB/year
Contaboโs 200 GB NVMe easily handles even large fleets for years without needing to trim historical data.
FAQs
Is Beszel secure to expose to the public internet?
Use HTTPS via a reverse proxy and set a strong admin password. Beszel does not currently support multi-user authentication or OIDC, so it is best accessed over a VPN or reverse proxy with additional auth (e.g., Authelia or Caddyโs basicauth).
Can Beszel replace Grafana + Prometheus for basic monitoring?
For system metrics on a small to medium fleet (under 100 servers), yes. Beszel covers the core metrics that most self-hosters need without the operational complexity of a full Prometheus stack. For custom metrics, log aggregation, or alerting pipelines, a Prometheus-based stack is more appropriate.
How do I update Beszel?
Pull the latest image and recreate the container:
docker pull henrygd/beszel:latest
docker compose down && docker compose up -d
Your data persists in the named volume.
Self-hosting with Beszel is one of the most efficient ways to maintain visibility across a distributed VPS fleet without operational overhead. For more VPS recommendations, see our full comparison.