Health
Manager health and readiness
Purpose
Prove whether the Manager process is alive and whether it is ready to serve traffic. These are different questions. A live process can still be unreadiness if PostgreSQL, listener admission, or (when enabled) cluster health has failed.
Audience
Operators who start, restart, or load-balance the Manager, and anyone diagnosing “console down.”
Edition
SHARED. Community and Enterprise expose the same four HTTP probes. Enterprise may add cluster and blocking-authority checks to readiness when those subsystems are enabled. Cluster itself is license-gated and not a public HA product.
Status
SUPPORTED as unauthenticated process probes. Do not treat them as a Kubernetes product integration; source comments mention probe style only.
Prerequisites
- Manager HTTP(S) listener reachable from the operator host
- The real listen URL (example YAML uses
https://manager.example.com:8443; unconfiguredzwallctluseshttp://localhost:8080)
Required permissions
None. GET /health/live, GET /health/ready, GET /health, and GET /api/v1/health are unauthenticated.
GET /metrics is not a health probe. When metrics.enabled is true it requires an administrator JWT/session and RoleAuth("admin").
Dependencies
Readiness depends on:
- HTTP listener admission (
listenerAdmissionReadyand servers serving) - PostgreSQL
HealthCheck() - Optional blocking-authority readiness when the blocking pipeline is required
- Optional cluster health when
cluster.enabledis true (not a customer HA procedure)
Configuration
Scroll sideways to see the full table. Use the arrow keys when focused.
| Key | Meaning |
|---|---|
health.readiness_timeout | Bound for the readiness handler. Code default is 5s when unset. Validation requires at least 1s and at most 30s. |
zwall-manager.service does not wrap these probes. Operators, a local load balancer, or a watchdog call them.
Enterprise unit facts that affect whether probes can succeed:
User=zwall-managerExecStart=/opt/zwall-manager/bin/zwall-manager -config /etc/zwall-manager/manager.ymlAfter=postgresql.serviceReadWritePaths=/var/lib/zwall-manager /var/log/zwall-manager /run/zwall-manager
Community source installs often use /etc/zcs/manager.yml. Follow the unit actually installed.
Procedure
Replace the URL with the Manager you actually run.
curl -k https://manager.example.com:8443/health/live
curl -k https://manager.example.com:8443/health/ready
curl -k https://manager.example.com:8443/healthUse -k only when you have not yet installed a trusted CA for the Manager certificate. Production scrapers should verify TLS.
To confirm the unit, not just the HTTP path:
systemctl is-active zwall-manager
journalctl -u zwall-manager -n 100 --no-pagerExclusive Manager flags that do not start listeners (-migrate, -preflight-migrate, -check-schema, -migration-exec-preflight, -validate-runtime) will not keep /health/live up. Choose only one of those exclusive modes; they exit after the check.
Verification
GET /health/live
Liveness: the process is running and not in an updater drain.
200:
{"status": "alive", "timestamp": 1710000000}timestamp is Unix seconds.
503 when updater runtime mode is draining or updating:
{"status": "draining", "timestamp": 1710000000}(status is the snapshot mode: draining or updating.)
Do not treat HTTP 200 as “database healthy.”
GET /health/ready
Readiness: listeners admitted and PostgreSQL health check passed. If cluster is enabled, cluster health is included.
200 includes at least:
Scroll sideways to see the full table. Use the arrow keys when focused.
| Field | Meaning |
|---|---|
status | "ready" when no failed checks |
timestamp | Unix seconds |
database | "ok", "not_configured", "timeout", "unavailable" |
checks | string array of failed check names when not ready |
503 uses the same object with status: "not_ready" and populated checks. Example failed check strings from source:
manager: listener_admission_incompletedatabase: not_configureddatabase: timeoutdatabase:plus the health-check error textcluster: timeoutwhen cluster is enabled and the readiness timeout firesblocking_authority:plus state when the blocking pipeline is required and not ready
Additive keys on the same object include cluster and blocking_authority. Treat extra keys as additive, not as a second public schema.
GET /health and GET /api/v1/health
Compatibility health (healthCheck). Prefer /health/live and /health/ready for automation.
Success JSON includes status: "ok", database, timestamp, version. 503 when draining/updating or when the database is not ok (status: "degraded" in that path). Exact keys besides the live/ready contract are not a second public schema.
Expected result
Scroll sideways to see the full table. Use the arrow keys when focused.
| Question | Probe | Pass |
|---|---|---|
| Is the process running? | /health/live → 200 alive | yes |
| Can it serve operators and Agents? | /health/ready → 200 ready, database: ok | yes |
| Unit enabled? | systemctl is-active zwall-manager → active | supporting evidence only |
A load balancer that routes on liveness only will send traffic at a Manager that cannot talk to PostgreSQL. Use readiness for that decision.
Failure modes
Scroll sideways to see the full table. Use the arrow keys when focused.
| Observation | Meaning | Operator action |
|---|---|---|
| Connection refused | Wrong host/port, unit down, or TLS vs HTTP mismatch | Match server.port / server.api_port (example 8443). See the port/URL note above. |
/health/live 200, /health/ready 503 listener_admission_incomplete | HTTP servers not serving | TLS cert/key paths, bind address, journal |
ready database: not_configured | Store never opened | Config load / migrate path |
ready database: timeout | Health check exceeded health.readiness_timeout | PostgreSQL load, network, ssl_mode |
ready database: unavailable | HealthCheck() error | Credentials (systemd database_password in Enterprise production), ssl_mode, PostgreSQL up |
live 503 draining / updating | Updater runtime | The in-product updater is not the supported production upgrade path. Do not treat this as a customer HA drain procedure. |
ready includes cluster: failures | Cluster enabled and unhealthy | Cluster is not a public HA product. Do not treat this as a customer failover runbook. |
/health 503 degraded | Compatibility probe saw a non-ok database | Same as ready database failures |
Troubleshooting
systemctl status zwall-manager— is the unit active?journalctl -u zwall-manager -n 200— config validation, JWT/database secret resolution, TLS file missing.- Call live, then ready. If live fails, do not debug PostgreSQL first.
- Confirm you are not hitting
zwallctl’s defaulthttp://localhost:8080while the Manager listens on TLS8443. - Enterprise production: YAML
database.passwordandauth.jwt_secretmust stay empty; missing systemd credentials prevent a ready server.
Security considerations
- Probes are unauthenticated. Expose them to a local load balancer or operator network, not as an internet information leak if you can avoid it. They do not return secrets.
- Do not put administrator JWTs on health check command lines.
/metricsis admin-equivalent. Never scrape it without the same care as/api/v1.
Limitations
- Not a Kubernetes product. You may point kubelet-style probes at these URLs if you operate your own cluster; Zwall does not ship that integration.
- Live does not imply schema version correctness. Schema checks are
-check-schema/-validate-runtime(Enterprise). - Blocking-authority and cluster keys on readiness are additive. Do not build a public HA product story from them.