Skip to content

ZeptoDB Docker Deployment Guide

Single Docker image for all roles: master, data node, flight server, CLI.

Image: zeptodb/zeptodb:0.0.1 Size: ~300MB (distroless runtime) Base: gcr.io/distroless/cc-debian12:nonroot


Terminal window
# Start master node with Web UI
docker run -p 8123:8123 zeptodb/zeptodb:0.0.1
# Open Web UI
open http://localhost:8123/ui/
# Query via curl
curl -X POST http://localhost:8123/ -d "SELECT 1+1 AS result"

BinaryRoleDefault Port
zepto_http_serverMaster node — HTTP API, SQL engine, Web UI8123
zepto_data_nodeData node — partition storage, RPC server9000+
zepto_flight_serverArrow Flight — gRPC streaming8815
zepto-cliInteractive SQL REPL
Terminal window
# Master node (default)
docker run -p 8123:8123 zeptodb/zeptodb:0.0.1
# Data node
docker run zeptodb/zeptodb:0.0.1 ./zepto_data_node 9000
# Arrow Flight server
docker run -p 8815:8815 zeptodb/zeptodb:0.0.1 ./zepto_flight_server --port 8815
# CLI (interactive)
docker run -it --entrypoint ./zepto-cli zeptodb/zeptodb:0.0.1

FeatureStatusNotes
Highway SIMDVectorized scan/aggregation
LLVM JITRuntime query compilation
OpenSSL / TLS / JWT--tls-cert, --jwt-issuer to activate
AWS S3AWS_ACCESS_KEY_ID env var to activate
Arrow Flightzepto_flight_server binary
ParquetHDB flush to Parquet files
LZ4 compressionWAL and HDB compression
io_uringAsync I/O for HDB reads
HugePagesAuto-detect: uses if available, falls back to regular pages
Web UIServed at /ui/ on master node
FeatureReasonAlternative
UCX / RDMARequires InfiniBand hardware + kernel modulesUse bare-metal deployment
Python bindingRuntime dependency on Python + pybind11pip install zeptodb separately
tcmallocMarginal gain in containersDefault allocator is fine

MetricBare Metal (tuned)DockerGapNotes
Tick-to-trade latency< 1μs3–8μs3–8xContainer syscall overhead + no CPU isolation
Ingest throughput50M+ msg/s20–35M msg/s~2xNo NUMA pinning, shared scheduler
Query (1M rows scan)~200μs~250μs~25%Minimal overhead for compute-bound
Query (aggregation)~50μs~60μs~20%SIMD/JIT identical
Tail latency (p99)< 5μs20–100μs10–20xKernel scheduler jitter
Network (RDMA)< 2μsN/ARDMA not available in containers
FeatureBare MetalDocker
CPU pinning (isolcpus, taskset)✅ Full control⚠️ --cpuset-cpus only
NUMA bindingnumactl --membind⚠️ --cpuset-mems only
HugePages (2MB/1GB)✅ Kernel-level config⚠️ Host must pre-allocate
RDMA / InfiniBand✅ Native❌ Not supported
io_uring✅ Native✅ Works (kernel 5.10+)
Kernel bypass (DPDK)
nohz_full (tickless)❌ Host-level only
TLS / JWT auth
Arrow Flight
S3 upload
Web UI✅ (separate process)✅ (embedded, /ui/)
Rolling upgradeManual✅ K8s native
Auto-scaling✅ K8s HPA
Deployment speedHoursSeconds
Use CaseRecommendationReason
HFT / market makingBare metalEvery microsecond matters; need RDMA, CPU isolation
Market data feed handlerBare metalConsistent sub-millisecond latency required
Real-time risk / surveillanceBare metal or DockerDepends on latency SLA
Quant research / backtestingDockerCost-effective, easy to spin up/down
Analytics dashboardDockerQuery latency tolerance > 10ms
Development / CIDockerFast iteration, reproducible
Multi-tenant SaaSDocker + K8sIsolation, resource quotas, auto-scaling

Terminal window
# Pin to cores 0-3
docker run --cpuset-cpus="0-3" -p 8123:8123 zeptodb/zeptodb:0.0.1
Terminal window
# Host: allocate HugePages
echo 1024 > /proc/sys/vm/nr_hugepages
# Container: mount hugetlbfs
docker run --shm-size=2g \
-v /dev/hugepages:/dev/hugepages \
-p 8123:8123 zeptodb/zeptodb:0.0.1
Terminal window
docker run --cpuset-cpus="0-15" --cpuset-mems="0" \
-p 8123:8123 zeptodb/zeptodb:0.0.1
Terminal window
docker run -p 8123:8123 \
-v /data/zeptodb:/opt/zeptodb/data \
zeptodb/zeptodb:0.0.1
Terminal window
docker run -p 8123:8123 \
-e AWS_ACCESS_KEY_ID=<key> \
-e AWS_SECRET_ACCESS_KEY=<secret> \
-e AWS_DEFAULT_REGION=us-east-1 \
zeptodb/zeptodb:0.0.1

version: "3.8"
services:
master:
image: zeptodb/zeptodb:0.0.1
ports:
- "8123:8123"
command: >
--port 8123 --no-auth
--web-dir /opt/zeptodb/web
--add-node 1:data1:9000
--add-node 2:data2:9001
data1:
image: zeptodb/zeptodb:0.0.1
entrypoint: ["./zepto_data_node"]
command: ["9000", "--node-id", "1"]
data2:
image: zeptodb/zeptodb:0.0.1
entrypoint: ["./zepto_data_node"]
command: ["9001", "--node-id", "2"]
Terminal window
docker compose up -d
curl http://localhost:8123/admin/nodes # verify cluster

zepto_http_server [OPTIONS]
Server:
--port PORT HTTP API port (default: 8123)
--web-dir PATH Web UI static files directory
--no-auth Disable authentication
--log-level LEVEL info|debug|warn|error
Cluster:
--node-id ID Node identifier
--add-node ID:HOST:PORT Add remote data node
--rpc-port PORT RPC port for HA communication
HA:
--ha active|standby Enable HA mode
--peer HOST:PORT HA peer address
TLS:
--tls-cert PATH TLS certificate file
--tls-key PATH TLS private key file
JWT / SSO:
--jwt-issuer URL Expected JWT issuer
--jwt-audience AUD Expected JWT audience
--jwt-secret SECRET HS256 shared secret
--jwt-public-key PATH RS256 PEM public key
--jwks-url URL JWKS endpoint (auto-fetch)

IssueCauseFix
Permission denied [/var/log/zeptodb]Log directory not writableAlready handled in image; report if seen
mmap failed, falling backHugePages not available on hostNormal — auto-fallback to regular pages
Port already in useAnother container on same portChange -p mapping
Web UI blank pageBrowser cacheHard refresh (Ctrl+Shift+R)
No Authorization headerAuth enabled by defaultAdd --no-auth or provide API key

See also: