cursus

Installation

Requirements

Build From Source

git clone https://github.com/cursus-io/cursus.git
cd cursus
go mod download
make build

make build creates two binaries for the current OS:

bin/cursus
bin/cursus-cli

Build individually:

make build-api
make build-cli

Cross-compile both for Linux:

make build-linux

Direct broker build:

CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/cursus ./cmd/broker

There is no standalone cmd/bench binary. End-to-end benchmarks use Docker Compose and test/e2e-benchmark; storage microbenchmarks use go test -bench. See Benchmark Verification.

Run From Source

./bin/cursus

or:

make run

Without -config/CONFIG_PATH, built-in defaults are used. A missing explicitly named file logs a warning and falls back to effective flag defaults; malformed readable configuration fails startup.

Container Image

Pull the published GHCR image:

docker pull ghcr.io/cursus-io/cursus:latest
docker run --rm \
  -p 9000:9000 -p 9080:9080 -p 9100:9100 \
  -v cursus-data:/root/broker-logs \
  ghcr.io/cursus-io/cursus:latest

Use a version tag for repeatable deployment:

docker pull ghcr.io/cursus-io/cursus:<version>

Build locally:

docker build -t cursus:local .

The multi-stage Dockerfile builds /root/broker and /root/cli with Go 1.25.0 on Alpine 3.20. entrypoint.sh executes the broker with -config ./config.yaml; if no file is mounted, the broker uses defaults after warning. Production deployments should mount a configuration and durable log volume explicitly.

Example configuration mount:

docker run --rm \
  -p 9000:9000 -p 9080:9080 -p 9100:9100 \
  -v "$PWD/config.yaml:/root/config.yaml:ro" \
  -v cursus-data:/root/broker-logs \
  ghcr.io/cursus-io/cursus:latest

Helm

A Helm chart is available under manifests/helm. Review values.yaml, persistent volume settings, TLS/internal mTLS secrets, advertised addresses, replica/quorum values, and resource limits before installing. Do not treat chart defaults as a production security profile.

Verify

curl -f http://localhost:9080/live
curl -f http://localhost:9080/ready
curl -f http://localhost:9100/metrics

The client port accepts only Wire v2, so raw nc text without the required handshake and CRS2 frame is not a valid protocol check. Use bin/cursus-cli, a supported SDK, or the E2E client helpers.

Run local validation:

go test ./...
make e2e

Docker benchmark tests are opt-in and main-push-only in CI:

RUN_E2E_BENCHMARK=1 go test -v -timeout 30m ./test/e2e-benchmark/...

Clean

make clean

The current target removes files under bin/ and local coverage outputs. It does not delete arbitrary broker log directories or Docker volumes; remove those intentionally with the matching Compose/volume command.

Next Steps