[{"data":1,"prerenderedAt":181},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-beszel-multi-server-monitoring-hub-on-your-vps-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"slugs":9,"title":12,"excerpt":13,"readTime":14,"views":15,"isPinned":16,"publishedAt":17,"category":18,"categories":24,"featuredImage":26,"bgImage":27,"posterImage":28,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":130,"ctaBody":131,"ctaButton":132,"ctaUrl":133,"relatedPosts":134},133,"self-host-beszel-multi-server-monitoring-hub-on-your-vps",{"fr":10,"en":8,"ar":11},"self-host-beszel-vps","استضف-beszel-على-vps-مركز-مراقبة-متعدد-الخوادم","Beszel on VPS: multi-server monitoring, alerts and security","Deploy Beszel on a VPS, monitor your entire fleet from one hub, set up Telegram\u002Femail alerts, enable 2FA and fix silent agents, TLS errors and blocked ports.",10,0,false,"2026-02-14T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},8,"Security & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[25],{"id":19,"name":20,"slug":21,"color":22,"icon":23},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-beszel-vps-poster.svg",{"categorySlug":30,"appSlug":31},"monitoring-observability","beszel","Running multiple VPS instances is normal once you start self-hosting seriously. But checking each server individually is slow, and you will miss problems before they become expensive. Beszel solves this with a hub-and-agent model: one lightweight PocketBase-backed hub aggregates real-time metrics from all your servers. The hub idles under 50 MB RAM, agents are tiny Go binaries, and the whole setup takes about 10 minutes. This guide covers the full deployment: starting the hub, adding multiple agents, configuring alerts, hardening the setup and resolving common issues.",[34,38,76,87,90,112,115,118,121,125,127],{"type":35,"title":36,"body":37},"h2","Why Beszel hits the right balance for self-hosters","Grafana + Prometheus is the industry standard, but it comes with significant setup overhead: exporters, Prometheus config, Grafana datasources, dashboards. Uptime Kuma is great for availability checks but does not give you resource metrics. Netdata is data-rich but consumes more RAM per node and requires a cloud account to aggregate multiple hosts. Beszel lands in the middle: full resource metrics (CPU, RAM, disk, bandwidth, temperatures), per-container Docker stats, historical charts and threshold alerts — deployed in a single Docker command with zero config files.\n\nThe hub is built on PocketBase, which means it is a single Go binary with an embedded database. No separate Postgres or Redis. No YAML to write. The trade-off is that Beszel does not do custom queries or arbitrary dashboards like Prometheus\u002FGrafana — for resource monitoring across a fleet, it is faster to get started and easier to maintain.",{"type":39,"title":40,"headers":41,"rows":46},"comparison","Uptime Kuma · Beszel · Netdata — comparison",[42,43,44,45],"Criterion","Uptime Kuma","Beszel","Netdata",[47,52,57,62,67,71],[48,49,50,51],"Resource metrics","No (HTTP\u002FTCP probes only)","Yes (CPU, RAM, disk, bandwidth, temp.)","Yes (very detailed)",[53,54,55,56],"Multi-server without cloud account","Yes (one instance per server)","Yes (one hub, any number of agents)","Partial (cloud room needed to aggregate)",[58,59,60,61],"Hub RAM usage","\u003C 100 MB","\u003C 50 MB","300–500 MB per node",[63,64,65,66],"Per-container Docker stats","No","Yes (auto-discovered)","Yes",[68,69,70,70],"Config required","Web UI","Zero files",[72,73,74,75],"Prometheus export","No (native)","Not native (experimental \u002Fmetrics)","Yes (native)",{"type":77,"title":78,"items":79},"ul","What you get out of the box",[80,81,82,83,84,85,86],"CPU, RAM, disk, bandwidth and temperature metrics updated every 15 seconds.","Per-container Docker stats — CPU, RAM and network per container, auto-discovered.","Historical charts at hourly, daily and monthly resolution with no retention cap.","Threshold alerts sent to Telegram, Slack, email, Discord, ntfy, PagerDuty and more.","Multi-server: one hub, any number of agents — no per-server fee or paywalled features.","Agents connect out to the hub — no inbound firewall rules needed on monitored servers.","MIT license — fully open-source, self-hosted, no cloud dependency.",{"type":35,"title":88,"body":89},"Requirements","The hub is exceptionally lightweight. It runs comfortably on a 512 MB \u002F 1 vCPU VPS — in fact, it fits alongside other services on your smallest server. Plan for 5–10 GB of disk for the PocketBase data directory, which grows slowly as historical metrics accumulate. Agents are even lighter: a few MB RAM each. You can monitor 20+ servers without the hub breaking a sweat on a 1 GB VPS.\n\nDependencies: Docker installed on the hub (for the hub container) and on each monitored server (for the agent in container mode). A binary alternative without Docker exists for agents — refer to the official documentation for this variant.",{"type":91,"title":92,"steps":93},"steps","Deploy the hub and add multiple agents",[94,97,100,103,106,109],{"title":95,"body":96},"Start the hub","On the VPS dedicated to monitoring:\n```bash\ndocker run -d --restart=always \\\n  -p 8090:8090 \\\n  --name beszel \\\n  -v \u002Fopt\u002Fbeszel:\u002Fbeszel_data \\\n  henrygd\u002Fbeszel:latest\n```\nThe hub starts immediately — no environment variables or config files required.",{"title":98,"body":99},"Create the administrator account","Open `http:\u002F\u002F\u003Chub-ip>:8090`. The first visitor sees the PocketBase wizard that creates the admin account (email + strong password). This account controls the entire dashboard — choose a solid password, you will enable 2FA in the next step.",{"title":101,"body":102},"Enable 2FA on the administrator account","In PocketBase, go to **Settings → Admins**, open your profile and enable two-factor authentication (TOTP). Scan the QR code with an authenticator app (Aegis, Authy, 1Password). From that point on, every login requires the time-based code in addition to the password.",{"title":104,"body":105},"Put the hub behind an HTTPS reverse proxy","Point a subdomain (e.g. `monitor.yourdomain.com`) to the hub VPS. With Caddy:\n```bash\napt install -y caddy\n```\nContent of `\u002Fetc\u002Fcaddy\u002FCaddyfile`:\n```\nmonitor.yourdomain.com {\n  reverse_proxy localhost:8090\n}\n```\nCaddy provisions the TLS certificate automatically. Then close port 8090 in your firewall — all access goes through 443:\n```bash\nufw delete allow 8090\nufw allow 443\n```",{"title":107,"body":108},"Add each monitored server","In Beszel, click **Add system**, enter a name and the server's IP or hostname (port 45876). The hub generates a per-system public key — copy it.",{"title":110,"body":111},"Install the agent on each monitored server","On each server to monitor:\n```bash\ndocker run -d --restart=always \\\n  --network host \\\n  --name beszel-agent \\\n  -v \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro \\\n  -e KEY=\"\u003Ckey-copied-from-hub>\" \\\n  henrygd\u002Fbeszel-agent:latest\n```\nThe agent establishes an **outbound** connection to the hub on port 45876 — no inbound port to open on the monitored server. Metrics appear in the dashboard within seconds.",{"type":35,"title":113,"body":114},"Configure Telegram and email alerts","In Beszel settings, open the **Notifications** tab and click **Add notification**.\n\n**Telegram** (recommended for speed): create a bot via @BotFather to get a token, then retrieve your `chat_id` by sending a message to the bot and calling `https:\u002F\u002Fapi.telegram.org\u002Fbot\u003Ctoken>\u002FgetUpdates`. Paste the token and chat ID into the form. A test message confirms the connection.\n\n**Email (SMTP)**: fill in the SMTP host, port (587 for STARTTLS), username, password and destination address. On each monitored system, define **alert thresholds**: for example, alert when disk usage exceeds 80%, or when RAM stays above 90% for 5 minutes. Multiple channels can coexist — Telegram for urgent alerts, email for summaries.",{"type":35,"title":116,"body":117},"Troubleshooting — silent agent, TLS rejected, port blocked","**The agent does not appear in the dashboard.** First check that the agent is actually running: `docker logs beszel-agent`. A `connection refused` message means port 45876 is blocked on the hub — open it on the hub side only (agents themselves do not need any inbound port):\n```bash\nufw allow 45876\u002Ftcp\n```\nIf the logs show a TLS error like `certificate signed by unknown authority`, the hub is exposed with a self-signed or unrecognized certificate. Two options: use a valid Let's Encrypt certificate (recommended path via Caddy), or pass `AGENT_SKIP_TLS_VERIFY=true` to the agent (avoid in production).\n\n**Hub is behind a reverse proxy but agents cannot connect.** Port 45876 is a direct TCP port (not HTTP): Caddy or nginx does not proxy it the same way as a web request. The solution is to expose port 45876 directly on the hub (not via the proxy) and only put the web interface (8090) behind the HTTPS proxy. Allow port 45876 in your firewall and make sure your VPS security group allows it as TCP inbound from your agents' IPs.\n\n**Docker metrics are missing.** The agent must have access to the Docker socket. Check that `\u002Fvar\u002Frun\u002Fdocker.sock` is mounted read-only in the agent start command.",{"type":35,"title":119,"body":120},"Securing the hub","A monitoring hub aggregates sensitive data (load, disk, internal network topology). A few essential measures:\n\n**Restricted dashboard access.** After enabling 2FA, add an IP restriction or HTTP basic auth at the reverse proxy level if the hub is only accessible to a small team. With Caddy:\n```\nmonitor.yourdomain.com {\n  basicauth {\n    \u003Cuser> \u003Cbcrypt-hash>\n  }\n  reverse_proxy localhost:8090\n}\n```\n\n**Port 45876 not exposed publicly.** If all your agents are on VPS instances sharing a private network, configure the hub to listen on the private IP only and block 45876 on the public IP. Otherwise, restrict this port to your agents' known IPs in `ufw`.\n\n**Back up the data directory.** The `\u002Fopt\u002Fbeszel` folder contains the PocketBase database and metrics history. Include it in your backup routine — recovery after a failure is immediate if the backup is current.",{"type":122,"title":123,"body":124},"tip","Export to Prometheus — going further","If you already have a Prometheus\u002FGrafana stack and want to centralise all your metrics, Beszel exposes an experimental `\u002Fmetrics` endpoint in Prometheus format on the hub. Enable it in advanced settings and add a scrape job to your `prometheus.yml`:\n```yaml\nscrape_configs:\n  - job_name: beszel\n    static_configs:\n      - targets: ['monitor.yourdomain.com']\n    scheme: https\n    metrics_path: \u002Fmetrics\n    basic_auth:\n      username: '\u003Cuser>'\n      password: '\u003Cpassword>'\n```\nThis is not Beszel's primary path — if Prometheus\u002FGrafana is already in place you may not need Beszel at all. But for a team that wants both dashboards, it is a useful bridge.",{"type":122,"body":126},"Run the Beszel hub on a separate VPS from your main stack. When your production server is down, you want the monitoring system to still be up and sending alerts — not down alongside it. The hub's tiny resource footprint means you can justify a dedicated 512 MB VPS for monitoring without feeling like you are wasting money.",{"type":122,"title":128,"body":129},"Official documentation","For advanced configuration and tool-specific options, refer to the \u003Ca href=\"https:\u002F\u002Fbeszel.dev\">official Beszel documentation\u003C\u002Fa>. This guide covers VPS deployment and common issues; the vendor documentation remains the reference for major upgrades and fine-tuning.","Monitor all your servers from one hub","Deploy the Beszel monitoring hub on a ServOrbit VPS — lightweight, self-hosted, no per-server fee. Add agents to every server in your fleet in minutes.","Deploy Beszel","\u002Fmarketplace\u002Fmonitoring-observability\u002Fbeszel",[135,148,165],{"id":136,"slug":137,"slugs":138,"title":141,"excerpt":142,"readTime":14,"views":15,"isPinned":16,"publishedAt":143,"category":144,"categories":145,"featuredImage":26,"bgImage":27,"posterImage":147,"relatedSolution":26},228,"initial-linux-server-hardening",{"fr":139,"en":137,"ar":140},"durcissement-serveur-linux-initial","تصليب-الخادم-linux-الأولي","Initial Linux Server Hardening","Create a sudo user, configure SSH with keys, enable UFW and fail2ban on Ubuntu 22.04 or Debian 12 in under an hour.","2026-08-06T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[146],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",{"id":149,"slug":150,"slugs":151,"title":154,"excerpt":155,"readTime":156,"views":15,"isPinned":16,"publishedAt":143,"category":157,"categories":162,"featuredImage":26,"bgImage":27,"posterImage":164,"relatedSolution":26},229,"docker-compose-in-production-10-point-checklist",{"fr":152,"en":150,"ar":153},"docker-compose-production-checklist","docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط","Docker Compose in Production: 10-Point Checklist","10 Docker Compose settings to verify before any production deployment: restart, healthchecks, limits, secrets and logs.",14,{"id":158,"name":159,"slug":160,"color":161,"icon":160},3,"Deployment","deploiement","bg-success\u002F10 text-success",[163],{"id":158,"name":159,"slug":160,"color":161,"icon":160},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",{"id":166,"slug":167,"slugs":168,"title":171,"excerpt":172,"readTime":173,"views":15,"isPinned":16,"publishedAt":174,"category":175,"categories":176,"featuredImage":26,"bgImage":27,"posterImage":178,"relatedSolution":179},106,"vps-monitoring-with-grafana-and-prometheus",{"fr":169,"en":167,"ar":170},"monitoring-vps-grafana-prometheus","مراقبة-الخادم-الافتراضي-vps-باستخدام-grafana-و-prometheus","VPS Monitoring with Grafana and Prometheus","Set up a Grafana + Prometheus stack on your VPS to collect, store and visualize your system and application metrics.",4,"2026-03-06T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[177],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fmonitoring-vps-grafana-prometheus-poster.svg",{"categorySlug":30,"appSlug":180},"grafana",1787581011957]