Skip to content

Status / Health

A lightweight public status page that lets you (and your future self) tell at a glance whether auxserver-prod is reachable, when it was last checked, and which edge/runtime/app components respond.

Endpoint

URLPurpose
https://docs.cadenceworks.tech/healthzLiveness — returns 200 if Caddy + docs site are up
https://docs.cadenceworks.tech/healthz/fullDeep check — probes edge, runtime, and app loopback services
https://docs.cadenceworks.tech/healthz.jsonMachine-readable JSON (same payload as /healthz/full)

A 200 from /healthz means the documentation site itself is healthy — it is not a guarantee that Nextcloud, n8n, or other apps are up. Use /healthz/full for that.

Response shape

/healthz/full returns JSON:

json
{
  "host": "auxserver-prod",
  "checked_at": "2026-07-25T18:50:00Z",
  "overall": "ok",
  "checks": {
    "edge": { "status": "ok", "detail": "Caddy responding on :443" },
    "ssh": { "status": "ok", "detail": "sshd listening on :22" },
    "docker": { "status": "ok", "detail": "12 containers running" },
    "postgresql": { "status": "ok", "detail": "127.0.0.1:5432 accepting connections" },
    "apps": {
      "nextcloud": { "status": "ok", "url": "https://cloud.cadenceworks.tech" },
      "n8n":       { "status": "ok", "url": "https://n8n.cadenceworks.tech" },
      "radicale":  { "status": "ok", "url": "https://dav.cadenceworks.tech" },
      "portainer": { "status": "ok", "url": "https://portainer.cadenceworks.tech" },
      "puter":     { "status": "ok", "url": "https://puter1.cadenceworks.tech" }
    }
  }
}

Status values

ValueMeaning
okProbe succeeded within timeout
degradedProbe succeeded but reported warnings (e.g. container restarting)
downProbe failed after timeout or returned non-2xx

overall is ok only when all checks are ok. Any down flips it to down; any degraded flips it to degraded.

Probes

Each check is a small, side-effect-free probe:

CheckWhat it doesTimeout
edgeTCP connect to 127.0.0.1:443 (Caddy)2s
sshTCP connect to 127.0.0.1:222s
dockerdocker ps and count running5s
postgresqlTCP connect to 127.0.0.1:54322s
apps.<name>GET https://<host>/ and require 2xx/3xx5s each

A failed probe never raises; it is recorded as down with the error string in detail.

DNS cutover

App probes use *.cadenceworks.tech URLs. Until those names have public DNS, /healthz/full may report apps as down even when the loopback backends are healthy.

Implementation

The status page is served by Caddy from a tiny static generator run by a systemd timer:

  • Script: /usr/local/sbin/healthz.sh
  • Output: /var/www/healthz/index.html, /var/www/healthz/healthz.json, /var/www/healthz/full
  • Timer: healthz.timer runs every 60 seconds
  • Caddy serves /healthz* from /var/www/healthz/ with Cache-Control: no-cache

Quick checks

bash
curl -sS https://docs.cadenceworks.tech/healthz
curl -sS https://docs.cadenceworks.tech/healthz/full | jq
curl -sS https://docs.cadenceworks.tech/healthz.json | jq '.overall'

Caddy serves these paths from /var/www/healthz on docs.cadenceworks.tech (see /etc/caddy/Caddyfile and ~/docs-site/docs.caddy.snippet).

Northeast Systems · Aux Server · Infra Server