Docker
The repository's Dockerfile builds an image with the server, built with the RocksDB engine, and the terminal UI. docker-compose.yml runs it with a named volume.
Compose
docker compose up -d # builds the image on first run
docker compose logs -f quiver
docker compose exec quiver quiver-tui # the terminal UI, inside the container
docker compose down # the quiver-data volume is keptThe compose file:
- builds
.and tags itquiver:latest; - publishes 6900 (REST) and 6901 (gRPC) on the host's loopback address only;
- mounts the
quiver-datavolume at/data; - passes
QUIVER_API_KEY(empty by default),QUIVER_STORAGE(file),QUIVER_SNAPSHOT_INTERVAL(3600, hourly snapshots) andRUST_LOG(info), each overridable from your shell or a.envfile next to it; - loads that
.envinto the container too, if it exists; - restarts the container unless you stopped it.
To reach the server from other machines, set a key first, then drop the 127.0.0.1: prefix from the ports entries:
QUIVER_API_KEY=$(openssl rand -hex 32) docker compose up -d.env.example is written for running the binary directly: it sets QUIVER_HOST=127.0.0.1 and QUIVER_DATA_DIR=./quiver-data. Compose passes a .env file into the container, where those two values would override the image's 0.0.0.0 and /data. If you copy it for compose, remove or comment out those lines.
The image
docker build -t quiver:latest . # or: make docker
docker run -d --name quiver -p 6900:6900 -p 6901:6901 -v quiver-data:/data \
-e QUIVER_API_KEY=change-me quiver:latest| Build | rust:1.99-slim-bookworm with clang, libclang and g++ for RocksDB; cargo build --release --locked -p quiver-server --features rocksdb and -p quiver-tui |
| Runtime | debian:bookworm-slim, running as the unprivileged quiver user (uid 10001) |
| Binaries | /usr/local/bin/quiver (the entrypoint) and /usr/local/bin/quiver-tui |
| Environment | QUIVER_HOST=0.0.0.0, QUIVER_HTTP_PORT=6900, QUIVER_GRPC_PORT=6901, QUIVER_DATA_DIR=/data |
| Volume | /data |
| Ports | 6900 (REST), 6901 (gRPC) |
Arguments after the image name go to quiver, so any flag works there, and every QUIVER_* variable can be set with -e:
docker run -d -p 6900:6900 -v quiver-data:/data quiver:latest \
--storage rocksdb --snapshot-interval 600 --snapshot-keep 12 --disable-grpcWith a keys file, mount it read-only and point the server at it:
docker run -d -p 6900:6900 -p 6901:6901 -v quiver-data:/data \
-v "$PWD/keys.json:/run/keys.json:ro" -e QUIVER_KEYS_FILE=/run/keys.json quiver:latestThe image declares a HEALTHCHECK that runs quiver --healthcheck every 30 seconds. It reads the same QUIVER_* variables as the server, asks the REST API for /health on the configured port (over loopback when the server binds 0.0.0.0), and exits 0 when the answer is 200. With QUIVER_DISABLE_HTTP set, it checks that the gRPC port accepts connections instead. /health needs no API key, so the check works with authentication on.
Backups
Snapshots are written inside the volume, at /data/snapshots. Download them over the API (snapshots & backups), or copy them out of the container:
docker cp quiver:/data/snapshots ./quiver-snapshots