Brokoli
Deployment

Docker Deployment

Run Brokoli in a Docker container with optional PostgreSQL.

Run Brokoli in a Docker container with optional PostgreSQL.

Build the image

git clone https://github.com/Tnsor-Labs/brokoli.git
cd brokoli
docker build -f broked/Dockerfile -t broked:latest .

Quick start

docker run -d \
  --name brokoli \
  -p 8080:8080 \
  -v brokoli-data:/data \
  broked:latest

Open http://localhost:8080.

Docker Compose with PostgreSQL

version: "3.8"

services:
  brokoli:
    image: broked:latest
    ports:
      - "8080:8080"
    environment:
      - BROKOLI_DB=postgres://brokoli:brokoli@postgres:5432/brokoli?sslmode=disable
      - BROKOLI_DATA_DIRS=/data
      - BROKOLI_CORS_ORIGINS=https://brokoli.example.com
      - BROKOLI_MAX_CONCURRENT_RUNS=8
    volumes:
      - brokoli-data:/data
      - brokoli-uploads:/app/uploads
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: brokoli
      POSTGRES_PASSWORD: brokoli
      POSTGRES_DB: brokoli
    volumes:
      - pg-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U brokoli"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped

volumes:
  brokoli-data:
  brokoli-uploads:
  pg-data:

Start:

docker compose up -d

Docker Compose with SQLite

For simpler deployments:

version: "3.8"

services:
  brokoli:
    image: broked:latest
    ports:
      - "8080:8080"
    environment:
      - BROKOLI_DATA_DIRS=/data
    volumes:
      - brokoli-data:/data
      - ./broked.db:/app/broked.db
    restart: unless-stopped

volumes:
  brokoli-data:

Volume mounts

PathPurpose
/dataPipeline data files (source/sink file nodes)
/app/broked.dbSQLite database (if not using Postgres)
/app/broked.db.keyEncryption key for secrets
/app/uploadsFile uploads

Persist your data: Always mount volumes for the database and encryption key. Losing the container without volumes means losing all pipelines and credentials.

Environment variables

Pass configuration via environment variables in Docker:

docker run -d \
  --name brokoli \
  -p 8080:8080 \
  -e BROKOLI_DB=postgres://user:pass@host:5432/brokoli \
  -e BROKOLI_DATA_DIRS=/data \
  -e BROKOLI_MAX_CONCURRENT_RUNS=8 \
  -e BROKOLI_CORS_ORIGINS=https://brokoli.example.com \
  -e BROKOLI_JWT_SECRET=your-secret-key \
  -v brokoli-data:/data \
  broked:latest

See Configuration for all environment variables.

Building the Docker image

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN cd broked && go build -o /broked .

FROM alpine:3.19
RUN apk add --no-cache python3 ca-certificates
COPY --from=builder /broked /usr/local/bin/broked
EXPOSE 8080
CMD ["broked", "serve", "--port", "8080"]

Build:

docker build -t brokoli .

Health checks

Configure Docker health checks:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 10s

Python for Code nodes

The default Docker image includes Python 3. To add Python packages for Code nodes:

FROM broked:latest
RUN pip3 install pandas pyarrow requests

Or mount a virtual environment:

volumes:
  - ./venv:/opt/venv
environment:
  - PATH=/opt/venv/bin:$PATH