Zentrix Gateway docs中文
POC deployment manual

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 reason field in the error body the caller received (OpenAI and Anthropic error bodies also carry request_id, matching response header x-request-id);
  • The call record found in console Gateway requests by x-request-id.

Procedure

  1. Ask the caller for this call's x-request-id and the reason in the body.
  2. Find this call in console Gateway requests by x-request-id and check caller, model, and result.
  3. Use the table below to decide which class it is, and check configuration under Where to confirm.
ClassTypical reason (HTTP status)Where to confirm
Permission and scopeMODEL_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
QuotaQUOTA_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 blockCONTENT_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

  1. 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/
  1. When the problem happened more than 30 minutes ago, change --since to a time that covers the moment it happened, for example '2 hours ago'. The --since value is passed through to journalctl.
  2. 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>
CommandOutputUse
zenova status --jsonEach service's status, current version, instances, in-progress and last upgradeWhich 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 remediesLists 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 windowLocate console errors, configuration fan-out, and database-access problems
cp /opt/zenova/state/install.logInstall and upgrade process logLocate failures in install, upgrade, or wipe-and-reinstall

What you will see

  • status.json, a doctor/ directory, control-plane.log, and install.log appear under /root/zenova-install/.
  • When the zenova doctor --target report 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

  1. Look up the exact on-screen text in the table below.
  2. Follow the Remedy column, then rerun the original command.
  3. If it is not in the table, record the exact on-screen text and the diagnostic code, and check section 12.4.
On-screen promptCauseRemedy
Answers are not valid: run the installer with sudoNot run as rootAdd sudo and rerun
The package cannot be read or is damagedThe offline package is incomplete or the path is wrongCheck 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 versionUse 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 versionThe installer and offline package belong to different productsUse 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 … editionThis host already has another product installedSwitch 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 formOS or CPU architecture does not match the offline packageCheck this host's architecture with uname -m and download an offline package for that platform
… does not include the "…" capability; remove it from --withA capability this product does not provide was specifiedRemove 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 GBMemory below 8 GiBAdd memory and rerun
Not enough disk: /opt/zenova needs N GB, M GB remainFree space on the volume that holds the install root is shortExpand; 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 servicesThe host is not started by systemdSwitch to a Linux host started by systemd
[HOST_CLOCK_UNSYNCED]Time is not synchronized, or status cannot be confirmedWarning 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 secondsCalibrate per section 3.2 and retry

A few more cases that appear only after confirm-install:

On-screen prompt or phenomenonCauseRemedy
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 automaticallyStop 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 executionService user zenova cannot enter or execute programs under the install root. This kind of interception is discovered only after unpackFollow 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 completeFollow 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.

PrefixCountScope
HOST22Host conditions: architecture, memory, disk, time, CPU instruction set, container runtime, ingress port, directory permissions, security modules, root privileges
PKG6Installer and offline package: integrity, platform, version, capabilities in the product
FRESH6Wipe-and-reinstall: external data, shared resources, ownership proof, on-site change, flags
NODE6Remote gateway node: already installed, registration, configuration fan-out
ANS4Install answers and configuration values: not valid, cannot be read, resume mismatch, product already locked
NET4Network: access-URL format, dependency and notification-channel probe, target connectivity, admin-plane CIDR
UPD10Local upgrade service: not installed or not started, access refused, response timeout, version behind, operation state damaged or unreadable
UPG3Upgrade: pre-upgrade check, nodes not upgraded
SVC3Local services: install already complete, service control failed, cannot determine this host's install
BAK5Backup and restore: refused, backup-file digest mismatch, database dump unreadable, version or form does not match this host

Procedure

  1. Look at the prefix first to decide which class of problem it is.
  2. Then look at parameters after the code (such as path, have_gib, need_gib); they give the concrete object and numbers.
  3. 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:

CodeMeaningRemedy
HOST_DISK_LOWFree space on the volume that holds the install directory is short; install has stopped. Output lists candidate mountsInstall onto a volume with more free space using --install-dir <directory>, or clean disk and retry
HOST_CPU_FEATURESThe CPU lacks the instruction set required to self-host ClickHouseOn a VM, set the CPU model to host (x86-64-v3); or switch to existing ClickHouse in the install questions
HOST_ENTRY_PORT_BUSYThe local listen port the access URL depends on is occupied by another processStop that process, or change the port in the access URL, or add --business-entry-port
PKG_INVALIDThe offline package cannot be read or verifiedConfirm the file is a complete .zpkg and retry
PKG_VERSION_MISMATCHInstaller version does not match offline-package versionUse an installer of the same version as the offline package
PKG_CAP_NOT_IN_EDITIONThe chosen product does not provide that capabilityRemove it from --with, or switch to a product that provides it
FRESH_EXTERNAL_DATAWipe-and-reinstall detected an external data serviceThe installer will not delete an external database or object storage. Keep remove = false in the plan file
FRESH_OWNER_UNPROVENSome objects cannot be automatically proven to have been created by this installConfirm y/N one by one in interactive mode, or export a plan file, review it, then execute (Chapter 11)
FRESH_STATE_CHANGEDThe site has changed since the wipe plan was generatedRerun --fresh --dry-run to generate the latest plan file
NET_PUBLIC_URLThe access URL is not a valid http/https addressCorrect it with zenova config set PUBLIC_URL http://<IP-or-domain>
NET_DEP_UNREACHABLEA data-dependency or notification-channel probe failedCheck the target address, network connectivity, and access credentials, then retry
UPG_NODES_NOT_UPGRADEDThe upgrade package is missing node packages for the platforms of online gateway nodesObtain 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_INSTALLEDThis host has already completed installationUpgrade with zenova upgrade; change configuration with --reconfigure; wipe-and-reinstall with --fresh
NODE_ALREADY_INSTALLEDThis host already has a gateway-node installUpgrade 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

  1. 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.
  2. 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
  1. 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'
  1. 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 statusreasonMeaningWho handles it · retry?
400LLM_REQUEST_BODY_INVALID / VALIDATION_FAILEDRequest body is not validCaller changes the request · no
400LLM_CONTEXT_OVERFLOWExceeds the model's context lengthCaller changes the request · no
401UNAUTHENTICATEDAuthentication failed (no API key, or the key is invalid)Caller changes the request · no
401ACCESS_KEY_REVOKEDThe API key has been revokedCaller switches to a valid key · no
402MONTHLY_TOKEN_EXCEEDED / INSUFFICIENT_CREDITSMonthly usage or balance is insufficientAdministrator adjusts the quota · no
403PERMISSION_DENIEDNo permissionAdministrator checks permission and availability · no
403MODEL_NOT_AVAILABLE_FOR_WORKSPACEThat model is not in the caller's availabilityAdministrator adds the member to availability of a model group that includes that model · no
403CONTENT_POLICY_BLOCKEDRequest content was blocked by a content-safety ruleCaller changes the request content · no
403NETWORK_NOT_ALLOWEDThe source CIDR is not allowedAdministrator checks the CIDR policy · no
403CAPABILITY_NOT_LICENSEDThe license does not include that capabilityTenant administrator checks the license · no
404LLM_MODEL_NOT_AVAILABLEThe requested model name does not exist or is unavailableCaller switches to an available model name · no
408REQUEST_TIMEOUTRequest timed outUpstream; retry later · yes
429QUOTA_EXCEEDED / USER_TOKEN_EXCEEDED / USER_COST_EXCEEDEDQuota exhaustedAdministrator adjusts the quota · no
429MODEL_SERVICE_QUOTA_HARD_REJECTModel-group quota hard rejectAdministrator adjusts the model-group quota · no
429TRAFFIC_RATE_LIMITED / TRAFFIC_CONCURRENCY_LIMITEDHit a platform rate or concurrency limitAdministrator checks rate-limit rules; retry later · yes
429LLM_RATE_LIMITEDUpstream provider rate limitedUpstream; retry later · yes
502LLM_UPSTREAM_CREDENTIAL_REJECTEDUpstream rejected the provider credentials the platform storedAdministrator updates the model-provider credentials · no
502LLM_UPSTREAM_MODEL_NOT_FOUNDUpstream does not have that modelAdministrator checks the model name on the provider side · no
502LLM_BILLING_EXCEEDEDUpstream account quota exhaustedAdministrator handles the provider-account quota · no
502LLM_UPSTREAM_SERVER_ERRORUpstream server errorUpstream; retry later · yes
502LLM_UPSTREAM_CONNECT_FAILED / LLM_STREAM_INTERRUPTEDConnect to upstream failed, or the stream was interruptedRetry with the same idempotency key · yes
503MODEL_ROUTE_NOT_CONFIGURED / NO_MODEL_SERVICE_SELECTEDModel routing is not configured, or the current workspace has no available modelAdministrator checks model-group and traffic-rule configuration · no
503LLM_PROVIDER_UNAVAILABLE / LLM_OVERLOADEDUpstream temporarily unavailable or overloadedUpstream; retry later · yes
503CONTROL_PLANE_UNAVAILABLE / SERVICE_UNAVAILABLEPlatform service temporarily unavailableAdministrator troubleshoots per "The console will not open" in this section · yes
504LLM_TIMEOUTWaiting for upstream timed outUpstream; 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. reason is 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

  1. Collect the four materials per section 12.2.
  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.
FieldNotesWhere to get it
Time of occurrence and time zoneTo the minute; state the time zone (for example UTC+8)Caller logs or on-site notes
Request IDResponse header x-request-id; request_id in the error body is the sameCaller response; console Gateway requests
Trace IDProvide it as well when the call record shows a trace IDConsole call record (follow what the page actually shows)
InitiatorAccount name of the member the call belongs toConsole Gateway requests
Access-credential prefixFirst few characters of the API key, to tell which key it isConsole key list; do not provide the full key
Client IPCaller's egress addressCaller or console call record
Declared model and actually routed modelModel name in the caller's request, and the model actually routed toCaller request; console call record
HTTP status and error codeHTTP status, reason in the body; for install and operations problems, provide the diagnostic codeCaller response; on-screen output
Reproduction stepsFrom 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
ScreenshotsConsole error page, Gateway requests record detail, terminal outputTaken on site
  1. Redact all materials (see below).
  2. Organize the materials in this order and pack them for submission:
OrderContent
1One-sentence problem description: phenomenon, impact, start time
2Environment: product, full version and channel, platform, enabled capabilities, data-dependency mode (deployed by the installer / existing service), whether there is a remote gateway node
3Fields in the table above
4Troubleshooting and handling already done, and the result
5The four materials collected in section 12.2, and the zenova doctor --target report if any
6Screenshots

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:

ContentHandling
API keys, model-provider credentials, database passwords, object-storage access keysKeep only the prefix; delete the rest
root password and initial password, two-factor recovery codesMust not be submitted
Files under /opt/zenova/.env, /etc/zenova/secret-service/, /opt/zenova/.env.runtime/, the key archive, and the platform-backup export fileMust not be submitted; they contain the master key and secret-service material
License-file contentsMust not be submitted; when needed, state only the license status
Business data and personal information in request and response bodiesDelete or replace with sample content
Internal IPs, domain names, host namesReplace 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 providedAlternative
One-click packing of all troubleshooting materials with automatic redactionCollect with the four commands in section 12.2; redact by hand per section 12.6
Automatic upload of install-host logs to the vendorAfter the customer confirms redaction, submit by hand in the order in section 12.6
zenova status listing every system serviceView postgres, clickhouse, caddy, secret-service, and spicedb with systemctl status <name>
zenova doctor --target representing connectivity of the gateway's actual egressWhen the report notes "direct connect", judge by a model-provider test or a real call through the gateway
Judging handling from HTTP status aloneJudge by reason in the error body; check section 12.5 or the Error reference page

Previous: 11. Wipe-and-reinstall and changing product

On this page