This guide gets eBeacon running locally with a multi-upstream Beacon API pool.
⚠️ Not for validators. eBeacon is for read-heavy Beacon API workloads (RPC clients, indexers, dashboards), not for fronting a validator's beacon node. If you need a validator-safe Beacon API load balancer, see Vero.
- Go 1.26+
- At least one reachable Beacon API upstream (
http://.../eth/v1/...)
Copy the example and tailor upstream URLs:
cp ebeacon.example.yaml ebeacon.yamlOr start with a minimal config:
logLevel: info
server:
host: "0.0.0.0"
port: 5555
maxTimeout: 60s
networks:
- id: mainnet
upstreams:
- id: lighthouse
url: "http://127.0.0.1:5052"
- id: prysm
url: "http://127.0.0.1:3500"
routing:
loadBalancing: score
stickySession: true
cache:
enabled: true
maxSize: 4096go build -o ebeacon .
./ebeacon -config ebeacon.yamlThe proxy listens on server.host:server.port (default 0.0.0.0:5555).
Multi-network mode:
curl "http://localhost:5555/mainnet/eth/v1/node/version"If exactly one network is configured, prefix-free routes also work:
curl "http://localhost:5555/eth/v1/node/version"- Global health summary:
GET /healthz - Per-network health summary:
GET /mainnet/healthz - Synthetic beacon node health:
GET /mainnet/eth/v1/node/health - Prometheus metrics:
GET /metrics(ifmetrics.enabled: true) - Web UI:
GET /webui/(ifui.enabled: true) - Web UI API:
/webui/api/health,/webui/api/upstreams,/webui/api/cache,/webui/api/cache/entries,/webui/api/sessions,/webui/api/forks
The dashboard includes a cache entries table for browsing recent cached responses, previewing cached bodies on demand, and deleting a specific entry by key. The same delete operation is available over the protected API with DELETE /webui/api/cache/entries?network=<id>&key=<cache-key>.
When you use client-route prefixes such as /mainnet/lighthouse/eth/v1/node/health, eBeacon scopes the synthetic health response to that selected upstream subset.
Build locally:
docker build -t ebeacon .
docker run -p 5555:5555 -v $(pwd)/ebeacon.yaml:/app/ebeacon.yaml ebeaconOr pull a published release from GHCR (image names must be lowercase):
docker pull ghcr.io/mysticryuujin/ebeacon:latest
docker run -p 5555:5555 -v $(pwd)/ebeacon.yaml:/app/ebeacon.yaml ghcr.io/mysticryuujin/ebeacon:latest