Run DarkDuck in Docker without installing Node or pnpm locally.
Compose Quickstart (Recommended)
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: