How to Monitor Multiple Servers From One Dashboard (5 Real Ways, Honestly Compared)
Five working setups to watch several VPSes in one place, with tested commands, and the one question that decides everything: who runs the dashboard?
There are five real ways to monitor multiple servers from one dashboard, and each of them parks that dashboard somewhere: on a box you run, or behind a service you pay. Everything else is detail. This page is for the person with 3 to 20 VPSes scattered across Hetzner, DigitalOcean and OVH, for whom the ssh, htop, df, exit loop stopped scaling around box number four. Below is every serious option, self-hosted and hosted, with install commands tested before publishing and the trade-offs that rarely make it above the fold.
TL;DR: which multi server monitoring dashboard fits you
The short version
- Homelab or zero budget: Beszel, free and MIT (vs Beszel).
- Per-second depth on every box: Netdata (vs Netdata).
- Up/down only: Uptime Kuma, big caveat below (vs Uptime Kuma).
- Platform team, custom metrics, Kubernetes: Prometheus + Grafana, or Zabbix for SNMP and mixed fleets.
- Hosted and working in a minute: PulseNode. That one is ours; the pitch and its caveats are further down.
- Enterprise budget, APM and logs too: Datadog, a different price class entirely.
What "one dashboard" actually requires
"Single pane of glass" is the enterprise phrase for it, and stripped of the sales gloss it means one thing: metrics from N servers have to land in one aggregation point. Agents push to it, or a collector pulls from each box, but that point has to live somewhere. Either it is a machine you run, back up and patch, or it is a service someone else runs and bills you for. That single sentence is the whole self-hosted versus hosted decision.
A second, quieter requirement: whatever hosts the dashboard usually also sends your alerts, so its failure domain matters more than its feature list.
Option 1: self-hosted aggregators, free because you run the hub
All three put several VPSes in one place for zero euros. The catch is identical: the place is yours to operate.
Beszel: hub + agent, the lightweight favorite
Beszel is the community favorite and earned it: MIT license, about 23.3k GitHub stars, v0.18.7 as of April 2026. The hub is a PocketBase web app you deploy once; agents connect out over WebSocket, or the hub can connect in over SSH. The hub takes three commands, per the getting started guide:
# On the machine that will host the hub:
mkdir beszel && cd beszel
curl -fsSLO https://raw.githubusercontent.com/henrygd/beszel/main/supplemental/docker/hub/docker-compose.yml
docker compose up -d
# Hub UI: http://your-host:8090
Each server is then added from the hub's "Add System" dialog, which hands you the exact agent command to paste on that box. The free feature list stings a paid product: alerts on CPU, memory, disk, bandwidth, temperature, load average and status, Docker and Podman container stats, GPU and temperature metrics, OAuth/OIDC login, automatic backups to disk or S3. PulseNode vs Beszel concedes most of this at length. If you want to self-host, install Beszel first.
Netdata: per-second depth, two ways to centralize
Netdata plays a different game: depth. The agent is open source under GPLv3+, has about 79.5k stars, and collects metrics every second, which nothing else on this page matches. Install is one line per box:
wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh && sh /tmp/netdata-kickstart.sh
That gives every box its own local dashboard on port 19999. Seeing all of them on one screen takes one of two routes. Route one is Netdata Cloud: the Community plan is free for up to 5 connected nodes with one custom dashboard per room; past five, Business is $4.50 per node per month billed annually. Route two is a self-hosted Parent: a regular Netdata agent configured through stream.conf to receive streaming and replication from child agents; each child streams to one parent at a time. The Parent route is free and keeps every byte on your hardware. It is also one more Netdata that you size, back up, patch and keep online. More in PulseNode vs Netdata.
Uptime Kuma: one dashboard, but only up or down
Uptime Kuma will happily show 30 servers on one page, with one large caveat. MIT licensed, about 88.7k stars, version 2.4.0 from May 2026, one command to run:
docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:2
It checks HTTP(s), TCP, keywords, JSON queries, ping, DNS, push heartbeats, Docker containers and even Steam servers, and it notifies through more than 90 services. The caveat: it collects no host CPU, RAM or disk metrics at all. That is a maintainer decision; the feature request was closed as not planned. Kuma answers whether things are up, not why they are slow, so a box can keep serving 200s while its disk sits at 97%. As a complement to a metrics tool it is excellent. As the only monitor for server health it is the wrong tool. Longer version: PulseNode vs Uptime Kuma.
The catch all three share
Free self-hosted aggregation has one bill, and it arrives later. The hub, the Parent or the Kuma instance runs inside your own infrastructure, so when that machine dies, monitoring dies with it, usually while something else is also on fire. Upgrades, backups, auth and the uptime of the aggregation box are yours, and alerts originate from hardware you keep alive: nobody watches the watcher. That is the real price, paid in hours instead of euros.
Option 2: Prometheus + Grafana, the powerful stack you operate
What the stack really is
Prometheus pulls. You run node_exporter on every server, which serves metrics on port 9100, with no authentication or TLS by default, so the firewalling is on you. The Prometheus server scrapes each target listed in prometheus.yml, stores samples in its local time-series database, and keeps 15 days by default; that is a configurable default, not a limit. Dashboards are Grafana's job (AGPL-3.0, v13.1.0 as of July 2026), and alert delivery belongs to Alertmanager, a separate service. Count the pieces: an exporter per host, Prometheus, Grafana, Alertmanager. Each is fine software. Together they are a system you operate.
The actual commands (tested)
Per server, from the official guide, using the current 1.11.1 release. I ran these before publishing; the binary starts and serves metrics:
wget https://github.com/prometheus/node_exporter/releases/download/v1.11.1/node_exporter-1.11.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.11.1.linux-amd64.tar.gz
cd node_exporter-1.11.1.linux-amd64
./node_exporter
Then every server goes into the scrape config on the Prometheus box:
scrape_configs:
- job_name: node
static_configs:
- targets: ['203.0.113.10:9100', '203.0.113.11:9100', '203.0.113.12:9100']
The quickstart stops there. Still ahead: a systemd unit so the exporter survives reboots, firewall rules for 9100 on every box, a targets list to keep in sync, Grafana dashboards to build, and Alertmanager routing YAML before any alert reaches you.
When it is right, and when Zabbix is the other heavyweight answer
Build this stack when you need PromQL, custom application metrics or Kubernetes; in that territory it has no equal, and PulseNode vs Prometheus says so at length. The other heavyweight is Zabbix, AGPLv3 since version 7.0, which monitors nearly anything with an IP address: SNMP network gear, Windows hosts, IPMI hardware. The deployment is proportionate, with a server daemon, a real MySQL or PostgreSQL database, a PHP frontend and an agent per host. For a handful of Linux VPSes, either stack is a second system to run on top of the servers you were trying to watch. See PulseNode vs Zabbix.
Option 3: monitor multiple servers from one dashboard without running the dashboard
PulseNode: one command per server
PulseNode is our product, so read this section as the pitch it is. Setup is one command per server:
curl -fsSLo /tmp/server-monitor-install.sh https://github.com/Xaenox/server-monitor-releases/releases/latest/download/install.sh && sudo bash /tmp/server-monitor-install.sh agent
That installs a single static Go binary as a hardened systemd service. The agent pushes metrics outbound over HTTPS about every 30 seconds and never listens on a port, so there is nothing new to firewall. Linux only, amd64 and arm64.
A minute later the server is on the same live page as the rest of your fleet: per-core CPU and load average, RAM and swap, disk per mount with read and write throughput, network per interface, uptime, Docker containers (status, image, uptime), and open TCP/UDP ports labelled with the process that owns them. Charts cover 1h, 6h, 24h and 7d windows, plus 14d and 30d on Pro.
Alerting takes a couple of minutes of clicking rather than zero. You connect a channel in settings, an email address or a Telegram chat ID (no bot server to host), then write threshold rules like cpu > 85% or disk > 90%, where the disk metric follows whichever mount is fullest. Rules have per-rule cooldowns (1 to 1440 minutes, default 15) and send recovery notices. Once a channel exists, the agent-offline alert needs no rule at all: when a box stops pushing, PulseNode's own infrastructure tells you. That is a built-in dead man's switch, and it fires precisely when a self-hosted monitor would have died along with the box. One boundary to know: the push interval is about 30 seconds, so this is trend and threshold detection. It catches a disk filling overnight and misses a two-second CPU spike.
Hobby is €5/mo for 5 servers with 7 days of history; Pro is €15/mo for 20 servers with 30 days. Billing runs through Lemon Squeezy and you can cancel anytime.
What PulseNode does not do
The honest list, since we hold everyone else to one. PulseNode is closed source and hosted only; you cannot self-host it. There is no public API and no data export today. Alert rules cover exactly three metrics: CPU, RAM and disk percent. External HTTP(S) and TLS-expiry checks exist, and they are status-only on the dashboard: up/down, latency and days to certificate expiry, with no notifications today. Docker is visibility only, so no alert fires when a container stops. Linux only. History is capped at 7 or 30 days by plan. And it is a young product run by one founder. If any of that is a dealbreaker, go back to the self-hosted section; Beszel is a fine place to start.
The bigger players
Datadog sits in a different class of price and scope. Its free tier covers up to 5 hosts; Infrastructure Pro is $15 per host per month billed annually, Enterprise $23. In exchange you get a full observability platform: APM, log management, distributed tracing. For a product team with the budget and the need, that is the point. For ten VPSes that need CPU, disk and an alert channel, Pro comes to $150 a month for capability you may never open. That is a sizing mismatch, and Datadog is good at what it charges for.
Watch all your servers on one dashboard, from €5/mo
One command per server, alerts in Telegram and email, nothing for you to host. And if you enjoy running Beszel, run Beszel; it is good software. PulseNode is for when the dashboard should be someone else's job.
Start monitoring for €5/mo → Pro: 20 servers for €15/moSelf-hosted vs hosted: the honest trade
| Self-hosted (Beszel, Netdata Parent, Prometheus, Zabbix, Kuma) | Hosted (PulseNode, Netdata Cloud, Datadog) | |
|---|---|---|
| Money | Free software; you pay in hardware and hours | Subscription, from €5/mo flat to $15 per host per month |
| Maintenance | Upgrades, backups, auth and the aggregation host are yours | The vendor's problem |
| Data | On your disk, entirely yours | On the vendor's servers; export varies (PulseNode has none today) |
| Retention | As long as your disks hold | Capped by plan (PulseNode: 7 or 30 days) |
| When the monitoring host dies | Monitoring dies with it, silently | The dashboard is off-box and notices the silence |
| Alert delivery | From infrastructure you keep alive | From the vendor's infrastructure |
The table picks no winner on purpose; three questions decide it. How many boxes do you run? At one or two, the free tiers and a self-hosted hub are hard to argue with. Do you enjoy operating infrastructure? Some people genuinely do, and for them a Beszel hub is a hobby that costs nothing. And who notices at 2 a.m. when the machine hosting your dashboard is the machine that died? If nobody, put the dashboard outside your own failure domain, whichever vendor you pick.
Side-by-side: every option in one table
| Beszel | Netdata | Uptime Kuma | Prometheus + Grafana | Zabbix | PulseNode | Datadog | |
|---|---|---|---|---|---|---|---|
| Price | Free (MIT) | Agent free; Cloud free to 5 nodes, then $4.50/node/mo annual | Free (MIT) | Free software; you pay in servers and time | Free software; you run the server | €5/mo (5 servers) or €15/mo (20) | Free to 5 hosts; Pro $15/host/mo annual |
| License | MIT | GPLv3+ (agent) | MIT | Open source; Grafana AGPL-3.0 | AGPLv3 since 7.0 | Proprietary SaaS | Proprietary SaaS |
| What you run and maintain | The hub (a PocketBase app) plus an agent per server | An agent per node, plus a Parent if you self-host the fleet view | One Kuma instance (Docker or Node.js 20.4+) | Prometheus, node_exporter per host, Grafana, Alertmanager | Server daemon, database, PHP frontend, agent per host | One agent per server; we run the dashboard | An agent per host; platform is hosted |
| Server metrics (CPU/RAM/disk) | ✅ | ✅ per second | ❌ closed as "not planned" | ✅ via node_exporter | ✅ | ✅ ~30s push | ✅ |
| Docker | ✅ Docker & Podman stats | ✅ per-container cgroup metrics | Up/down per container via the Docker socket | Via cAdvisor, another component | Templates and triggers | Status, image, uptime; no container alerts | ✅ |
| Alerting | Thresholds for CPU/mem/disk/bandwidth/temp/load/status; 20+ services via Shoutrrr | Preconfigured alarms plus custom health rules | Up/down notifications via 90+ services | PromQL rules; delivery via separate Alertmanager | Trigger expressions with escalations | CPU/RAM/disk % rules + agent-offline, to Telegram and email | ✅ |
| External HTTP/TLS checks | ❌ not a documented feature | Via optional check collectors | ✅ core feature | Via blackbox_exporter | ✅ web monitoring with triggers | Status only; no notifications | ✅ |
| Setup effort | Compose up the hub, then one agent command per server | One kickstart line per node; Parent config or Cloud claim for the fleet view | One docker run | The most assembly: exporters, YAML, dashboards, Alertmanager | A real deployment: repo, packages, DB schema, web wizard | One command per server | Agent install per host |
| Best for | Homelabs and self-hosters | Per-node depth and forensics | Up/down checks and status pages | Platform teams and custom metrics | Mixed fleets, SNMP, network gear | Small Linux fleets you want watched, not operated | Enterprise observability budgets |
The full matchups live on the comparison pages: Beszel, Netdata, Uptime Kuma, Prometheus and Zabbix.
See also
- How to get an alert when a disk is full on Linux: the most common reason people start wanting fleet-wide monitoring.
- How to get notified when a server goes offline: heartbeat monitoring, and why an alert script that lives on the server dies with it.
- All PulseNode comparison pages: honest matchups, including the ones where we tell you to pick the other tool.
FAQ
What is the best free way to monitor multiple servers from one dashboard?
Beszel is the strongest free option for host metrics: an MIT licensed hub you self-host, one small agent per server, and alerts plus Docker stats included. Netdata Cloud's Community plan is also free for up to 5 connected nodes and adds per-second detail. Both are genuinely free; the trade is that you operate and back up the aggregation point yourself.
Do I need to open ports on every server to monitor them in one place?
No. Push-based agents connect outward to the aggregation point, so the monitored servers need no new inbound ports; PulseNode's agent, Beszel's WebSocket mode and Netdata's streaming all work this way. Pull-based setups are the opposite: Prometheus scrapes node_exporter on port 9100 of every target, and a stock Netdata agent serves its own dashboard on port 19999, so both need firewall rules or a private network.
Can I monitor servers from different providers (Hetzner, DigitalOcean, AWS) on one dashboard?
Yes. Provider dashboards stop at the provider's own machines, but an agent you install does not care who rents you the box. Install the same agent on a Hetzner VPS, a DigitalOcean droplet and an AWS instance, point them all at one hub or one hosted dashboard, and they show up side by side. Mixed-provider fleets are the normal case for every tool on this page.
Is Uptime Kuma enough for monitoring multiple servers?
Only if the question is whether things are up. Uptime Kuma checks services from outside and notifies through more than 90 services, but it collects no host CPU, RAM or disk metrics, and its maintainers closed that feature request as not planned. A server can return HTTP 200 while its disk sits at 97%. Many people run Kuma for uptime and status pages alongside a metrics tool that watches the inside of the box.
How many servers can I monitor for free?
With self-hosted tools, as many as your hardware can carry: Beszel, Uptime Kuma, Prometheus and Zabbix have no node limits, and Netdata's agent is free on every box. Hosted services meter by node: Netdata Cloud is free up to 5 connected nodes, Datadog's free tier covers up to 5 hosts, and PulseNode starts at €5/mo for 5 servers with no free tier. The self-hosted options cost you the machine and the upkeep instead.
Should I self-host my monitoring dashboard or pay for a hosted one?
Self-host if you enjoy running infrastructure, want full data ownership and unlimited retention, and have a plan for the day the monitoring host itself dies. Pay for hosting if the dashboard and the alerting should live outside your own failure domain, and the maintenance hours are worth more to you than the subscription. Count your boxes, then decide who patches the monitor at 2 a.m.