Docker Compose deploys,
without the baggage.

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.

Design Principles

Every decision flows from these constraints.

Compose is truth

No deploy.yml, no parallel config. Your docker-compose.yml is all there is.

Two layers, clean split

CLI on each node, GitHub Action across the fleet. One deploys, the other orchestrates.

Accessories left alone

Databases, caches, and stateful services stay running. Only app containers get touched.

Builds happen in CI

CI builds and pushes images. The server just pulls and swaps.

Failure is a no-op

Failed health check? The old container keeps serving. Nothing changes until the new one is healthy.

Logging is the interface

Structured, readable output that flows cleanly through SSH into your CI logs.

Deploy Lifecycle

For each deploy.role=app service, in order:

1

Pull new image

<compose-command> pull <service>
2

Scale up

up -d --no-deps --no-recreate --scale <service>=2
3

Health check

Poll new container via docker inspect until healthy or timeout

4

Cutover or rollback

Healthy? Graceful shutdown of old container, scale back to 1.
Unhealthy? Remove new container, old continues serving. Exit 1.

Quick Start

Up and running in under a minute.

terminal
# 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) ─────────────────────

CLI Commands

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.