In this guide
  1. The three things worth monitoring
  2. Uptime and external checks
  3. Resource usage on the server itself
  4. Application error tracking
  5. Alerting that you will actually see
  6. What to skip for now
  7. A sample free-tier stack
  8. A simple disk alert script
  9. Log visibility without a log platform
  10. Frequently asked questions

Full observability platforms are genuinely powerful and genuinely overkill for a single-server SaaS in its early years. Here's a monitoring setup that catches the failures that actually happen to small production servers, at close to zero cost.

The three things worth monitoring

In order of how often they actually catch a real incident: is the site reachable from outside your own network (uptime monitoring), is the server running out of a critical resource (disk, memory, CPU sustained at 100%), and is the application throwing errors users are hitting but not reporting. Everything past these three is a refinement, not a foundation.

Uptime and external checks

An external uptime monitor — checking your site from outside your own infrastructure, on a schedule of a few minutes — is non-negotiable and free tiers of several well-known services cover this adequately for a single site or a handful of endpoints. Check not just the homepage but a real authenticated or database-backed endpoint, since a server can serve a static homepage from cache even while the actual application and database are broken.

Resource usage on the server itself

aaPanel's built-in monitoring tab covers basic CPU, RAM, and disk usage graphs out of the box with no extra setup. If you want alerting rather than just a dashboard you have to remember to check, a lightweight agent-based free tier from a dedicated monitoring provider, or a simple custom cron script that emails you when disk usage crosses a threshold, both work — the specific tool matters less than actually having some automated alert instead of discovering a full disk when the application starts failing.

Application error tracking

An error tracking service with a generous free tier for low-volume apps (several well-known ones exist) catches exceptions your users hit but never bother to report — which, for most products, is the large majority of them. This is often the highest-leverage monitoring addition for a young product, because it surfaces bugs you'd otherwise only learn about from churn.

Alerting that you will actually see

An alert that only shows up in an email you check once a day isn't really an alert for anything urgent. Route uptime and critical resource alerts to somewhere you'll actually see within minutes — a phone push notification, SMS, or a messaging app you check constantly. Save email for lower-urgency summaries.

What to skip for now

Distributed tracing, custom metrics dashboards, and log aggregation platforms with per-GB pricing are valuable once you're debugging cross-service latency issues in a multi-server architecture. For a single VPS running one or two applications, they're solving a problem you probably don't have yet, and the subscription cost is better spent elsewhere until you do.

Minimum viable monitoring: one external uptime check on a real endpoint, disk/RAM/CPU alerting, and an error tracker with alerts routed somewhere you'll actually see promptly. All three fit comfortably in a free tier for a single-server product.

A sample free-tier stack

LayerWhat it catchesTypical free-tier limit
External uptime monitorSite unreachable from outside your networkA handful of monitors, checked every few minutes
Self-hosted dashboard (e.g. Uptime Kuma)Same, plus a status page — no per-monitor limit since you run it yourselfFree, costs only the tiny VPS it runs on
Dead-man's-switch ping (e.g. Healthchecks-style services)A cron job or backup script silently stopped runningA modest number of checks on the free tier
Error tracker (e.g. Sentry-style services)Unhandled exceptions your users hit but never reportA monthly event quota, generous for a low-traffic product

Combined, this stack covers uptime, resource alerting, silent job failures, and application errors — the four failure modes that account for the overwhelming majority of incidents on a small self-hosted product — for effectively no monthly cost beyond what you're already paying for the VPS itself.

A simple disk alert script

If you'd rather not add another external service just for disk alerting, a five-line cron script covers it:

#!/bin/bash
THRESHOLD=80
USAGE=$(df / --output=pcent | tail -1 | tr -dc '0-9')
if [ "$USAGE" -ge "$THRESHOLD" ]; then
  curl -s -X POST "https://api.your-messaging-service.com/send" \
    -d "text=Disk usage on $(hostname) is at ${USAGE}%"
fi

Run it every 15 minutes via cron and point the curl call at whatever messaging service you already check constantly (a chat app's webhook, an SMS API, or even a simple email-to-SMS gateway). It's not as polished as a dedicated monitoring dashboard, but it closes the single most common "we didn't notice" gap — a slowly filling disk — for the cost of five minutes of setup.

Log visibility without a log platform

Full log aggregation platforms are genuinely useful once you're correlating logs across multiple servers, but for a single VPS, journalctl and plain application log files already cover most day-to-day debugging needs — the trick is making them fast to search under pressure. A couple of habits go a long way: keep application logs structured (even simple key=value pairs) rather than free-form text, so grep and basic tools can filter them quickly, and set up log rotation (logrotate is preinstalled on virtually every Linux distribution) so a single misbehaving service can't fill the disk with its own logs — tying this back to the disk-fill failure mode covered elsewhere on this site. This gets you real debugging visibility without paying per-GB for a dedicated platform until you actually have enough servers that correlating logs across them by hand becomes the bottleneck.

Frequently asked questions

How often should an uptime check run?

Every 1-5 minutes is typical for a production service — frequent enough to catch an outage quickly without generating excessive check traffic. Most free-tier monitoring services default to something in this range.

What resource usage thresholds should trigger an alert?

A common starting point: alert at 80% for disk usage (since disk fills gradually and you want runway to act), and alert on CPU or memory only if elevated usage is sustained for several minutes rather than a brief spike, to avoid alert fatigue from normal traffic variation. Tune thresholds based on your own server's normal baseline once you've observed it for a couple of weeks.

Is a status page worth setting up for a small SaaS?

Once you have real paying customers, yes — a simple public status page (several free, self-hostable tools exist — see our guide to running your own) reduces support inquiries during an incident because users can check it themselves, and it signals operational transparency that builds trust.