Run DarkDuck in Docker without installing Node or pnpm locally.
docker compose -f docker/docker-compose.quickstart.yml up --build
Open http://localhost:3100. Defaults:
  • Host port: 3100
  • Data directory: ./data/docker-darkduck
Override with environment variables:
DARKDUCK_PORT=3200 DARKDUCK_DATA_DIR=../data/pc \
  docker compose -f docker/docker-compose.quickstart.yml up --build
DARKDUCK_DATA_DIR is resolved relative to the compose file (docker/), so ../data/pc maps to data/pc in the project root.

Manual Docker Build

docker build -t darkduck-local .
docker run --name darkduck \
  -p 3100:3100 \
  -e HOST=0.0.0.0 \
  -e DARKDUCK_HOME=/darkduck \
  -v "$(pwd)/data/docker-darkduck:/darkduck" \
  darkduck-local

Data Persistence

All data is persisted under the bind mount (./data/docker-darkduck):
  • Embedded PostgreSQL data
  • Uploaded assets
  • Local secrets key
  • Agent workspace data
Back up the data directory before upgrading the Docker image. While migrations are handled automatically, having a backup protects against data loss.

Claude and Codex Adapters in Docker

The Docker image pre-installs:
  • claude (Anthropic Claude Code CLI)
  • codex (OpenAI Codex CLI)
Pass API keys to enable local adapter runs inside the container:
docker run --name darkduck \
  -p 3100:3100 \
  -e HOST=0.0.0.0 \
  -e DARKDUCK_HOME=/darkduck \
  -e OPENAI_API_KEY=sk-... \
  -e ANTHROPIC_API_KEY=sk-... \
  -v "$(pwd)/data/docker-darkduck:/darkduck" \
  darkduck-local
Without API keys, the app runs normally — adapter environment checks will surface missing prerequisites when you try to configure an agent.
For production Docker deployments, use secrets management (Docker secrets or environment variable injection from your orchestrator) instead of passing API keys directly on the command line.

Docker Compose with External PostgreSQL

For production deployments with a dedicated PostgreSQL database:
services:
  darkduck:
    build: .
    ports:
      - "3100:3100"
    environment:
      HOST: "0.0.0.0"
      DATABASE_URL: "postgres://darkduck:password@db:5432/darkduck"
      DARKDUCK_HOME: "/darkduck"
    volumes:
      - darkduck-data:/darkduck

  db:
    image: postgres:17
    environment:
      POSTGRES_USER: darkduck
      POSTGRES_PASSWORD: password
      POSTGRES_DB: darkduck
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  darkduck-data:
  postgres-data: