HOP: Setup Guide
HOP is a Docker Compose bundle for running the Optimum Gateway on Hoodi with optional local EL/CL clients and a pre-wired Prometheus + Grafana stack. Use it to try the gateway, connect a consensus client, and inspect metrics locally.
Repository: https://github.com/getoptimum/optimum-hop
The gateway bridges your Ethereum consensus layer (CL) client to the mump2p network. Peer discovery and fork digest are handled automatically on startup (no separate proxy configuration in app_conf.yml).
Prerequisites
- Docker and Docker Compose
- curl and jq (used by
make init) - Ports 33211, 33212, 43213, 48123, 9090, 3000 free on the host
Hardware (same order of magnitude as the gateway quick start): minimum about 1 vCPU, 256MB RAM, 200MB disk; more if you run a full EL/CL stack.
Repository layout
optimum-hop/
├── integration/
│ ├── ethereum/ # Compose + Makefile (your working directory)
│ │ ├── docker-compose.yml
│ │ ├── Makefile
│ │ ├── .env.example
│ │ ├── config/
│ │ │ └── sample.app_conf.yml
│ │ └── prysm.sh
│ ├── grafana/
│ │ ├── prometheus/ # Scrape config + file_sd targets
│ │ ├── grafana-provisioning/
│ │ └── grafana-dashboards/ # Partner dashboard (JSON)
│ └── README.md
└── docs/
└── index.md # This pageQuick start
cd integration/ethereum
make initmake init:
- Creates
hop-hoodi/data dirs and EL↔CL jwt.hex - Creates
.envfrom.env.exampleandconfig/app_conf.ymlfromsample.app_conf.ymlif missing - Starts the gateway and writes GATEWAY_PEER, ADDR, and PEER_ID into
.env(for CL clients to peer with the gateway on the Docker network)
Then start either lite (gateway + monitoring only) or full (add Geth/Prysm or another supported pair):
make lite # gateway + Prometheus + Grafana (no EL/CL)
make run # Geth + Prysm + gateway + monitoringGateway configuration
Edit integration/ethereum/config/app_conf.yml (seeded from sample.app_conf.yml). Important fields for v0.0.1-rc11:
gateway_cluster_id: optimum_hoodi_v0_3
gateway_id: your_unique_gateway_id # e.g. yourorg-region-hoodi-01
eth_topics_subscribe:
- beacon_blockOnly **beacon_block** is supported in rc11; attestation subnets are planned for a later release. Identity paths in the bundled sample use /tmp/libp2p and /tmp/mump2p with matching volume mounts in Compose.
Makefile commands
| Command | Description |
|---|---|
make help | List targets |
make init | Init dirs, JWT, gateway peer discovery -> .env |
make lite | Gateway + Prometheus + Grafana |
make run | Geth + Prysm + gateway + monitoring |
make run_teku | Nethermind + Teku + gateway + monitoring |
make run_lighthouse | Nethermind + Lighthouse + gateway + monitoring |
make run_prysm | Nethermind + Prysm + gateway + monitoring |
make stop | docker compose down |
make reset | Remove EL/CL data dirs under hop-hoodi/ and run init again |
make clean | Stops stack and aggressively removes local compose data (see Makefile) |
Docker Compose (same profiles as the Makefile)
From integration/ethereum/:
docker compose --profile lite up -d
docker compose --profile full --profile geth --profile prysm up -d
docker compose --profile full --profile nethermind --profile teku up -d
docker compose --profile full --profile nethermind --profile lighthouse up -dUse only one EL profile (geth or nethermind) and one CL profile at a time.
URLs and checks
| Service | URL |
|---|---|
| Grafana | http://localhost:3000 (default admin / admin) |
| Prometheus | http://localhost:9090 |
| Gateway API / metrics | http://localhost:48123 |
Prometheus scrapes the gateway on the Docker network; Grafana opens with a partner dashboard pre-loaded for gateway metrics.
curl -s http://localhost:48123/api/v1/version
curl -s http://localhost:48123/api/v1/self_info | jq .
curl -s http://localhost:48123/metrics | grep optp2p_gatewayWith a CL container connected, you should see CL peers ≥ 1 in the dashboard / self info and libp2p traffic on subscribed topics.
Persistent data
**hop-hoodi/** — JWT, EL/CL datadirs (depending on profile)- Named volumes —
prometheus-data,grafana-data(metrics and Grafana state)
Troubleshooting
- Gateway not starting or restarting:
docker logs optimum-gatewayand confirmconfig/app_conf.ymlexists (runmake initonce so it is created from the sample if needed). - CL peers stay at 0 (full stack): wait until the beacon client finishes checkpoint sync, then check
docker logs prysm-beacon(or your CL container). Ensure you ranmake initso.envcontains a valid GATEWAY_PEER for the gateway’s libp2p address inside Docker. - Port already in use (9090, 3000, 48123, …):
make stop, stop whatever else is bound to that port, or rundocker system prune -fif you have leftover containers, then start again. - Services show unhealthy: often normal for the first few minutes while Geth/Prysm (or another EL/CL pair) start; use
docker compose psanddocker compose logs <service-name>. - Start over with chain data:
make resetstops, wipes the usualhop-hoodi/EL/CL dirs, and re-runsinit.
Further reading
- Optimum Gateway documentation (latest) — configuration, networking, and release notes aligned with the gateway image you run here.
- Geth
- Prysm
- Teku
- Lighthouse
- Prometheus · Grafana

