Website Uptime Monitoring
Uptime Monitoring — basic observability layer: URL availability check via HTTP requests at intervals. Detects unavailability fact, not cause. Must be supplemented with infrastructure monitoring and error logging.
Tools
SaaS (no infrastructure):
- UptimeRobot — free up to 50 monitors, 5 min interval. Paid — 1 min.
- Better Uptime — aggregates multiple locations, status page, on-call scheduling
- Pingdom — Enterprise-level, RUM, API monitoring
- StatusCake — good price/quality ratio
Self-hosted:
- Uptime Kuma — Docker, web interface, many check types
- Gatus — YAML configuration, Kubernetes-friendly
- Blackbox Exporter + Prometheus + Grafana — for those with existing Prometheus
Uptime Kuma via Docker
# docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:latest
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./uptime-kuma-data:/app/data
Gatus: declarative monitoring
# gatus/config.yaml
endpoints:
- name: Main Site
url: https://mysite.com
interval: 1m
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 2000"
- "[CERTIFICATE_EXPIRATION] > 168h" # > 7 days until expiry
- name: API Health
url: https://api.mysite.com/health
interval: 30s
conditions:
- "[STATUS] == 200"
- "[BODY].status == UP"
- "[RESPONSE_TIME] < 500"
- name: Checkout Flow
url: https://mysite.com/cart
interval: 5m
conditions:
- "[STATUS] == 200"
- "[BODY] pat *Add to cart*"
alerting:
telegram:
token: $TELEGRAM_BOT_TOKEN
id: $TELEGRAM_CHAT_ID
default-alert:
enabled: true
failure-threshold: 2
success-threshold: 1
Multi-region monitoring
Check from multiple locations: otherwise might miss regional failure. Better Uptime and Pingdom include this in base plan.
For self-hosted — multiple Gatus instances in different regions + central aggregator.
Telegram alerting
# Simple webhook handler for alerts
import requests
import os
def send_alert(message: str, is_recovery: bool = False):
emoji = "✅" if is_recovery else "🚨"
requests.post(
f"https://api.telegram.org/bot{os.environ['BOT_TOKEN']}/sendMessage",
json={
"chat_id": os.environ['CHAT_ID'],
"text": f"{emoji} {message}",
"parse_mode": "HTML",
}
)
What to monitor
| URL | Check type | Interval |
|---|---|---|
| Homepage | HTTP 200 + content check | 1 min |
| API /health | HTTP 200 + JSON | 30 sec |
| Checkout/order form | HTTP 200 | 5 min |
| Login page | HTTP 200 | 5 min |
| Sitemap | HTTP 200 | 15 min |
| SSL certificate | Expiry > 14 days | 1 hour |
Setting up Uptime Kuma or Gatus for site (10–20 endpoints) — 2–4 hours.







