Deployment

Deployment

Ship Ductor with Docker, Dokploy, or Helm/Kubernetes — and the production concerns that apply to all three.

Ductor is a single statically-linked Go binary that needs two backing services: PostgreSQL (TimescaleDB recommended) and Redis or Dragonfly. Everything else — the API, the routing engine, the workflow coordinator, the workers — runs inside that one binary, selected by server.role. There is no separate scheduler, broker, or executor image to operate; you scale by running more copies of the same binary and, if you want, splitting roles across fleets.

Pick the path that matches your platform:

The shape of a deployment

Ductor binaryAPI · routing · workflow · workers PostgreSQL Redis / Dragonfly VictoriaMetrics stack(optional)
ComponentPurposeRequired
Ductor binaryAPI + routing + workflow runtime + workersYes
PostgreSQLDurable state — runs, attempts, pools, rules, idempotencyYes
Redis / DragonflyCache, flow control, tiered queue, pub/subYes
VictoriaMetrics stackMetrics, logs, traces, alerting, GrafanaOptional

Configuration is uniform

However you deploy, configuration follows one rule: a YAML key becomes an env var by uppercasing and swapping dots for underscores (database.urlDUCTOR_DATABASE_URL). See the Configuration reference. In Kubernetes the Helm chart also supports injecting a whole YAML document via the DUCTOR_CONFIG Secret — the surface for enterprise-only settings that shouldn't live in individual env vars.

Because the same binary runs everywhere, the difference between a laptop and a production cluster is entirely configuration: which backing services it points at, which security controls are enabled, and how many replicas run. The deployment paths above differ only in how they deliver that configuration.

Two Helm postures

The Helm chart ships one switch that draws the line between the two worlds:

PostureproductionWhat it means
Developmentfalse (default)Chart-managed database/cache Secrets, development runtime profile, permissive defaults. For local and internal installs.
EnterprisetrueFail-closed gate: rendering fails unless the environment is production, the security profile is enterprise, and every credential comes from pre-provisioned Kubernetes Secrets.

Flipping production=true is not a tuning knob — it turns on a hard guard rail that refuses to render a chart that isn't fully hardened. See Kubernetes (Helm) for the exact requirements and Production concerns for the config that backs them.

After you ship

Getting Ductor running is day one. The day-two concerns — migrations you run on every upgrade, backups you rehearse, metrics and alerts you watch, key rotation you plan for — live in Operations: