quiver
Documentation menu

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 kept

The compose file:

  • builds . and tags it quiver:latest;
  • publishes 6900 (REST) and 6901 (gRPC) on the host's loopback address only;
  • mounts the quiver-data volume at /data;
  • passes QUIVER_API_KEY (empty by default), QUIVER_STORAGE (file), QUIVER_SNAPSHOT_INTERVAL (3600, hourly snapshots) and RUST_LOG (info), each overridable from your shell or a .env file next to it;
  • loads that .env into 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
Buildrust:1.99-slim-bookworm with clang, libclang and g++ for RocksDB; cargo build --release --locked -p quiver-server --features rocksdb and -p quiver-tui
Runtimedebian:bookworm-slim, running as the unprivileged quiver user (uid 10001)
Binaries/usr/local/bin/quiver (the entrypoint) and /usr/local/bin/quiver-tui
EnvironmentQUIVER_HOST=0.0.0.0, QUIVER_HTTP_PORT=6900, QUIVER_GRPC_PORT=6901, QUIVER_DATA_DIR=/data
Volume/data
Ports6900 (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-grpc

With 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:latest

The 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