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.
A sample free-tier stack
| Layer | What it catches | Typical free-tier limit |
|---|---|---|
| External uptime monitor | Site unreachable from outside your network | A 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 yourself | Free, 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 running | A modest number of checks on the free tier |
| Error tracker (e.g. Sentry-style services) | Unhandled exceptions your users hit but never report | A 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.