Expose the main HTTP service
Add an entry withoutlabel for the main hostname and custom-domain target. Replace app and 3000 with your service name and container port. Configure your app to listen on 0.0.0.0.
APP_URL and APP_ALLOWED_HOSTS with your app’s environment variable names. Adapt the comma-separated hostname list if your app expects another format.
Zenith terminates TLS at the HTTP ingress. web: false does not create a raw TCP or UDP endpoint. See the expose reference for all fields.
Track verified domain changes
UseZENITH_PUBLIC_URL for the base URL and ZENITH_PUBLIC_HOSTNAMES for a hostname allowlist. See the URL built-ins for variants with ports and multiple URLs.
An unverified custom domain does not replace the public URL. Aliases and templates resolve again when Zenith renders the deployment, so they track verified domain changes. A stored input.default_template keeps its initial value instead.
Add a labelled endpoint
Use a uniquelabel for an additional HTTP endpoint. This example exposes an API alongside the main app:
ZENITH_PUBLIC_URL_<LABEL> instead of constructing its hostname. Convert the label to uppercase and replace hyphens with underscores. For example, admin-api becomes ZENITH_PUBLIC_URL_ADMIN_API.