Lightweight server monitoring with historical data, Docker stats, and alerts. This repo deploys the Beszel hub (the dashboard). Agents run on the servers you want to monitor and report to it. The app runs from the official Beszel image.
This repository does not contain the Beszel source. The service pulls the official hub image from Docker Hub at a pinned version. To upgrade, change the tag in render.yaml and push.
| Piece | Role |
|---|---|
| Beszel | Hub: dashboard, alerts, and storage for metrics that agents send. |
beszel (Web Service) |
The hub. |
beszel-data (Persistent disk) |
The PocketBase (SQLite) database at /beszel_data. |
flowchart LR
user["Browser"] --> hub["beszel (hub)"]
agent1["Agent on your server"] -->|WebSocket over HTTPS| hub
agent2["Agent on another server"] -->|WebSocket over HTTPS| hub
hub --> disk[("beszel-data")]
hubimg["Docker Hub: henrygd/beszel:0.21.1"] --> hub
- Click Deploy to Render. The flow copies this repo into your GitHub account and applies
render.yaml. - On Apply, enter
USER_EMAIL. Render creates the disk and generatesUSER_PASSWORD. - On first boot, Beszel creates its database and an admin account from
USER_EMAILandUSER_PASSWORD. - Sign in, add a system, and run the agent command the hub gives you on that server.
| Resource | Type | Plan | Notes |
|---|---|---|---|
beszel |
Web, image | Starter | Disk at /beszel_data, 1 GB. Health: /api/health. Single instance. |
Default region: Oregon.
- Click Deploy to Render above and enter
USER_EMAIL. - Wait until
beszelis Live. - Copy
USER_PASSWORDfrom the service's Environment page and sign in at the service URL. - Click Add System. Copy the Docker or binary command the hub shows and run it on the server you want to monitor.
curl -fsS "https://<beszel>.onrender.com/api/health"Agents open an outbound WebSocket to the hub over HTTPS, using the HUB_URL and TOKEN in the command the hub gives you. The monitored server doesn't need any inbound ports, so this works behind NAT and firewalls.
| Variable | Source | Description |
|---|---|---|
USER_EMAIL |
Required | Admin email. Only used on first boot. |
USER_PASSWORD |
Generated | Admin password for the first sign-in. Change it in the UI afterward. |
APP_URL |
Wired | The service's RENDER_EXTERNAL_URL. Used in alert links and agent commands. Update it after you add a custom domain. |
| Others | Optional | OAuth-only login, MFA, and more. See .env.example. |
generateValue runs once, on the first Blueprint apply. Alert notifications (email, Slack, Discord, and others) are set up in the hub's settings.
Prices from Render's pricing page.
| Resource | Approx. monthly |
|---|---|
beszel (Starter) |
$7 |
| 1 GB disk | $0.25 |
| Total | ~$7.25 |
The hub used about 10 MB of memory in testing.
| Problem | Solution |
|---|---|
| Admin sign-in fails | The account is created on first boot only. Use USER_PASSWORD from the Environment page, or the password you set in the UI. |
| Agent shows as down | Check that HUB_URL in the agent's config is the hub's public https:// URL and that TOKEN matches the one the hub shows for that system. |
| Metrics disappear after a deploy | Confirm the disk is mounted at /beszel_data. |
| Deploy takes under a minute of downtime | Expected. A service with a disk stops the old instance before it starts the new one. Agents retry every 10 seconds and reconnect on their own. |
render.yaml Blueprint. One image-backed web service with a disk.
README.md This file
LICENSE Wrapper license
.env.example Value the deploy form asks for, and optional extras