Uptime Kuma vs Beszel: Which Monitoring Tool?
Summary
Uptime Kuma and Beszel monitor different things. Uptime Kuma checks whether your services are reachable — pinging URLs, ports, DNS records, and Docker containers. Beszel tracks system-level metrics — CPU, RAM, disk, network, GPU, and temperature across multiple servers. Most self-hosters should start with Uptime Kuma for availability monitoring, then add Beszel when they need system metrics for capacity planning or troubleshooting. Running both together costs under 150MB of RAM total.
They Solve Different Problems
The confusion between these tools comes from the word “monitoring.” Both monitor things, but at completely different layers:
Uptime Kuma answers: “Is my Nextcloud responding? Is my DNS resolving? Did my SSL certificate expire? Is my Docker container running?”
Beszel answers: “Why is my server slow? Which container is eating all the RAM? Is my disk filling up? What’s my GPU temperature under load?”
Uptime Kuma watches from the outside in — the same perspective as your users hitting a URL. Beszel watches from the inside out — the same perspective as an admin SSH’d into the box.
Feature Comparison
| Feature | Uptime Kuma 2.2.1 | Beszel 0.18.4 |
|---|---|---|
| Primary function | Service uptime/availability | System resource metrics |
| Monitors | URLs, TCP, DNS, ping, WebSocket, Docker, Steam, JSON query | CPU, RAM, disk, network, temp, GPU, battery, S.M.A.R.T. |
| Multi-server | Single server (monitors remote services via network) | Hub + agent model (agent on each server) |
| Architecture | Single Node.js container | Go hub + Go agent per server |
| Notification channels | 90+ (Telegram, Discord, Slack, email, Pushover, Gotify, ntfy, Matrix, webhooks) | Webhooks, Telegram, Shoutrrr integrations |
| Status pages | Yes (public, customizable, multiple with domain mapping) | No |
| GPU monitoring | No | Yes (NVIDIA via NVML, AMD via sysfs, Apple Silicon) |
| S.M.A.R.T. disk health | No | Yes (dedicated monitoring page, hourly collection) |
| Battery monitoring | No | Yes (charge tracking, low battery alerts) |
| Systemd service monitoring | No | Yes (service status tracking) |
| Container-level metrics | Status only (up/down) | CPU, RAM, network per container |
| Multi-user | Single admin with 2FA | Multi-user with OAuth/OIDC, per-user system management |
| API | WebSocket-based (real-time) | REST API with bearer tokens |
| Maintenance windows | Yes | Quiet hours (alert silencing) |
| Check interval | 20 seconds minimum | Continuous agent reporting |
| Outbound heartbeats | No | Yes (Healthchecks.io, BetterStack integration) |
| Language | JavaScript/Vue | Go/TypeScript |
| Database | SQLite | SQLite (PocketBase) |
| Mobile app | No (responsive web UI) | No (responsive web UI) |
| GitHub stars | 83.5k | 19.7k |
Docker Setup Comparison
Uptime Kuma
One container, one volume, done:
services:
uptime-kuma:
image: louislam/uptime-kuma:2.2.1
volumes:
- uptime-kuma-data:/app/data
ports:
- "3001:3001"
restart: unless-stopped
volumes:
uptime-kuma-data:
Start it, open http://your-server:3001, create an admin account. Add your first monitor in under two minutes.
Beszel Hub
The central dashboard that aggregates data from all agents:
services:
beszel-hub:
image: henrygd/beszel:0.18.4
volumes:
- beszel-data:/beszel_data
ports:
- "8090:8090"
restart: unless-stopped
volumes:
beszel-data:
Beszel Agent (on each monitored server)
Deploy on every server you want to monitor:
services:
beszel-agent:
image: henrygd/beszel-agent:0.18.4
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
TOKEN: "your-agent-token" # Generated by the hub
KEY: "your-ssh-key" # Generated by the hub
PORT: "45876"
network_mode: host
restart: unless-stopped
Beszel requires one extra step per server — deploy the agent and register it with the hub. Not hard, but it scales linearly with your server count. The agent is tiny (~10MB RAM) so it won’t impact the monitored system.
Performance and Resource Usage
| Metric | Uptime Kuma | Beszel Hub | Beszel Agent |
|---|---|---|---|
| RAM (idle) | ~80MB | ~30MB | ~10MB |
| RAM (10 services) | ~85MB | ~35MB | ~10MB per server |
| RAM (50 services) | ~100MB | ~50MB | ~10MB per server |
| RAM (100+ services) | ~120-150MB | ~80MB | ~10MB per server |
| CPU (idle) | Minimal (~1-2%) | Minimal (<1%) | Minimal (<1%) |
| Disk (application) | ~50MB | ~20MB | ~15MB |
| Startup time | 2-3 seconds | <1 second | <1 second |
| Language runtime | Node.js 20.4+ | Native Go binary | Native Go binary |
Uptime Kuma’s memory grows with monitor count — each HTTP monitor maintains connection state and response time history. At 100 monitors you’re still well under 200MB.
Beszel’s hub RAM scales with the number of agents and data retention period. The agent itself is fixed at ~10MB regardless of what’s running on the server because it reads system metrics from /proc and /sys, not from application memory.
For a typical homelab (5 servers, 30 monitored services): Uptime Kuma ~90MB + Beszel hub ~40MB + 5 agents at ~10MB = ~180MB total for comprehensive monitoring.
Alerting
Uptime Kuma has the clear advantage. Over 90 notification integrations out of the box — Telegram, Discord, Slack, Microsoft Teams, Email (SMTP), Pushover, Gotify, ntfy, Matrix, PagerDuty, Webhooks, and dozens more. Configure different notification channels per monitor. Set alert thresholds, retry counts, and notification intervals. The alert configuration UI is excellent.
Beszel supports webhooks, Telegram, and Shoutrrr-based integrations. Shoutrrr covers many popular services (Slack, Discord, Teams, email), but the configuration isn’t as polished as Uptime Kuma’s per-monitor setup. Since v0.17.0, Beszel supports quiet hours for suppressing alerts during maintenance windows.
Alert types differ by tool:
| Alert Type | Uptime Kuma | Beszel |
|---|---|---|
| Service down | Yes | No (not its job) |
| Response time degradation | Yes | No |
| SSL certificate expiry | Yes | No |
| DNS resolution failure | Yes | No |
| CPU threshold | No | Yes |
| RAM threshold | No | Yes |
| Disk usage threshold | No | Yes |
| Temperature threshold | No | Yes |
| GPU usage threshold | No | Yes (since v0.16.0) |
| Low battery | No | Yes (since v0.18.0) |
| S.M.A.R.T. disk health | No | Yes (since v0.15.0) |
| Systemd service status | No | Yes (since v0.16.0) |
| Docker container status | No | In progress |
What Beszel Added Since Early Versions
Beszel has matured significantly. Key additions:
- GPU monitoring (v0.15.0+): NVIDIA via NVML, AMD via sysfs, Apple Silicon. Per-GPU usage, temperature, and power draw. GPU usage alerts since v0.16.0.
- S.M.A.R.T. disk health (v0.15.0+): Dedicated monitoring page with hourly background collection. Configurable intervals via
SMART_INTERVAL. Alpine image variant includessmartmontools. - Battery monitoring (v0.18.0+): Charge tracking and low battery alerts for laptops and UPS-connected systems.
- Systemd service monitoring (v0.16.0+): Track whether critical services (like your reverse proxy or database) are running.
- Outbound heartbeat monitoring (v0.18.4): Push uptime data to external services like Healthchecks.io and BetterStack. Useful when your monitoring itself needs to be monitored.
- Multi-hub support (v0.10.0+): A single agent can report to multiple Beszel hubs — useful for team environments where different groups manage overlapping infrastructure.
- Windows and FreeBSD support (v0.17.0+): Hub and agent builds for non-Linux systems.
- Container-level metrics: Per-container CPU, memory, and network usage history. Not just “is the container running” but “how much RAM is this container using over time.”
What the Community Says
The self-hosting community generally agrees these tools are complementary, not competitive. Common patterns from r/selfhosted and r/homelab discussions:
“I replaced Grafana+Prometheus with Beszel.” Users who were running the full Grafana stack (Prometheus + Node Exporter + Grafana) just for basic system metrics often switch to Beszel. The monitoring depth is less, but setup time goes from hours to minutes and maintenance burden drops significantly.
“Uptime Kuma is the first thing I install on a new server.” It’s the most recommended monitoring tool in the self-hosting community. The setup is trivial, the UI is polished, and 90+ notification channels means it works with whatever messaging platform you already use.
“I run both — Uptime Kuma told me Nextcloud was down, Beszel told me the disk was full.” This is the canonical use case for running both. Uptime Kuma detects the symptom (service unreachable), Beszel provides the root cause (resource exhaustion).
“Beszel is what Netdata should have been — lightweight and focused.” Users frustrated by Netdata’s resource usage (~200-500MB RAM) or Grafana’s complexity find Beszel hits the sweet spot of useful system metrics without the overhead.
Use Cases
Choose Uptime Kuma If…
- You need to know when services go down (the most common monitoring need)
- You want public status pages for users or clients
- You have services across multiple hosting providers or VPS instances
- You need rich alerting with 90+ notification channels
- You want maintenance window scheduling with advance notification
- You’re monitoring external services you don’t control (APIs, third-party websites, DNS)
- You want sub-minute check intervals (20 seconds minimum)
Choose Beszel If…
- You need system-level resource monitoring across multiple servers
- You want CPU/RAM/disk/GPU historical trends for capacity planning
- You need temperature monitoring for Raspberry Pi, fanless devices, or GPU workloads
- You want S.M.A.R.T. disk health tracking to catch failing drives early
- You need per-container resource metrics (which Docker container is using the most RAM?)
- You want an extremely lightweight agent that won’t impact monitored systems
- You’re running GPU workloads (AI/ML, transcoding) and need GPU metrics
- You already use Grafana+Prometheus and want something simpler
Run Both If…
- You want the full picture: availability AND resource metrics
- You have 3+ servers and need both “is it up?” and “how’s it performing?”
- You want Uptime Kuma’s alerting for service downtime + Beszel’s resource trends for root cause analysis
- Combined RAM: ~180MB for a 5-server setup with 30 monitors — negligible on any modern server
Which Uses Less Resources?
Beszel wins on raw numbers. The hub uses ~30MB and each agent uses ~10MB. Uptime Kuma uses ~80MB idle. But neither tool is resource-intensive — both run comfortably on a Raspberry Pi 4 alongside dozens of other containers. Resource usage shouldn’t be a deciding factor.
Can I Run Both?
Yes, and many self-hosters do. There’s zero overlap in functionality — Uptime Kuma checks service availability from the network level, Beszel tracks system resources from the OS level. They don’t interfere with each other and their combined footprint is under 200MB for a typical setup.
A common setup:
- Uptime Kuma on your primary server, monitoring all your services via HTTP/TCP/ping
- Beszel hub on the same server, with agents on every server in your homelab
- Uptime Kuma alerts → “something broke” (Telegram notification)
- Beszel dashboard → “here’s why it broke” (disk full, RAM exhausted, CPU pegged)
Final Verdict
Start with Uptime Kuma. Knowing when services go down is the baseline monitoring requirement for any self-hosting setup. Uptime Kuma’s single-container deployment, polished UI, and 90+ notification integrations make it the obvious first choice. It’s the most popular self-hosted monitoring tool for a reason.
Add Beszel when you need deeper visibility. Once you have multiple servers, start hitting unexplained performance issues, or want to track GPU/disk health over time, Beszel fills the gap that Uptime Kuma can’t. Its lightweight agents add negligible overhead to monitored systems, and features like S.M.A.R.T. monitoring and GPU tracking have no equivalent in Uptime Kuma.
They’re complementary, not competitive. The best monitoring setup for most self-hosters is both tools running together — Uptime Kuma for the “is it up?” layer and Beszel for the “how’s it performing?” layer.
FAQ
Can Beszel replace Uptime Kuma?
No. Beszel monitors system resources (CPU, RAM, disk, GPU, temperature) on servers where you install its agent. It doesn’t check whether a URL is responding, whether a port is open, or whether your SSL certificate is about to expire. They monitor different layers — Beszel watches the infrastructure, Uptime Kuma watches the services running on that infrastructure.
Can Uptime Kuma monitor system resources like CPU and RAM?
Not directly. Uptime Kuma monitors service availability — is port 443 responding? Is the HTTP status code 200? You can indirectly detect resource exhaustion when response times spike, but for actual CPU/RAM/disk metrics, use Beszel, Netdata, or Grafana+Prometheus.
Which uses less resources?
Beszel. Its agent uses ~10MB RAM and the hub uses ~30MB. Uptime Kuma uses ~80MB idle. But both are lightweight enough to run on a Raspberry Pi — resource usage shouldn’t drive this decision.
Can I run both together?
Yes, and it’s the recommended setup for serious self-hosters. Uptime Kuma handles availability monitoring with rich alerting. Beszel handles system metrics with lightweight agents. Combined overhead is under 200MB for a typical homelab.
What about Grafana + Prometheus instead?
Grafana + Prometheus is significantly more powerful but also significantly more complex. You need Prometheus, Node Exporter, and Grafana at minimum — three containers, PromQL queries, and dashboard configuration. If you want a full observability stack with custom dashboards and long-term metric retention, go with Grafana. If you want fast, simple monitoring with minimal setup, Uptime Kuma + Beszel covers 90% of self-hosting monitoring needs in a fraction of the setup time.
Does Beszel support GPU monitoring?
Yes. Since v0.15.0, Beszel supports NVIDIA GPUs (via NVML), AMD GPUs (via sysfs since v0.18.3), and Apple Silicon. It tracks GPU usage, temperature, and power draw with per-GPU granularity. GPU usage alerts were added in v0.16.0.
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments