Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Docker Compose

Local development and single-machine deployment using Docker Compose.

Base Stack

docker compose up -d

Starts the core services:

ServicePortDescription
syndb-api8080 (HTTP), 50051 (Flight)REST API + Arrow Flight
syndb-ui— (reverse-proxied)Web frontend
postgres5433Metadata, users, access control
clickhouse8123 (HTTP), 9002 (native)Data warehouse
minio9000 (API), 9001 (console)Object storage
meilisearch7700Full-text search

All services use network_mode: host — they bind directly to the host network.

Federation Profile

docker compose --profile federation up -d

Adds federation services on top of the base stack:

ServicePortDescription
clickhouse-node8124 (HTTP), 9003 (native)Node ClickHouse
clickhouse-node-setupCreates federation user on node
clickhouse-hub-fed-setupCreates federation user on hub
syndb-node50052 (Flight), 4001/UDP (libp2p)Federation node daemon

Note: The federation and federation-world profiles share port 8124 and are mutually exclusive. federation-world runs 5 regional ClickHouse nodes for benchmarking only.

ETL Profile

Run dataset imports:

docker compose --profile etl run syndb-etl <dataset> <command>

Example:

docker compose --profile etl run syndb-etl hemibrain download
docker compose --profile etl run syndb-etl hemibrain import

Version Management

All service versions are defined in versions.nix. After changing versions:

just sync-versions

This regenerates .env with the correct image tags.

Image Building

Build container images from Nix:

just stack-prepare

This builds OCI images for syndb-api, syndb-node, syndb-cli-etl, and the UI.

Volumes

VolumeServiceContent
clickhouse-dataclickhouseClickHouse data
clickhouse-node-dataclickhouse-nodeNode ClickHouse data
postgres-datapostgresPostgreSQL data
minio-dataminioS3 object storage
meilisearch-datameilisearchSearch index

Cleanup

ClickHouse creates files with UID 100100 and restrictive permissions. To clean volumes:

podman unshare rm -rf <volume-path>

Prefer keeping data in Docker volumes rather than bind mounts to avoid permission issues.