Install the server
Celeriant is one Rust binary, Linux only: the storage engine runs on io_uring and Direct I/O. For development you run one standalone node; for production a two-node cluster.
Two install paths today. No prebuilt binaries are published.
- Container image at
ghcr.io/celeriant/celeriant, amd64 and arm64, tagged per release (0.2.0) pluslatest. Recommended; it is also the only path on macOS and Windows. - Build from source.
Container
docker run -d --name celeriant \
--security-opt seccomp=unconfined \
--ulimit memlock=-1:-1 \
-p 10000:10000 \
-v celeriant-data:/var/lib/celeriant \
ghcr.io/celeriant/celeriant:0.2.0 \
--standalone --data-root /var/lib/celeriant --num-shards 1
Docker's default seccomp profile blocks io_uring, so seccomp=unconfined is required. The unlimited memlock matches what the repo's own Compose stack and test image set for io_uring. The image's entrypoint is the server binary, so everything after the image name is server flags.
To build the image yourself, the repo's Dockerfile is two-stage: docker build -t celeriant .
Build from source
git clone https://github.com/celeriant/celeriant-db
cd celeriant-db
cargo build --release -p celeriant
# binary at ./target/release/celeriant
The workspace is Rust edition 2024, so a toolchain of 1.85 or newer.
./target/release/celeriant \
--standalone \
--data-root /var/lib/celeriant \
--num-shards 1
What the server checks at boot
- Direct I/O. It writes a deliberately misaligned block into
--data-root. If the write succeeds, the filesystem is silently buffering instead of honouringO_DIRECT, and the server exits. It also exits if a 512-byte aligned write fails. Some encrypted filesystems fail the first check. XFS and ext4 enforceO_DIRECT; the repo's own cluster setup scripts format XFS. - Ports. It exits if the client port (default 10000) or the replication port (default 10001) is already taken, even in standalone mode.
- Immutable settings.
--num-shards,--timestamp-precision,--timestamp-epoch-offset-secs,--routing-rule,--reserve-coordinator-shardand the WAL compression settings are recorded in the data root on first start. Start again with a different value and the server refuses.--num-shardsdefaults to the CPU count, so pin it.
Metrics listen on port 9090 by default. Every flag also reads a CELERIANT_ environment variable (--data-root is CELERIANT_DATA_ROOT); see Configuration.
For a local two-node cluster with MinIO standing in for S3, Prometheus, Loki and Grafana, use the Compose stack in deploy/local-cluster: docker compose up -d --build. See Running a two-node cluster.
Next: install a client.