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:latestOpen 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 -dDocker 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
| Path | Purpose |
|---|---|
/data | Pipeline data files (source/sink file nodes) |
/app/broked.db | SQLite database (if not using Postgres) |
/app/broked.db.key | Encryption key for secrets |
/app/uploads | File 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:latestSee 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: 10sPython 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 requestsOr mount a virtual environment:
volumes:
- ./venv:/opt/venv
environment:
- PATH=/opt/venv/bin:$PATH