Health Checks
Purpose
Determine whether the Manager process is alive and whether it is ready to serve (listeners admitted, PostgreSQL health check passed).
This is the operator procedure. Endpoint JSON is in API health and Manager health.
Prerequisites
- Manager process or
zwall-manager.serviceinstalled - Network path to the listen address (example YAML
server.port/server.api_port8443; zwallctl default 8080 is a known mismatch — use the real listener)
Required permissions: unauthenticated HTTP GET for /health/live and /health/ready. Admin JWT for /metrics and zwallctl check (sanity-check API).
Procedure — process probes
Prefer live and ready separately.
curl -fsS https://MANAGER_HOST:8443/health/live
curl -fsS https://MANAGER_HOST:8443/health/readySelf-signed lab certificates need curl -k only in non-production. Production should use a trust store.
Liveness 200: {"status":"alive","timestamp":<unix seconds>}.
Liveness 503: {"status":"draining","timestamp":...} when updater runtime mode is draining or updating (updater is not a production upgrade path; still interpret 503 as “do not send traffic”).
Readiness 200: status is ready, database is ok, checks empty or omitted.
Readiness 503: status is not_ready. checks may include:
manager: listener_admission_incompletedatabase: not_configureddatabase: timeoutdatabase:plus the health-check errorcluster: timeoutif cluster is enabled (cluster is not a public HA product)
Timeout is health.readiness_timeout (code default 5s when set).
GET /health and GET /api/v1/health are compatibility aliases. Prefer live/ready.
Procedure — CLI
zwallctl ping --manager-url https://MANAGER_HOST:8443
zwallctl check --manager-url https://MANAGER_HOST:8443ping GETs /api/v1/health. check [check-name] GETs /api/v1/system/sanity-check or /api/v1/system/sanity-check/{name} (admin).
zwallctl default URL is http://localhost:8080. If ping fails with connection refused, you are likely hitting the port mismatch, not a dead Manager.
Procedure — systemd
systemctl is-active zwall-manager
systemctl is-active zwall-agent
systemctl is-active zwall-hosting-ebpf-loader
systemctl is-active zwall-hosting-agentHosting v2 unit name is zwall-hosting-agent-v2.service when that unit is what the release shipped. Use the installed name.
is-active is not readiness. A running Manager with PostgreSQL down is live and not ready.
Expected result
Scroll sideways to see the full table. Use the arrow keys when focused.
| Check | Healthy |
|---|---|
| live | 200 alive |
| ready | 200 ready, database ok |
| systemd | active |
| ping | success to the real URL |
Failure modes
Scroll sideways to see the full table. Use the arrow keys when focused.
| Result | Meaning | Next |
|---|---|---|
| connection refused | wrong port, unit down, listen not bound | Manager unavailable |
| TLS handshake fail | cert/key mismatch, tls.enabled | TLS |
| live 200, ready 503 | process up, DB or listener not admitted | journal + PostgreSQL |
| live 503 draining | updater drain | do not treat as healthy; updater is not the production upgrade path |
Security considerations
Live/ready are unauthenticated by design for a local load balancer. Do not expose them on the public Internet without an independent ACL. /metrics is admin-gated when enabled.
Limitations
- Not a Kubernetes shipping integration. Probe-style paths are HTTP only.
- Blocking-authority extra JSON keys are additive; do not invent a second public contract.
- Community does not implement
GetEBPFHealth.