12. Troubleshooting and submitting support
POC deployment manual chapter. Verified against the 2026.10 mainline; command output follows the installer delivered for that engagement.
Back to overview · Full table of contents · Download full PDF
This chapter is the order of handling when a problem appears: first confirm the three most common causes yourself, then collect troubleshooting information in one pass, then match against install-stage, diagnostic-code, and post-install access-and-call scenarios. If it is still unsolved, prepare materials per section 12.6 and submit support. The readers are the customer system administrator and the implementation engineer. Every collection command in this chapter is read-only and can be run without worry.
12.1 Confirm three things yourself first
Applies to: a caller reports "the call does not work", "it was rejected", or "it suddenly stopped working", but platform services themselves are running normally.
Most of those reports are not failures. They are the platform rejecting per configuration. The reject conclusion is in two places; you do not need logs:
- The
reasonfield in the error body the caller received (OpenAI and Anthropic error bodies also carryrequest_id, matching response headerx-request-id); - The call record found in console Gateway requests by
x-request-id.
Procedure
- Ask the caller for this call's
x-request-idand thereasonin the body. - Find this call in console Gateway requests by
x-request-idand check caller, model, and result. - Use the table below to decide which class it is, and check configuration under Where to confirm.
| Class | Typical reason (HTTP status) | Where to confirm |
|---|---|---|
| Permission and scope | MODEL_NOT_AVAILABLE_FOR_WORKSPACE (403), PERMISSION_DENIED (403), LLM_MODEL_NOT_AVAILABLE (404), UNAUTHENTICATED / ACCESS_KEY_REVOKED (401) | Whether Availability and quotas of the model group includes that member; whether the model name used in the call is in that service; whether the API key was created by that member and is not disabled |
| Quota | QUOTA_EXCEEDED (429), USER_TOKEN_EXCEEDED / USER_COST_EXCEEDED (429), MODEL_SERVICE_QUOTA_HARD_REJECT (429), MONTHLY_TOKEN_EXCEEDED / INSUFFICIENT_CREDITS (402) | Whether that member's or that service's quota under the model group's Availability and quotas is exhausted; whether the tenant quota is exhausted |
| Rule block | CONTENT_POLICY_BLOCKED (403), DATA_FENCE_BLOCKED (403), NETWORK_NOT_ALLOWED (403), TRAFFIC_RATE_LIMITED / TRAFFIC_CONCURRENCY_LIMITED (429) | The traffic rule that was hit (content safety, data fence, source CIDR, rate limit and concurrency) |
What you will see
- For these three classes, platform service status is healthy. The same member succeeds with a request that is in scope, still has quota, and does not hit a rule.
- Handling is changing configuration (add to scope, adjust quota, change a rule) or having the caller change the request. No service restart is needed.
Note: all three classes of reject leave a call record. If Gateway requests cannot find this call by x-request-id at all, the request did not reach the gateway (wrong address, network down, or a front device intercepted it). Troubleshoot per section 12.5.
12.2 Collect information in one pass
Applies to: a problem section 12.1 cannot explain, or any problem that will be submitted to support. Collect first, then act — after services are restarted, some on-site information is gone.
Procedure
- Run the four commands below on the install host. All four are read-only and do not change any service state.
# Install host · root · read-only (collect troubleshooting information; output goes to the staging directory)
sudo zenova status --json > /root/zenova-install/status.json
sudo zenova doctor --all --save /root/zenova-install/doctor
sudo zenova logs control-plane --since '30 min ago' > /root/zenova-install/control-plane.log
sudo cp /opt/zenova/state/install.log /root/zenova-install/- When the problem happened more than 30 minutes ago, change
--sinceto a time that covers the moment it happened, for example'2 hours ago'. The--sincevalue is passed through to journalctl. - When the problem involves connectivity to an external address (model provider, notification channel, object storage), add one targeted doctor:
# Install host · root · read-only (layered DNS, TCP, TLS, HTTP check of a named address)
sudo zenova doctor --target <target-address>| Command | Output | Use |
|---|---|---|
zenova status --json | Each service's status, current version, instances, in-progress and last upgrade | Which service is not running, what version this is, whether it is stuck in an upgrade |
zenova doctor --all --save <directory> | Full host and connectivity doctor report, with diagnostic codes and remedies | Lists every blocking and warning item in one pass. Exit code 0 means no blocking item; 2 means there is a blocking item |
zenova logs control-plane --since <time> | Control-plane logs in the given window | Locate console errors, configuration fan-out, and database-access problems |
cp /opt/zenova/state/install.log | Install and upgrade process log | Locate failures in install, upgrade, or wipe-and-reinstall |
What you will see
status.json, adoctor/directory,control-plane.log, andinstall.logappear under/root/zenova-install/.- When the
zenova doctor --targetreport notes "direct connect; may not match production egress", the result is only this host's direct connection to that address. It does not represent connectivity of the gateway's actual egress (for example through an egress proxy).
Note: zenova status lists only services that start with zenova-. View postgres, clickhouse, caddy, secret-service, and spicedb with systemctl status <name>. For a problem on a remote gateway node, collect on the node host with sudo zenova status, sudo zenova logs node-edge, and sudo zenova logs node-caddy.
Note: the materials above may contain internal addresses, account names, and request-content fragments. Redact them per section 12.6 before sending them out. Do not collect or submit /opt/zenova/.env, /etc/zenova/secret-service/, or /opt/zenova/.env.runtime/root-password-initial. Those three hold the master key, secret-service material, and the initial password.
12.3 Install-stage failure table
Applies to: zenova install (including --check-only preflight) stops before or after confirm-install, and the screen prints a prompt.
Before confirm-install the installer writes no files and creates no services. A stop before confirm: after fixing the cause, rerun the same command. This host has nothing to clean.
Procedure
- Look up the exact on-screen text in the table below.
- Follow the Remedy column, then rerun the original command.
- If it is not in the table, record the exact on-screen text and the diagnostic code, and check section 12.4.
| On-screen prompt | Cause | Remedy |
|---|---|---|
| Answers are not valid: run the installer with sudo | Not run as root | Add sudo and rerun |
| The package cannot be read or is damaged | The offline package is incomplete or the path is wrong | Check the file path; check the file size against the download site. If they differ, download again (the offline package supports resume) |
| Installer version … does not match offline-package version … | The installer and offline package are not the same version | Use an installer of the same version as the offline package. Both should be downloaded from the same selection on the download site |
| The package and the installer do not belong to the same version | The installer and offline package belong to different products | Use an installer and offline package of the same product. Check the product field in the offline-package file name |
| This host has already installed …; this installer is the … edition | This host already has another product installed | Switch to a package of the installed product. To change product, wipe-and-reinstall per Chapter 11 |
| The offline package does not apply to this host's platform or deployment form | OS or CPU architecture does not match the offline package | Check this host's architecture with uname -m and download an offline package for that platform |
| … does not include the "…" capability; remove it from --with | A capability this product does not provide was specified | Remove that capability from --with. If you truly need it, choose a product that provides it |
| Not enough memory: 8 GB required, this host has N GB | Memory below 8 GiB | Add memory and rerun |
| Not enough disk: /opt/zenova needs N GB, M GB remain | Free space on the volume that holds the install root is short | Expand; or install with --install-dir <directory> onto a candidate mount listed in the prompt; or switch PostgreSQL, ClickHouse, and object storage to existing services to reduce what this host occupies |
| This host has no systemd and cannot manage services | The host is not started by systemd | Switch to a Linux host started by systemd |
[HOST_CLOCK_UNSYNCED] | Time is not synchronized, or status cannot be confirmed | Warning only; install continues. Check the host clock yourself; handling is in section 3.2 |
[HOST_CLOCK_SKEW] | A measured offset from the time source exceeds 30 seconds | Calibrate per section 3.2 and retry |
A few more cases that appear only after confirm-install:
| On-screen prompt or phenomenon | Cause | Remedy |
|---|---|---|
Ingress listen port in use (HOST_ENTRY_PORT_BUSY) | The business-ingress port is occupied by another process. The install stops and does not pick another port automatically | Stop the occupying process; or change the port in the access URL; or use --business-entry-port for the local port a front forward targets |
| Install parent not traversable, mount is noexec, SELinux / fapolicyd / KYSEC blocks execution | Service user zenova cannot enter or execute programs under the install root. This kind of interception is discovered only after unpack | Follow section 3.3; if needed, the host-security administrator adds an allow policy |
| Post-install acceptance failed: checks that did not pass: <item> (<evidence>) | A post-install acceptance item failed; the install is not recorded as complete | Follow the evidence in parentheses, then rerun the same install command to continue from post-install acceptance |
What you will see
- After the fix, a rerun continues from where it last stopped: a stop before confirm answers from the start; a stop after confirm reuses existing install progress.
Note: passing --check-only preflight does not mean the real install will pass. Preflight does not include the business-ingress port check, the existing-dependency probe, post-unpack execution-rights check, or the notification test. Problems in the second table above can appear after preflight has passed.
Note: do not delete progress files under /opt/zenova/state/ or delete directories by hand to "start over". To install from scratch, use wipe-and-reinstall in Chapter 11.
12.4 How to read diagnostic codes
Applies to: output from the installer, zenova doctor, post-install acceptance, upgrade, wipe-and-reinstall, or backup/restore carries a code such as [HOST_DISK_LOW].
There are 69 diagnostic codes, in ten groups by prefix. Codes are stable: the same problem keeps the same code across versions and Chinese/English UI. You can report the code to support as-is; you do not need to paraphrase the on-screen text. The full list and remedies are on the product documentation site's "Install and operations diagnostic codes" page.
| Prefix | Count | Scope |
|---|---|---|
HOST | 22 | Host conditions: architecture, memory, disk, time, CPU instruction set, container runtime, ingress port, directory permissions, security modules, root privileges |
PKG | 6 | Installer and offline package: integrity, platform, version, capabilities in the product |
FRESH | 6 | Wipe-and-reinstall: external data, shared resources, ownership proof, on-site change, flags |
NODE | 6 | Remote gateway node: already installed, registration, configuration fan-out |
ANS | 4 | Install answers and configuration values: not valid, cannot be read, resume mismatch, product already locked |
NET | 4 | Network: access-URL format, dependency and notification-channel probe, target connectivity, admin-plane CIDR |
UPD | 10 | Local upgrade service: not installed or not started, access refused, response timeout, version behind, operation state damaged or unreadable |
UPG | 3 | Upgrade: pre-upgrade check, nodes not upgraded |
SVC | 3 | Local services: install already complete, service control failed, cannot determine this host's install |
BAK | 5 | Backup and restore: refused, backup-file digest mismatch, database dump unreadable, version or form does not match this host |
Procedure
- Look at the prefix first to decide which class of problem it is.
- Then look at parameters after the code (such as
path,have_gib,need_gib); they give the concrete object and numbers. - Follow the on-screen remedy or the table below. If it is still unclear, submit the code and the full output together to support.
Examples of common codes:
| Code | Meaning | Remedy |
|---|---|---|
HOST_DISK_LOW | Free space on the volume that holds the install directory is short; install has stopped. Output lists candidate mounts | Install onto a volume with more free space using --install-dir <directory>, or clean disk and retry |
HOST_CPU_FEATURES | The CPU lacks the instruction set required to self-host ClickHouse | On a VM, set the CPU model to host (x86-64-v3); or switch to existing ClickHouse in the install questions |
HOST_ENTRY_PORT_BUSY | The local listen port the access URL depends on is occupied by another process | Stop that process, or change the port in the access URL, or add --business-entry-port |
PKG_INVALID | The offline package cannot be read or verified | Confirm the file is a complete .zpkg and retry |
PKG_VERSION_MISMATCH | Installer version does not match offline-package version | Use an installer of the same version as the offline package |
PKG_CAP_NOT_IN_EDITION | The chosen product does not provide that capability | Remove it from --with, or switch to a product that provides it |
FRESH_EXTERNAL_DATA | Wipe-and-reinstall detected an external data service | The installer will not delete an external database or object storage. Keep remove = false in the plan file |
FRESH_OWNER_UNPROVEN | Some objects cannot be automatically proven to have been created by this install | Confirm y/N one by one in interactive mode, or export a plan file, review it, then execute (Chapter 11) |
FRESH_STATE_CHANGED | The site has changed since the wipe plan was generated | Rerun --fresh --dry-run to generate the latest plan file |
NET_PUBLIC_URL | The access URL is not a valid http/https address | Correct it with zenova config set PUBLIC_URL http://<IP-or-domain> |
NET_DEP_UNREACHABLE | A data-dependency or notification-channel probe failed | Check the target address, network connectivity, and access credentials, then retry |
UPG_NODES_NOT_UPGRADED | The upgrade package is missing node packages for the platforms of online gateway nodes | Obtain an upgrade package that includes those platform node packages and rerun zenova upgrade. Gateway nodes are rolled by the upgrade automatically; you do not log into the nodes |
SVC_ALREADY_INSTALLED | This host has already completed installation | Upgrade with zenova upgrade; change configuration with --reconfigure; wipe-and-reinstall with --fresh |
NODE_ALREADY_INSTALLED | This host already has a gateway-node install | Upgrade on the same control plane with --upgrade; change control plane or token with --reenroll --token <token> |
Note: zenova doctor exits 2 when there is a blocking item, 0 when there is none. Inspection scripts can use that. Warning items do not affect the exit code, but should be recorded in the handover notes.
12.5 Access and call problems after install
The console will not open
Procedure
- First open the console on the intranet using the Direct access on this host URL printed at the end of install. It is built from the admin ingress's actual port and has no front forward. If it opens, this host is healthy; the problem is the load balancer, reverse proxy, NAT, or network policy. Go to step 4.
- If Direct access on this host also will not open, inspect service status on the install host:
# Install host · root · read-only (inspect each service's status)
sudo zenova status
systemctl status caddy postgres clickhouse secret-service spicedb- Restart a service that is not running and inspect logs:
# Install host · root · write (restart a named service)
sudo zenova restart <service>
sudo zenova logs <component> --since '10 min ago'- This host is healthy but external access does not work: check the host firewall, cloud security group, and DNS. When a front TLS or proxy is used, confirm the local port the front device forwards to matches what was filled in at install.
What you will see
- After restart, service status is running again and the console opens.
- While the control plane is unavailable, gateway nodes keep serving with the last configuration. Existing business calls are not affected.
Note: zenova restart accepts only services that start with zenova-. For a few seconds while the control plane switches slot, the internal ingress returning 503 is expected; the ingress proxy holds new requests for up to 5 seconds. A readiness check on the central gateway-node data plane (3080) returning 503 with reason no_tenant_routes means there is not yet a tenant or model routing. It recovers after a tenant is created and models are configured. It is not a failure.
The call returns an error
On failure, all three gateway protocol ingresses (OpenAI, Anthropic, Gemini) return a unified error envelope. The body carries a stable reason. HTTP status is decided by reason and is the same across the three protocols. Response header x-should-retry states whether a retry is meaningful.
Under the same HTTP status, different reason values are handled completely differently. Looking only at the status code goes the wrong way: the same 429 may be a member quota exhausted (adjust the quota) or an upstream provider rate limit (retry later); the same 503 may be model routing not configured (change configuration) or the upstream temporarily unavailable (retry later). Always judge by reason.
| HTTP status | reason | Meaning | Who handles it · retry? |
|---|---|---|---|
| 400 | LLM_REQUEST_BODY_INVALID / VALIDATION_FAILED | Request body is not valid | Caller changes the request · no |
| 400 | LLM_CONTEXT_OVERFLOW | Exceeds the model's context length | Caller changes the request · no |
| 401 | UNAUTHENTICATED | Authentication failed (no API key, or the key is invalid) | Caller changes the request · no |
| 401 | ACCESS_KEY_REVOKED | The API key has been revoked | Caller switches to a valid key · no |
| 402 | MONTHLY_TOKEN_EXCEEDED / INSUFFICIENT_CREDITS | Monthly usage or balance is insufficient | Administrator adjusts the quota · no |
| 403 | PERMISSION_DENIED | No permission | Administrator checks permission and availability · no |
| 403 | MODEL_NOT_AVAILABLE_FOR_WORKSPACE | That model is not in the caller's availability | Administrator adds the member to availability of a model group that includes that model · no |
| 403 | CONTENT_POLICY_BLOCKED | Request content was blocked by a content-safety rule | Caller changes the request content · no |
| 403 | NETWORK_NOT_ALLOWED | The source CIDR is not allowed | Administrator checks the CIDR policy · no |
| 403 | CAPABILITY_NOT_LICENSED | The license does not include that capability | Tenant administrator checks the license · no |
| 404 | LLM_MODEL_NOT_AVAILABLE | The requested model name does not exist or is unavailable | Caller switches to an available model name · no |
| 408 | REQUEST_TIMEOUT | Request timed out | Upstream; retry later · yes |
| 429 | QUOTA_EXCEEDED / USER_TOKEN_EXCEEDED / USER_COST_EXCEEDED | Quota exhausted | Administrator adjusts the quota · no |
| 429 | MODEL_SERVICE_QUOTA_HARD_REJECT | Model-group quota hard reject | Administrator adjusts the model-group quota · no |
| 429 | TRAFFIC_RATE_LIMITED / TRAFFIC_CONCURRENCY_LIMITED | Hit a platform rate or concurrency limit | Administrator checks rate-limit rules; retry later · yes |
| 429 | LLM_RATE_LIMITED | Upstream provider rate limited | Upstream; retry later · yes |
| 502 | LLM_UPSTREAM_CREDENTIAL_REJECTED | Upstream rejected the provider credentials the platform stored | Administrator updates the model-provider credentials · no |
| 502 | LLM_UPSTREAM_MODEL_NOT_FOUND | Upstream does not have that model | Administrator checks the model name on the provider side · no |
| 502 | LLM_BILLING_EXCEEDED | Upstream account quota exhausted | Administrator handles the provider-account quota · no |
| 502 | LLM_UPSTREAM_SERVER_ERROR | Upstream server error | Upstream; retry later · yes |
| 502 | LLM_UPSTREAM_CONNECT_FAILED / LLM_STREAM_INTERRUPTED | Connect to upstream failed, or the stream was interrupted | Retry with the same idempotency key · yes |
| 503 | MODEL_ROUTE_NOT_CONFIGURED / NO_MODEL_SERVICE_SELECTED | Model routing is not configured, or the current workspace has no available model | Administrator checks model-group and traffic-rule configuration · no |
| 503 | LLM_PROVIDER_UNAVAILABLE / LLM_OVERLOADED | Upstream temporarily unavailable or overloaded | Upstream; retry later · yes |
| 503 | CONTROL_PLANE_UNAVAILABLE / SERVICE_UNAVAILABLE | Platform service temporarily unavailable | Administrator troubleshoots per "The console will not open" in this section · yes |
| 504 | LLM_TIMEOUT | Waiting for upstream timed out | Upstream; retry later · yes |
What you will see
- When Who handles it is the caller, the caller succeeds after changing the request. When it is the administrator, a retry will not change the result; configuration must be adjusted. When it is upstream, a retry may succeed.
- When a streaming request fails after output has started, the gateway sends an in-stream error frame of the same shape as the chosen protocol's error body, then ends the stream normally. Content and usage already output are billed and shown as usual.
reasonis still read from the table above.
Note: the table lists only the most common reasons. The full list (HTTP status, error type, and whether retryable for each reason) is on the product documentation site's Error reference page. For a reason not in the table, submit the exact reason text together with x-request-id to support.
Note: when a model-provider test or zenova doctor --target reports a connectivity failure, the failure is one of seven classes: dnsFailed (name resolution), proxyConnectFailed (egress-proxy connect), connectFailed (target TCP connect), tlsFailed (TLS handshake and certificate), timeout, ssrfBlocked (outbound safety policy), invalidEndpointUrl (illegal address format). Find the owner of the matching layer by class; do not start from the first layer every time.
12.6 What to prepare when submitting support
Applies to: after handling per sections 12.1–12.5 the problem is still there, and you need support from the delivering party or the vendor.
Procedure
- Collect the four materials per section 12.2.
- Organize the problem information in the table below. Provide what you can; write "none" when you do not have it. Do not leave a blank for support to guess.
| Field | Notes | Where to get it |
|---|---|---|
| Time of occurrence and time zone | To the minute; state the time zone (for example UTC+8) | Caller logs or on-site notes |
| Request ID | Response header x-request-id; request_id in the error body is the same | Caller response; console Gateway requests |
| Trace ID | Provide it as well when the call record shows a trace ID | Console call record (follow what the page actually shows) |
| Initiator | Account name of the member the call belongs to | Console Gateway requests |
| Access-credential prefix | First few characters of the API key, to tell which key it is | Console key list; do not provide the full key |
| Client IP | Caller's egress address | Caller or console call record |
| Declared model and actually routed model | Model name in the caller's request, and the model actually routed to | Caller request; console call record |
| HTTP status and error code | HTTP status, reason in the body; for install and operations problems, provide the diagnostic code | Caller response; on-screen output |
| Reproduction steps | From which machine, with which command or UI action, what result. When it can be reproduced, attach a runnable curl (replace the key with <YOUR_API_KEY>) | Organized on site |
| Screenshots | Console error page, Gateway requests record detail, terminal output | Taken on site |
- Redact all materials (see below).
- Organize the materials in this order and pack them for submission:
| Order | Content |
|---|---|
| 1 | One-sentence problem description: phenomenon, impact, start time |
| 2 | Environment: product, full version and channel, platform, enabled capabilities, data-dependency mode (deployed by the installer / existing service), whether there is a remote gateway node |
| 3 | Fields in the table above |
| 4 | Troubleshooting and handling already done, and the result |
| 5 | The four materials collected in section 12.2, and the zenova doctor --target report if any |
| 6 | Screenshots |
What you will see
- When the materials are complete, support can locate by request ID and diagnostic code without going back and forth.
Note: the following must be redacted or must not be submitted:
| Content | Handling |
|---|---|
| API keys, model-provider credentials, database passwords, object-storage access keys | Keep only the prefix; delete the rest |
root password and initial password, two-factor recovery codes | Must not be submitted |
Files under /opt/zenova/.env, /etc/zenova/secret-service/, /opt/zenova/.env.runtime/, the key archive, and the platform-backup export file | Must not be submitted; they contain the master key and secret-service material |
| License-file contents | Must not be submitted; when needed, state only the license status |
| Business data and personal information in request and response bodies | Delete or replace with sample content |
| Internal IPs, domain names, host names | Replace per the customer's information-security rules, one-to-one before and after, so support can still compare |
Note: do not send the initial password or any credential over instant messaging, email, or a ticket. Before a screenshot or screen recording, confirm the frame has no password, full key, or recovery code.
Capability notes
| Not provided | Alternative |
|---|---|
| One-click packing of all troubleshooting materials with automatic redaction | Collect with the four commands in section 12.2; redact by hand per section 12.6 |
| Automatic upload of install-host logs to the vendor | After the customer confirms redaction, submit by hand in the order in section 12.6 |
zenova status listing every system service | View postgres, clickhouse, caddy, secret-service, and spicedb with systemctl status <name> |
zenova doctor --target representing connectivity of the gateway's actual egress | When the report notes "direct connect", judge by a model-provider test or a real call through the gateway |
| Judging handling from HTTP status alone | Judge by reason in the error body; check section 12.5 or the Error reference page |