Manager Unavailable
Symptom
The console, Manager API, or zwallctl cannot reach the Manager. Typical operator observations:
- browser cannot load
/login zwallctl ping/zwallctl loginconnection refused, TLS errors, or HTTP 503- Agents cannot heartbeat because the Manager listener is down
- a load balancer marks the Manager unhealthy
Likely verified causes
zwall-manager.serviceis inactive, failed, or restarting.- Listeners are not admitted: TLS files missing while
server.tls.enabledis true, or bind/port mismatch. - PostgreSQL is down, unreachable, or
database.ssl_modedoes not match the server (example defaultrequire). - Operator curls or points
zwallctlat the wrong port (example YAML8443vs zwallctl defaulthttp://localhost:8080). - Config path prefix mismatch: Enterprise unit uses
-config /etc/zwall-manager/manager.yml; Community installer writes$CONFIG_DIR/manager.yml(often/etc/zcs); Virtualization Agent is/etc/zcs/agent.yml. - HTTP client against a TLS Manager, or cookie issuance without HTTPS (
Secure HTTPS session required). - Liveness 503 because updater runtime mode is
drainingorupdating(in-product updater is not the supported production upgrade path). - Readiness 503 with
cluster: timeoutwhen cluster is enabled. This is not a public HA product.
Diagnostic commands/endpoints
Enterprise unit name is zwall-manager. Community setup also installs zwall-manager.service. Follow the unit that is actually running.
sudo systemctl status zwall-manager
sudo journalctl -u zwall-manager -n 200 --no-pager
sudo systemctl status postgresqlHealth probes (unauthenticated):
# Example Manager listener from configs/manager.example.yml
curl -sS --cacert /etc/zcs/certs/manager.crt \
https://manager.example.com:8443/health/live
curl -sS --cacert /etc/zcs/certs/manager.crt \
https://manager.example.com:8443/health/readyIf you only need to learn whether anything is listening, and TLS is the unknown, a one-shot curl -k distinguishes “TLS mismatch” from “connection refused”. Do not leave -k in monitoring.
Wrong-port check:
curl -sS http://127.0.0.1:8080/health/live
curl -sS https://127.0.0.1:8443/health/liveOptional operator CLI (uses the same Manager URL as zwallctl; default is http://localhost:8080):
zwallctl ping --manager-url https://manager.example.com:8443Do not treat GET /health or GET /api/v1/health as readiness. Prefer /health/live and /health/ready.
What each result means
systemd
Scroll sideways to see the full table. Use the arrow keys when focused.
| Result | Meaning |
|---|---|
active (running) | Process is up. Still check ready. |
inactive / failed | Unit not serving. Read journal. |
activating / crash loop | Config validation or dependency failure (TLS files, credentials, database). |
Enterprise User=zwall-manager | Expected for the Enterprise unit. |
Community installer User=root | Community setup.sh writes a root unit. That is Community installer behavior, not the Enterprise least-privilege unit. |
`GET /health/live`
Scroll sideways to see the full table. Use the arrow keys when focused.
| HTTP | Body | Meaning |
|---|---|---|
| 200 | {"status":"alive","timestamp":<unix seconds>} | Process is running and not in updater drain. Not “database healthy.” |
| 503 | {"status":"draining"} or {"status":"updating"} plus timestamp | Updater runtime snapshot mode. Load balancers must not treat this as ready. Do not invent cluster failover. |
`GET /health/ready`
Timeout is health.readiness_timeout (code default 5s when set). 503 body uses status: "not_ready" and checks.
Scroll sideways to see the full table. Use the arrow keys when focused.
| Check string | Meaning |
|---|---|
manager: listener_admission_incomplete | listenerAdmissionReady is false or HTTP servers are not serving. Typical: TLS cert/key missing, bind failure. |
database: not_configured | Manager store is nil. |
database: timeout | Health check did not finish within readiness timeout. |
database: plus store error text | HealthCheck() failed (unavailable in the database field). Includes SSL/auth/connectivity errors from PostgreSQL. |
cluster: timeout | Cluster is enabled and the cluster check timed out. Not a customer HA signal. |
blocking_authority: ... | Additional check when the blocking pipeline is required. Additive; do not invent extra public keys. |
200 body includes at least status: "ready", timestamp, database: "ok". Extra keys (cluster, blocking_authority) are additive.
Port and TLS
Scroll sideways to see the full table. Use the arrow keys when focused.
| Result | Meaning |
|---|---|
| Connection refused on 8080, success on 8443 | zwallctl default URL is wrong for this Manager. |
| Connection refused on 8443 | Manager not listening, bound elsewhere, or firewall. Confirm server.api_port / server.port in the unit’s config path. |
| HTTP against a TLS listener | Protocol mismatch. Example config has server.tls.enabled: true. |
TLS certificate file is required when TLS is enabled in journal | server.tls.cert_file or key_file empty while TLS is on. |
Secure HTTPS session required on login | Cookie policy rejected non-HTTPS issuance. |
Path prefix
Scroll sideways to see the full table. Use the arrow keys when focused.
| Unit | Config path in tree |
|---|---|
Enterprise zwall-manager.service | /etc/zwall-manager/manager.yml |
| Enterprise Virtualization Agent | /etc/zcs/agent.yml |
| Enterprise Hosting Agent | /etc/zwall-hosting/agent.yml |
| Community setup | $CONFIG_DIR/manager.yml (installer variable; commonly /etc/zcs) |
Editing the wrong file does not change the running process.
Safe remediation
- If the unit is dead: fix the journal error, then
sudo systemctl start zwall-manager. Do not combine this with-migrateon the running service (migration flags are exclusive Manager modes that then exit). - If live is 200 and ready is 503 with database checks: restore PostgreSQL, confirm
database.ssl_mode(disable,require,verify-ca,verify-full; examplerequire), and confirm Enterprisedatabase_passwordsystemd credential / CommunityDB_PASSWORDcontract. See Database. - If ready reports
listener_admission_incomplete: place cert and key at the configuredserver.tls.cert_file/key_file, or generate an operator certificate withscripts/generate_tls_certs.sh(see TLS). Restart the Manager after files exist. - If the client uses 8080: set
--manager-url https://manager.example.com:8443orZWALL_MANAGER_URL. Do not change the Manager listen port only to match zwallctl folklore. - If HTTP vs HTTPS: use
https://and the operator trust store. Do not set Agentallow_insecure_remote_tls: trueto “fix” the Manager. - If login returns
Secure HTTPS session required: enable TLS and connect over HTTPS. Do not disable cookie security to force a session. - If live is 503
draining/updating: this is updater runtime, not a certified production upgrade. Do not document or perform cluster member failover. Wait for the process to leave that mode or revert the unsupported updater action on a lab host. - After any config change: Enterprise unit supports
systemctl reload(HUP). Treat HUP as a reload request, not a certified live-apply of every key. Restart if readiness still fails.
Do-not-do warnings
- Do not treat
/health/live200 as ready. - Do not tell operators to fail over Manager cluster. Cluster gRPC example port
50051is inter-manager, not a public HA product. - Do not publish or copy unit
Documentation=lab URLs (Hosting unit contains an internal lab URL; omit it). - Do not mix Community source binaries with Enterprise verified-release units.
- Do not run
-migrateagainst a live Manager as a “restart.”-migrateapplies schema then exits. - Do not use
curl | sudo bashinstallers. - Do not disable
server.tls.enabledin production to make health checks easier. - Do not put JWT, database password, or admin password on the curl command line.
Escalation condition
Escalate to engineering / vendor when:
- live is 200, listeners should be admitted, TLS files exist and are readable by the service user, PostgreSQL
HealthChecksucceeds from the same host, and ready still returnslistener_admission_incomplete - ready reports
blocking_authorityfailure after the blocking pipeline is required and the database is otherwise healthy - cluster checks fail and
cluster.enabledwas intentionally set — there is no certified customer HA runbook - the unit crash-loops on credential custody after
setup.sh --manager-secret-custody(that path is implemented but not finally security-accepted)
Related documentation
- Health
- API health
- Service control
- Database troubleshooting
- TLS hardening
- Network exposure
- CLI troubleshooting
- Paths and ports
Edition
SHARED probes and example ports. Enterprise unit user zwall-manager, empty capabilities, config /etc/zwall-manager/manager.yml. Community installer unit currently User=root with JWT_SECRET in the unit environment. See Manager authentication.
Status
SUPPORTED for live/ready/systemd diagnosis. NOT_SUPPORTED: Manager cluster as customer HA. NOT_VERIFIED as a single canonical port or filesystem prefix (port mismatch and path-prefix inconsistency).