Increase Docker Desktop memory allocation:
- Set Memory to at least 8GB (12GB recommended)
- Set CPUs to at least 4
From the docs/example directory:
# Create the kind cluster and install the operator via Helm (skipped when already running)
task clusterOr run the operator locally from the project root: task kind:reset, then task run in another terminal.
From the docs/example directory:
# Install MetalLB and RustFS (object storage for stream uploaders)
task setup
# Deploy full 4-node network (orbit + all nodes + genesis), waits for pods ready
task deploy
# Or deploy node0 only + genesis (lightweight, e.g. for beacon testing)
task deploy:single
# Check status
task status
# Tail consensus node logs
task logs# Set up kind + operator + RustFS, deploy the block node first, then the network with node0 streaming to it,
# then a mirror monitor (pinger) that sends transfers to node0 so blocks flow
task deploy:blocknode
# Remove the pinger, the block node, its PVCs, and reset node0's block-nodes config
task destroy:blocknodeThe block node is deployed before the consensus nodes so node0 starts with block-nodes.json and the stream properties already in place. TSS needs a threshold of nodes streaming blocks (BOTH), so all four nodes get the block-node properties. Only node0 is connected to the block node (FILE_AND_GRPC); node1 to node3 write block files only (FILE). Config changes on a running consensus node need a pod restart, because the files are subPath mounts. deploy:blocknode runs task deploy BLOCKNODE=true, which also applies helmcapsule/block-nodes-config.yaml and helmcapsule/applicationproperties.yaml for every node.
Each node has its own HAProxyCapsule and EnvoyProxy. To deploy proxies manually:
# HAProxy — gRPC load balancer (ports 50211/50212), routes directly to consensus node
kubectl apply -f node0/haproxycapsule.yaml
kubectl apply -f node1/haproxycapsule.yaml
kubectl apply -f node2/haproxycapsule.yaml
kubectl apply -f node3/haproxycapsule.yaml
# EnvoyProxy — gRPC-Web gateway for browser/JS clients (port 8080), routes directly to consensus node
kubectl apply -f node0/envoyproxycapsule.yaml
kubectl apply -f node1/envoyproxycapsule.yaml
kubectl apply -f node2/envoyproxycapsule.yaml
kubectl apply -f node3/envoyproxycapsule.yamlBoth proxies auto-derive their upstream from the CR name (e.g. haproxy-node1 → upstream node1, envoy-node1 → upstream node1). Override with upstreamService if needed.
# Delete the kind cluster
task destroy
# Uninstall MetalLB and RustFS
task cleanup