Docs / Monitoring & Logging / Gatus: Lightweight Uptime Monitoring

Gatus: Lightweight Uptime Monitoring

By Admin · Mar 15, 2026 · Updated Apr 23, 2026 · 315 views · 3 min read

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-threshold to 2-3 to avoid alerting on transient issues
  • Use send-on-resolved: true to 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

Was this article helpful?