Every self-hoster eventually asks the same question: “Is my server OK right now?”
The answer used to require setting up Prometheus, node_exporter, cAdvisor, and Grafana. Four components, YAML config files, PromQL queries, and a few hours of dashboard building before you could see a single CPU graph.
In 2026, there are simpler options. This guide reviews the 7 best server monitoring tools for a fleet of 1-20 servers, what each costs in RAM and setup time, and which combination makes sense for your setup. Every tool here is self-hosted and open source, so the only cost is the small server it runs on. (Updated June 2026.)
How I compared these: RAM and footprint figures come from each tool’s own documentation plus independent 2026 benchmarks; every price and free-tier limit was checked against the vendor’s own pricing page in June 2026. Where a tool’s marketing number and real-world measurements differ (Beszel’s “under 10MB” agent, for example), I note both.
At a Glance: Which Server Monitoring Tool to Pick
Short on time? Here is the verdict before the details.
- Lightweight default (1-20 servers): Beszel. A roughly 10-15MB agent that answers “is my server healthy” with near-zero overhead. One-click $3/mo deploy on InstaPods.
- Service uptime and status pages: Uptime Kuma. It measures availability, Beszel measures resources, and they do not overlap, so most people run both.
- Deep, one-second-resolution metrics: Netdata (batteries-included) or the Grafana + Prometheus stack (PromQL, custom dashboards).
- Docker hosts: Beszel for container stats + Dozzle for logs, with cAdvisor if you want raw Prometheus-scrapeable container metrics.
- Proxmox: Pulse for per-VM and per-LXC detail, Beszel for everything else.
Short version: most people running 1-20 servers should deploy Beszel and add a second tool only when they outgrow it. The rest of this guide tests each one on RAM, setup time, and what it actually monitors, plus the supporting tools (cAdvisor, Gatus) and heavyweights that round out a real stack.
Why Self-Hosted Monitoring Beats SaaS for 1-20 Servers
Every tool in this guide is a self-hosted monitoring tool, and for a fleet of 1-20 servers that is usually the right call for two reasons: cost and data ownership.
Hosted monitoring is priced per host. Datadog Infrastructure starts at around $15 per host per month, Netdata Cloud’s paid Business plan is $4.50 per node per month, and Grafana Cloud bills $8 per additional 1,000 active metric series. A single Docker host can generate 5,000+ series, so three or four boxes push you into real money fast. A self-hosted monitoring pod is a flat $3/mo on InstaPods and watches as many servers as you point agents at.
The other reason is privacy. With self-hosted monitoring, your CPU graphs, process lists, and logs never leave a machine you control, instead of being ingested by a third-party SaaS. The big platforms (Datadog, New Relic, Dynatrace) are genuinely powerful for large estates, but for a homelab or a small VPS fleet they are expensive overkill. The open-source dashboards below answer the same “is my server OK” question for a fraction of the price. If you are new to running your own apps, open-source hosting and the self-hosted apps directory are good starting points.
Beszel: The Lightweight Server Monitoring Default (10MB Agent)
Beszel is a server monitoring tool built as a single Go binary. It tracks CPU, memory, disk, network, and Docker container stats with a clean web dashboard. As of v0.18.7 (April 2026) it is the lightweight default most self-hosters reach for first.
Why it’s popular: The agent uses roughly 10-15MB of RAM at idle. Beszel markets it as “under 10MB,” and independent 2026 benchmarks measure it between about 12MB and 23MB depending on the box. Even at the high end, that is a fraction of Netdata (200-500MB) or a full Grafana stack (500MB+). On a Raspberry Pi or cheap VPS, that difference matters. This is the lightweight monitoring agent the rest of the list is measured against.
Setup time: Under 5 minutes. Deploy the hub, run the agent on each server with a single command, and monitoring starts immediately. No configuration files, no query languages, no dashboard building. Running it manually means a docker-compose hub plus an agent per server; on InstaPods it is a one-click $3/mo deploy.
What it monitors: CPU, memory, disk, network, temperature, GPU usage (NVIDIA via NVML/nvtop, with experimental Apple Silicon support), per-container Docker stats, systemd service metrics, S.M.A.R.T. disk health, and detailed disk I/O (utilization, await, queue depth). It stores historical data so you can look back days or weeks. Several gaps people assume Beszel has are now closed: systemd service monitoring, S.M.A.R.T. disk health with failure alerts, and disk I/O detail all shipped in the v0.17-v0.18 releases.
What it doesn’t do: No arbitrary application-defined custom metrics (the open feature request henrygd/beszel #731 is not shipped as of v0.18.7), no PromQL queries, no log aggregation, and no AI anomaly detection. The dashboard layout is fixed, so you can’t build custom charts. If you need application metrics or a query language, pair Beszel with Prometheus + Grafana. For deeper disk-health monitoring than Beszel’s S.M.A.R.T. page, NAS and large-array owners can add Scrutiny (MIT, ~100-200MB with its InfluxDB backend) for historical SMART trends and Backblaze failure-rate context; for most single-disk setups, Beszel’s built-in alerts are enough.
Best for: Homelabs, small VPS fleets, Docker-heavy setups, and anyone who wants server monitoring without the complexity. Choose Beszel when you want resource metrics for 1-20 servers with near-zero overhead, and outgrow it when you need application metrics, PromQL, or log search. You can deploy Beszel on InstaPods in one click for $3/mo.
Netdata: The Deep Metrics Platform
Netdata is the opposite end of the spectrum. It collects over 2,000 metrics at one-second resolution with AI-powered anomaly detection.
Resource cost: Netdata agents use 200-500MB of RAM per node. The Netdata Cloud free Community tier covers 5 nodes. Beyond that, the paid Business plan costs $4.50 per node per month (billed annually).
Setup time: 10-15 minutes for the agent install. Cloud signup adds another 5-10 minutes. Customizing alerts and dashboards requires editing YAML configuration files.
The overwhelm problem: Netdata shows 2,000+ charts by default. For most self-hosters who just want to know “is my CPU OK and is Docker behaving,” this is information overload. You’re scrolling through charts you’ll never look at to find the three metrics you actually care about.
Best for: Teams that need deep observability, one-second resolution, or AI anomaly detection across complex infrastructure. If you’re running a production SaaS with 50+ nodes, Netdata’s depth is genuinely useful. Compare Beszel vs Netdata for a lightweight-vs-deep breakdown.
Dozzle: The Docker Log Viewer
Dozzle solves a completely different problem: reading Docker container logs. It’s not a metrics tool, it’s a log viewer with a web UI.
What it does: Streams real-time logs from all your Docker containers in a clean interface. Supports regex search, JSON log auto-detection, and multi-host viewing. It can also query logs with SQL using DuckDB under the hood. The v10.0 release (February 2026) added webhook alerts and a redesigned notifications page, and Dozzle now supports Kubernetes in addition to Docker and Swarm.
What it doesn’t do: No CPU/memory/disk metrics. No historical metric graphs. No threshold alerts for resource usage. If a container is silently eating all available RAM without logging about it, Dozzle won’t catch it.
Why it pairs with Beszel: This is the most common self-hosted monitoring stack in 2026: Beszel for metrics (“something is using too much CPU”) and Dozzle for logs (“let me read the error messages to find out why”). Both are lightweight, both take minutes to set up, and together they replace what used to require Grafana + Prometheus + Loki. Compare Beszel vs Dozzle for the metrics-vs-logs split.
Best for: Anyone running Docker containers who needs to quickly check logs without SSH-ing into the server and running docker logs.
Best Docker Monitoring Tools: Beszel, Dozzle, and cAdvisor
If your servers are mostly Docker hosts, three tools cover the job, and you have already met two of them.
Beszel gives you per-container CPU, memory, and network stats inside its standard dashboard, with zero config and the same ~10-15MB agent. Dozzle handles the other half: real-time container logs with regex and DuckDB SQL search, so you read the error instead of SSH-ing in for docker logs.
cAdvisor is the third option and the most misunderstood. It is Google’s open-source container-metrics daemon (Apache-2.0, roughly 50-150MB resident). It reads each container’s Linux cgroup data and exposes raw, Prometheus-scrapeable per-container CPU, memory, network, and filesystem time-series. That is the one job none of the lightweight tools do. But it ships no dashboard of its own, so you still need Prometheus to store the data and Grafana to see it. Pair it with node_exporter (the host-metrics equivalent) and you have rebuilt the exact four-component stack Beszel removes. cAdvisor is the right answer only when you specifically want queryable container metrics in an existing Prometheus setup.
One 2026 note: enterprise Docker monitoring is shifting toward eBPF and kernel-level tools (Datadog, Sysdig, Dynatrace) for zero-instrumentation container visibility. Powerful, but far past what a homelab or small VPS fleet needs.
Grafana + Prometheus: The Enterprise Standard
The Grafana + Prometheus stack is still the gold standard for production monitoring. It’s infinitely customizable, supports thousands of data sources, and powers monitoring at companies like Spotify and GitLab.
The cost: A full monitoring stack needs Prometheus (scraping), node_exporter (host metrics), cAdvisor (Docker), and Grafana (visualization). That’s four components, each with its own configuration. Total RAM: 500MB-1GB+ depending on cardinality. Setup time: 2-8 hours for a working dashboard. Modern Grafana setups increasingly use a single collector (Grafana Alloy) instead of node_exporter + cAdvisor + Promtail separately. It simplifies collection but still needs Prometheus + Grafana to be useful.
Grafana Cloud: Starts free with 10,000 active metrics series. A single server with Docker can generate 5,000+ series. Monitor 3 servers and you’re into the paid tier at $8 per 1,000 series, easily $120/mo for 5 Docker hosts.
Netdata vs Prometheus: These come up together a lot, and they sit at opposite ends. Netdata is a batteries-included, local-first agent that shows 1-second-resolution metrics immediately with no query language to learn. Prometheus is a pull-based system that scrapes metrics on an interval (commonly 15 seconds), stores them, and exposes PromQL, but it needs Grafana to visualize anything. In one 2026 benchmark, Netdata used about 35% less CPU than Prometheus (4.93 vs 7.56 cores), and a 15-second scrape interval can miss short spikes that Netdata catches. Choose Netdata for instant visibility, Prometheus for long-term, queryable, customizable observability.
When it makes sense: If you need custom dashboards, PromQL queries, alerts routed to PagerDuty, or metrics from 15 different data sources in one view, Grafana is the right choice. For everyone else, it’s overkill.
Best for: Production infrastructure teams, SREs, and anyone who considers PromQL a feature rather than a barrier. Compare Beszel vs Grafana Cloud for a self-hosted-vs-hosted cost breakdown.
Proxmox Pulse: The Proxmox Specialist
Pulse is a real-time monitoring dashboard that started as a Proxmox VE specialist. If you run Proxmox, it gives you instant visibility into nodes, VMs, and LXC containers that Proxmox’s built-in tools don’t surface well.
What makes it different: WebSocket-based updates give near-instant feedback with no polling delays, and it auto-discovers all your VMs and containers. The core is free and open source (MIT). A paid Pulse Pro tier adds AI root-cause analysis (Pulse Patrol) and Auto-Fix safe-remediation, plus RBAC, audit logging, and longer history. Check pulserelay.pro for current pricing rather than trusting any flat monthly figure you see quoted elsewhere.
The scope: Pulse is Proxmox-first, but as of 2026 it also monitors Docker and Kubernetes (plus Proxmox Backup Server and Mail Gateway), so it is no longer Proxmox-only. Where it still shines is per-node, per-VM, and per-LXC Proxmox visibility through the Proxmox API, which is auto-discovery Beszel does not do.
Beszel and LXC: This is a common point of confusion. Beszel can run on a Proxmox host or inside an LXC guest and report that machine’s CPU, memory, disk, and Docker stats, but it does not enumerate your Proxmox VMs and LXC guests through the API the way Pulse does, and an agent inside an LXC tends to show host-level stats unless you use the binary install. So for per-VM and per-LXC Proxmox visibility, use Pulse, and use Beszel for your non-Proxmox boxes. On a pure Docker VPS or Raspberry Pi, Beszel is still the lighter pick.
Best for: Proxmox environments where you want deeper VM/LXC visibility than Beszel or Netdata provide. Compare Beszel vs Pulse for the full split.
Glances: The Terminal Power Tool
Glances is a cross-platform system monitoring tool written in Python. It runs in the terminal and shows CPU, memory, disk, network, processes, and sensor data in a single view.
What makes it different: Glances goes deeper than most tools on per-process metrics. See exactly which process is eating CPU or memory, sorted in real-time. It also reads hardware sensors (temperature, fan speed, voltage) that Beszel and Dozzle don’t touch.
The trade-off: Glances is terminal-first. There’s a web UI mode (glances -w), but it’s basic. No multi-server dashboard, no built-in historical data (needs InfluxDB export), and 50-100MB RAM, not heavy, but 5x more than Beszel. For a pure interactive terminal view, btop is the modern htop (a few MB, run on demand), but unlike Glances it has no web UI, REST API, or remote multi-server mode, which is why Glances earns the always-available slot here.
Best for: SSH-heavy workflows where you want a quick htop replacement with more data. Pairs well with Beszel for always-on monitoring while Glances handles ad-hoc debugging. Compare Beszel vs Glances for web dashboard vs terminal.
Uptime Kuma: The Availability Monitor
Uptime Kuma (now on its 2.x line) solves a different problem than the tools above: it monitors whether your services are reachable. HTTP, TCP, DNS, ping, Docker, gRPC, MQTT, if it has an endpoint, Uptime Kuma can monitor it.
Why it’s essential: Server metrics tools like Beszel tell you how your servers are performing. Uptime Kuma tells you if your services are accessible. A server at 10% CPU is meaningless if your website is returning 502s because of a misconfigured proxy.
The feature set: 90+ notification channels, built-in status pages, maintenance windows, SSL certificate monitoring, and check intervals down to 20 seconds. All for ~30-50MB of RAM (closer to 60-80MB once you are running 20-30 monitors).
Beszel vs Uptime Kuma: which do you need?
This is the question people ask most, so here is the head-to-head before the verdict. Beszel and Uptime Kuma do not overlap. Beszel watches resources from inside the server; Uptime Kuma watches availability from outside.
| Beszel | Uptime Kuma | |
|---|---|---|
| Answers | ”Is my server healthy?" | "Is my service reachable?” |
| Monitors | CPU, memory, disk, network, Docker stats | HTTP, TCP, DNS, ping, SSL, gRPC, MQTT |
| Perspective | Internal resource metrics | External checks |
| Status pages | No | Yes (built-in, customizable) |
| Alerting | Threshold alerts (email, webhook) | 90+ notification channels |
| RAM | ~10-15MB per agent | ~30-50MB (60-80MB at 20-30 monitors) |
| Best for | Catching overload before a crash | Knowing the instant a service goes down |
The right answer for most self-hosters is to run both: Beszel tells you a server is about to fall over, Uptime Kuma tells you the moment something actually went down. Combined they sit around 40-65MB of RAM and cost $6/mo on InstaPods ($3/mo each). For the full breakdown, see Beszel vs Uptime Kuma.
Gatus: the config-as-code alternative
If you prefer version-controlled, GitOps-style monitoring over a clicky UI, Gatus is the lightweight counterpart to Uptime Kuma. Where Uptime Kuma stores its config in SQLite, Gatus defines every health check (HTTP, TCP, ICMP, DNS, SSH, TLS) in a single declarative YAML file you keep in Git, then renders a status page from it. It is a single Go binary (Apache-2.0, ~10-40MB, lighter than Uptime Kuma’s Node app). Choose Gatus when you want reproducible config in version control; choose Uptime Kuma when you want a point-and-click UI, 90+ notification integrations, and per-monitor history without editing YAML. Both answer “is my service reachable” and both pair cleanly with Beszel for the resource side.
Best for: Anyone who needs to know when their website, API, or service goes down. Deploy Uptime Kuma on InstaPods for $3/mo.
Monitoring Stack Combinations: Lightweight, Homelab, Proxmox, and Enterprise
Most self-hosters don’t need just one tool. Here are the most effective combinations:
The Lightweight Stack (< 20MB RAM): Beszel + Dozzle. Server metrics + Docker logs. Covers 90% of monitoring needs for homelabs and small VPS fleets. Total cost: $3/mo on InstaPods.
The Complete Stack (< 80MB RAM): Beszel + Dozzle + Uptime Kuma. Add endpoint availability monitoring and status pages. Know when something breaks AND why. Total cost: $6/mo on InstaPods.
The Proxmox Stack: Beszel + Proxmox Pulse. Beszel for Docker hosts and general servers. Pulse for VM-level and LXC Proxmox visibility. Best of both worlds.
The Enterprise Stack (500MB+ RAM): Prometheus + Grafana for custom metrics and PromQL. Only if you need custom dashboards, multi-datasource views, or complex alerting rules.
Two things round out any of these stacks. For cron and backup jobs, a dead-man’s-switch like the self-hosted Healthchecks.io covers the “did my nightly backup actually run?” gap that metrics and uptime tools both miss: jobs ping a URL on success, and you get alerted when a ping goes missing. And to actually get pinged, route every tool’s alerts through a lightweight notification server like ntfy (~20MB, HTTP-native, with iOS and UnifiedPush apps) or Gotify, instead of wiring each tool to email separately.
Which Server Monitoring Tool Should You Choose?
Here’s the decision tree:
- Just want basic server monitoring? Start with Beszel. It covers 90% of what most self-hosters need with minimal resources.
- Need Docker logs too? Add Dozzle alongside Beszel. Together they cost less than 20MB of RAM and give you metrics + logs.
- Need to know when a service goes down? Add Uptime Kuma (or Gatus if you prefer config-as-code) for availability and status pages.
- Running Proxmox? Add Pulse for VM-level and LXC detail. Use Beszel for your non-Proxmox servers.
- Need deep observability? Use Netdata for one-second resolution and AI anomaly detection, or Grafana + Prometheus for custom dashboards and PromQL.
- Want monitoring that also acts? Monit (~5MB, AGPL) is the classic lightweight self-healer: it can restart a crashed process instead of just alerting. Every other tool here observes only.
- Want the simplest path? Deploy Beszel on InstaPods for $3/mo, one click, no server management required.
Those are the best server monitoring tools for 1-20 servers in 2026. For most self-hosters, start with Beszel and add only what you outgrow it for.
Resource Usage Comparison
| Tool | RAM | Resolution | Setup | License | Best for |
|---|---|---|---|---|---|
| Beszel | ~10-15MB agent | 1 minute | 5 min | MIT | Lightweight metrics for 1-20 servers |
| Netdata | 200-500MB | 1 second | 15 min | GPL-3.0+ | Deep, one-second observability |
| Dozzle | ~10MB | Real-time (logs) | 2 min | MIT | Reading Docker container logs |
| cAdvisor | ~50-150MB | Scrape interval | 10 min | Apache-2.0 | Queryable container metrics in Prometheus |
| Glances | 50-100MB | Real-time | 2 min | LGPL-3.0 | Terminal / ad-hoc process debugging |
| Uptime Kuma | 30-50MB | 20s-5min | 5 min | MIT | Endpoint uptime + status pages |
| Gatus | ~10-40MB | Config-defined | 5 min (YAML) | Apache-2.0 | Config-as-code status pages |
| Grafana + Prometheus | 500MB-1GB+ | 15 seconds | 2-8 hours | AGPL/Apache | Custom dashboards + PromQL |
| Proxmox Pulse | ~50MB | Real-time (WebSocket) | 5 min | MIT | Per-VM/LXC Proxmox visibility |
| Checkmk (Raw) | ~1-2GB (server) | Agent-based | 30+ min | GPLv2 | Large mixed fleets you outgrow lightweight tools for |
Every tool above is self-hosted and open source, so your monitoring data stays on a machine you control (Netdata Cloud and Grafana Cloud send data to a SaaS only in their hosted modes). Checkmk anchors the heavy end: capable, with auto-discovery and a big plugin catalog, but its server wants ~1-2GB of RAM, well past this guide’s 1-20-server audience (Beszel vs Checkmk breaks down where the line is). Zabbix sits in the same enterprise tier - SNMP, network discovery, distributed proxies - and runs as a full server + database + web frontend, so Beszel vs Zabbix is the comparison to read if you only need server and Docker metrics.
The monitoring landscape has shifted. You don’t need a 4-component stack to answer “is my server healthy.” Start lightweight, add complexity only when you need it.
Deploy Beszel on InstaPods - one click, $3/mo, monitoring in 5 minutes.
FAQ
Beszel vs Uptime Kuma: which one do I actually need?
They measure different things, so for most people the answer is both. Beszel tracks resource health (CPU, memory, disk, Docker stats) and answers “is my server healthy,” while Uptime Kuma tracks availability (HTTP, TCP, ping, SSL) and answers “is my service reachable.” A server at 10% CPU is useless information if your site is returning 502s, which is exactly the gap Uptime Kuma fills. They do not overlap, so running both at roughly 40-65MB combined is the standard small-fleet setup.
Can I run Beszel and Uptime Kuma together?
Yes, and you should. They monitor different layers and do not conflict. Beszel handles internal resource metrics and Uptime Kuma handles external availability and status pages. On InstaPods you can deploy each as a one-click app for $3/mo, so the full metrics-plus-uptime stack runs at $6/mo.
What is the most lightweight self-hosted server monitoring tool?
Beszel is the lightest always-on option, with an agent measured at roughly 10-15MB of RAM at idle. Dozzle (logs) and Gatus (availability) are similarly light single Go binaries, while Netdata uses 200-500MB and a full Grafana + Prometheus stack uses 500MB-1GB+. For a pure on-demand terminal view, btop uses only a few MB but is not a remote or multi-server monitor.
Does Beszel support custom metrics?
Not arbitrary application-defined custom metrics as of v0.18.7 (June 2026). The custom-metrics feature request (henrygd/beszel #731) is open but not shipped, and there is no PromQL-style query language. Beszel has, however, added systemd service monitoring, S.M.A.R.T. disk health, and detailed disk I/O metrics in the v0.17-v0.18 releases. If you need fully custom application metrics, pair Beszel with Prometheus and Grafana.
Can Beszel monitor Proxmox or LXC containers?
Partly. Beszel can run on a Proxmox host or inside an LXC guest and report that machine’s CPU, memory, disk, and Docker stats. It does not enumerate Proxmox VMs and LXC guests through the Proxmox API the way Pulse does, and an agent inside an LXC tends to show host-level stats unless you use the binary install. For per-VM and per-LXC Proxmox visibility, use Pulse, and use Beszel for your non-Proxmox boxes.
How is Netdata different from Prometheus?
Netdata is a batteries-included, local-first agent that shows 1-second-resolution metrics immediately with no query language to learn. Prometheus is a pull-based system that scrapes metrics on an interval (commonly 15 seconds), stores them, and exposes the PromQL query language, but it needs Grafana to visualize anything. In one 2026 benchmark, Netdata used about 35% less CPU than Prometheus, and a 15-second scrape interval can miss short spikes that Netdata catches. Choose Netdata for instant visibility, Prometheus for long-term, queryable, customizable observability.
What is cAdvisor and do I need it?
cAdvisor is Google’s open-source container-metrics daemon that reads each container’s cgroup data and exposes raw, Prometheus-scrapeable per-container CPU, memory, network, and filesystem metrics. It has no dashboard of its own, so you only need it if you want queryable container time-series inside an existing Prometheus and Grafana setup. For a simple “how are my containers doing” view, Beszel’s built-in container stats are far less work.
How much does it cost to self-host server monitoring?
The software is free and open source for every tool in this guide. The only cost is the server it runs on. On InstaPods a Beszel pod is $3/mo, and the full Beszel + Dozzle + Uptime Kuma stack is about $6/mo, versus hosted alternatives that bill per host (Datadog from around $15 per host per month, Netdata Cloud Business at $4.50 per node, Grafana Cloud at $8 per additional 1,000 metric series).
Related reading:
- Beszel vs Uptime Kuma - server metrics vs endpoint uptime, and why you want both
- Beszel vs Prometheus + Grafana - lightweight vs enterprise monitoring
- Beszel vs Grafana Cloud - self-hosted vs hosted monitoring costs
- Beszel vs Netdata - lightweight vs deep observability
- Beszel vs Glances - web dashboard vs terminal monitoring
- Beszel vs Zabbix - 10MB agent vs a server + database + frontend stack
- Beszel vs Checkmk - lightweight metrics vs a 1-2GB enterprise fleet monitor
- Beszel vs Cockpit - long-term metrics history vs a live Linux server console
- n8n Pricing: Cloud vs Self-Hosted - if you’re self-hosting apps, compare the real costs
- Deploy Without DevOps - get apps running without server management
- SSH Hosting With No Config - get SSH access without writing nginx files
- Best Heroku Alternatives - 6 platforms compared if you’re moving off Heroku