Skip to main content
← All articles
tooling

I put Beszel on the box instead of Grafana. No regrets, one caveat.

I put Beszel on the box instead of Grafana. No regrets, one caveat.

The box that runs this blog is a modest OVH VPS with Coolify on top. For months my "monitoring" was SSHing in and running htop when something felt slow, which is to say I had none. I wanted a graph of CPU, memory, disk and per-container stats — and I very much did not want to stand up Prometheus and Grafana to get it. That's a lot of moving parts to learn so I can confirm that twelve people read my last post. Beszel is where I landed, and it's the rare piece of self-hosted software I set up once and then just kept.

What it is

Beszel is a lightweight server monitor by henrygd, MIT-licensed, written in Go, sitting around 23k GitHub stars. The architecture is two pieces: a hub (a web app built on PocketBase) and a small agent you run on each machine you want to watch. The agent is genuinely tiny — the container image is under about 10MB — and it reports back over a WebSocket connection.

Out of the box it tracks CPU, memory, disk usage and I/O, network, and load average, plus temperatures, GPU usage, S.M.A.R.T. disk health, and — the bit I cared about — per-container Docker stats. It does configurable alerts, multiple users, OAuth login, and automatic backups to disk or S3. For a single VPS that's not just enough, it's slightly more than I need, which is the correct direction to be wrong in.

Beszel dashboard showing CPU, memory, disk and network charts for a server
The Beszel hub — at-a-glance health across systems, no query language required.

Setup alongside Coolify

The hub runs as an ordinary container — image henrygd/beszel, port 8090, a beszel_data volume for its PocketBase store. Bring it up, open the port, create the admin account. Then in the UI you hit "Add System," and it generates the exact compose block for the agent: the henrygd/beszel-agent image, mounting /var/run/docker.sock:ro, usually on host networking, with a token and key that pair it to the hub.

That read-only Docker socket mount is the whole reason it fits a Coolify box so well — the agent immediately sees every Coolify-managed container by name and charts each one. One thing that'll trip you up if you front the hub with a reverse proxy: it needs WebSocket upgrades forwarded, or the agent shows up perpetually offline. That's the connection path, not a bug.

The caveat, and it's a real one

Here's the honest trade, and you should decide with your eyes open: Beszel's data retention is fixed at 30 days and not configurable, and it aggregates aggressively as data ages. You get one-minute resolution for the last hour only; after that it's averaged down (ten-minute averages for twelve hours, twenty-minute for a day, two-hour for a week, eight-hour out to thirty days). Past thirty days, it's gone.

So this is at-a-glance health and recent trends, not a forensic time machine. There is no PromQL, no building your own dashboards, no long-term series. If you need to zoom into a CPU spike from three weeks ago at second-level resolution, Beszel simply doesn't keep that, and no amount of configuring will make it.

When you'd still want the heavy stack

Reach for Prometheus and Grafana when you actually need what they're for: long retention, custom queries, application or business metrics beyond host stats, correlating multiple sources, alerting on derived expressions. Those are real needs — for a fleet, or a product, or anyone on the hook for an SLA. They are not my needs for a personal blog on one server, and pretending otherwise would just leave me with an elaborate dashboard I stopped looking at.

The monitoring you keep running beats the monitoring you set up perfectly once and abandon. On a solo box, lightweight isn't a compromise — it's the correct engineering call.

Beszel gives me the four numbers I check, the per-container view I actually use, and an alert when disk creeps up, in a 10MB agent I'll forget is even there. That's the whole job. No regrets — just know about the thirty days before you lean on it for anything historical.

Links

BM
Blue Moose
The moose behind Blue Moose. Full-stack PHP developer — Drupal by day, Symfony by night, tests always.