Disclosure: we may earn a commission or referral reward from CloudCone, Contabo, DigitalOcean (account credit, not cash), Hostwinds, InterServer, RackNerd, VPSDime and Vultr if you sign up through our links. It does not change the price you pay. Every other provider pays us nothing. Prices in this guide are as of the date shown and may have changed; see the comparison pages for the latest checked prices.

Guides · BLOG

How to monitor a VPS: free tools that actually matter (2026)

Some prices quoted in this guide are out of date. It is being rebuilt on our price index; for current prices use the comparison pages, which show when each price was checked.

If your VPS is down for two hours and you didn't know, monitoring failed. This guide walks through the free monitoring stack that catches real problems — uptime, resource exhaustion, disk fill, cron failure — without paying for Datadog.

What you're actually monitoring for

  • Site down. External check that hits your URL every 1-5 minutes.
  • Server unreachable. Ping / SSH availability.
  • Disk filling. Log growth, database growth, forgotten /tmp files.
  • RAM exhaustion. OOM killer running on your services.
  • CPU pinned. Sustained 100% CPU means something's stuck or being abused.
  • Cron didn't run. Silent backup failure is the classic disaster.
  • SSL certificate about to expire. Automatically renew or die.
  • Unusual traffic. DDoS, spam, spike.

The free stack

  • UptimeRobot — external URL monitoring. Free tier: 50 monitors, 5-minute checks.
  • Netdata — local resource dashboards. Or Prometheus + node_exporter + Grafana if you want more control.
  • Healthchecks.io — cron ping monitoring. Free tier: 20 checks.
  • Fail2ban — blocks brute-force SSH attempts.
  • logwatch — nightly emailed log summary.

Total cost: $0. Total setup time: 1 hour.

Layer 1: UptimeRobot

  • Sign up at uptimerobot.com. Free.
  • Add HTTP monitor for https://yourdomain.com.
  • 5-minute check interval on free tier (paid: 1-minute).
  • Alerts via email, Discord webhook, Slack webhook, Telegram bot.

Set up a Discord webhook alert — Discord's mobile notifications are instant and free:

  • Discord server → channel → Settings → Integrations → Webhooks → New Webhook. Copy URL.
  • UptimeRobot → Alert Contacts → Add → Discord → paste webhook URL.

Now when your site is down, your phone buzzes.

Add ping monitors for critical URLs — the login page, the API health endpoint, checkout.

Layer 2: Netdata (local dashboards)

One-command install:

```bash

bash <(curl -Ss https://my-netdata.io/kickstart.sh)

```

Netdata now runs on localhost:19999 — every metric (CPU, RAM, disk I/O, network, per-service resource) visible in real-time.

Firewall Netdata — don't expose it to the internet:

```bash

ufw allow from 127.0.0.1 to any port 19999

```

Access via SSH tunnel: ssh -L 19999:localhost:19999 you@vps → open http://localhost:19999 locally.

For remote access, use Netdata Cloud's free tier (aggregates your nodes). Or use Tailscale to reach the port over your private tailnet.

Layer 3: Alerting from Netdata

Netdata has built-in health monitoring. Configure /etc/netdata/health_alarm_notify.conf:

```

SEND_EMAIL="YES"

DEFAULT_RECIPIENT_EMAIL="[email protected]"

SEND_DISCORD="YES"

DISCORD_WEBHOOK_URL[sysadmin]="https://discord.com/api/webhooks/..."

DEFAULT_RECIPIENT_DISCORD="sysadmin"

```

Now high CPU, low disk, unresponsive services all page you.

Layer 4: Healthchecks.io for cron

For every cron job that matters (backups, log rotation, cache purges):

  • Sign up at healthchecks.io. Free.
  • Create a check. Copy the ping URL.
  • Add to your cron script: curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/YOUR-UUID after successful run.

If your cron doesn't ping in the expected window, Healthchecks alerts you.

Ideal for daily backup verification: no ping in 25 hours → email alert → you know backup broke last night.

Layer 5: Fail2ban

Install and configure fail2ban to block brute-force attempts:

```bash

apt install fail2ban

```

Default config bans IPs after 5 failed SSH attempts for 10 minutes. Turn it up:

```

/etc/fail2ban/jail.local

[sshd]

enabled = true

findtime = 10m

maxretry = 3

bantime = 1h

```

Restart: systemctl restart fail2ban.

Check active bans: fail2ban-client status sshd.

Layer 6: logwatch

Nightly emailed summary of your logs:

```bash

apt install logwatch

```

Config: /etc/logwatch/conf/logwatch.conf — set Detail = Med and MailTo = [email protected].

Runs via /etc/cron.daily/00logwatch. Every morning you get an email summarising the previous 24 hours of logs. You'll see brute-force patterns, unusual traffic, and errors before they become incidents.

Layer 7 (optional): Prometheus + node_exporter + Grafana

For teams: run Prometheus + node_exporter on the VPS, Grafana on a separate management box.

  • Prometheus scrapes metrics from node_exporter.
  • Grafana visualises them.
  • AlertManager routes alerts.

Overkill for a single-VPS setup; correct for a fleet of 5+ boxes.

SSL certificate expiry

If you use Certbot with --nginx, auto-renewal is already set up via /etc/cron.d/certbot.

Verify:

```bash

certbot renew --dry-run

```

Add a Healthchecks.io check that pings when renewal runs — silent Certbot failure means expired certs at 3am on a Saturday.

What NOT to do

  • Enable Netdata's public dashboard on port 19999 over the open internet. Exposes system information; also occasionally used as an attack vector.
  • Ignore log emails. logwatch is only useful if you actually read it.
  • Alert on everything. Fatigue makes you ignore alerts. Alert on what actually needs immediate action.
  • Rely only on external monitoring. External uptime says nothing about database corruption or slow queries.

Cost view

  • UptimeRobot free tier: $0.
  • Netdata (self-hosted): $0.
  • Healthchecks.io free tier: $0.
  • Fail2ban: $0.
  • logwatch: $0.

For a paid upgrade path:

  • UptimeRobot Pro (1-minute checks): $8/mo.
  • Netdata Cloud: free for individuals, ~$10/user/month for teams.
  • Healthchecks.io paid: $20/mo for 100+ checks.
  • Total under $40/mo for the paid stack. Under $0 for the free stack.

Related guides