Quick Start (Docker)
Get the Optimum Gateway running with Docker.
Prerequisites: Requirements and Network Requirements. You also need an API key — see Generate your API key below.
Hardware Requirements
Minimum: 2+ vCPUs, 512MB RAM, 500MB+ disk
Recommended: 4+ vCPUs
Generate your API key
Every gateway authenticates with an API key. The key binds your gateway's identity, chain, operator, and validator scope — everything the gateway needs comes from this key, so there is no per-network YAML to edit.
Access is invite-only. You cannot self-register. The Optimum team must onboard you first. Anyone not invited cannot create an account or generate a key.
- Get invited. The Optimum team adds you as an operator. You receive a "Welcome to Optimum" email invite to the Partner Console.
- Sign in. Open the console and sign in with the same email the invite was sent to, using your Google or Microsoft account — no password.
- Open API Keys. In the sidebar go to API Keys, then select the GATEWAY tab.
Generate one key
- Generate a key. Click GENERATE KEY and fill in:
- Type — choose Partner (this fixes the gateway's publish/subscribe role on mump2p and cannot be changed after creation).
- Gateway Details — pick from the dropdowns where available: Region, Consensus Client, Hosting Provider, DVT. These label the gateway in monitoring.
- Copy the key. The key (format
ogw_live_...) is shown only once. Copy and store it securely. If you lose it, generate a new one and revoke the old.
Bulk generate many keys
Use BULK GENERATE when you need many gateway keys at once (for example a large fleet rollout). Each key is still one per gateway — bulk create saves clicking GENERATE KEY repeatedly.
- Open API Keys. Same as above: sidebar API Keys -> GATEWAY tab.
- Start bulk generate. Click BULK GENERATE.
- Choose how many. Enter the number of keys to create. Your operator quota is shown in the dialog (for example
0 of 1000 used). - Gateway details (optional). Region, Consensus Client, Hosting Provider, and DVT apply to every key in the batch — the same dropdowns as single-key generation. Keys are auto-named; you do not enter a label per key.
- Download your keys. When creation finishes, download the batch as CSV or JSON. Raw keys (
ogw_live_...) are shown only once — store the file securely before closing the dialog. Keep the browser tab open until the download completes. - Deploy one key per host. Map each key to a gateway instance and set
OPT_API_KEYon that host. Do not reuse a key across gateways.
All-or-nothing. If any key in a batch fails to create, the whole batch is rolled back — none of the keys are kept. Fix the issue (for example quota) and try again.
One API key per gateway. Each gateway instance needs its own key. Do not share a key across gateways — the gateway registers a single identity per key, and reuse causes registration conflicts. If you run multiple gateways (e.g. Hoodi + Mainnet, or several hosts), generate a separate key for each — use BULK GENERATE for large rollouts.
The gateway exchanges this key on startup at auth.getoptimum.io/api/v1/auth/token for a short-lived JWT that carries your gateway_id, chain, and validator scope.
Installation
docker pull getoptimum/gateway:v1.0.2Configuration
Create config/app_conf.yml:
log_level: info
gateway_cluster_id: optimum_ethereum_hoodi_v0_1 # assigned by Optimum during onboarding
agent_lib_p2p_port: 33212
agent_opt_p2p_port: 43213
telemetry_enable: true
telemetry_port: 48123
identity_libp2p_dir: /tmp/libp2p
identity_optp2p_dir: /tmp/optp2pSet your API key via the environment, not YAML. Pass it as
OPT_API_KEYso it never lives in a config file or image layer. Yourgateway_id,chain, and validator scope are all derived from this key — do not set them in YAML.
export OPT_API_KEY=ogw_live_xxxRun
mkdir -p config data/libp2p data/mump2p
docker run --name optimum-gateway --rm \
-p 33212:33212/tcp \
-p 127.0.0.1:48123:48123/tcp \
-e OPT_API_KEY=$OPT_API_KEY \
-v $(pwd)/config:/app/config \
-v $(pwd)/data/libp2p:/tmp/libp2p \
-v $(pwd)/data/mump2p:/tmp/optp2p \
getoptimum/gateway:v1.0.2 \
-config=/app/config/app_conf.ymlPersist the identity volumes (
/tmp/libp2p,/tmp/optp2p) across restarts — otherwise the gateway's peer ID changes on every run and your CL client config breaks.
Verify
Health check:
curl http://localhost:48123/health{
"status": "healthy",
"gateway_id": "optimum-dev-hoodi-kubernetes-validator-lighthouse",
"version": "v1.0.2",
"commit_hash": "a0b2bc1",
"uptime_seconds": 1639,
"checks": {
"cl_peers": {"status": "ok", "value": 1},
"mump2p_peers": {"status": "ok", "value": 13},
"subscribed_topics": {"status": "ok", "value": 65},
"last_block_age_sec": {"status": "ok", "value": 1},
"cl_health": {"status": "ok"},
"mump2p_health": {"status": "ok"}
}
}For a lightweight liveness probe (process + HTTP up), use the root endpoint:
curl http://localhost:48123/{"status":"ok"}Metrics with your gateway_id:
curl http://localhost:48123/metrics | grep gateway_idmump2p_gateway_app_build_info{commit="a0b2bc1",gateway_id="your-gateway-id",paired_with="partner",...} 1
mump2p_gateway_mump2p_peers{gateway_id="your-gateway-id"} 13
...Startup logs (fork digest, topics):
docker logs optimum-gateway{"msg":"initialized fork digest from chain default","fork_digest":"c6ecb76c","chain":"hoodi"}
{"msg":"fork digest updated from bootstrap","fork_digest":"c6ecb76c"}
{"msg":"subscribed to topic","topic":"/eth2/c6ecb76c/beacon_block/ssz_snappy"}
{"msg":"subscribed to topic","topic":"/eth2/c6ecb76c/beacon_attestation_0/ssz_snappy"}
...Note: "Failed to connect to bootstrap" during startup is normal. See Troubleshooting.
Connect CL Client
Get gateway peer info:
curl -s http://localhost:48123/api/v1/self_infoUse libp2p.multiaddrs[0] (or another reachable multiaddr) for IP and peer_id for peer ID.
Recommended CL versions: Use Prysm v7.1.4 or later. For Teku use v26.4.0+. See Troubleshooting for client-specific PeerDAS flags.
Prysm
./beacon-chain \
--peer=/ip4/YOUR_GATEWAY_IP/tcp/33212/p2p/YOUR_GATEWAY_PEER_ID \
...Teku
teku \
--p2p-direct-peers=/ip4/YOUR_GATEWAY_IP/tcp/33212/p2p/YOUR_GATEWAY_PEER_ID \
--p2p-static-peers=/ip4/YOUR_GATEWAY_IP/tcp/33212/p2p/YOUR_GATEWAY_PEER_ID \
...Use --p2p-direct-peers (not just --p2p-static-peers) — static peers can be pruned. See Troubleshooting - Teku PeerDAS for details.
Lighthouse
Add your Lighthouse node as a direct peer in the gateway config so the gateway auto-reconnects after restarts:
direct_cl_peers:
- /ip4/YOUR_LIGHTHOUSE_IP/tcp/9000/p2p/YOUR_LIGHTHOUSE_PEER_IDSee Troubleshooting - Lighthouse v8.x for additional required flags.
Nimbus
Point Nimbus at the gateway (multiaddr or ENR; multiaddr is typical):
nimbus_beacon_node \
--direct-peer=/ip4/YOUR_GATEWAY_IP/tcp/33212/p2p/YOUR_GATEWAY_PEER_ID \
--netkey-file=/data/netkey \
...Add your Nimbus node in the gateway config so the gateway reconnects after restarts:
direct_cl_peers:
- /ip4/YOUR_NIMBUS_IP/tcp/YOUR_NIMBUS_P2P_PORT/p2p/YOUR_NIMBUS_PEER_IDUse a stable --netkey-file (not random) — Nimbus requires it for privileged direct peers. Nimbus drop/reconnect cycles during warmup are normal; see Troubleshooting - Nimbus for verification and expected behavior.
Lodestar
Lodestar is supported. Point it at the gateway as a trusted/direct peer and add the Lodestar node to the gateway's direct_cl_peers so the gateway re-dials after restarts.
Next Steps
- Configuration - Ports, direct peers, advanced settings
- Troubleshooting - Gateway diagnosis and common issues
- Metrics - Gateway and mesh metrics

