Skip to main content
zenith-compose.yml packages a Docker Compose app for Zenith. It keeps the Compose services, networks, and volumes intact, then adds one top-level x-zenith block for listing and deployment settings. Every service needs a public container image. If you do not have one yet, containerise your app first.
This page covers the fields most apps need. Use the complete zenith-compose.yml reference for every field, default, validation rule, and runtime behavior.

Create the file

Add zenith-compose.yml to the root of a public GitHub repository. Start from the Compose file you already use to run the app. This example packages PrivateBin with one public service and one persistent volume:
zenith-compose.yml
The minimum x-zenith block needs catalog.name and one expose entry. The rest depends on the app.

Configure the listing

catalog describes the app in the Zenith marketplace. The developer dashboard collects listing copy and artwork during submission. Zenith writes the uploaded artwork URLs into the catalogue copy of the file.

Expose a service

expose maps a Compose service port to a public Zenith hostname.
Each entry has these fields:

Add deployment variables

env declares values Zenith resolves for each deployment. The map key becomes the literal container environment variable name.

Use the public URL

A bare string aliases another declared value or a Zenith built-in:
Common built-ins include:

Generate a stable secret

Use generate with an RE2 pattern. Zenith creates the value once and keeps it for the life of the deployment.
Changing the pattern does not rotate a value that a deployment already stores.

Build a value from other variables

Use template to substitute {NAME} references on every render:
Add services to inject a value into selected Compose services. Without it, Zenith injects the value into every service.
An x-zenith.env value replaces a Compose environment entry with the same name in the services it targets.

Add persistent storage

storage describes a Compose named volume and its initial size.
Do not mark database files, indexes, credentials, or other application internals as public storage. public: true makes the volume eligible for app-owner file-manager access.

Check the file locally

Ask Docker Compose to parse the file:
Then run the app:
These commands test the Compose model and the app. Zenith runs the x-zenith-specific validation during submission.
Continue when Compose parses the file without errors, every service stays running, and each exposed service answers on its declared port.

Compose restrictions

Zenith reads one self-contained file. Developer submissions cannot use:
  • Bind mounts.
  • Top-level include.
  • configs.file or secrets.file.
  • Service extends, env_file, or label_file.
privileged: true triggers a security warning during review.

Commit the file

Commit zenith-compose.yml at the repository root on the default branch. The file must be non-empty and no larger than 128 KiB.

Next: submit your app

Connect the repository to Zenith and send it for review.

Complete reference

Check every supported field, default, validation rule, and runtime behavior.