Gatus is a developer-oriented health check and uptime monitoring tool that monitors HTTP, TCP, DNS, ICMP, and SSH endpoints. Unlike heavyweight monitoring platforms, Gatus is a single Go binary with a beautiful dashboard and flexible alerting. It uses a simple YAML configuration and requires no database. This guide covers deployment and practical monitoring configurations.
Installation
# Docker (recommended)
docker run -d --name gatus -p 8080:8080 \
-v /path/to/config.yaml:/config/config.yaml \
twinproduction/gatus
# Binary
wget https://github.com/TwiN/gatus/releases/latest/download/gatus-linux-amd64.tar.gz
tar xzf gatus-linux-amd64.tar.gz
./gatus
Configuration
# config.yaml
storage:
type: sqlite
path: /data/gatus.db
endpoints:
# HTTP health check
- name: Website
group: production
url: "https://example.com"
interval: 30s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 500"
- "[BODY].status == 'ok'"
# API endpoint
- name: API
group: production
url: "https://api.example.com/health"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 1000"
# TCP port check
- name: Database
group: infrastructure
url: "tcp://db.example.com:5432"
interval: 30s
conditions:
- "[CONNECTED] == true"
# DNS resolution
- name: DNS
group: infrastructure
url: "dns:example.com"
dns:
query-type: A
query-name: "example.com"
conditions:
- "[DNS_RCODE] == NOERROR"
- "[BODY] == 203.0.113.1"
# SSH connectivity
- name: SSH Server
group: infrastructure
url: "ssh://server.example.com:22"
interval: 60s
conditions:
- "[CONNECTED] == true"
# ICMP ping
- name: Gateway
group: network
url: "icmp://10.0.0.1"
interval: 10s
conditions:
- "[CONNECTED] == true"
- "[RESPONSE_TIME] < 50"
Alerting
alerting:
slack:
webhook-url: "https://hooks.slack.com/services/xxx/yyy/zzz"
default-alert:
enabled: true
send-on-resolved: true
failure-threshold: 3
success-threshold: 2
pagerduty:
integration-key: "your-pagerduty-key"
default-alert:
enabled: true
failure-threshold: 5
email:
from: "gatus@example.com"
host: "smtp.example.com"
port: 587
username: "gatus@example.com"
password: "password"
default-alert:
enabled: true
send-on-resolved: true
endpoints:
- name: Critical API
url: "https://api.example.com/health"
interval: 15s
conditions:
- "[STATUS] == 200"
alerts:
- type: slack
failure-threshold: 2
- type: pagerduty
failure-threshold: 5
Docker Compose Deployment
services:
gatus:
image: twinproduction/gatus
restart: always
ports:
- "8080:8080"
volumes:
- ./config.yaml:/config/config.yaml
- gatus_data:/data
environment:
- TZ=America/New_York
volumes:
gatus_data:
Dashboard Features
- Real-time status for all endpoints with response times
- Uptime percentages (24h, 7d, 30d)
- Response time graphs
- Certificate expiration monitoring (automatic for HTTPS endpoints)
- Group-based organization
- Dark/light theme
Best Practices
- Use groups to organize endpoints by environment or service type
- Set
failure-thresholdto 2-3 to avoid alerting on transient issues - Use
send-on-resolved: trueto know when issues are fixed - Monitor SSL certificate expiration by checking HTTPS endpoints
- Use SQLite storage for persistence across restarts
- Keep check intervals reasonable — 30-60 seconds for most endpoints