Uptime Monitoring and Alerting: Know the Moment You Go Down
Combine external probes with Uptime Kuma or Alertmanager to give your server a heartbeat, and let email and Telegram watch the box for you.
The scariest thing about a server isn't that it's slow — it's that it dies quietly. If you only find out when users complain, hours have usually already slipped by. Uptime monitoring solves exactly one problem: the instant your service goes down, you get pinged.
The core idea: probe from the outside
To decide whether a machine is "alive," you probe it on a schedule. There are three common layers:
- Ping (ICMP) — confirms the host is reachable on the network. Lightweight, but "reachable" doesn't mean "working."
- TCP port checks — open a connection to 22, 443, 3306, and so on to confirm a service is actually listening.
- HTTP/HTTPS checks — hit a health endpoint (e.g. https://your-site/healthz) and validate the status code is 200, that the body contains an expected keyword, and how many days until the TLS certificate expires.
One hard rule: the monitor must live outside the machine it watches. If your monitoring runs on the same VPS as your app, then when the box dies the monitor dies with it — and no alert ever goes out. Run your probes from a separate, cheap VPS or a node in a different data center.
Option 1: Uptime Kuma (one Docker command — great for individuals/small teams)
Uptime Kuma is the least fussy self-hosted option. A single command brings it up:
docker run -d --restart=always \
-p 3001:3001 \
-v uptime-kuma:/app/data \
--name uptime-kuma louislam/uptime-kuma:1
Open http://monitor-ip:3001, create the admin account, then under "Add New Monitor" pick HTTP(s)/TCP/Ping, enter the target and a check interval (say, 60 seconds), and wire up a channel under Notifications. It ships with 90+ channels — email (SMTP), Telegram, and Webhook included — and can even publish a public status page.
Option 2: Prometheus + Blackbox + Alertmanager (for scale)
If you already run Prometheus, pair blackboxexporter for probing with Alertmanager for routing. A sample rule:
groups:
- name: uptime
rules:
- alert: InstanceDown
expr: probe_success == 0
for: 2m # fire only after 2 straight minutes of failure
labels: { severity: critical }
annotations:
summary: "{{ $labels.instance }} is down"
Channels and "alert fatigue"
Email is good for a paper trail; Telegram and Webhook are better for reaching your phone right now. But what really makes monitoring usable is thresholds and silencing:
- Set a for window or retry count. Don't alert on a single failed probe — require two or three consecutive failures to filter out network blips.
- Use silences and maintenance windows. Mute before a planned reboot or upgrade so you don't flood yourself.
- Tier your severities. A cert expiring in 30 days is a "reminder"; a downed service is "critical" — route them to different channels.
Too many alerts is the same as no alerts. The moment you start reflexively ignoring notifications, your monitoring has already failed.
Summary
The essentials of uptime monitoring: probe over HTTP/TCP/Ping from outside the box; spin up Uptime Kuma with Docker for personal use, or Prometheus + Alertmanager at scale; send alerts to email for the record and Telegram/Webhook for instant reach; and tame alert fatigue with consecutive-failure thresholds and silence windows. Ten minutes of setup buys you the peace of mind of knowing the moment you go down.