Beszel: Lightweight Monitoring for Your Proxmox Homelab
May 31, 2026Tutorials
A complete walkthrough for setting up Beszel on Proxmox — spin up a dedicated LXC hub, deploy agents across all containers via pct exec, monitor the Proxmox host itself with Intel GPU support, and optionally expose the dashboard via Caddy reverse proxy.

If you're running a Proxmox homelab with a handful of LXC containers, you eventually want a single place to see CPU, RAM, disk, and network across all of them. Beszel is the answer — lightweight, self-hosted, hub + agent architecture, under 10 MB RAM per agent, and a clean web dashboard. This guide walks through setting it up from scratch: dedicated LXC for the hub, agents deployed to every container via pct exec, the Proxmox host itself with Intel GPU monitoring, and an optional Caddy reverse proxy step.
System Reference
| Property | Value |
|---|---|
| Proxmox host IP | 192.168.0.150 |
| Beszel hub LXC IP | 192.168.0.157 |
| Beszel hub port | 8090 |
| Beszel agent port | 45876 |
| Beszel version | v0.18.7 |
Containers being monitored
| VMID | Hostname | Role |
|---|---|---|
| 151 | img-server | Immich photo server |
| 152 | caddy | Reverse proxy |
| 153 | jellyfin | Media server |
| 154 | uptimekuma | Uptime monitoring |
| 155 | forge | Gitea Forge |
| 156 | nexus | Artifact registry |
| — | proxmox | Bare metal host |
Why Beszel and not something else?
Netdata and Grafana+Prometheus are the usual alternatives. Netdata uses 200–500 MB RAM per node — brutal if your containers are sized at 512 MB like Caddy and Uptime Kuma. The Grafana stack requires setting up Prometheus, node_exporter, cAdvisor, and building dashboards before you see a single graph. Beszel takes five minutes, uses under 10 MB per agent, and covers everything a homelab needs: CPU, RAM, disk, network, temperatures, and Docker container stats.
Beszel also pairs cleanly with Uptime Kuma — Kuma handles service-level uptime (is your app responding?), Beszel handles system-level metrics (how much RAM is Jellyfin eating?). No overlap, no redundancy.
Part 1 — Create the Beszel Hub LXC
Run this from the Proxmox Shell (not SSH — the community-scripts installer is more stable from the console):
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/beszel.sh)"The installer presents a wizard. Choose Advanced Install to set a static IP and keep it consistent with your homelab's addressing scheme.
Wizard settings
Work through the prompts with these values:
| Prompt | Value |
|---|---|
| Install type | Advanced Install |
| Container type | Unprivileged (recommended) |
| Root password | Set one (needed for SSH access if required later) |
| Container ID | 157 |
| Hostname | beszel |
| Disk size | 6 GB |
| CPU cores | 1 |
| RAM | 512 MiB |
| Network bridge | vmbr0 |
| IPv4 assignment | Static |
| IPv4 address | 192.168.0.157/24 |
| Gateway | 192.168.0.1 |
| IPv6 | None |
| MTU / DNS / MAC / VLAN | Leave blank (defaults) |
| Tags | community-script;monitoring |
| SSH keys | None (or add your own) |
| Root SSH access | No |
| FUSE / TUN / Nesting / GPU | All No |
| Timezone | Your local timezone (e.g. Asia/Kolkata) |
| Protection / mknod / mount FS | All No |
| Verbose mode | Yes |
| Storage pool | local-lvm |
| Save as defaults | Yes |
Expected output
When the installer completes you should see:
✔️ Deployed: beszel (0.18.7)
✔️ Completed successfully!
🚀 Beszel setup has been successfully initialized!
💡 Access it using the following IP:
🌐 http://192.168.0.157:8090Part 2 — Create the Admin Account
Open http://192.168.0.157:8090 in your browser. On first load, Beszel will prompt you to create an admin account.
Fill in:
- Email — your admin email
- Password — a strong password
- Confirm password
Click Create account. You'll land on the empty dashboard, ready to add systems.
Part 3 — Get the Agent Install Command
In the Beszel dashboard, click Add System. Fill in the details for your first system (you can start with any LXC):
- Name — e.g.
img-server - Host — the LXC's IP, e.g.
192.168.0.151 - Port —
45876(leave default)
Beszel will generate an agent install command with your hub's public key embedded. It will look like this:
curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh -p 45876 -k "ssh-ed25519 <YOUR_PUBLIC_KEY>" -t "<YOUR_TOKEN>" -url "http://192.168.0.157:8090"Copy this command — you'll use it in the next step for every LXC.
Note: The
-kflag contains your hub's public key and the-tflag contains a registration token. Both are unique to your installation. Never share these publicly.
Part 4 — Install Agents on All LXCs via pct exec
Instead of SSHing into each container individually, use pct exec from the Proxmox host to run the install command directly. This is cleaner and faster.
The syntax is:
pct exec <VMID> -- bash -c '<command>'Important: Note the space between
--andbash.--bash(no space) will fail withUnknown option: bash. Wrap the entire command in single quotes so the inner double quotes around the public key are preserved correctly.
Run the following from the Proxmox host shell, replacing <YOUR_PUBLIC_KEY> and <YOUR_TOKEN> with your actual values from the Beszel UI:
# LXC 151 — img-server (Immich)
pct exec 151 -- bash -c 'curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh -p 45876 -k "ssh-ed25519 <YOUR_PUBLIC_KEY>" -t "<YOUR_TOKEN>" -url "http://192.168.0.157:8090"'
# LXC 152 — caddy
pct exec 152 -- bash -c 'curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh -p 45876 -k "ssh-ed25519 <YOUR_PUBLIC_KEY>" -t "<YOUR_TOKEN>" -url "http://192.168.0.157:8090"'
# LXC 153 — jellyfin
pct exec 153 -- bash -c 'curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh -p 45876 -k "ssh-ed25519 <YOUR_PUBLIC_KEY>" -t "<YOUR_TOKEN>" -url "http://192.168.0.157:8090"'
# LXC 154 — uptimekuma
pct exec 154 -- bash -c 'curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh -p 45876 -k "ssh-ed25519 <YOUR_PUBLIC_KEY>" -t "<YOUR_TOKEN>" -url "http://192.168.0.157:8090"'
# LXC 155 — forge
pct exec 155 -- bash -c 'curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh -p 45876 -k "ssh-ed25519 <YOUR_PUBLIC_KEY>" -t "<YOUR_TOKEN>" -url "http://192.168.0.157:8090"'
# LXC 156 — nexus
pct exec 156 -- bash -c 'curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh -p 45876 -k "ssh-ed25519 <YOUR_PUBLIC_KEY>" -t "<YOUR_TOKEN>" -url "http://192.168.0.157:8090"'When the agent install succeeds you'll see:
Beszel Agent has been installed successfully! It is now running on 45876.Verify each agent
pct exec 151 -- systemctl status beszel-agentExpected output:
● beszel-agent.service - Beszel Agent Service
Loaded: loaded (/etc/systemd/system/beszel-agent.service; enabled; preset: enabled)
Active: active (running) since ...Repeat for VMIDs 152–156.
Part 5 — Install Agent on the Proxmox Host
The Proxmox host itself (bare metal) is not an LXC, so run the agent install command directly in the Proxmox host shell — no pct exec needed, and no sudo since you're already root on Proxmox:
curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh -p 45876 -k "ssh-ed25519 <YOUR_PUBLIC_KEY>" -t "<YOUR_TOKEN>" -url "http://192.168.0.157:8090"Verify:
systemctl status beszel-agentYou should see active (running) and a line like:
INFO: WebSocket connected host=192.168.0.157:8090Part 6 — Fix Intel GPU Monitoring on the Proxmox Host
If your Proxmox host has an Intel iGPU (e.g. HP EliteDesk 800 G5 with Intel UHD 630), the agent will log GPU errors until you install intel_gpu_top and grant the required capabilities. All commands run as root on the Proxmox host.
Step 6.1 — Install intel-gpu-tools
apt install intel-gpu-tools -yStep 6.2 — Set cap_perfmon on the binary
setcap cap_perfmon=ep /usr/bin/intel_gpu_topStep 6.3 — Add CAP_PERFMON ambient capability to the service
systemctl edit beszel-agentAdd the following in the editor that opens:
[Service]
AmbientCapabilities=CAP_PERFMONSave and close (Ctrl+X if nano).
Step 6.4 — Lower perf_event_paranoid and make it persistent
echo "kernel.perf_event_paranoid=2" | tee /etc/sysctl.d/99-intel-gpu-beszel.conf
sysctl --systemStep 6.5 — Restart the agent
systemctl daemon-reload
systemctl restart beszel-agentStep 6.6 — Verify
systemctl status beszel-agentYou should now see intel_gpu_top running as a subprocess:
CGroup: /system.slice/beszel-agent.service
├─292991 /opt/beszel-agent/beszel-agent
└─293050 intel_gpu_top -s 3300 -lThe GPU error warnings should be gone and GPU stats will appear in the Beszel dashboard for the Proxmox host entry.
Part 7 (Optional) — Caddy Reverse Proxy
If you're already running Caddy as your reverse proxy (LXC 152), you can put Beszel behind a subdomain instead of accessing it via IP and port. This assumes you have a domain and Cloudflare DNS already configured in Caddy.
Step 7.1 — Add the Beszel block to your Caddyfile
SSH into LXC 152 or exec into it:
pct exec 152 -- bashEdit the Caddyfile:
nano /etc/caddy/CaddyfileAdd the following block:
beszel.yourdomain.com {
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
reverse_proxy 192.168.0.157:8090
}Replace beszel.yourdomain.com with your actual subdomain and CLOUDFLARE_API_TOKEN with the name of your environment variable.
Step 7.2 — Format and validate
caddy fmt --overwrite /etc/caddy/Caddyfile
caddy validate --config /etc/caddy/Caddyfile 2>&1 | tail -5Expected:
Valid configurationStep 7.3 — Reload Caddy
systemctl reload caddyBeszel will now be accessible at https://beszel.yourdomain.com.
What You End Up With
After following this guide, your monitoring setup looks like this:
| Component | Location | Purpose |
|---|---|---|
| Beszel Hub | LXC 157 (192.168.0.157:8090) | Web dashboard + data store |
| Beszel Agent | LXCs 151–156 | Per-container metrics |
| Beszel Agent | Proxmox host | Bare metal + Intel GPU metrics |
| Caddy (optional) | LXC 152 | HTTPS subdomain access |
Every system reports CPU, RAM, disk, and network to the hub. The Proxmox host additionally reports Intel GPU usage, temperature, and power draw. Total RAM overhead across all agents is under 100 MB combined.
What's Next
Alerts and notifications with ntfy
Beszel has built-in support for alerts — you can trigger notifications when a system goes down, CPU exceeds a threshold, RAM is critically high, or disk is filling up. A great self-hosted option is ntfy, which can push notifications to your phone. To set it up:
- In the Beszel dashboard go to Settings → Notifications → Add Notification
- Select ntfy from the provider list
- Enter your ntfy server URL and topic
- Configure alert rules per system (CPU %, RAM %, disk %, or downtime)
A full walkthrough for setting up ntfy as a notification provider will be covered in a separate post.
Additional disks
If your LXCs have mounted volumes (Immich and Jellyfin both have HDD mounts), Beszel can monitor those mount points too. See the Additional Disks guide in the Beszel docs — it involves setting an environment variable on the agent service.
Bypassing ISP DNS Blocking for Prowlarr: AdGuard Home + Byparr on Proxmox
How I fixed ISP DNS hijacking and Cloudflare Turnstile blocking for Prowlarr indexers — using AdGuard Home for encrypted DNS resolution and Byparr as a modern FlareSolverr replacement.
Central Logging for Your Homelab: Loki, Grafana, and Alloy
Set up a lightweight central logging stack that collects logs from every service in your homelab — Jellyfin, Sonarr, Radarr, Caddy, Immich, AdGuard Home, and more — into a single Grafana interface you can actually search.