Gatus is a fast, self-hosted endpoint monitoring tool that checks the health of your APIs, databases, and services. It's lightweight, configuration-driven, and increasingly popular in homelab and production environments alike.
But here's the thing: Gatus is itself a service. It runs in a container, depends on a configuration file, serves a dashboard, and can be silently killed by an OOM event or a bad deploy. If Gatus goes down, you lose visibility into everything it was watching — and you won't know until a user reports a real outage.
The solution is meta-monitoring: monitor your monitor with an independent external tool. In this tutorial you'll set up Vigilmon to watch Gatus from outside your network, so a Gatus failure triggers an alert through a completely separate path.
Why monitoring Gatus externally matters
Gatus handles the inside view — it knows whether your internal APIs respond. Vigilmon handles the outside view — it knows whether Gatus itself is reachable and healthy. These are complementary:
- Gatus container crashes — if the container exits or OOMs, Gatus stops alerting. Vigilmon still sees the dashboard as unreachable and fires
- Configuration errors after redeploy — a malformed
gatus.yamlcan cause Gatus to start silently ignoring checks; Vigilmon detects the dashboard going blank - Disk/volume issues — if Gatus can't write state, it may serve stale data; monitoring the
/healthAPI detects this - Alert delivery failures — Gatus uses webhooks, Slack, or email to deliver alerts. Vigilmon tests the delivery path end-to-end using a dead man's switch pattern
- Network partition — if Gatus is isolated from its targets but still running, you need to know that Gatus itself is alive even while its checks fail
What you'll need
- A running Gatus instance (Docker, Kubernetes, or bare metal)
- Gatus's web UI and API accessible from the internet (or via a reverse proxy)
- A free Vigilmon account — sign up takes 30 seconds
Step 1: Verify Gatus's built-in health endpoint
Gatus exposes an /api/v1/endpoints/statuses JSON API and a /health endpoint (if enabled). Check your gatus.yaml to make sure the web server is running:
# gatus.yaml (partial)
web:
port: 8080
read-timeout: 15s
write-timeout: 15s
With a default setup, Gatus serves:
http://your-gatus-host:8080/— the dashboard UIhttp://your-gatus-host:8080/api/v1/endpoints/statuses— JSON status for all endpoints
Test the API response:
curl http://your-gatus-host:8080/api/v1/endpoints/statuses
# Returns a JSON array of endpoint statuses
If you're behind a reverse proxy (nginx, Caddy, Traefik), confirm the proxy is forwarding correctly:
curl https://status.yourdomain.com/api/v1/endpoints/statuses
Step 2: Monitor the Gatus API health endpoint
Log in to vigilmon.online and go to Monitors → New Monitor.
Set up your first monitor:
| Field | Value |
|-------|-------|
| Type | HTTP / HTTPS |
| Name | Gatus API Health |
| URL | https://status.yourdomain.com/api/v1/endpoints/statuses |
| Check interval | 1 minute |
| Expected status code | 200 |
| Response body contains | results |
The results keyword check ensures Gatus is actually returning status data, not just responding with an empty page or error HTML.
Click Save. Vigilmon will begin probing from multiple regions immediately.
Step 3: Monitor the Gatus dashboard availability
Gatus's web UI is what your team uses to get a quick overview of infrastructure health. If the dashboard loads a blank page or returns a 5xx error, that's operationally just as bad as Gatus being down.
Add a second monitor:
| Field | Value |
|-------|-------|
| Type | HTTP / HTTPS |
| Name | Gatus Dashboard UI |
| URL | https://status.yourdomain.com/ |
| Check interval | 2 minutes |
| Expected status code | 200 |
| Response body contains | Gatus |
The body check on Gatus ensures the page is rendering real content rather than a reverse-proxy error page.
Step 4: Monitor alert delivery with a heartbeat
This is the most powerful meta-monitoring technique: configure Gatus to periodically ping a Vigilmon heartbeat URL. If Gatus stops running or stops delivering alerts, Vigilmon detects the silence and fires.
Create a heartbeat monitor in Vigilmon
- Go to Monitors → New Monitor → Heartbeat
- Name it:
Gatus Alert Delivery - Set the expected interval to 5 minutes
- Save — Vigilmon gives you a unique ping URL like
https://hb.vigilmon.online/ping/abc123xyz
Configure Gatus to ping the heartbeat
In your gatus.yaml, add an endpoint that pings Vigilmon's heartbeat URL on a schedule:
endpoints:
- name: vigilmon-heartbeat
url: https://hb.vigilmon.online/ping/abc123xyz
interval: 5m
conditions:
- "[STATUS] == 200"
alerts:
- type: slack # or whichever alert channel you use
failure-threshold: 1
success-threshold: 1
send-on-resolved: true
Now the chain is complete:
- Gatus pings Vigilmon every 5 minutes
- If Gatus crashes, the pings stop
- Vigilmon fires an alert after 5 minutes of silence
- You're notified through Vigilmon — completely independent of Gatus
Step 5: Monitor the TCP layer
If Gatus runs on a non-standard port or behind a TCP load balancer, add a TCP check to catch port-level failures that HTTP monitoring wouldn't catch:
- Go to Monitors → New Monitor → TCP Port
- Host:
your-gatus-host.yourdomain.com - Port:
8080(or your Gatus port) - Interval: 1 minute
This catches scenarios where the HTTP server inside Gatus hangs but the port is still bound, or vice versa.
Step 6: Configure alert channels
Connect Vigilmon to your notification stack so Gatus failures reach you reliably.
- Go to Alert Channels → Add Channel → Email
- Enter your on-call address
- Assign to all your Gatus monitors
Webhook (Slack, Teams, PagerDuty)
- Go to Alert Channels → Add Channel → Webhook
- Paste your Slack incoming webhook URL or PagerDuty integration URL
- Assign to all monitors
When Gatus goes down, Vigilmon sends a payload like:
{
"monitor_name": "Gatus API Health",
"status": "down",
"url": "https://status.yourdomain.com/api/v1/endpoints/statuses",
"started_at": "2026-07-01T09:12:00Z",
"duration_seconds": 67
}
Step 7: Set up a status page
If your team or stakeholders rely on Gatus for visibility, a Vigilmon status page gives them an independent confirmation channel when Gatus itself is unavailable.
- Go to Status Pages → New Status Page
- Name it:
Infrastructure Monitoring Health - Add your monitors: Gatus API Health, Gatus Dashboard UI, Gatus Alert Delivery heartbeat
- Publish the page
Share the link in your runbook. When Gatus is down, your team can check Vigilmon's status page directly.
Monitor summary
| Monitor | Type | Catches |
|---------|------|---------|
| Gatus API /api/v1/endpoints/statuses | HTTP | Container crash, config errors, process hang |
| Gatus Dashboard / | HTTP | Reverse proxy failure, UI rendering errors |
| Gatus Alert Delivery | Heartbeat | Silent Gatus failures, alert pipeline breakage |
| Gatus TCP port | TCP | Port-level connectivity failures |
What's next
- SSL monitoring — if your Gatus dashboard is behind TLS, Vigilmon tracks your certificate expiry automatically
- Multi-region confirmation — Vigilmon probes from multiple regions, so a single network hiccup doesn't trigger false alerts for your meta-monitoring
- Uptime history — Vigilmon's response time graphs let you see if Gatus has been running slow before it actually fails, which can indicate resource pressure
Start meta-monitoring your monitoring stack at vigilmon.online — free tier, no credit card required.