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.

Beszel: Lightweight Monitoring for Your Proxmox Homelab

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

PropertyValue
Proxmox host IP192.168.0.150
Beszel hub LXC IP192.168.0.157
Beszel hub port8090
Beszel agent port45876
Beszel versionv0.18.7

Containers being monitored

VMIDHostnameRole
151img-serverImmich photo server
152caddyReverse proxy
153jellyfinMedia server
154uptimekumaUptime monitoring
155forgeGitea Forge
156nexusArtifact registry
proxmoxBare 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:

PromptValue
Install typeAdvanced Install
Container typeUnprivileged (recommended)
Root passwordSet one (needed for SSH access if required later)
Container ID157
Hostnamebeszel
Disk size6 GB
CPU cores1
RAM512 MiB
Network bridgevmbr0
IPv4 assignmentStatic
IPv4 address192.168.0.157/24
Gateway192.168.0.1
IPv6None
MTU / DNS / MAC / VLANLeave blank (defaults)
Tagscommunity-script;monitoring
SSH keysNone (or add your own)
Root SSH accessNo
FUSE / TUN / Nesting / GPUAll No
TimezoneYour local timezone (e.g. Asia/Kolkata)
Protection / mknod / mount FSAll No
Verbose modeYes
Storage poollocal-lvm
Save as defaultsYes

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:8090

Part 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
  • Port45876 (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 -k flag contains your hub's public key and the -t flag 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 -- and bash. --bash (no space) will fail with Unknown 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-agent

Expected 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-agent

You should see active (running) and a line like:

INFO: WebSocket connected host=192.168.0.157:8090

Part 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 -y

Step 6.2 — Set cap_perfmon on the binary

setcap cap_perfmon=ep /usr/bin/intel_gpu_top

Step 6.3 — Add CAP_PERFMON ambient capability to the service

systemctl edit beszel-agent

Add the following in the editor that opens:

[Service]
AmbientCapabilities=CAP_PERFMON

Save 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 --system

Step 6.5 — Restart the agent

systemctl daemon-reload
systemctl restart beszel-agent

Step 6.6 — Verify

systemctl status beszel-agent

You 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 -l

The 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 -- bash

Edit the Caddyfile:

nano /etc/caddy/Caddyfile

Add 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 -5

Expected:

Valid configuration

Step 7.3 — Reload Caddy

systemctl reload caddy

Beszel will now be accessible at https://beszel.yourdomain.com.


What You End Up With

After following this guide, your monitoring setup looks like this:

ComponentLocationPurpose
Beszel HubLXC 157 (192.168.0.157:8090)Web dashboard + data store
Beszel AgentLXCs 151–156Per-container metrics
Beszel AgentProxmox hostBare metal + Intel GPU metrics
Caddy (optional)LXC 152HTTPS 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:

  1. In the Beszel dashboard go to Settings → Notifications → Add Notification
  2. Select ntfy from the provider list
  3. Enter your ntfy server URL and topic
  4. 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.