A minimal content-addressed object store with a gRPC API, RocksDB index, IPFS for bytes, Git-like commits/heads, background replication, and built-in observability (Prometheus metrics + Tempo traces + Grafana).
- Objects:
Put/Getby SHA-256 object id or by IPFS CID - Commits & heads: lightweight DAG over objects
- Replication: gRPC sync between nodes
- IPFS: stores bytes in Kubo, pins automatically
- Observability: Prometheus metrics, OpenTelemetry traces, Grafana dashboards
- CLI:
repo-clifor quick interactions
# Health
docker exec orion-node1 repo-cli health --endpoint http://127.0.0.1:50051
# Put file -> returns object_id & cid
docker exec orion-node1 sh -lc 'echo hello > /tmp/x.txt'
docker exec orion-node1 repo-cli --endpoint http://127.0.0.1:50051 put --file /tmp/x.txt
# Commit metadata (message + cid) to DAG
docker exec orion-node1 repo-cli --endpoint http://127.0.0.1:50051 commit --object-hex <object_id_hex> --cid <cid> --message "init"
# Replicate to node2
docker exec orion-node2 repo-cli --endpoint http://127.0.0.1:50052 sync --remote http://orion-node1:50051 --object-hex <object_id_hex>Requirements: Docker 24+, Docker Compose v2.
# Build the app image via the project Dockerfile
docker compose build
# Start the full stack (IPFS, 2 nodes, Prometheus, Tempo, Grafana)
docker compose up -dServices (default ports):
- orion-node1: gRPC
:50051, metrics:9100 - orion-node2: gRPC
:50052, metrics:9100 - ipfs (Kubo): API
:5001, Gateway:8080 - prometheus:
:9090 - tempo: HTTP
:3200, OTLP gRPC:4317, OTLP HTTP:4318 - grafana:
:3000
If you prefer compiling locally:
cargo build -p repo-node -p repo-cli --releaseYou’ll need a local IPFS Kubo and to set the same env vars as in
docker-compose.ymlwhen runningrepo-node.
Experimental. Use at your own risk.
See LICENSE. PRs welcome.