Zero-downtime deploy
The new revision starts unpublished and passes a health gate. One atomic proxy swap moves traffic and drains old connections; the previous revision stays for rollback.
bundant ships your container over plain SSH, gates it on health, and swaps traffic through kamal-proxy. Docker or podman, one CLI, nothing left running on the host. No Kubernetes. No registry required.
Try a command
type a command, or press Enter to run bundant validate
Type validate, deploy, status or rollback. Press Enter with an empty prompt to run the next command.
output recorded from a real docker host; nothing runs in your browser
npm i -g bundantWhy and how
A single host already gives you a network, a proxy and a restart policy. bundant adds the deploy discipline without asking you to run a cluster to get it.
Build locally, ship over the connection you already have.
A box, sshd and docker or podman. That is the whole platform.
Health-gated swaps through kamal-proxy, not restart roulette.
A deploy, in four steps
One deploy.yml holds the image, hosts, env, health check and proxy host. Validate parses it locally and never contacts a host.
The new revision starts unpublished, passes a health gate, then kamal-proxy swaps its target set in one call and drains old connections.
Expected and live replicas, revision and containers for every unit, straight from the host. --json for scripts.
The previous revision is re-gated, or the exact one named by --to-revision, then swapped back. The old container was kept for exactly this.
bundant deploy plan (via api)
hello/web rev=59ceb8d runtime=podman
hosts: replace-me.example.ts.net
1) [ssh] host prerequisites
2) [pull] POST /images/create
3) [network] POST /networks/create
4) [run] POST /containers/create
5) [health] probe -> GET /logs
6) [proxy-ensure] GET /kamal-proxy
7) [proxy-swap] kamal-proxy deploy
8) [stop-old] POST /stop?t=10 Features
Six capabilities, all present in bundant 0.1.0. If it is not in the CLI today, it is not on this page.
The new revision starts unpublished and passes a health gate. One atomic proxy swap moves traffic and drains old connections; the previous revision stays for rollback.
A group is a namespace: install services in needs: order, aggregate status, roll back to one sha. Stateful accessories keep stable names and named volumes and are never touched by deploy, rollback or prune.
Run N copies of one service per host and scale up or down on demand. New targets are gated before the proxy swap, and scale-down drains before containers stop.
validate parses deploy.yml, group.yml or accessory.yml and prints the resolved identity plus the full error list. An invalid config never contacts a host.
One typed engine API, two runtimes through their native APIs. Set runtime: podman and every step targets Podman directly — no docker shim, no compatibility layer.
ps, logs, stats, events, status and a local ui page, all pull-on-demand over the same ssh connection. Nothing is installed on the host and nothing stays resident.
Commands
23 commands, 34 flags, one binary. Search the list, open a command and read its full usage, every flag and a runnable example.
23 of 23 commands
Deploy6
Units9
Groups2
Ops6
deploy the current revision to every host
Usage
bundant deploy [flags]Flags 34
Example
$ bundant deploy -f deploy.ymlCaptured from bundant --help and bundant <command> --help by scripts/capture-commands.mjs. Nothing on this page is written by hand.
FAQ
If something is not shipped, it is not promised here. The CLI help is the source of truth.