Quick install
curl -fsSL https://zenithgw.com/install.sh | bash -s -- --yesThe installer creates and keeps your configuration in ~/zenith-gateway, then pulls the Gateway image from ghcr.io. Keep gateway.env private and use a pinned image tag for production changes.
Installer flags
| Flag | Purpose |
|---|---|
| --mode swarm | Docker Swarm stack instead of Compose |
| --swarm-data-node NAME | Pin gateway/Postgres/NATS to the Swarm node that owns local volumes |
| --no-nats | Skip NATS; empty ZENITH_NATS_URL |
| --gateway-port N | Publish gateway on a non-default host port |
| --issuer-url URL | Activation / policy-sync issuer origin |
| --tag TAG | Image tag or full image reference |
| --uninstall [--purge] | Tear down (optionally delete volumes) |
| --check | Prerequisites only |
Compose vs Swarm
Compose is the recommended single-host path. Swarm is available for operators who need it; it keeps one Gateway replica and pins stateful services to one node.
Environment model
gateway.env contains your Gateway image, local admin secret, bootstrap API key, database password, issuer URL, and optional issuer verification key. The installer generates secrets for a new installation. Product settings are configured in the Gateway admin after activation.
Ports
| Host port (default) | Target | When published |
|---|---|---|
| 9090 | 9090 gateway | Always (GATEWAY_PORT) |
| 15432 | 5432 postgres | Only when you explicitly publish it |
| 14222 / 18222 | NATS client / monitor | Only when you explicitly publish it |
Activation
- /healthz returns 200 as soon as the process is up.
- /readyz returns 503 until a valid license is activated; then 200.
- Open /admin/activate, upload .lic, activate against ZENITH_ISSUER_URL (HTTPS in production).
- First boot continues to /setup to create the owner account when the org is empty.
- Configure providers and pools, then call the OpenAI SDK against /v1.