deploy command group that installs and manages a self-hosted Docker Compose deployment:
a guided installer plus lifecycle commands for upgrading, inspecting, stopping, and removing the deployment.
It is the recommended way to set up and manage a self-hosted deployment on Linux, macOS, and Windows.
The install.sh / install.ps1 installation scripts
are thin wrappers that install the CLI and run onyx-cli deploy install, so both paths produce the same deployment.
Deployments created by older versions of the scripts are detected and managed in
place.
Compared to managing the Docker Compose files by hand, the CLI:
- Keeps the compose files in sync automatically:
deploy upgraderefreshes the compose files, overlays, and nginx config to match the target version, so you never diff them against the repo yourself. - Protects your customizations: hand-edited files are detected via a checksum manifest and backed up before
they are ever overwritten, and your
.envsettings survive every upgrade. - Steers debugging:
deploy statusflags version drift and explains why a service is down (restarts, exit code, OOM, last failing health probe), anddeploy logsfinds the right compose files and overlays for you. - Handles the environment: it checks RAM, disk, and ports, installs Docker on Linux, and generates secrets, instead of leaving prerequisites to a README.
- Has a convenient, discoverable interface: guided prompts with sensible defaults,
--helpon every command, and clear error messages, with--no-promptand--jsonfor automation.
Prerequisites
Install the CLI from PyPI:onyx-cli configure step is needed — the deploy commands work directly against your local Docker,
not an Onyx server.
Install
- Checks system resources (RAM, disk) and scans for a free host port
- Installs Docker Engine and the compose plugin on Linux after confirmation; starts Docker Desktop and waits for it on macOS; detects Docker and provides instructions on Windows
- Creates a
.envfile from the template with randomly generated secrets - Pulls the Onyx images and starts the containers, waiting until every service reports healthy
deploy install on an existing deployment asks a single question:
Restart it as-is or Upgrade it to a newer version.
Flags
For example, a fully non-interactive install pinned to a specific version:
Deployment directory
New installs live in~/.config/onyx (XDG-aware).
Deployments created by older versions of the install.sh script in ./onyx_data are detected automatically and managed
in place — no migration needed.
Pass --dir or set the ONYX_DEPLOYMENT_DIR environment variable to target a specific location.
The directory holds the compose files, .env, and an install-state.json manifest recording the deployment mode,
version, and a checksum of each managed file. No application data lives there — chats, users,
and documents are stored in named Docker volumes.
Offline install
--offline deploys entirely from what is already on the host — no release lookup, no config download,
and no image pull. The images must be loaded in advance,
and Docker must already be installed (the installer cannot install it without a network). It implies --local:
config files already on disk are used as-is, and any that are missing are written from copies bundled with the CLI.
Staging the deployment directory from a connected install (below)
is still recommended — the bundled copies match the CLI’s own version, not necessarily the Onyx version being deployed.
On a machine with internet access,
install the latest release with the same mode flags (or pin a specific version with --tag),
then export the images the deployment resolved to:
onyx-images.tar and the ~/.config/onyx directory to the offline host, then:
--tag,
an offline install offers the newest released version whose images are already on the host — the one just loaded.
Before starting anything,
the installer verifies every image the deployment needs and names each one that is missing — load those with docker load and re-run.
deploy upgrade --offline works the same way for moving an air-gapped deployment to a newer staged version.Upgrade
--tag:
- Only the
IMAGE_TAGline in.envis rewritten (plusSANDBOX_BACKENDwhen Craft is enabled) — every other setting, including your edits, is kept. - Managed files (compose files, overlays, nginx config) are refreshed to match the target version.
Files you hand-edited are detected via the manifest, backed up,
and only overwritten after you confirm (or with
--force). - Downgrades to an older version warn and require confirmation or
--force.
upgrade accepts the same --dir, --no-prompt, --local, --offline, --no-wait, --dry-run,
and --verbose flags as install.
Status
.env,
and by the running containers (drift between them is flagged), plus per-container status and health, the published port,
and — for a service that is down — why (restarts, exit code, OOM, last failing health probe).
status is read-only and works as a health probe: use --json for machine-readable output, and check the exit code.
Logs
Stop
onyx-cli deploy install.
Uninstall
Migrating an existing deployment
From an older install.sh deployment
Today’sinstall.sh runs the CLI, but older versions were standalone and installed into an onyx_data directory.
Those deployments are managed in place — run the CLI from the directory containing onyx_data (or point --dir at it)
and it takes over, no migration required. The old script’s mode flags map to dedicated commands:
Moving to ~/.config/onyx
A legacyonyx_data install can also be relocated to the recommended ~/.config/onyx location.
Only configuration moves: chats, users,
and documents live in named Docker volumes keyed by the compose project name (onyx), which stays the same,
so the relocated deployment adopts them automatically.
The one file that must be carried over is .env — it holds the secrets the database and object-store volumes were
initialized with.
.env, or Upgrade to move to a newer one.
The compose files are downloaded fresh, so re-apply any hand edits you made to them.
Once onyx-cli deploy status reports healthy, delete the old directory — it only holds configuration:
Deleting the old directory matters: when
onyx_data exists in the working directory,
the CLI prefers it over ~/.config/onyx. Once it is gone,
plain onyx-cli deploy commands find the new location without --dir.From a manual docker compose setup
A deployment you started by hand from the repo’sdeployment/docker_compose directory can be adopted the same way,
as long as it uses the default compose project name (onyx, pinned in docker-compose.yml):
.env as an existing deployment, downloads the managed compose files,
and brings the stack back up on the existing volumes.
Next Steps
Configure Authentication
Set up authentication for your Onyx deployment with OAuth, OIDC, or SAML.
More Onyx Configuration Options
Learn about all available configuration options for your Onyx deployment.