Appearance
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
| URL | Purpose |
|---|---|
https://docs.cadenceworks.tech/healthz | Liveness — returns 200 if Caddy + docs site are up |
https://docs.cadenceworks.tech/healthz/full | Deep check — probes edge, runtime, and app loopback services |
https://docs.cadenceworks.tech/healthz.json | Machine-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
| Value | Meaning |
|---|---|
ok | Probe succeeded within timeout |
degraded | Probe succeeded but reported warnings (e.g. container restarting) |
down | Probe 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:
| Check | What it does | Timeout |
|---|---|---|
edge | TCP connect to 127.0.0.1:443 (Caddy) | 2s |
ssh | TCP connect to 127.0.0.1:22 | 2s |
docker | docker ps and count running | 5s |
postgresql | TCP connect to 127.0.0.1:5432 | 2s |
apps.<name> | GET https://<host>/ and require 2xx/3xx | 5s 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.timerruns every 60 seconds - Caddy serves
/healthz*from/var/www/healthz/withCache-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).