Gatus

Embed
Preview of the card
<a href="https://forumulate.com/p/watchtower/docs/gatus"><img src="https://forumulate.com/api/public/orgs/watchtower/spaces/docs/pages/ceaf5cb7-554d-48da-9010-c19692c2cef7/social-card.svg?v=3e7ae33eec8b" alt="Gatus" width="600" height="315"></a>

Watchtower does not build a status page. Forumulate runs Gatus; Gatus polls Watchtower's health endpoints (see health tokens) and Watchtower pushes alert state and a heartbeat to Gatus external endpoints. Tested against Gatus v5.17.0 (go/e2e/phase3/gatus.version).

Alert state push (gatus_push receiver)

In Gatus, declare an external endpoint:

external-endpoints:
  - name: shop
    group: watchtower
    token: "${WT_GATUS_ALERTS_TOKEN}"

Create a receiver of kind gatus_push:

  • config: {"base_url": "https://gatus.example.com", "endpoint_key": "watchtower_shop"}. The key is Gatus's <group>_<name>. base_url must be https (plain http only for loopback in dev).

  • secrets: {"token": "<the external endpoint's token>"}. Sealed on save like every receiver secret; never returned, logged or audited.

On each flush the notifier calls POST {base_url}/api/v1/endpoints/{endpoint_key}/external?success=<bool>&error=<summary>&duration=<ms> with Authorization: Bearer <token>: success=false while any alert in the group is firing, true once all resolved. error names the firing alerts and their count (alert names only, at most 200 characters). Delivery is at-least-once; repeating a state is harmless.

Self-heartbeat

Set on the notifier WT_GATUS_SELF_URL (Gatus base URL), WT_GATUS_SELF_KEY (e.g. watchtower_self) and WT_GATUS_SELF_TOKEN (env only, never logged). It pushes success=true every 60 s. Give the Gatus endpoint heartbeat: {interval: 3m}: when Watchtower goes silent Gatus fails it. Several notifier replicas may all push.

Config export

wtctl gatus config --api https://api.example.com --key $WT_API_KEY --project shop \
  --project-id <prj_...> [--env prod] [--public-url https://watchtower.example.com]

--project-id is required (the API has no slug lookup). It prints Gatus YAML with one polling endpoint per live health token (Authorization: Bearer ${WT_HEALTH_TOKEN_<n>}, never the secret; set each variable from the value shown once at token creation) plus the external-endpoints stanzas above.

Updated