A minimal, opinionated deployment tool for Docker Compose + Traefik stacks.
Rolling deploys, health checks, automatic rollback.
Your docker-compose.yml is the single source of truth.
Every decision flows from these constraints.
No deploy.yml, no parallel config. Your docker-compose.yml is all there is.
CLI on each node, GitHub Action across the fleet. One deploys, the other orchestrates.
Databases, caches, and stateful services stay running. Only app containers get touched.
CI builds and pushes images. The server just pulls and swaps.
Failed health check? The old container keeps serving. Nothing changes until the new one is healthy.
Structured, readable output that flows cleanly through SSH into your CI logs.
For each deploy.role=app service, in order:
<compose-command> pull <service>
up -d --no-deps --no-recreate --scale <service>=2
Poll new container via docker inspect until healthy or timeout
Healthy? Graceful shutdown of old container, scale back to 1.
Unhealthy? Remove new container, old continues serving. Exit 1.
Up and running in under a minute.
# Install $ curl -fsSL https://deploy.flowcanon.com/install | sh Detected libc: glibc Downloading flow-deploy... Installed: ~/.local/bin/flow-deploy # Label your services in docker-compose.yml $ cat docker-compose.yml services: web: image: ghcr.io/myorg/myapp:${DEPLOY_TAG:-latest} labels: deploy.role: app healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] # Deploy $ flow-deploy deploy --tag abc123f [12:34:56] ── deploy ────────────────────────────── [12:34:56] tag: abc123f [12:34:58] ▸ web [12:35:11] ✓ web deployed (16.1s) [12:35:11] ── complete (16.1s) ─────────────────────
Everything you need. Nothing you don't.
deploy
Rolling deploy of all app services. Supports --tag, --service, --dry-run.
rollback
Rollback to the previously deployed image tag from .deploy-tag history.
status
Show current state of all managed services: container ID, image, health, uptime.
exec
Run a command inside a running service container.
logs
Tail logs for a service. Supports --follow and --tail.
--version
Show the installed version. Upgrade by re-running the install script.