oz0 server start

Start the server.

For: Operators and developers looking up a command.

Start the server. With --dev, management, edge and an embedded Temporal run in one process on SQLite, which is meant for development and tests. Without it the server joins the cluster that server init created in PostgreSQL.

Usage

oz0 server start [flags]

Common flags

FlagTypeDefaultDescription
--devboolrun in dev mode: one process, embedded Temporal on SQLite
--data-dirstring~/.local/share/orchestrator-zeroserver data directory (with --dev: keep dev state here instead of a temporary directory)
--db-filefilea file (- for stdin) holding the PostgreSQL URL of the management database, such as postgres://oz0:PASSWORD@db:5432/oz0 (or set OZ0_DB); the URL can carry a password, so it never goes on the command line
--master-key-filestring<data-dir>/master.keymaster key file written by server init
--advertisestringfirst non-loopback IPv4address other servers and nodes reach this server on
--sanstringsextra host name or IP for the edge certificate, such as a load balancer; repeatable
--namestringhost nameserver name in the cluster
--rolesstringmanager,edge,temporalthe roles this server runs, comma-separated: manager, edge, temporal; all three run as one server, any other set runs them apart (see the docs on running the roles separately)
--public-urlstringthe address each browser usedhow browsers reach the management port, such as https://oz0.acme.se, for identity providers' callback URL
--oidc-configstringa YAML file of identity providers for signing in to the web UI, saved at start (see the sign-in docs)
--temporal-backendstringembeddedTemporal backend: embedded (in this server), external (a Temporal cluster you run) or cloud (Temporal Cloud)
--temporal-addressstringthe frontend's host:port: external or cloud, where {namespace} stands for a namespace's backend name (cloud default {namespace}.tmprl.cloud:7233), or with embedded, for an edge-only process, a temporal-role server's frontend
--dist-dirfolderthe dist folder next to this binary's folderthe folder make dist built, which the edge serves to new nodes

Other flags

FlagTypeDefaultDescription
--advertise-to-managementstringwith --roles=edge: the HOST:PORT management dials for this edge's API (plugin builds, the web UI's calls, artifacts) when it is not the address nodes use, as behind NAT, a load balancer or a tunnel; default: the edge API address nodes get
--advisory-feed-everyduration24hhow often the advisory feed is fetched
--advisory-feed-filefilea file (- for stdin) holding the URL of an advisory feed the edge fetches for the vulnerability scan of installed plugins: an https URL of OSV entries (a JSON array or OSV's zip) or of the hub's advisory format; off by default (or set OZ0_ADVISORY_FEED); the URL can carry a token, so it never goes on the command line
--artifact-gcmodeonwhat the manager role does each hour with plugin artifacts that no installed version, rollout, gate or retained job references and that are older than 7 days: on (delete them), dry-run (log what it would delete) or off; one pass at a time across the cluster
--ca-signer-commandcommanda command that signs with the cluster CA's key outside the server, such as in an HSM or a KMS: "COMMAND public-key" prints the key as PEM, "COMMAND sign sha256" signs the digest on stdin (with --dev: when the dev cluster is created, too)
--call-bindingstringautohow the edge treats a node's model call, admit or connection token that names a job without a call binding: required refuses it; when-present checks a binding only when a call carries one, and takes one without it only for a job whose task it handed that node lately; auto is when-present for a node that reports a runtime without call bindings and never showed them, required for every other node, and required for all by itself once none does (oz0 doctor warns while the edge takes calls without one)
--cloud-endpointstringArrayreplace a cloud's token endpoint for federated credentials, <name>=<URL> with name aws-sts, gcp-sts, gcp-iam or entra, such as a sovereign cloud's (https; http only to this machine); gcp-models or entra-models names a host that answers as the cloud's model API, which a federated provider's token may go to beside the cloud's own (a sovereign cloud's, a private endpoint's); entra-resources names one of your own Azure resources: an Entra provider needs its host named here or with entra-models, on the management servers and the edges, since any Azure customer can register a name on Azure's model hosts; repeatable
--codec-account-claimstringa claim of the UI's access tokens that must hold --temporal-cloud-account; it binds them to this cluster, and is the binding to use with Temporal Cloud's keys: unbound, no access token is taken
--codec-allow-originstringshttps://cloud.temporal.ioa browser origin that may call the edge's codec endpoint; repeatable
--codec-assume-email-verifiedboolwith --codec-jwks-url, take a UI access token without an email_verified claim as naming a verified address, for an identity provider that verifies or sets every address itself, such as Microsoft Entra ID; a claim that says anything but true is refused all the same
--codec-email-claimstringemailthe claim of the UI's access tokens that holds the user's email
--codec-jwks-urlstringTemporal Cloud's, https://login.tmprl.cloud/.well-known/jwks.jsonwhere the keys of the UI's access tokens are
--codec-jwt-audiencestringan audience the UI's access tokens must name in aud; it binds them to this cluster only with --codec-jwks-url (an identity provider's own keys), since Temporal Cloud's tokens for every account can name the same one: unbound, no access token is taken
--codec-jwt-issuerstringthe issuer the UI's access tokens must name (needed with --codec-jwks-url; default with Temporal Cloud's keys: any they sign for)
--codec-jwt-max-ageduration12h0m0sthe longest time after its issue that a UI access token is taken
--codec-jwt-unboundbooltake any unexpired UI access token of a linked user that nothing binds to this cluster: another codec server the user's token reaches could replay it here
--connect-allow-netstringsa network, such as 10.20.0.0/16, that connections' exchanges and token requests may reach, over http too, such as a GitHub Enterprise Server; public addresses over https are always allowed, others only in dev mode or when listed; repeatable
--edge-api-portint7443edge HTTPS port for join, renew and the control stream
--edge-temporal-portint7233port where nodes reach Temporal through the edge
--encrypt-payloadsboolencrypt every payload with its tenant's key before it reaches Temporal: on by default in a cluster (=false turns it off, and oz0 doctor warns), off by default with --dev, always on with cloud
--erasure-ledgerfile<data-dir>/erasure-ledger.jsonl; off for nonethe file management records every erasure in, outside the database, for server restore --erasure-ledger
--eval-canary-perioddurationhow often model canaries check their models (default 24h); a finding needs two periods in a row that differ
--ipstring127.0.0.1 with --dev, else 0.0.0.0IP address to bind listeners to
--llm-anthropic-urlstringhttps://api.anthropic.comAnthropic API address for the LLM gateway
--llm-openai-urlstringhttps://api.openai.comOpenAI-compatible API address for the LLM gateway
--management-portint8443management HTTPS port for the admin API
--management-urlstringswith --roles=edge: management's address, such as https://mgmt.internal:8443, which the edge follows the registry from and reaches management's tables through; repeatable
--master-key-commandcommanda command that unwraps the master key from --master-key-file when the file holds it wrapped, such as with an HSM or a KMS: "COMMAND unwrap" prints the key from the wrapped document on stdin, "COMMAND wrap" wraps one, "COMMAND describe" says what holds the wrapping key (see the docs on key commands) (or set OZ0_MASTER_KEY_COMMAND)
--metrics-listenstringserve /metrics for Prometheus on this address over plain HTTP, such as 127.0.0.1:9464 (not authenticated: keep it private)
--notify-allow-netstringsa private network, such as 10.20.0.0/16, that webhook notifications may post to; public addresses are always allowed, private ones only in dev mode or when listed; repeatable
--offline-dirfolderan offline folder the edge serves its PyPI and npm mirrors from, and installs plugins only from (or set OZ0_OFFLINE_DIR); needs --dist-dir, which server dist pull --from fills with the folder's release
--otlp-endpointstringsend traces over OTLP/HTTP to this URL, such as http://collector:4318: the server's own, and the nodes', which the edge relays
--otlp-header-filestringToString[]a header for every trace export, as NAME=FILE: the header's value is what the file holds, such as a Kubernetes Secret's key mounted as a file (repeatable; or set OZ0_OTLP_HEADERS to name=value,name=value)
--payload-db-filefilewith --roles=edge: a file holding the edge's own PostgreSQL URL for payloads and plugin artifacts (tables payloads, blobs and file_scopes; a role with grants on those is enough; optional with --payload-store) (or set OZ0_PAYLOAD_DB); the URL can carry a password, so it never goes on the command line
--payload-storestringkeep payloads and plugin artifacts in an S3-compatible bucket instead of PostgreSQL: s3://bucket[/prefix][?endpoint=https://host:port&region=R&path-style=true&sse=AES256|aws:kms&kms-key-id=ID&ca-file=PATH] (for the edge role; every edge of a region must name the same bucket, and each region its own; see the docs on payload storage and on regions)
--payload-store-credentials-filestringan AWS shared credentials file for --payload-store (read again when it changes); without it AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY, or ~/.aws/credentials
--plugin-source-allow-netstringsa private network, such as 10.20.0.0/16, that the edge's fetches for plugin sources may reach: Git servers, OCI registries, forges, plugin indexes and package mirrors inside your network; public addresses over https are always allowed, private ones only in dev mode or when listed, and this machine's own addresses (inside a listed network too), its link and metadata services never; repeatable
--pprofboolalso serve Go's runtime profiles at /debug/pprof/ on the --metrics-listen address, such as for load tests (not authenticated: profiles and goroutine dumps reveal internals, so keep the address private; the command line is not served)
--public-edge-urlstringhttps:// and the advertised edge API addresshow browsers and other systems reach the edge's HTTPS port, such as https://oz0-edge.acme.se, for connections' callbacks and the webhook URLs they register
--public-originstringsanother address this cluster's edge API is reached at, such as https://agents.acme.se: nodes mark their agents' calls to it with the job they come from, so a call that loops back into the cluster is refused; repeatable
--queue-poolssharedsharedhow the task queues of a tenant's agents and flows are pooled: shared (one per node selector and label set across the tenant's plugins, which a node polls only while it runs every plugin of it) or plugin (one per plugin and label set: the fallback for a fleet whose nodes cannot poll shared pools yet, such as nodes whose supervisor predates them); management puts it in force at start, a change drains the jobs left on the old names, and every management server should get the same value
--regionstringfor the edge role: the region this edge belongs to, such as eu or us-east (lowercase letters, digits and dashes). It serves only the tenants pinned to that region and admits only nodes that joined through that region's edges; every edge of a region names the same Temporal backends and payload store. Empty is the unnamed region, as in a cluster that uses no regions
--release-channelchannelits dist folder's release's, else stablewith --dev, the release channel a new dev cluster follows
--role-sets-commandstringa command, run without a shell, that prints the role set on stdout; if it fails, the last valid set stays in force
--role-sets-filestringa role set (JSON or YAML, version oz0-roles/v1) whose roles join the built-in ones; read at start and every --role-sets-refresh
--role-sets-refreshduration5m, at least 10show often the role set is read again
--role-sets-timeoutduration10s, at most 5mhow long --role-sets-command may take
--routine-output-allow-netstringsa private network, such as 10.20.0.0/16, that routines' outputs may post to; public addresses are always allowed, private ones only in dev mode or when listed; repeatable
--sandbox-floorboolwith --dev: run shell and write harness sessions only on sandbox tier-1 nodes or a node a tenant admin opted out, as a cluster does (a dev server otherwise runs them on any node, without a sandbox where it has no tier 1, and says so)
--secret-storesstringfor the edge role: a YAML file of secret store processes that tenant secrets may reference (store:<store>/<path>), with the tenants and path prefixes each offers; see the docs on secrets
--secrets-key-commandcommanda command that unwraps the secrets key from --secrets-key-file when the file holds it wrapped: "COMMAND unwrap" prints the key from the wrapped document on stdin, "COMMAND wrap" wraps one, "COMMAND describe" says what holds the wrapping key (see the docs on key commands) (or set OZ0_SECRETS_KEY_COMMAND)
--secrets-key-filestringthe edge role's private key that tenant secrets are sealed to, so that management cannot open them (make one with: oz0 server secrets-key create)
--smtp-addrstringthe SMTP relay notifications are mailed through, host:port such as smtp.acme.se:587; email is off without it
--smtp-ca-filestringthe system's rootsa PEM file of the CA the SMTP relay's certificate chains to, for a relay with a private CA
--smtp-fromstringthe address notifications are mailed from, such as [email protected]
--smtp-password-filestringa file with the SMTP relay's password (never a flag's value)
--smtp-sender-domainsstringsa tenant and a mail domain, such as acme=acme.se, that this tenant's agents' mail may be From through the relay when its sender is in that domain; any other goes From --smtp-from with the tenant's sender as Reply-To; repeatable
--smtp-tlsstringstarttlshow mail to the relay is encrypted: starttls (port 587) or tls (port 465); the relay's certificate is always verified
--smtp-userstringthe SMTP relay's user name, with --smtp-password-file; sent over TLS only
--temporal-api-key-dirstringdirectory with one API key file per backend namespace, named like it (such as acme.a1b2c), read again when they change
--temporal-api-key-envstringenvironment variable holding an API key for every namespace
--temporal-api-key-filestringfile holding an API key for every namespace, read again when it changes
--temporal-backends-filestringYAML file naming more Temporal backends (external or cloud) that tenants can be on or move to; the backend the flags above name is then called default
--temporal-cloud-accountstringcloud: the account ID; a tenant's namespace is <namespace>.<account> unless an admin mapped it (tenant temporal-namespace)
--temporal-create-namespacesboolexternal: create missing namespaces and search attributes instead of only checking them
--temporal-frontend-membership-portint6933Temporal frontend membership port
--temporal-frontend-portint7234Temporal frontend gRPC port
--temporal-history-membership-portint6934Temporal history membership port
--temporal-history-portint7235Temporal history gRPC port
--temporal-log-levelstringWARNlog level for Temporal's own logs
--temporal-matching-membership-portint6935Temporal matching membership port
--temporal-matching-portint7236Temporal matching gRPC port
--temporal-portint7234dev mode: port of the embedded Temporal frontend
--temporal-tlsboolexternal: TLS to the frontend (always on with cloud)
--temporal-tls-ca-filestringPEM file of the CAs to trust for the frontend instead of the system's
--temporal-tls-cert-filestringclient certificate for mTLS to the frontend, read again when it changes
--temporal-tls-key-filestringthe client certificate's key, read again when it changes
--temporal-tls-server-namestringthe address's hostname to check in the frontend's certificate
--temporal-ui-portint8233dev mode: port of the Temporal web UI (0 disables it)
--temporal-ui-urlstringhttps://cloud.temporal.io with cloudwhere Temporal's UI is, for links to jobs
--temporal-worker-membership-portint6939Temporal worker membership port
--temporal-worker-portint7239Temporal worker gRPC port
--trusted-proxystringsa reverse proxy in front of this server, such as a Kubernetes Ingress controller, by its address or a network only proxies hold (10.42.7.0/28, never the pods' whole network, where any pod could then name its own client): a request from it counts as the client X-Forwarded-For names, read from the right past the trusted proxies, for what is held back per address (failed sign-ins, device sign-ins started, unknown API keys) and the sessions page; without it, every client behind a proxy counts as the proxy's one address; repeatable

Inherited flags

FlagTypeDefaultDescription
--contextstring$OZ0_CONTEXT or <config dir>/orchestrator-zero/context.jsonCLI context file written by server init
--log-levelstringinfolog level: debug, info, warn or error

See all oz0 commands and the global flags.

Copyright © 2026