The unkey deploy command ships a pre-built Docker image to Unkey infrastructure. Unlike the GitHub integration, the CLI does not build your image, you build it yourself (locally or in CI), push it to a registry Unkey can pull from, and unkey deploy creates the deployment and streams status until it is ready.
Use the CLI when you want to own the build step: custom CI pipelines, monorepo build systems, pre-release images from a tag, or deploying without connecting a GitHub repository.
Prerequisites#
- The Unkey CLI installed and authenticated (
unkey auth login). - A project created in your workspace.
- A Docker image pushed to a registry Unkey can pull from (for example, a public
ghcr.io,docker.io, orquay.ioimage).
We currently don't support private registries on the platform, this will come in a future release.
Quick start#
That single command:
- Creates a deployment for
my-project/defaultusing the image you supplied. - Monitors the deployment status in your terminal with a live spinner.
- Prints the deployment ID and assigned domains once the deployment is Ready.
Example output:
Usage#
The first positional argument is the fully qualified image reference, registry/repository:tag or registry/repository@sha256:…. The image must already exist in the registry before you run the command.
Flags#
| Flag | Description | Default |
|---|---|---|
--project | Project slug. Required. | |
--app | App slug within the project. | default |
--env | Environment slug to deploy to. | preview |
--root-key | Root key for authentication. Required. | |
--api-base-url | API base URL override (local testing only). |
All flags have matching environment variables so the command works cleanly in CI:
Git auto-detection#
If you run unkey deploy inside a Git working tree, the CLI auto-fills --branch and --commit from the current repository. Set the flags explicitly if you want to override what it detects (for example, when deploying from a CI runner with a detached HEAD).
Dirty working trees are recorded with a (dirty) marker in the source info but still deploy.
Deploy from GitHub Actions#
A typical CI flow builds the image, pushes it to a registry, then calls unkey deploy:
Store your root key as a repository secret (UNKEY_ROOT_KEY) with permission to deploy to the target project.
What happens after you run the command#
The deployment follows the same lifecycle as a GitHub-triggered deployment, with one difference: the Building image step is skipped because Unkey uses the image you supplied as-is.
- Deployment record created with status Pending.
- Image pulled from the registry.
- Containers scheduled across your configured regions.
- Health checks run (if configured in app settings).
- Domains assigned and routes updated.
- Status moves to Ready.
The CLI exits with a non-zero status if the deployment fails, so CI jobs fail loudly when something goes wrong.
Troubleshoot#
| Symptom | Likely cause |
|---|---|
docker image is required | You called unkey deploy without a positional image argument. |
--project is required | Pass --project or set UNKEY_PROJECT. |
--root-key is required | Pass --root-key or set UNKEY_ROOT_KEY. |
| Deployment fails during image pull | The registry is private or the image tag does not exist. Verify the image is pullable publicly. |
| Deployment reaches Ready but returns 5xx | Check runtime logs in the dashboard, usually a crash on startup or a missing environment variable. |