go.mod is authoritative).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.
./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.
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
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.
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/...
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.