Skip to main content
Docs / Deployment

Deployment Guide

Five deployment modes. Same codebase, same config format. Choose based on your scale and infrastructure.

ModeInfraScalingBest For
Single BinaryNoneManualDev / Testing
Docker ClusterDocker + nginxAdd nodesSmall prod
Docker ControllerDockerAutoNo K8s, need auto-scale
K8s ControllerKubernetesAuto + HPACloud-native prod
K8s StaticKubernetesK8s HPAGitOps / fixed cap
1.

Single Binary

When: Development, testing, small-scale production

One Drawbridge process manages all accounts with local workers. Optional ValKey for persistence. Simplest setup.

Configuration
# config.yaml
accounts:
  - id: "pro-1"
    pool_size: 2
    env:
      KIRO_API_KEY: "ksk_..."

server:
  port: 8080
  gateway_secret: "your-secret"
Commands
$ make build
$ ./bin/drawbridge --config config.yaml
2.

Docker Cluster

When: Small production, VPS hosting, Docker Swarm

N identical Drawbridge nodes behind nginx load balancer. Each node manages a subset of accounts. Shared ValKey for coordination.

Configuration
# config-multi.yaml
accounts:
  - id: "pro-1"
    pool_size: 2
    node: "node-1"
  - id: "pro-2"
    pool_size: 2
    node: "node-2"

redis:
  url: "redis://valkey:6379"
Commands
$ make prepare-docker
$ make up-multi
3.

Docker Controller

When: Container orchestration without Kubernetes

Drawbridge dynamically creates/destroys worker containers via Docker API. Account CRUD triggers immediate provisioning.

Configuration
# config.yaml
controller:
  enabled: true
  reconcile_interval: 30s
  runtime:
    type: docker
    docker:
      network: drawbridge-net
      image: drawbridge/kiro-worker:latest

redis:
  url: "redis://valkey:6379"
Commands
$ make prepare-docker
$ make up-workers
4.

Kubernetes Controller

When: Cloud-native production (EKS, GKE, on-prem K8s)

Full Kubernetes deployment via Helm chart. Controller dynamically creates worker Pods. RBAC, HPA, and PDB included.

Configuration
# values.yaml overrides
controller:
  enabled: true
  runtime:
    type: kubernetes
    kubernetes:
      namespace: drawbridge
      image: drawbridge/kiro-worker:latest
      cpu_limit_millis: 2000
      mem_limit_bytes: 2147483648

valkey:
  enabled: true
Commands
$ helm install drawbridge ./deploy/kubernetes/helm/drawbridge/ \
$ --set controller.enabled=true \
$ --set controller.runtime.type=kubernetes
5.

Kubernetes Static

When: GitOps, fixed capacity, no dynamic provisioning needed

Pre-defined Worker Deployments managed by Kubernetes. No RBAC required. HPA handles scaling. Best for predictable workloads.

Configuration
# values.yaml overrides
controller:
  enabled: false

workers:
  enabled: true
  replicas: 3
  resources:
    limits:
      cpu: "2"
      memory: "2Gi"
Commands
$ helm install drawbridge ./deploy/kubernetes/helm/drawbridge/ \
$ --set controller.enabled=false \
$ --set workers.enabled=true

Next Steps