Docker Compose
Local development and single-machine deployment using Docker Compose.
Base Stack
docker compose up -d
Starts the core services:
| Service | Port | Description |
|---|---|---|
syndb-api | 8080 (HTTP), 50051 (Flight) | REST API + Arrow Flight |
syndb-ui | — (reverse-proxied) | Web frontend |
postgres | 5433 | Metadata, users, access control |
clickhouse | 8123 (HTTP), 9002 (native) | Data warehouse |
minio | 9000 (API), 9001 (console) | Object storage |
meilisearch | 7700 | Full-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:
| Service | Port | Description |
|---|---|---|
clickhouse-node | 8124 (HTTP), 9003 (native) | Node ClickHouse |
clickhouse-node-setup | — | Creates federation user on node |
clickhouse-hub-fed-setup | — | Creates federation user on hub |
syndb-node | 50052 (Flight), 4001/UDP (libp2p) | Federation node daemon |
Note: The
federationandfederation-worldprofiles share port 8124 and are mutually exclusive.federation-worldruns 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
| Volume | Service | Content |
|---|---|---|
clickhouse-data | clickhouse | ClickHouse data |
clickhouse-node-data | clickhouse-node | Node ClickHouse data |
postgres-data | postgres | PostgreSQL data |
minio-data | minio | S3 object storage |
meilisearch-data | meilisearch | Search 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.