Compare commits

..
1 Commits
Author SHA1 Message Date
claude defc60469b arc: add snapshot-init wrapper for testnet pruned bootstrap
Shell entrypoint wraps arc-snapshots so compose can optionally override EL/CL
snapshot URLs via ARC_SNAPSHOT_* env vars while defaulting to latest from
snapshots.arc.network on fresh volumes.
2026-07-04 05:51:19 +00:00
222 changed files with 288 additions and 18229 deletions
@@ -62,7 +62,6 @@ services:
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
@@ -63,7 +63,6 @@ services:
- --http.port=8545
- --http.vhosts=*
- --init.prune=minimal
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
@@ -62,7 +62,6 @@ services:
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
@@ -63,7 +63,6 @@ services:
- --http.port=8545
- --http.vhosts=*
- --init.prune=full
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
@@ -62,7 +62,6 @@ services:
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
+12
View File
@@ -0,0 +1,12 @@
# One-shot Arc snapshot downloader for compose init containers.
# Wraps arc-snapshots with a shell entrypoint so operators can optionally
# override EL/CL snapshot URLs via environment variables.
ARG ARC_EXECUTION_IMAGE=docker.cloudsmith.io/circle/arc-network/arc-execution:0.7.2
FROM ${ARC_EXECUTION_IMAGE} AS arc-bin
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates libssl3 zlib1g \
&& rm -rf /var/lib/apt/lists/*
COPY --from=arc-bin /usr/local/bin/arc-snapshots /usr/local/bin/arc-snapshots
COPY scripts/snapshot-init.sh /usr/local/bin/snapshot-init.sh
RUN chmod +x /usr/local/bin/snapshot-init.sh
ENTRYPOINT ["/usr/local/bin/snapshot-init.sh"]
+2 -2
View File
@@ -128,11 +128,11 @@ services:
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-persistence-backpressure-threshold=50
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --follow.endpoint=https://arc.drpc.org,wss=arc.drpc.org
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
+2 -2
View File
@@ -129,11 +129,11 @@ services:
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-persistence-backpressure-threshold=50
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --follow.endpoint=https://arc.drpc.org,wss=arc.drpc.org
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
+3 -3
View File
@@ -128,12 +128,12 @@ services:
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-persistence-backpressure-threshold=50
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --follow.endpoint=https://rpc.drpc.testnet.arc.network,wss=rpc.drpc.testnet.arc.network
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --follow.endpoint=https://rpc.drpc.testnet.arc.network,wss=rpc.drpc.testnet.arc.network
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
+3 -3
View File
@@ -129,12 +129,12 @@ services:
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-persistence-backpressure-threshold=50
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --follow.endpoint=https://rpc.drpc.testnet.arc.network,wss=rpc.drpc.testnet.arc.network
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --follow.endpoint=https://rpc.drpc.testnet.arc.network,wss=rpc.drpc.testnet.arc.network
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
+23
View File
@@ -0,0 +1,23 @@
#!/bin/sh
set -eu
CHAIN="${ARC_SNAPSHOT_CHAIN:-arc-testnet}"
EXEC_PATH="${ARC_SNAPSHOT_EXECUTION_PATH:-/data/execution}"
CONS_PATH="${ARC_SNAPSHOT_CONSENSUS_PATH:-/data/consensus}"
if [ -n "${ARC_SNAPSHOT_EXECUTION_URL:-}" ] && [ -n "${ARC_SNAPSHOT_CONSENSUS_URL:-}" ]; then
exec /usr/local/bin/arc-snapshots download \
--chain="${CHAIN}" \
--execution-path="${EXEC_PATH}" \
--consensus-path="${CONS_PATH}" \
--execution-url="${ARC_SNAPSHOT_EXECUTION_URL}" \
--consensus-url="${ARC_SNAPSHOT_CONSENSUS_URL}"
elif [ -n "${ARC_SNAPSHOT_EXECUTION_URL:-}" ] || [ -n "${ARC_SNAPSHOT_CONSENSUS_URL:-}" ]; then
echo "Both ARC_SNAPSHOT_EXECUTION_URL and ARC_SNAPSHOT_CONSENSUS_URL must be set together" >&2
exit 1
else
exec /usr/local/bin/arc-snapshots download \
--chain="${CHAIN}" \
--execution-path="${EXEC_PATH}" \
--consensus-path="${CONS_PATH}"
fi
+82 -1453
View File
File diff suppressed because it is too large Load Diff
+6 -16
View File
@@ -1,21 +1,11 @@
# cronosd — public GitHub release tarball (ghcr.io/crypto-org-chain/cronos returns 403
# on anonymous pulls). Mirror zero-gravity/zerog.Dockerfile: alpine base + tarball extract.
ARG CRONOS_CRONOS_VERSION=v1.7.8
FROM alpine:3.21
RUN apk add --no-cache ca-certificates curl jq
ARG CRONOS_CRONOS_IMAGE
ARG CRONOS_CRONOS_VERSION
RUN _ver="${CRONOS_CRONOS_VERSION#v}" && \
curl -fsSL "https://github.com/crypto-org-chain/cronos/releases/download/${CRONOS_CRONOS_VERSION}/cronos_${_ver}_Linux_x86_64.tar.gz" \
-o /tmp/cronos.tar.gz && \
tar -xzf /tmp/cronos.tar.gz -C /tmp && \
install -m 755 /tmp/bin/cronosd /usr/local/bin/cronosd && \
rm -rf /tmp/cronos.tar.gz /tmp/bin
FROM ${CRONOS_CRONOS_IMAGE}:${CRONOS_CRONOS_VERSION}
# Layer the shared CometBFT bootstrap lib + the chain init.sh onto the upstream
# cronos binary image (alpine-based, has sh+apk; runs nonroot by default — the compose
# sets user: root so init.sh can apk-add curl and write the /root home).
USER root
COPY ./scripts/cometbft-common.sh /usr/local/bin/cometbft-common.sh
COPY ./scripts/init.sh /usr/local/bin/init.sh
RUN chmod +x /usr/local/bin/init.sh /usr/local/bin/cometbft-common.sh
ENTRYPOINT ["init.sh"]
@@ -35,6 +35,7 @@ services:
dockerfile: cometbft.Dockerfile
args:
CRONOS_CRONOS_VERSION: ${CRONOS_MAINNET_CRONOS_VERSION:-v1.7.8}
CRONOS_CRONOS_IMAGE: ${CRONOS_MAINNET_CRONOS_IMAGE:-ghcr.io/crypto-org-chain/cronos}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -69,14 +70,9 @@ services:
- JSON_RPC_FEEHISTORY_CAP=100
- JSON_RPC_HTTP_TIMEOUT=30s
- JSON_RPC_LOGS_CAP=10000
- MIN_GAS=5000000000000basecro
- MONIKER=d${DOMAIN:-local}
- P2P_PORT=10521
- PRUNING=custom
- PRUNING_INTERVAL=19
- PRUNING_KEEP_RECENT=100
- SEEDS=0d5cf1394a1cfde28dc8f023567222abc0f47534@seed-0.cronos.com:26656,3032073adc06d710dd512240281637c1bd0c8a7b@seed-1.cronos.com:26656,04f43116b4c6c70054d9c2b7485383df5b1ed1da@seed-2.cronos.com:26656,337377dcda43d79c537d2c4d93ad3b698ce9452e@bd-cronos-mainnet-seed-node-01.bdnodes.net:26656
- STATESYNC_RPC=https://cronos-rpc.publicnode.com:443
restart: unless-stopped
stop_grace_period: 5m
networks:
+5 -11
View File
@@ -11,11 +11,6 @@ CHAINID="${CHAINID:-cronosmainnet_25-1}"
API="${API:-eth,txpool,net,debug,web3}"
GENESIS_URL="${GENESIS_URL:-https://raw.githubusercontent.com/crypto-org-chain/cronos-mainnet/master/cronosmainnet_25-1/genesis.json}"
SEEDS="${SEEDS:-0d5cf1394a1cfde28dc8f023567222abc0f47534@seed-0.cronos.com:26656,3032073adc06d710dd512240281637c1bd0c8a7b@seed-1.cronos.com:26656,04f43116b4c6c70054d9c2b7485383df5b1ed1da@seed-2.cronos.com:26656,337377dcda43d79c537d2c4d93ad3b698ce9452e@bd-cronos-mainnet-seed-node-01.bdnodes.net:26656}"
STATESYNC_RPC="${STATESYNC_RPC:-https://cronos-rpc.publicnode.com:443}"
MIN_GAS="${MIN_GAS:-5000000000000basecro}"
PRUNING="${PRUNING:-custom}"
PRUNING_KEEP_RECENT="${PRUNING_KEEP_RECENT:-100}"
PRUNING_INTERVAL="${PRUNING_INTERVAL:-19}"
JSON_RPC_ENABLE="${JSON_RPC_ENABLE:-true}"
JSON_RPC_ENABLE_INDEXER="${JSON_RPC_ENABLE_INDEXER:-true}"
JSON_RPC_FEEHISTORY_CAP="${JSON_RPC_FEEHISTORY_CAP:-100}"
@@ -30,14 +25,13 @@ if cronosd init "${MONIKER:-rpc-node}" --chain-id "$CHAINID" --home "$HOME_DIR"
ct_log "fresh init; fetching genesis"
ct_fetch "$GENESIS_URL" "$CONFIG_DIR/genesis.json" required
ct_localize_home "$CONFIG_DIR"
ct_set_min_gas_prices "$CONFIG_DIR/app.toml" "$MIN_GAS"
else
ct_log "already initialized, continuing"
fi
sed -i -e "s/^pruning *=.*/pruning = \"$PRUNING\"/" "$CONFIG_DIR/app.toml"
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$PRUNING_KEEP_RECENT\"/" "$CONFIG_DIR/app.toml"
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$PRUNING_INTERVAL\"/" "$CONFIG_DIR/app.toml"
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" "$CONFIG_DIR/app.toml"
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" "$CONFIG_DIR/app.toml"
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" "$CONFIG_DIR/app.toml"
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" "$CONFIG_DIR/config.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^address = .*|address = \"0.0.0.0:8545\"|}" "$CONFIG_DIR/app.toml"
@@ -53,7 +47,7 @@ sed -i "/^\[evm\]/,/^\[/{s|^max-tx-gas-wanted = .*|max-tx-gas-wanted = $EVM_MAX_
ct_patch_p2p "$CONFIG_DIR/config.toml" "$IP" "${P2P_PORT:-10521}"
ct_merge_seeds "$CONFIG_DIR/config.toml" "$SEEDS"
ct_configure_statesync "$CONFIG_DIR/config.toml" "$STATESYNC_RPC" 2000
ct_configure_statesync "$CONFIG_DIR/config.toml" "https://rpc-cronos.crypto.org:443,https://cronos-rpc.publicnode.com:443" 2000
ct_set_moniker "$CONFIG_DIR/config.toml" "${MONIKER:-rpc-node}"
exec cronosd start --chain-id "$CHAINID" --minimum-gas-prices "$MIN_GAS" "$@"
exec cronosd start --chain-id "$CHAINID" "$@"
+2 -2
View File
@@ -1,10 +1,10 @@
# digibyted — official release tarball (no Docker image upstream).
ARG VERSION=9.26.4
ARG VERSION=9.26.3
FROM debian:stable-slim
ARG VERSION
ARG SHA256=523da7ac9ee0f1bcb38ff75da6f01997b9491a9eee1e2b0ce3c90f60b2aaa9b3
ARG SHA256=51465a7a7409dc9a734e463b8fd95fb9773033753d79504de946ab2a0aa0991c
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
@@ -34,7 +34,7 @@ services:
context: ./digibyte
dockerfile: digibyted.Dockerfile
args:
VERSION: ${DIGIBYTE_MAINNET_DIGIBYTED_VERSION:-9.26.4}
VERSION: ${DIGIBYTE_MAINNET_DIGIBYTED_VERSION:-9.26.3}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
lens-mainnet-archive:
image: ${LENS_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${LENS_MAINNET_EXTERNAL_NODE_VERSION:-v31.1.0}
image: ${LENS_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${LENS_MAINNET_EXTERNAL_NODE_VERSION:-v31.0.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
lens-mainnet:
image: ${LENS_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${LENS_MAINNET_EXTERNAL_NODE_VERSION:-v31.1.0}
image: ${LENS_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${LENS_MAINNET_EXTERNAL_NODE_VERSION:-v31.0.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -1,203 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/base-mainnet-op-erigon-archive-trace--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/base-mainnet-op-erigon \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
base-mainnet-op-erigon:
image: ${BASE_ERIGON_IMAGE:-testinprod/op-erigon}:${BASE_MAINNET_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
ports:
- 13092:13092
- 13092:13092/udp
- 33092:33092
- 33092:33092/udp
- 38092:38092
- 38092:38092/udp
expose:
- 8545
- 6060
- 8551
entrypoint: [erigon]
command:
- --chain=base-mainnet
- --datadir=/root/.local/share/erigon
- --db.size.limit=8TB
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --p2p.allowed-ports=33092
- --p2p.allowed-ports=38092
- --port=13092
- --rollup.sequencerhttp=https://mainnet-sequencer.base.org
- --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000
- --http
- --http.addr=0.0.0.0
- --http.api=eth,erigon,web3,net,debug,trace,txpool,admin,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BASE_MAINNET_OP_ERIGON_ARCHIVE_TRACE_DATA:-base-mainnet-op-erigon-archive-trace}:/root/.local/share/erigon
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.base-mainnet-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/base-mainnet-op-erigon
- traefik.http.services.base-mainnet-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/base-mainnet-op-erigon`) || Path(`/base-mainnet-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.base-mainnet-op-erigon-archive-trace.rule=Path(`/base-mainnet-op-erigon`) || Path(`/base-mainnet-op-erigon/`)}
- traefik.http.routers.base-mainnet-op-erigon-archive-trace.middlewares=base-mainnet-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
base-mainnet-op-erigon-node:
image: ${BASE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BASE_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 18092:18092
- 18092:18092/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BASE_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=8453
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://base-mainnet-op-erigon:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=18092
- KONA_NODE_P2P_LISTEN_UDP_PORT=18092
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
base-mainnet-op-erigon:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.base-mainnet-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/base-mainnet-op-erigon/node
- traefik.http.services.base-mainnet-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/base-mainnet-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.base-mainnet-op-erigon-archive-trace-node.rule=PathPrefix(`/base-mainnet-op-erigon/node`)}
- traefik.http.routers.base-mainnet-op-erigon-archive-trace-node.middlewares=base-mainnet-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes:
base-mainnet-op-erigon-archive-trace:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: base
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
# non standard erigon only
- name: eth_getBlockReceipts
- name: eth_protocolVersion
- name: eth_callMany
- name: eth_callBundle
- name: debug_accountAt
- name: debug_traceCallMany
- name: erigon_getHeaderByHash
- name: erigon_getBlockReceiptsByBlockHash
- name: erigon_getHeaderByNumber
- name: erigon_getLogsByHash
- name: erigon_forks
- name: erigon_getBlockByTimestamp
- name: erigon_BlockNumber
- name: erigon_getLatestLogs
...
@@ -1,203 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/base-sepolia-op-erigon-archive-trace--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/base-sepolia-op-erigon \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
base-sepolia-op-erigon:
image: ${BASE_ERIGON_IMAGE:-testinprod/op-erigon}:${BASE_SEPOLIA_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
ports:
- 13487:13487
- 13487:13487/udp
- 33487:33487
- 33487:33487/udp
- 38487:38487
- 38487:38487/udp
expose:
- 8545
- 6060
- 8551
entrypoint: [erigon]
command:
- --chain=base-sepolia
- --datadir=/root/.local/share/erigon
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --p2p.allowed-ports=33487
- --p2p.allowed-ports=38487
- --port=13487
- --rollup.sequencerhttp=https://sepolia-sequencer.base.org
- --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000
- --http
- --http.addr=0.0.0.0
- --http.api=eth,erigon,web3,net,debug,trace,txpool,admin,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BASE_SEPOLIA_OP_ERIGON_ARCHIVE_TRACE_DATA:-base-sepolia-op-erigon-archive-trace}:/root/.local/share/erigon
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.base-sepolia-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/base-sepolia-op-erigon
- traefik.http.services.base-sepolia-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/base-sepolia-op-erigon`) || Path(`/base-sepolia-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.base-sepolia-op-erigon-archive-trace.rule=Path(`/base-sepolia-op-erigon`) || Path(`/base-sepolia-op-erigon/`)}
- traefik.http.routers.base-sepolia-op-erigon-archive-trace.middlewares=base-sepolia-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
base-sepolia-op-erigon-node:
image: ${BASE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BASE_SEPOLIA_KONA_VERSION:-v1.6.1}
ports:
- 18487:18487
- 18487:18487/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BASE_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=84532
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://base-sepolia-op-erigon:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=18487
- KONA_NODE_P2P_LISTEN_UDP_PORT=18487
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
base-sepolia-op-erigon:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.base-sepolia-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/base-sepolia-op-erigon/node
- traefik.http.services.base-sepolia-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/base-sepolia-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.base-sepolia-op-erigon-archive-trace-node.rule=PathPrefix(`/base-sepolia-op-erigon/node`)}
- traefik.http.routers.base-sepolia-op-erigon-archive-trace-node.middlewares=base-sepolia-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes:
base-sepolia-op-erigon-archive-trace:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: base-sepolia
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
# non standard erigon only
- name: eth_getBlockReceipts
- name: eth_protocolVersion
- name: eth_callMany
- name: eth_callBundle
- name: debug_accountAt
- name: debug_traceCallMany
- name: erigon_getHeaderByHash
- name: erigon_getBlockReceiptsByBlockHash
- name: erigon_getHeaderByNumber
- name: erigon_getLogsByHash
- name: erigon_forks
- name: erigon_getBlockByTimestamp
- name: erigon_BlockNumber
- name: erigon_getLatestLogs
...
@@ -108,7 +108,7 @@ services:
shm_size: 2gb
bob-mainnet-op-erigon-node:
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.1}
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 16071:16071
- 16071:16071/udp
@@ -1,228 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/hashkeychain-mainnet-op-erigon-archive-trace--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/hashkeychain-mainnet-op-erigon \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
hashkeychain-mainnet-op-erigon-init:
image: alpine:3.21
user: root
entrypoint: [/bin/sh, -c]
command:
- |
apk add --no-cache curl wget
mkdir -p /config
[ -f /config/genesis.json ] || curl -fsSL -o /config/genesis.json "https://hashkeychain.s3.ap-southeast-1.amazonaws.com/mainnet/genesis.json"
restart: no
networks:
- chains
volumes:
- ${HASHKEYCHAIN_MAINNET_OP_ERIGON_ARCHIVE_TRACE_CONFIG:-hashkeychain-mainnet-op-erigon-archive-trace_config}:/config
logging: *logging-defaults
hashkeychain-mainnet-op-erigon:
image: ${HASHKEYCHAIN_ERIGON_IMAGE:-testinprod/op-erigon}:${HASHKEYCHAIN_MAINNET_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
ports:
- 11378:11378
- 11378:11378/udp
- 31378:31378
- 31378:31378/udp
- 36378:36378
- 36378:36378/udp
expose:
- 8545
- 6060
- 8551
entrypoint: /bin/sh -c '[ ! -d /root/.local/share/erigon/chaindata/mdbx.dat ] && erigon init --datadir /root/.local/share/erigon /config/genesis.json; exec erigon "$@"' --
command:
- --bootnodes=enode://5ecd6d2054a58fa00729b73396044a35e6aceeafe58373d2f26b3f50a3934175fb56f8efa538381430889771613beaabf1177805910bbd34e4b4840320914690@mainnet-bootnodes.hsk.xyz:30615,enode://bd244da2a066e15f82d4bfb7f2732c5b5bac44cefb36cefef01a4c0e87e72b42004d012c9a294b8402ebf67491777f280ffbcc93a71157921d6d358b19ddac67@mainnet-bootnodes.hsk.xyz:30616,enode://a5bba6459ac3a075a4a8941478a4ef8d167460191c89632004b17e4b2d7beea52cdc1a2d376f35e996ad44ccac8db25f900700aad6991d015bdc4db072832063@mainnet-bootnodes.hsk.xyz:30617
- --bootnodes=enode://5ecd6d2054a58fa00729b73396044a35e6aceeafe58373d2f26b3f50a3934175fb56f8efa538381430889771613beaabf1177805910bbd34e4b4840320914690@mainnet-bootnodes.hsk.xyz:30615,enode://bd244da2a066e15f82d4bfb7f2732c5b5bac44cefb36cefef01a4c0e87e72b42004d012c9a294b8402ebf67491777f280ffbcc93a71157921d6d358b19ddac67@mainnet-bootnodes.hsk.xyz:30616,enode://a5bba6459ac3a075a4a8941478a4ef8d167460191c89632004b17e4b2d7beea52cdc1a2d376f35e996ad44ccac8db25f900700aad6991d015bdc4db072832063@mainnet-bootnodes.hsk.xyz:30617
- --datadir=/root/.local/share/erigon
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=177
- --p2p.allowed-ports=31378
- --p2p.allowed-ports=36378
- --port=11378
- --rollup.sequencerhttp=https://mainnet.hsk.xyz
- --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000
- --http
- --http.addr=0.0.0.0
- --http.api=eth,erigon,web3,net,debug,trace,txpool,admin,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
depends_on:
hashkeychain-mainnet-op-erigon-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${HASHKEYCHAIN_MAINNET_OP_ERIGON_ARCHIVE_TRACE_CONFIG:-hashkeychain-mainnet-op-erigon-archive-trace_config}:/config
- ${HASHKEYCHAIN_MAINNET_OP_ERIGON_ARCHIVE_TRACE_DATA:-hashkeychain-mainnet-op-erigon-archive-trace}:/root/.local/share/erigon
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-mainnet-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/hashkeychain-mainnet-op-erigon
- traefik.http.services.hashkeychain-mainnet-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/hashkeychain-mainnet-op-erigon`) || Path(`/hashkeychain-mainnet-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace.rule=Path(`/hashkeychain-mainnet-op-erigon`) || Path(`/hashkeychain-mainnet-op-erigon/`)}
- traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace.middlewares=hashkeychain-mainnet-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
hashkeychain-mainnet-op-erigon-node:
image: ${HASHKEYCHAIN_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${HASHKEYCHAIN_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 16378:16378
- 16378:16378/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${HASHKEYCHAIN_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=177
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://hashkeychain-mainnet-op-erigon:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=16378
- KONA_NODE_P2P_LISTEN_UDP_PORT=16378
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
hashkeychain-mainnet-op-erigon:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-mainnet-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/hashkeychain-mainnet-op-erigon/node
- traefik.http.services.hashkeychain-mainnet-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/hashkeychain-mainnet-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace-node.rule=PathPrefix(`/hashkeychain-mainnet-op-erigon/node`)}
- traefik.http.routers.hashkeychain-mainnet-op-erigon-archive-trace-node.middlewares=hashkeychain-mainnet-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes:
hashkeychain-mainnet-op-erigon-archive-trace:
hashkeychain-mainnet-op-erigon-archive-trace_config:
x-ephemeral-volumes:
- hashkeychain-mainnet-op-erigon-archive-trace_config
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: hashkey
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
# non standard erigon only
- name: eth_getBlockReceipts
- name: eth_protocolVersion
- name: eth_callMany
- name: eth_callBundle
- name: debug_accountAt
- name: debug_traceCallMany
- name: erigon_getHeaderByHash
- name: erigon_getBlockReceiptsByBlockHash
- name: erigon_getHeaderByNumber
- name: erigon_getLogsByHash
- name: erigon_forks
- name: erigon_getBlockByTimestamp
- name: erigon_BlockNumber
- name: erigon_getLatestLogs
...
@@ -143,7 +143,7 @@ services:
logging: *logging-defaults
hashkeychain-mainnet-op-erigon-node:
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_MAINNET_NODE_VERSION:-v1.19.1}
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 16378:16378
- 16378:16378/udp
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
ink-mainnet-op-erigon-node:
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_MAINNET_NODE_VERSION:-v1.19.1}
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 16990:16990
- 16990:16990/udp
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
ink-sepolia-op-erigon-node:
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 19826:19826
- 19826:19826/udp
@@ -109,7 +109,7 @@ services:
shm_size: 2gb
lisk-mainnet-op-erigon-node:
image: ${LISK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${LISK_MAINNET_NODE_VERSION:-v1.19.1}
image: ${LISK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${LISK_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 19831:19831
- 19831:19831/udp
@@ -1,202 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/metal-mainnet-op-erigon-archive-trace--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/metal-mainnet-op-erigon \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
metal-mainnet-op-erigon:
image: ${METAL_ERIGON_IMAGE:-testinprod/op-erigon}:${METAL_MAINNET_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
ports:
- 10543:10543
- 10543:10543/udp
- 30543:30543
- 30543:30543/udp
- 35543:35543
- 35543:35543/udp
expose:
- 8545
- 6060
- 8551
entrypoint: [erigon]
command:
- --chain=metal-mainnet
- --datadir=/root/.local/share/erigon
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --p2p.allowed-ports=30543
- --p2p.allowed-ports=35543
- --port=10543
- --rollup.sequencerhttp=https://rpc.metall2.com
- --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000
- --http
- --http.addr=0.0.0.0
- --http.api=eth,erigon,web3,net,debug,trace,txpool,admin,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${METAL_MAINNET_OP_ERIGON_ARCHIVE_TRACE_DATA:-metal-mainnet-op-erigon-archive-trace}:/root/.local/share/erigon
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.metal-mainnet-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/metal-mainnet-op-erigon
- traefik.http.services.metal-mainnet-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/metal-mainnet-op-erigon`) || Path(`/metal-mainnet-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.metal-mainnet-op-erigon-archive-trace.rule=Path(`/metal-mainnet-op-erigon`) || Path(`/metal-mainnet-op-erigon/`)}
- traefik.http.routers.metal-mainnet-op-erigon-archive-trace.middlewares=metal-mainnet-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
metal-mainnet-op-erigon-node:
image: ${METAL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${METAL_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 15543:15543
- 15543:15543/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${METAL_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=1750
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://metal-mainnet-op-erigon:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15543
- KONA_NODE_P2P_LISTEN_UDP_PORT=15543
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
metal-mainnet-op-erigon:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.metal-mainnet-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/metal-mainnet-op-erigon/node
- traefik.http.services.metal-mainnet-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/metal-mainnet-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.metal-mainnet-op-erigon-archive-trace-node.rule=PathPrefix(`/metal-mainnet-op-erigon/node`)}
- traefik.http.routers.metal-mainnet-op-erigon-archive-trace-node.middlewares=metal-mainnet-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes:
metal-mainnet-op-erigon-archive-trace:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: metall2
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
# non standard erigon only
- name: eth_getBlockReceipts
- name: eth_protocolVersion
- name: eth_callMany
- name: eth_callBundle
- name: debug_accountAt
- name: debug_traceCallMany
- name: erigon_getHeaderByHash
- name: erigon_getBlockReceiptsByBlockHash
- name: erigon_getHeaderByNumber
- name: erigon_getLogsByHash
- name: erigon_forks
- name: erigon_getBlockByTimestamp
- name: erigon_BlockNumber
- name: erigon_getLatestLogs
...
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
metal-mainnet-op-erigon-node:
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_MAINNET_NODE_VERSION:-v1.19.1}
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 15543:15543
- 15543:15543/udp
@@ -1,204 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/mode-mainnet-op-erigon-archive-trace--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/mode-mainnet-op-erigon \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
mode-mainnet-op-erigon:
image: ${MODE_ERIGON_IMAGE:-testinprod/op-erigon}:${MODE_MAINNET_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
ports:
- 12509:12509
- 12509:12509/udp
- 32509:32509
- 32509:32509/udp
- 37509:37509
- 37509:37509/udp
expose:
- 8545
- 6060
- 8551
entrypoint: /bin/sh -c '[ ! -d /root/.local/share/erigon/chaindata/mdbx.dat ] && erigon init --datadir /root/.local/share/erigon /config/genesis.json; exec erigon "$@"' --
command:
- --datadir=/root/.local/share/erigon
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=34443
- --p2p.allowed-ports=32509
- --p2p.allowed-ports=37509
- --port=12509
- --rollup.sequencerhttp=https://mainnet.mode.network
- --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000
- --http
- --http.addr=0.0.0.0
- --http.api=eth,erigon,web3,net,debug,trace,txpool,admin,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${MODE_MAINNET_OP_ERIGON_ARCHIVE_TRACE_DATA:-mode-mainnet-op-erigon-archive-trace}:/root/.local/share/erigon
- ./op/mode/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.mode-mainnet-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/mode-mainnet-op-erigon
- traefik.http.services.mode-mainnet-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/mode-mainnet-op-erigon`) || Path(`/mode-mainnet-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.mode-mainnet-op-erigon-archive-trace.rule=Path(`/mode-mainnet-op-erigon`) || Path(`/mode-mainnet-op-erigon/`)}
- traefik.http.routers.mode-mainnet-op-erigon-archive-trace.middlewares=mode-mainnet-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
mode-mainnet-op-erigon-node:
image: ${MODE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${MODE_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 17509:17509
- 17509:17509/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${MODE_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=34443
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://mode-mainnet-op-erigon:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=17509
- KONA_NODE_P2P_LISTEN_UDP_PORT=17509
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
mode-mainnet-op-erigon:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/mode/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.mode-mainnet-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/mode-mainnet-op-erigon/node
- traefik.http.services.mode-mainnet-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/mode-mainnet-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.mode-mainnet-op-erigon-archive-trace-node.rule=PathPrefix(`/mode-mainnet-op-erigon/node`)}
- traefik.http.routers.mode-mainnet-op-erigon-archive-trace-node.middlewares=mode-mainnet-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes:
mode-mainnet-op-erigon-archive-trace:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: mode
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
# non standard erigon only
- name: eth_getBlockReceipts
- name: eth_protocolVersion
- name: eth_callMany
- name: eth_callBundle
- name: debug_accountAt
- name: debug_traceCallMany
- name: erigon_getHeaderByHash
- name: erigon_getBlockReceiptsByBlockHash
- name: erigon_getHeaderByNumber
- name: erigon_getLogsByHash
- name: erigon_forks
- name: erigon_getBlockByTimestamp
- name: erigon_BlockNumber
- name: erigon_getLatestLogs
...
@@ -107,7 +107,7 @@ services:
shm_size: 2gb
mode-mainnet-op-erigon-node:
image: ${MODE_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${MODE_MAINNET_NODE_VERSION:-v1.19.1}
image: ${MODE_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${MODE_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 17509:17509
- 17509:17509/udp
@@ -1,203 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/mode-sepolia-op-erigon-archive-trace--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/mode-sepolia-op-erigon \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
mode-sepolia-op-erigon:
image: ${MODE_ERIGON_IMAGE:-testinprod/op-erigon}:${MODE_SEPOLIA_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
ports:
- 13212:13212
- 13212:13212/udp
- 33212:33212
- 33212:33212/udp
- 38212:38212
- 38212:38212/udp
expose:
- 8545
- 6060
- 8551
entrypoint: [erigon]
command:
- --chain=mode-sepolia
- --datadir=/root/.local/share/erigon
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --p2p.allowed-ports=33212
- --p2p.allowed-ports=38212
- --port=13212
- --rollup.sequencerhttp=https://sepolia.mode.network
- --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000
- --http
- --http.addr=0.0.0.0
- --http.api=eth,erigon,web3,net,debug,trace,txpool,admin,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${MODE_SEPOLIA_OP_ERIGON_ARCHIVE_TRACE_DATA:-mode-sepolia-op-erigon-archive-trace}:/root/.local/share/erigon
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.mode-sepolia-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/mode-sepolia-op-erigon
- traefik.http.services.mode-sepolia-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.mode-sepolia-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.mode-sepolia-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.mode-sepolia-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/mode-sepolia-op-erigon`) || Path(`/mode-sepolia-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.mode-sepolia-op-erigon-archive-trace.rule=Path(`/mode-sepolia-op-erigon`) || Path(`/mode-sepolia-op-erigon/`)}
- traefik.http.routers.mode-sepolia-op-erigon-archive-trace.middlewares=mode-sepolia-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
mode-sepolia-op-erigon-node:
image: ${MODE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${MODE_SEPOLIA_KONA_VERSION:-v1.6.1}
ports:
- 18212:18212
- 18212:18212/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${MODE_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=919
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://mode-sepolia-op-erigon:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=18212
- KONA_NODE_P2P_LISTEN_UDP_PORT=18212
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
mode-sepolia-op-erigon:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.mode-sepolia-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/mode-sepolia-op-erigon/node
- traefik.http.services.mode-sepolia-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.mode-sepolia-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.mode-sepolia-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.mode-sepolia-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/mode-sepolia-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.mode-sepolia-op-erigon-archive-trace-node.rule=PathPrefix(`/mode-sepolia-op-erigon/node`)}
- traefik.http.routers.mode-sepolia-op-erigon-archive-trace-node.middlewares=mode-sepolia-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes:
mode-sepolia-op-erigon-archive-trace:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: mode-testnet
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
# non standard erigon only
- name: eth_getBlockReceipts
- name: eth_protocolVersion
- name: eth_callMany
- name: eth_callBundle
- name: debug_accountAt
- name: debug_traceCallMany
- name: erigon_getHeaderByHash
- name: erigon_getBlockReceiptsByBlockHash
- name: erigon_getHeaderByNumber
- name: erigon_getLogsByHash
- name: erigon_forks
- name: erigon_getBlockByTimestamp
- name: erigon_BlockNumber
- name: erigon_getLatestLogs
...
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
mode-sepolia-op-erigon-node:
image: ${MODE_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${MODE_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${MODE_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${MODE_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 18212:18212
- 18212:18212/udp
@@ -109,7 +109,7 @@ services:
shm_size: 2gb
op-mainnet-op-erigon-node:
image: ${OP_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${OP_MAINNET_NODE_VERSION:-v1.19.1}
image: ${OP_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${OP_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 17509:17509
- 17509:17509/udp
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
op-sepolia-op-erigon-node:
image: ${OP_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${OP_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${OP_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${OP_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 15373:15373
- 15373:15373/udp
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
soneium-mainnet-op-erigon-node:
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MAINNET_NODE_VERSION:-v1.19.1}
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 18689:18689
- 18689:18689/udp
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
soneium-minato-sepolia-op-erigon-node:
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINATO_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINATO_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 17283:17283
- 17283:17283/udp
@@ -1,202 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/swell-mainnet-op-erigon-archive-trace--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/swell-mainnet-op-erigon \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
swell-mainnet-op-erigon:
image: ${SWELL_ERIGON_IMAGE:-testinprod/op-erigon}:${SWELL_MAINNET_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
ports:
- 10810:10810
- 10810:10810/udp
- 30810:30810
- 30810:30810/udp
- 35810:35810
- 35810:35810/udp
expose:
- 8545
- 6060
- 8551
entrypoint: [erigon]
command:
- --chain=swell-mainnet
- --datadir=/root/.local/share/erigon
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --p2p.allowed-ports=30810
- --p2p.allowed-ports=35810
- --port=10810
- --rollup.sequencerhttp=https://swell-mainnet.alt.technology
- --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000
- --http
- --http.addr=0.0.0.0
- --http.api=eth,erigon,web3,net,debug,trace,txpool,admin,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${SWELL_MAINNET_OP_ERIGON_ARCHIVE_TRACE_DATA:-swell-mainnet-op-erigon-archive-trace}:/root/.local/share/erigon
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.swell-mainnet-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/swell-mainnet-op-erigon
- traefik.http.services.swell-mainnet-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.swell-mainnet-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.swell-mainnet-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.swell-mainnet-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/swell-mainnet-op-erigon`) || Path(`/swell-mainnet-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.swell-mainnet-op-erigon-archive-trace.rule=Path(`/swell-mainnet-op-erigon`) || Path(`/swell-mainnet-op-erigon/`)}
- traefik.http.routers.swell-mainnet-op-erigon-archive-trace.middlewares=swell-mainnet-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
swell-mainnet-op-erigon-node:
image: ${SWELL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${SWELL_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 15810:15810
- 15810:15810/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${SWELL_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=1923
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://swell-mainnet-op-erigon:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15810
- KONA_NODE_P2P_LISTEN_UDP_PORT=15810
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
swell-mainnet-op-erigon:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.swell-mainnet-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/swell-mainnet-op-erigon/node
- traefik.http.services.swell-mainnet-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.swell-mainnet-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.swell-mainnet-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.swell-mainnet-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/swell-mainnet-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.swell-mainnet-op-erigon-archive-trace-node.rule=PathPrefix(`/swell-mainnet-op-erigon/node`)}
- traefik.http.routers.swell-mainnet-op-erigon-archive-trace-node.middlewares=swell-mainnet-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes:
swell-mainnet-op-erigon-archive-trace:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: swell
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
# non standard erigon only
- name: eth_getBlockReceipts
- name: eth_protocolVersion
- name: eth_callMany
- name: eth_callBundle
- name: debug_accountAt
- name: debug_traceCallMany
- name: erigon_getHeaderByHash
- name: erigon_getBlockReceiptsByBlockHash
- name: erigon_getHeaderByNumber
- name: erigon_getLogsByHash
- name: erigon_forks
- name: erigon_getBlockByTimestamp
- name: erigon_BlockNumber
- name: erigon_getLatestLogs
...
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
swell-mainnet-op-erigon-node:
image: ${SWELL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SWELL_MAINNET_NODE_VERSION:-v1.19.1}
image: ${SWELL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SWELL_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 15810:15810
- 15810:15810/udp
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
unichain-mainnet-op-erigon-node:
image: ${UNICHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${UNICHAIN_MAINNET_NODE_VERSION:-v1.19.1}
image: ${UNICHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${UNICHAIN_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 16415:16415
- 16415:16415/udp
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
unichain-sepolia-op-erigon-node:
image: ${UNICHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${UNICHAIN_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${UNICHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${UNICHAIN_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 18196:18196
- 18196:18196/udp
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
worldchain-mainnet-op-erigon-node:
image: ${WORLDCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${WORLDCHAIN_MAINNET_NODE_VERSION:-v1.19.1}
image: ${WORLDCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${WORLDCHAIN_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 16629:16629
- 16629:16629/udp
@@ -106,7 +106,7 @@ services:
shm_size: 2gb
worldchain-sepolia-op-erigon-node:
image: ${WORLDCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${WORLDCHAIN_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${WORLDCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${WORLDCHAIN_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 16046:16046
- 16046:16046/udp
@@ -1,204 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/zora-mainnet-op-erigon-archive-trace--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/zora-mainnet-op-erigon \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
zora-mainnet-op-erigon:
image: ${ZORA_ERIGON_IMAGE:-testinprod/op-erigon}:${ZORA_MAINNET_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
ports:
- 14360:14360
- 14360:14360/udp
- 34360:34360
- 34360:34360/udp
- 39360:39360
- 39360:39360/udp
expose:
- 8545
- 6060
- 8551
entrypoint: /bin/sh -c '[ ! -d /root/.local/share/erigon/chaindata/mdbx.dat ] && erigon init --datadir /root/.local/share/erigon /config/genesis.json; exec erigon "$@"' --
command:
- --datadir=/root/.local/share/erigon
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=7777777
- --p2p.allowed-ports=34360
- --p2p.allowed-ports=39360
- --port=14360
- --rollup.sequencerhttp=https://rpc.zora.energy
- --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000
- --http
- --http.addr=0.0.0.0
- --http.api=eth,erigon,web3,net,debug,trace,txpool,admin,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ZORA_MAINNET_OP_ERIGON_ARCHIVE_TRACE_DATA:-zora-mainnet-op-erigon-archive-trace}:/root/.local/share/erigon
- ./op/zora/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.zora-mainnet-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/zora-mainnet-op-erigon
- traefik.http.services.zora-mainnet-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.zora-mainnet-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zora-mainnet-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zora-mainnet-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/zora-mainnet-op-erigon`) || Path(`/zora-mainnet-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.zora-mainnet-op-erigon-archive-trace.rule=Path(`/zora-mainnet-op-erigon`) || Path(`/zora-mainnet-op-erigon/`)}
- traefik.http.routers.zora-mainnet-op-erigon-archive-trace.middlewares=zora-mainnet-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
zora-mainnet-op-erigon-node:
image: ${ZORA_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${ZORA_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 19360:19360
- 19360:19360/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${ZORA_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=7777777
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://zora-mainnet-op-erigon:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=19360
- KONA_NODE_P2P_LISTEN_UDP_PORT=19360
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
zora-mainnet-op-erigon:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/zora/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.zora-mainnet-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/zora-mainnet-op-erigon/node
- traefik.http.services.zora-mainnet-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.zora-mainnet-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zora-mainnet-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zora-mainnet-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/zora-mainnet-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.zora-mainnet-op-erigon-archive-trace-node.rule=PathPrefix(`/zora-mainnet-op-erigon/node`)}
- traefik.http.routers.zora-mainnet-op-erigon-archive-trace-node.middlewares=zora-mainnet-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes:
zora-mainnet-op-erigon-archive-trace:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: zora
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
# non standard erigon only
- name: eth_getBlockReceipts
- name: eth_protocolVersion
- name: eth_callMany
- name: eth_callBundle
- name: debug_accountAt
- name: debug_traceCallMany
- name: erigon_getHeaderByHash
- name: erigon_getBlockReceiptsByBlockHash
- name: erigon_getHeaderByNumber
- name: erigon_getLogsByHash
- name: erigon_forks
- name: erigon_getBlockByTimestamp
- name: erigon_BlockNumber
- name: erigon_getLatestLogs
...
@@ -107,7 +107,7 @@ services:
shm_size: 2gb
zora-mainnet-op-erigon-node:
image: ${ZORA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${ZORA_MAINNET_NODE_VERSION:-v1.19.1}
image: ${ZORA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${ZORA_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 19360:19360
- 19360:19360/udp
@@ -1,205 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/zora-sepolia-op-erigon-archive-trace--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/zora-sepolia-op-erigon \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
zora-sepolia-op-erigon:
image: ${ZORA_ERIGON_IMAGE:-testinprod/op-erigon}:${ZORA_SEPOLIA_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
ports:
- 13839:13839
- 13839:13839/udp
- 33839:33839
- 33839:33839/udp
- 38839:38839
- 38839:38839/udp
expose:
- 8545
- 6060
- 8551
entrypoint: /bin/sh -c '[ ! -d /root/.local/share/erigon/chaindata/mdbx.dat ] && erigon init --datadir /root/.local/share/erigon /config/genesis.json; exec erigon "$@"' --
command:
- --datadir=/root/.local/share/erigon
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=999999999
- --p2p.allowed-ports=33839
- --p2p.allowed-ports=38839
- --port=13839
- --rollup.sequencerhttp=https://sepolia.rpc.zora.energy
- --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000
- --http
- --http.addr=0.0.0.0
- --http.api=eth,erigon,web3,net,debug,trace,txpool,admin,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ZORA_SEPOLIA_OP_ERIGON_ARCHIVE_TRACE_DATA:-zora-sepolia-op-erigon-archive-trace}:/root/.local/share/erigon
- ./op/zora/sepolia:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.zora-sepolia-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/zora-sepolia-op-erigon
- traefik.http.services.zora-sepolia-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.zora-sepolia-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zora-sepolia-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zora-sepolia-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/zora-sepolia-op-erigon`) || Path(`/zora-sepolia-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.zora-sepolia-op-erigon-archive-trace.rule=Path(`/zora-sepolia-op-erigon`) || Path(`/zora-sepolia-op-erigon/`)}
- traefik.http.routers.zora-sepolia-op-erigon-archive-trace.middlewares=zora-sepolia-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
zora-sepolia-op-erigon-node:
image: ${ZORA_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${ZORA_SEPOLIA_KONA_VERSION:-v1.6.1}
ports:
- 18839:18839
- 18839:18839/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${ZORA_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=999999999
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://zora-sepolia-op-erigon:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=18839
- KONA_NODE_P2P_LISTEN_UDP_PORT=18839
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
zora-sepolia-op-erigon:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/zora/sepolia:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.zora-sepolia-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/zora-sepolia-op-erigon/node
- traefik.http.services.zora-sepolia-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.zora-sepolia-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zora-sepolia-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zora-sepolia-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/zora-sepolia-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.zora-sepolia-op-erigon-archive-trace-node.rule=PathPrefix(`/zora-sepolia-op-erigon/node`)}
- traefik.http.routers.zora-sepolia-op-erigon-archive-trace-node.middlewares=zora-sepolia-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes:
zora-sepolia-op-erigon-archive-trace:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: zora-sepolia
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
# non standard erigon only
- name: eth_getBlockReceipts
- name: eth_protocolVersion
- name: eth_callMany
- name: eth_callBundle
- name: debug_accountAt
- name: debug_traceCallMany
- name: erigon_getHeaderByHash
- name: erigon_getBlockReceiptsByBlockHash
- name: erigon_getHeaderByNumber
- name: erigon_getLogsByHash
- name: erigon_forks
- name: erigon_getBlockByTimestamp
- name: erigon_BlockNumber
- name: erigon_getLatestLogs
...
@@ -107,7 +107,7 @@ services:
shm_size: 2gb
zora-sepolia-op-erigon-node:
image: ${ZORA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${ZORA_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${ZORA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${ZORA_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 18839:18839
- 18839:18839/udp
@@ -1,196 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/base-mainnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/base-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
base-mainnet-archive:
image: ${BASE_GETH_IMAGE:-ghcr.io/base/node-geth}:${BASE_MAINNET_GETH_VERSION:-v0.15.6}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 13596:13596
- 13596:13596/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OP_NETWORK=base-mainnet
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://mainnet-sequencer.base.org
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --port=13596
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BASE_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-base-mainnet-op-geth-archive-leveldb-hash}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.base-mainnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/base-mainnet-archive
- traefik.http.services.base-mainnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/base-mainnet-archive`) || Path(`/base-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash.rule=Path(`/base-mainnet-archive`) || Path(`/base-mainnet-archive/`)}
- traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash.middlewares=base-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
base-mainnet-archive-node:
image: ${BASE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BASE_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 18596:18596
- 18596:18596/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BASE_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=8453
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://base-mainnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=18596
- KONA_NODE_P2P_LISTEN_UDP_PORT=18596
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
base-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.base-mainnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/base-mainnet-archive/node
- traefik.http.services.base-mainnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/base-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/base-mainnet-archive/node`)}
- traefik.http.routers.base-mainnet-op-geth-archive-leveldb-hash-node.middlewares=base-mainnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
base-mainnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: base
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,263 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/base-mainnet-op-geth-pruned-pebble-path--kona--fireeth.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/base-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
base-mainnet:
image: ${BASE_FIREETH_IMAGE:-ghcr.io/streamingfast/go-ethereum}:${BASE_MAINNET_FIREETH_VERSION:-v2.12.4-optimism-v1.101511.0-op-node.v1.13.3-1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 11422:11422
- 11422:11422/udp
expose:
- 8545
- 6060
- 8551
- 10010
environment:
- GETH_OP_NETWORK=base-mainnet
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://mainnet-sequencer.base.org
entrypoint: [sh, -c, exec fireeth start reader-node --reader-node-arguments "$*", _]
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --port=11422
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=full
- --vmtrace=firehose
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BASE_MAINNET_FIREETH_DATA:-base-mainnet-fireeth}:/app/firehose-data
- ${BASE_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-base-mainnet-op-geth-pruned-pebble-path}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.base-mainnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/base-mainnet
- traefik.http.services.base-mainnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/base-mainnet`) || Path(`/base-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.rule=Path(`/base-mainnet`) || Path(`/base-mainnet/`)}
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.middlewares=base-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
base-mainnet-firehose:
image: ${BASE_FIREETH_IMAGE:-ghcr.io/streamingfast/go-ethereum}:${BASE_MAINNET_FIREETH_VERSION:-v2.12.4-optimism-v1.101511.0-op-node.v1.13.3-1}
expose:
- 10015
- 10014
environment:
- ${BASE_MAINNET_FIREETH_BLOCKS_STORE:-/app/firehose-data/storage/merged-blocks}
entrypoint: [sh, -c, exec fireeth --config-file="" --log-to-file=false start firehose index-builder relayer merger $@, _]
command:
- --firehose-rate-limit-bucket-fill-rate=${BASE_MAINNET_FIREHOSE_RATE_LIMIT_BUCKET_FILL_RATE:-1s}
- --firehose-rate-limit-bucket-size=${BASE_MAINNET_FIREHOSE_RATE_LIMIT_BUCKET_SIZE:-200}
- --log-to-file=false
- --relayer-source=base-mainnet:10010
restart: unless-stopped
depends_on:
- base-mainnet
networks:
- chains
volumes:
- ${BASE_MAINNET_FIREETH_DATA:-base-mainnet-fireeth}:/app/firehose-data
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=false
- traefik.enable=true
- traefik.http.services.base-mainnet-op-geth-pruned-pebble-path-firehose.loadbalancer.server.scheme=h2c
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-firehose.service=base-mainnet-op-geth-pruned-pebble-path-firehose
- traefik.http.services.base-mainnet-op-geth-pruned-pebble-path-firehose.loadbalancer.server.port=10015
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-firehose.entrypoints=grpc
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-firehose.tls.certresolver=myresolver}
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-firehose.rule=Host(`base-mainnet-firehose.${DOMAIN}`)
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-firehose.middlewares=ipallowlist
base-mainnet-events:
image: ${BASE_FIREETH_IMAGE:-ghcr.io/streamingfast/go-ethereum}:${BASE_MAINNET_FIREETH_VERSION:-v2.12.4-optimism-v1.101511.0-op-node.v1.13.3-1}
expose:
- 10016
entrypoint: [sh, -c, exec fireeth --config-file="" --log-to-file=false start substreams-tier1 substreams-tier2 $@, _]
command:
- --common-live-blocks-addr=base-mainnet-firehose:10014
- --log-to-file=false
- --substreams-block-execution-timeout=${BASE_MAINNET_SUBSTREAMS_BLOCK_EXECUTION_TIMEOUT:-3m0s}
- --substreams-rpc-endpoints=${BASE_MAINNET_EXECUTION_ARCHIVE_RPC}
- --substreams-tier1-max-subrequests=${BASE_MAINNET_SUBSTREAMS_TIER1_MAX_SUBREQUESTS:-4}
restart: unless-stopped
depends_on:
- base-mainnet
networks:
- chains
volumes:
- ${BASE_MAINNET_FIREETH_DATA:-base-mainnet-fireeth}:/app/firehose-data
logging: *logging-defaults
labels:
- traefik.enable=true
- traefik.http.services.base-mainnet-op-geth-pruned-pebble-path-events.loadbalancer.server.scheme=h2c
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-events.service=base-mainnet-op-geth-pruned-pebble-path-events
- traefik.http.services.base-mainnet-op-geth-pruned-pebble-path-events.loadbalancer.server.port=10016
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-events.entrypoints=grpc
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-events.tls.certresolver=myresolver}
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-events.rule=Host(`base-mainnet-events.${DOMAIN}`)
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-events.middlewares=ipallowlist
base-mainnet-node:
image: ${BASE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BASE_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 16422:16422
- 16422:16422/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BASE_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=8453
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://base-mainnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=16422
- KONA_NODE_P2P_LISTEN_UDP_PORT=16422
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
base-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.base-mainnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/base-mainnet/node
- traefik.http.services.base-mainnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/base-mainnet/node`)}
- ${NO_SSL:+traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/base-mainnet/node`)}
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.middlewares=base-mainnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
base-mainnet-op-geth-pruned-pebble-path:
base-mainnet-op-geth-pruned-pebble-path_fireeth:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: base
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,198 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/base-mainnet-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/base-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
base-mainnet:
image: ${BASE_GETH_IMAGE:-ghcr.io/base/node-geth}:${BASE_MAINNET_GETH_VERSION:-v0.15.6}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 11422:11422
- 11422:11422/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OP_NETWORK=base-mainnet
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://mainnet-sequencer.base.org
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --port=11422
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=snap
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BASE_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-base-mainnet-op-geth-pruned-pebble-path}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.base-mainnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/base-mainnet
- traefik.http.services.base-mainnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/base-mainnet`) || Path(`/base-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.rule=Path(`/base-mainnet`) || Path(`/base-mainnet/`)}
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path.middlewares=base-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
base-mainnet-node:
image: ${BASE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BASE_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 16422:16422
- 16422:16422/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BASE_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=8453
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://base-mainnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=16422
- KONA_NODE_P2P_LISTEN_UDP_PORT=16422
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
base-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.base-mainnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/base-mainnet/node
- traefik.http.services.base-mainnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/base-mainnet/node`)}
- ${NO_SSL:+traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/base-mainnet/node`)}
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-node.middlewares=base-mainnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
base-mainnet-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: base
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,197 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/base-sepolia-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/base-sepolia-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
base-sepolia-archive:
image: ${BASE_GETH_IMAGE:-ghcr.io/base/node-geth}:${BASE_SEPOLIA_GETH_VERSION:-v0.15.6}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 10910:10910
- 10910:10910/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OP_NETWORK=base-sepolia
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://sepolia-sequencer.base.org
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --port=10910
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BASE_SEPOLIA_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-base-sepolia-op-geth-archive-leveldb-hash}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.base-sepolia-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/base-sepolia-archive
- traefik.http.services.base-sepolia-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/base-sepolia-archive`) || Path(`/base-sepolia-archive/`))}
- ${NO_SSL:+traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash.rule=Path(`/base-sepolia-archive`) || Path(`/base-sepolia-archive/`)}
- traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash.middlewares=base-sepolia-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
base-sepolia-archive-node:
image: ${BASE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BASE_SEPOLIA_KONA_VERSION:-v1.6.1}
ports:
- 15910:15910
- 15910:15910/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BASE_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=84532
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://base-sepolia-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15910
- KONA_NODE_P2P_LISTEN_UDP_PORT=15910
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
base-sepolia-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.base-sepolia-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/base-sepolia-archive/node
- traefik.http.services.base-sepolia-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/base-sepolia-archive/node`)}
- ${NO_SSL:+traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/base-sepolia-archive/node`)}
- traefik.http.routers.base-sepolia-op-geth-archive-leveldb-hash-node.middlewares=base-sepolia-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
base-sepolia-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: base-sepolia
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,199 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/base-sepolia-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/base-sepolia \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
base-sepolia:
image: ${BASE_GETH_IMAGE:-ghcr.io/base/node-geth}:${BASE_SEPOLIA_GETH_VERSION:-v0.15.6}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 12022:12022
- 12022:12022/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OP_NETWORK=base-sepolia
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://sepolia-sequencer.base.org
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --port=12022
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=snap
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BASE_SEPOLIA_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-base-sepolia-op-geth-pruned-pebble-path}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.base-sepolia-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/base-sepolia
- traefik.http.services.base-sepolia-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/base-sepolia`) || Path(`/base-sepolia/`))}
- ${NO_SSL:+traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path.rule=Path(`/base-sepolia`) || Path(`/base-sepolia/`)}
- traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path.middlewares=base-sepolia-op-geth-pruned-pebble-path-stripprefix, ipallowlist
base-sepolia-node:
image: ${BASE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BASE_SEPOLIA_KONA_VERSION:-v1.6.1}
ports:
- 17022:17022
- 17022:17022/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BASE_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=84532
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://base-sepolia:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=17022
- KONA_NODE_P2P_LISTEN_UDP_PORT=17022
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
base-sepolia:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.base-sepolia-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/base-sepolia/node
- traefik.http.services.base-sepolia-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/base-sepolia/node`)}
- ${NO_SSL:+traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/base-sepolia/node`)}
- traefik.http.routers.base-sepolia-op-geth-pruned-pebble-path-node.middlewares=base-sepolia-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
base-sepolia-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: base-sepolia
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,198 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/blast-mainnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/blast-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
blast-mainnet-archive:
image: ${BLAST_GETH_IMAGE:-blastio/blast-geth}:${BLAST_MAINNET_GETH_VERSION:-mainnet-v1.8.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OVERRIDE_CANYON=0
- GETH_OVERRIDE_ECOTONE=1716843599
- GETH_OVERRIDE_TAIGA=1746612311
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://sequencer.blast.io
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=leveldb --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --networkid=81457
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BLAST_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-blast-mainnet-op-geth-archive-leveldb-hash}:/data
- ./op/blast/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.blast-mainnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/blast-mainnet-archive
- traefik.http.services.blast-mainnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/blast-mainnet-archive`) || Path(`/blast-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash.rule=Path(`/blast-mainnet-archive`) || Path(`/blast-mainnet-archive/`)}
- traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash.middlewares=blast-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
blast-mainnet-archive-node:
image: ${BLAST_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BLAST_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 15683:15683
- 15683:15683/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BLAST_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=81457
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://blast-mainnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_BOOTNODES=enr:-J64QGwHl9uYLfC_cnmxSA6wQH811nkOWJDWjzxqkEUlJoZHWvI66u-BXgVcPCeMUmg0dBpFQAPotFchG67FHJMZ9OSGAY3d6wevgmlkgnY0gmlwhANizeSHb3BzdGFja4Sx_AQAiXNlY3AyNTZrMaECg4pk0cskPAyJ7pOmo9E6RqGBwV-Lex4VS9a3MQvu7PWDdGNwgnZhg3VkcIJ2YQ,enr:-J64QDge2jYBQtcNEpRqmKfci5E5BHAhNBjgv4WSdwH1_wPqbueq2bDj38-TSW8asjy5lJj1Xftui6Or8lnaYFCqCI-GAY3d6wf3gmlkgnY0gmlwhCO2D9yHb3BzdGFja4Sx_AQAiXNlY3AyNTZrMaEDo4aCTq7pCEN8om9U5n_VyWdambGnQhwHNwKc8o-OicaDdGNwgnZhg3VkcIJ2YQ
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15683
- KONA_NODE_P2P_LISTEN_UDP_PORT=15683
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
blast-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/blast/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.blast-mainnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/blast-mainnet-archive/node
- traefik.http.services.blast-mainnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/blast-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/blast-mainnet-archive/node`)}
- traefik.http.routers.blast-mainnet-op-geth-archive-leveldb-hash-node.middlewares=blast-mainnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
blast-mainnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: blast
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,198 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/blast-mainnet-op-geth-archive-pebble-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/blast-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
blast-mainnet-archive:
image: ${BLAST_GETH_IMAGE:-blastio/blast-geth}:${BLAST_MAINNET_GETH_VERSION:-mainnet-v1.8.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OVERRIDE_CANYON=0
- GETH_OVERRIDE_ECOTONE=1716843599
- GETH_OVERRIDE_TAIGA=1746612311
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://sequencer.blast.io
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --networkid=81457
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BLAST_MAINNET_OP_GETH_ARCHIVE_PEBBLE_HASH_DATA:-blast-mainnet-op-geth-archive-pebble-hash}:/data
- ./op/blast/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.blast-mainnet-op-geth-archive-pebble-hash-stripprefix.stripprefix.prefixes=/blast-mainnet-archive
- traefik.http.services.blast-mainnet-op-geth-archive-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/blast-mainnet-archive`) || Path(`/blast-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash.rule=Path(`/blast-mainnet-archive`) || Path(`/blast-mainnet-archive/`)}
- traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash.middlewares=blast-mainnet-op-geth-archive-pebble-hash-stripprefix, ipallowlist
blast-mainnet-archive-node:
image: ${BLAST_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BLAST_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 15287:15287
- 15287:15287/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BLAST_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=81457
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://blast-mainnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_BOOTNODES=enr:-J64QGwHl9uYLfC_cnmxSA6wQH811nkOWJDWjzxqkEUlJoZHWvI66u-BXgVcPCeMUmg0dBpFQAPotFchG67FHJMZ9OSGAY3d6wevgmlkgnY0gmlwhANizeSHb3BzdGFja4Sx_AQAiXNlY3AyNTZrMaECg4pk0cskPAyJ7pOmo9E6RqGBwV-Lex4VS9a3MQvu7PWDdGNwgnZhg3VkcIJ2YQ,enr:-J64QDge2jYBQtcNEpRqmKfci5E5BHAhNBjgv4WSdwH1_wPqbueq2bDj38-TSW8asjy5lJj1Xftui6Or8lnaYFCqCI-GAY3d6wf3gmlkgnY0gmlwhCO2D9yHb3BzdGFja4Sx_AQAiXNlY3AyNTZrMaEDo4aCTq7pCEN8om9U5n_VyWdambGnQhwHNwKc8o-OicaDdGNwgnZhg3VkcIJ2YQ
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15287
- KONA_NODE_P2P_LISTEN_UDP_PORT=15287
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
blast-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/blast/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.blast-mainnet-op-geth-archive-pebble-hash-node-stripprefix.stripprefix.prefixes=/blast-mainnet-archive/node
- traefik.http.services.blast-mainnet-op-geth-archive-pebble-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/blast-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash-node.rule=PathPrefix(`/blast-mainnet-archive/node`)}
- traefik.http.routers.blast-mainnet-op-geth-archive-pebble-hash-node.middlewares=blast-mainnet-op-geth-archive-pebble-hash-node-stripprefix, ipallowlist
volumes:
blast-mainnet-op-geth-archive-pebble-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: blast
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,200 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/blast-mainnet-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/blast-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
blast-mainnet:
image: ${BLAST_GETH_IMAGE:-blastio/blast-geth}:${BLAST_MAINNET_GETH_VERSION:-mainnet-v1.8.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OVERRIDE_CANYON=0
- GETH_OVERRIDE_ECOTONE=1716843599
- GETH_OVERRIDE_TAIGA=1746612311
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://sequencer.blast.io
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=full --datadir /data init --state.scheme=path /config/genesis.json; exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --networkid=81457
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BLAST_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-blast-mainnet-op-geth-pruned-pebble-path}:/data
- ./op/blast/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.blast-mainnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/blast-mainnet
- traefik.http.services.blast-mainnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/blast-mainnet`) || Path(`/blast-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path.rule=Path(`/blast-mainnet`) || Path(`/blast-mainnet/`)}
- traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path.middlewares=blast-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
blast-mainnet-node:
image: ${BLAST_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BLAST_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 17769:17769
- 17769:17769/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BLAST_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=81457
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://blast-mainnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_BOOTNODES=enr:-J64QGwHl9uYLfC_cnmxSA6wQH811nkOWJDWjzxqkEUlJoZHWvI66u-BXgVcPCeMUmg0dBpFQAPotFchG67FHJMZ9OSGAY3d6wevgmlkgnY0gmlwhANizeSHb3BzdGFja4Sx_AQAiXNlY3AyNTZrMaECg4pk0cskPAyJ7pOmo9E6RqGBwV-Lex4VS9a3MQvu7PWDdGNwgnZhg3VkcIJ2YQ,enr:-J64QDge2jYBQtcNEpRqmKfci5E5BHAhNBjgv4WSdwH1_wPqbueq2bDj38-TSW8asjy5lJj1Xftui6Or8lnaYFCqCI-GAY3d6wf3gmlkgnY0gmlwhCO2D9yHb3BzdGFja4Sx_AQAiXNlY3AyNTZrMaEDo4aCTq7pCEN8om9U5n_VyWdambGnQhwHNwKc8o-OicaDdGNwgnZhg3VkcIJ2YQ
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=17769
- KONA_NODE_P2P_LISTEN_UDP_PORT=17769
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
blast-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/blast/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.blast-mainnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/blast-mainnet/node
- traefik.http.services.blast-mainnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/blast-mainnet/node`)}
- ${NO_SSL:+traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/blast-mainnet/node`)}
- traefik.http.routers.blast-mainnet-op-geth-pruned-pebble-path-node.middlewares=blast-mainnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
blast-mainnet-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: blast
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,198 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/blast-sepolia-op-geth-pruned-pebble-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/blast-sepolia \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
blast-sepolia:
image: ${BLAST_GETH_IMAGE:-blastio/blast-geth}:${BLAST_SEPOLIA_GETH_VERSION:-sepolia-v1.7.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OVERRIDE_CANYON=0
- GETH_OVERRIDE_ECOTONE_TIME=1713999600
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://sequencer.s2.testblast.io
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=full --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --networkid=168587773
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BLAST_SEPOLIA_OP_GETH_PRUNED_PEBBLE_HASH_DATA:-blast-sepolia-op-geth-pruned-pebble-hash}:/data
- ./op/blast/sepolia:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.blast-sepolia-op-geth-pruned-pebble-hash-stripprefix.stripprefix.prefixes=/blast-sepolia
- traefik.http.services.blast-sepolia-op-geth-pruned-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/blast-sepolia`) || Path(`/blast-sepolia/`))}
- ${NO_SSL:+traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash.rule=Path(`/blast-sepolia`) || Path(`/blast-sepolia/`)}
- traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash.middlewares=blast-sepolia-op-geth-pruned-pebble-hash-stripprefix, ipallowlist
blast-sepolia-node:
image: ${BLAST_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BLAST_SEPOLIA_KONA_VERSION:-v1.6.1}
ports:
- 16591:16591
- 16591:16591/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BLAST_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=168587773
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://blast-sepolia:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_BOOTNODES=enr:-J-4QM3GLUFfKMSJQuP1UvuKQe8DyovE7Eaiit0l6By4zjTodkR4V8NWXJxNmlg8t8rP-Q-wp3jVmeAOml8cjMj__ROGAYznzb_HgmlkgnY0gmlwhA-cZ_eHb3BzdGFja4X947FQAIlzZWNwMjU2azGhAiuDqvB-AsVSRmnnWr6OHfjgY8YfNclFy9p02flKzXnOg3RjcIJ2YYN1ZHCCdmE,enr:-J-4QDCVpByqQ8nFqCS9aHicqwUfXgzFDslvpEyYz19lvkHLIdtcIGp2d4q5dxHdjRNTO6HXCsnIKxUeuZSPcEbyVQCGAYznzz0RgmlkgnY0gmlwhANiQfuHb3BzdGFja4X947FQAIlzZWNwMjU2azGhAy3AtF2Jh_aPdOohg506Hjmtx-fQ1AKmu71C7PfkWAw9g3RjcIJ2YYN1ZHCCdmE
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=16591
- KONA_NODE_P2P_LISTEN_UDP_PORT=16591
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
blast-sepolia:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/blast/sepolia:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.blast-sepolia-op-geth-pruned-pebble-hash-node-stripprefix.stripprefix.prefixes=/blast-sepolia/node
- traefik.http.services.blast-sepolia-op-geth-pruned-pebble-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/blast-sepolia/node`)}
- ${NO_SSL:+traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash-node.rule=PathPrefix(`/blast-sepolia/node`)}
- traefik.http.routers.blast-sepolia-op-geth-pruned-pebble-hash-node.middlewares=blast-sepolia-op-geth-pruned-pebble-hash-node-stripprefix, ipallowlist
volumes:
blast-sepolia-op-geth-pruned-pebble-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: blast-sepolia
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,197 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/bnb-mainnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/bnb-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
bnb-mainnet-archive:
image: ${BNB_GETH_IMAGE:-ghcr.io/bnb-chain/op-geth}:${BNB_MAINNET_GETH_VERSION:-v0.5.9}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 11402:11402
- 11402:11402/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://opbnb-mainnet-rpc.bnbchain.org
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --bootnodes=enr:-KO4QHs5qh_kPFcjMgqkuN9dbxXT4C5Cjad4SAheaUxveCbJQ3XdeMMDHeHilHyqisyYQAByfdhzyKAdUp2SvyzWeBqGAYvRDf80g2V0aMfGhHFtSjqAgmlkgnY0gmlwhDaykUmJc2VjcDI1NmsxoQJUevTL3hJwj21IT2GC6VaNqVQEsJFPtNtO-ld5QTNCfIRzbmFwwIN0Y3CCdl-DdWRwgnZf,enr:-KO4QKIByq-YMjs6IL2YCNZEmlo3dKWNOy4B6sdqE3gjOrXeKdNbwZZGK_JzT1epqCFs3mujjg2vO1lrZLzLy4Rl7PyGAYvRA8bEg2V0aMfGhHFtSjqAgmlkgnY0gmlwhDbjSM6Jc2VjcDI1NmsxoQNQhJ5pqCPnTbK92gEc2F98y-u1OgZVAI1Msx-UiHezY4RzbmFwwIN0Y3CCdl-DdWRwgnZf
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --opBNBMainnet
- --port=11402
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BNB_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-bnb-mainnet-op-geth-archive-leveldb-hash}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.bnb-mainnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/bnb-mainnet-archive
- traefik.http.services.bnb-mainnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/bnb-mainnet-archive`) || Path(`/bnb-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash.rule=Path(`/bnb-mainnet-archive`) || Path(`/bnb-mainnet-archive/`)}
- traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash.middlewares=bnb-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
bnb-mainnet-archive-node:
image: ${BNB_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BNB_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 16402:16402
- 16402:16402/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BNB_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=204
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://bnb-mainnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=16402
- KONA_NODE_P2P_LISTEN_UDP_PORT=16402
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
bnb-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.bnb-mainnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/bnb-mainnet-archive/node
- traefik.http.services.bnb-mainnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/bnb-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/bnb-mainnet-archive/node`)}
- traefik.http.routers.bnb-mainnet-op-geth-archive-leveldb-hash-node.middlewares=bnb-mainnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
bnb-mainnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: opbnb
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,200 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/bnb-mainnet-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/bnb-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
bnb-mainnet:
image: ${BNB_GETH_IMAGE:-ghcr.io/bnb-chain/op-geth}:${BNB_MAINNET_GETH_VERSION:-v0.5.9}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 12599:12599
- 12599:12599/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://opbnb-mainnet-rpc.bnbchain.org
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --allow-insecure-no-tries
- --bootnodes=enr:-KO4QHs5qh_kPFcjMgqkuN9dbxXT4C5Cjad4SAheaUxveCbJQ3XdeMMDHeHilHyqisyYQAByfdhzyKAdUp2SvyzWeBqGAYvRDf80g2V0aMfGhHFtSjqAgmlkgnY0gmlwhDaykUmJc2VjcDI1NmsxoQJUevTL3hJwj21IT2GC6VaNqVQEsJFPtNtO-ld5QTNCfIRzbmFwwIN0Y3CCdl-DdWRwgnZf,enr:-KO4QKIByq-YMjs6IL2YCNZEmlo3dKWNOy4B6sdqE3gjOrXeKdNbwZZGK_JzT1epqCFs3mujjg2vO1lrZLzLy4Rl7PyGAYvRA8bEg2V0aMfGhHFtSjqAgmlkgnY0gmlwhDbjSM6Jc2VjcDI1NmsxoQNQhJ5pqCPnTbK92gEc2F98y-u1OgZVAI1Msx-UiHezY4RzbmFwwIN0Y3CCdl-DdWRwgnZf
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --opBNBMainnet
- --port=12599
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=snap
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BNB_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-bnb-mainnet-op-geth-pruned-pebble-path}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.bnb-mainnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/bnb-mainnet
- traefik.http.services.bnb-mainnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/bnb-mainnet`) || Path(`/bnb-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path.rule=Path(`/bnb-mainnet`) || Path(`/bnb-mainnet/`)}
- traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path.middlewares=bnb-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
bnb-mainnet-node:
image: ${BNB_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BNB_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 17599:17599
- 17599:17599/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BNB_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=204
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://bnb-mainnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=17599
- KONA_NODE_P2P_LISTEN_UDP_PORT=17599
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
bnb-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.bnb-mainnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/bnb-mainnet/node
- traefik.http.services.bnb-mainnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/bnb-mainnet/node`)}
- ${NO_SSL:+traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/bnb-mainnet/node`)}
- traefik.http.routers.bnb-mainnet-op-geth-pruned-pebble-path-node.middlewares=bnb-mainnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
bnb-mainnet-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: opbnb
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,197 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/bnb-testnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/bnb-testnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
bnb-testnet-archive:
image: ${BNB_GETH_IMAGE:-ghcr.io/bnb-chain/op-geth}:${BNB_TESTNET_GETH_VERSION:-v0.5.9}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 10163:10163
- 10163:10163/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://opbnb-testnet-rpc.bnbchain.org
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --bootnodes=enr:-KO4QKFOBDW--pF4pFwv3Al_jiLOITj_Y5mr1Ajyy2yxHpFtNcBfkZEkvWUxAKXQjWALZEFxYHooU88JClyzA00e8YeGAYtBOOZig2V0aMfGhE0ZYGqAgmlkgnY0gmlwhDREiqaJc2VjcDI1NmsxoQM8pC_6wwTr5N2Q-yXQ1KGKsgz9i9EPLk8Ata65pUyYG4RzbmFwwIN0Y3CCdl-DdWRwgnZf,enr:-KO4QFJc0KR09ye818GT2kyN9y6BAGjhz77sYimxn85jJf2hOrNqg4X0b0EsS-_ssdkzVpavqh6oMX7W5Y81xMRuEayGAYtBSiK9g2V0aMfGhE0ZYGqAgmlkgnY0gmlwhANzx96Jc2VjcDI1NmsxoQPwA1XHfWGd4umIt7j3Fc7hKq_35izIWT_9yiN_tX8lR4RzbmFwwIN0Y3CCdl-DdWRwgnZf
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --opBNBTestnet
- --port=10163
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BNB_TESTNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-bnb-testnet-op-geth-archive-leveldb-hash}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.bnb-testnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/bnb-testnet-archive
- traefik.http.services.bnb-testnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/bnb-testnet-archive`) || Path(`/bnb-testnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash.rule=Path(`/bnb-testnet-archive`) || Path(`/bnb-testnet-archive/`)}
- traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash.middlewares=bnb-testnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
bnb-testnet-archive-node:
image: ${BNB_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BNB_TESTNET_KONA_VERSION:-v1.6.1}
ports:
- 15163:15163
- 15163:15163/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_TESTNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BNB_TESTNET_L1_EXECUTION_RPC:-${ETHEREUM_TESTNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_TESTNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=5611
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://bnb-testnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15163
- KONA_NODE_P2P_LISTEN_UDP_PORT=15163
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
bnb-testnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.bnb-testnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/bnb-testnet-archive/node
- traefik.http.services.bnb-testnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/bnb-testnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/bnb-testnet-archive/node`)}
- traefik.http.routers.bnb-testnet-op-geth-archive-leveldb-hash-node.middlewares=bnb-testnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
bnb-testnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: opbnb-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,200 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/bnb-testnet-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/bnb-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
bnb-testnet:
image: ${BNB_GETH_IMAGE:-ghcr.io/bnb-chain/op-geth}:${BNB_TESTNET_GETH_VERSION:-v0.5.9}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 13187:13187
- 13187:13187/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://opbnb-testnet-rpc.bnbchain.org
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --allow-insecure-no-tries
- --bootnodes=enr:-KO4QKFOBDW--pF4pFwv3Al_jiLOITj_Y5mr1Ajyy2yxHpFtNcBfkZEkvWUxAKXQjWALZEFxYHooU88JClyzA00e8YeGAYtBOOZig2V0aMfGhE0ZYGqAgmlkgnY0gmlwhDREiqaJc2VjcDI1NmsxoQM8pC_6wwTr5N2Q-yXQ1KGKsgz9i9EPLk8Ata65pUyYG4RzbmFwwIN0Y3CCdl-DdWRwgnZf,enr:-KO4QFJc0KR09ye818GT2kyN9y6BAGjhz77sYimxn85jJf2hOrNqg4X0b0EsS-_ssdkzVpavqh6oMX7W5Y81xMRuEayGAYtBSiK9g2V0aMfGhE0ZYGqAgmlkgnY0gmlwhANzx96Jc2VjcDI1NmsxoQPwA1XHfWGd4umIt7j3Fc7hKq_35izIWT_9yiN_tX8lR4RzbmFwwIN0Y3CCdl-DdWRwgnZf
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --opBNBTestnet
- --port=13187
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=snap
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BNB_TESTNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-bnb-testnet-op-geth-pruned-pebble-path}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.bnb-testnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/bnb-testnet
- traefik.http.services.bnb-testnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/bnb-testnet`) || Path(`/bnb-testnet/`))}
- ${NO_SSL:+traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path.rule=Path(`/bnb-testnet`) || Path(`/bnb-testnet/`)}
- traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path.middlewares=bnb-testnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
bnb-testnet-node:
image: ${BNB_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${BNB_TESTNET_KONA_VERSION:-v1.6.1}
ports:
- 18187:18187
- 18187:18187/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_TESTNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${BNB_TESTNET_L1_EXECUTION_RPC:-${ETHEREUM_TESTNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_TESTNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=5611
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://bnb-testnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=18187
- KONA_NODE_P2P_LISTEN_UDP_PORT=18187
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
bnb-testnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.bnb-testnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/bnb-testnet/node
- traefik.http.services.bnb-testnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/bnb-testnet/node`)}
- ${NO_SSL:+traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/bnb-testnet/node`)}
- traefik.http.routers.bnb-testnet-op-geth-pruned-pebble-path-node.middlewares=bnb-testnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
bnb-testnet-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: opbnb-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -109,7 +109,7 @@ services:
- traefik.http.routers.bob-mainnet-op-geth-archive-leveldb-hash.middlewares=bob-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
bob-mainnet-archive-node:
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.1}
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 19046:19046
- 19046:19046/udp
@@ -109,7 +109,7 @@ services:
- traefik.http.routers.bob-mainnet-op-geth-archive-pebble-hash.middlewares=bob-mainnet-op-geth-archive-pebble-hash-stripprefix, ipallowlist
bob-mainnet-archive-node:
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.1}
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 17223:17223
- 17223:17223/udp
@@ -109,7 +109,7 @@ services:
- traefik.http.routers.bob-mainnet-op-geth-pruned-pebble-hash.middlewares=bob-mainnet-op-geth-pruned-pebble-hash-stripprefix, ipallowlist
bob-mainnet-node:
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.1}
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 16363:16363
- 16363:16363/udp
@@ -109,7 +109,7 @@ services:
- traefik.http.routers.bob-mainnet-op-geth-pruned-pebble-path.middlewares=bob-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
bob-mainnet-node:
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.1}
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 18347:18347
- 18347:18347/udp
@@ -104,7 +104,7 @@ services:
- traefik.http.routers.bob-sepolia-op-geth-archive-leveldb-hash.middlewares=bob-sepolia-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
bob-sepolia-archive-node:
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 15225:15225
- 15225:15225/udp
@@ -104,7 +104,7 @@ services:
- traefik.http.routers.bob-sepolia-op-geth-archive-pebble-hash.middlewares=bob-sepolia-op-geth-archive-pebble-hash-stripprefix, ipallowlist
bob-sepolia-archive-node:
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 17678:17678
- 17678:17678/udp
@@ -104,7 +104,7 @@ services:
- traefik.http.routers.bob-sepolia-op-geth-pruned-pebble-hash.middlewares=bob-sepolia-op-geth-pruned-pebble-hash-stripprefix, ipallowlist
bob-sepolia-node:
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 17885:17885
- 17885:17885/udp
@@ -104,7 +104,7 @@ services:
- traefik.http.routers.bob-sepolia-op-geth-pruned-pebble-path.middlewares=bob-sepolia-op-geth-pruned-pebble-path-stripprefix, ipallowlist
bob-sepolia-node:
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 18979:18979
- 18979:18979/udp
@@ -138,7 +138,7 @@ services:
logging: *logging-defaults
doma-mainnet-node:
image: ${DOMA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${DOMA_MAINNET_NODE_VERSION:-v1.19.1}
image: ${DOMA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${DOMA_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 15977:15977
- 15977:15977/udp
@@ -1,207 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/fraxtal-mainnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/fraxtal-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
fraxtal-mainnet-archive:
image: ${FRAXTAL_GETH_IMAGE:-ghcr.io/fraxfinance/fraxtal-op-geth}:${FRAXTAL_MAINNET_GETH_VERSION:-v1.101702.1-frax-1.3.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 13290:13290
- 13290:13290/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_BOOTNODES=enr:-J24QI8QR7VIgvQFuvLl09b9ocugoQ1WkS_AOMWKFgNX48-4P1hjgDKGeMFXZmKtfjYA2aEehxKT066riaktnxhh92OGAY5Sw_QsgmlkgnY0gmlwhCztZu2Hb3BzdGFja4P8AQCJc2VjcDI1NmsxoQM2KM0mkdH97Ze8AqwxLeqc934PKj8-xoKsyP6mAptWwIN0Y3CCdl2DdWRwgnZd,enr:-J24QGD1J-g2EPY9b7XiuwLhIoGocVp2qx2gWSfDI_CdftiPSHlgi7G6LtzkQlDskuSvRj4OXTg3vXLISubphXNNhqyGAY5Sw8GxgmlkgnY0gmlwhCzW_iGHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQPvMYlJHJUsEyciuJCTkKHLE2ogZ6cs2xuPI28CGq0CTIN0Y3CCdl2DdWRwgnZd,enr:-J24QCA5I3xroUXt7Ge_Kf04VCRBnI-GbZeyBxOkkpIDGGLrVsonrbngQG1hAEnufRb1TgS6sNFCGtaZ2ZpRx7AgciGGAY5SxEy0gmlkgnY0gmlwhCLzRQyHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQOaHzrtPQWYcwAcFJWFrbGlbNUsBC0VEhCcH02RbgEIwIN0Y3CCdl2DdWRwgnZd
- GETH_OVERRIDE_CANYON=0
- GETH_OVERRIDE_ECOTONE=1717009201
- GETH_OVERRIDE_FJORD=1733947201
- GETH_OVERRIDE_GRANITE=1738958401
- GETH_OVERRIDE_HOLOCENE=1744052401
- GETH_OVERRIDE_ISTHMUS=1755716401
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.mainnet.frax.com
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=leveldb --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --bootnodes=enr:-J24QI8QR7VIgvQFuvLl09b9ocugoQ1WkS_AOMWKFgNX48-4P1hjgDKGeMFXZmKtfjYA2aEehxKT066riaktnxhh92OGAY5Sw_QsgmlkgnY0gmlwhCztZu2Hb3BzdGFja4P8AQCJc2VjcDI1NmsxoQM2KM0mkdH97Ze8AqwxLeqc934PKj8-xoKsyP6mAptWwIN0Y3CCdl2DdWRwgnZd,enr:-J24QGD1J-g2EPY9b7XiuwLhIoGocVp2qx2gWSfDI_CdftiPSHlgi7G6LtzkQlDskuSvRj4OXTg3vXLISubphXNNhqyGAY5Sw8GxgmlkgnY0gmlwhCzW_iGHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQPvMYlJHJUsEyciuJCTkKHLE2ogZ6cs2xuPI28CGq0CTIN0Y3CCdl2DdWRwgnZd,enr:-J24QCA5I3xroUXt7Ge_Kf04VCRBnI-GbZeyBxOkkpIDGGLrVsonrbngQG1hAEnufRb1TgS6sNFCGtaZ2ZpRx7AgciGGAY5SxEy0gmlkgnY0gmlwhCLzRQyHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQOaHzrtPQWYcwAcFJWFrbGlbNUsBC0VEhCcH02RbgEIwIN0Y3CCdl2DdWRwgnZd
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=252
- --port=13290
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${FRAXTAL_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-fraxtal-mainnet-op-geth-archive-leveldb-hash}:/data
- ./op/fraxtal/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.fraxtal-mainnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/fraxtal-mainnet-archive
- traefik.http.services.fraxtal-mainnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/fraxtal-mainnet-archive`) || Path(`/fraxtal-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash.rule=Path(`/fraxtal-mainnet-archive`) || Path(`/fraxtal-mainnet-archive/`)}
- traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash.middlewares=fraxtal-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
fraxtal-mainnet-archive-node:
image: ${FRAXTAL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${FRAXTAL_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 18290:18290
- 18290:18290/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${FRAXTAL_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=252
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://fraxtal-mainnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_BOOTNODES=enr:-J24QPGxmNmQ6Gsofjwnaaqt-RvC-2te44hHSU_wFGvCBpdnGnAuW0hKBCwzarXEmLN0TfwilwX3xS8xjEd9sQRqKXqGAY1ok0P3gmlkgnY0gmlwhDa-pcmHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQJA0echCE64KVt7m1lHfRF9_QgYxqIOSoPZ1UHcEArDu4N0Y3CCJAaDdWRwgiQG,enr:-J24QHPYu7uUXH4LCJ_pjHMD3fYhluZEgFRlewqOFFcja7ACaTDp4zG4GZBJdTPmLjsqskhTQa5ldKiVu4ypZYMzR_uGAY1ok_ABgmlkgnY0gmlwhCLvv1KHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQOEemNzZL5buGmwlN2naXLtz4nauCqBFeFxdmi4RL4rDIN0Y3CCJAaDdWRwgiQG,enr:-J24QBujtfGNIiE6GJrCgXEKJMs1F11wd4Y8Uvx7ZFn3Z1tyR0erNcpiW5EYIQEKQX0kL9PLJUDHWZFiaHWOTBvFg5aGAY1ok5p8gmlkgnY0gmlwhDbD-tqHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQLunzKLYJLvy6cWWkLgSSdLlILgSohrV8RT3tlKGwHBi4N0Y3CCJAaDdWRwgiQG
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=18290
- KONA_NODE_P2P_LISTEN_UDP_PORT=18290
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
fraxtal-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/fraxtal/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.fraxtal-mainnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/fraxtal-mainnet-archive/node
- traefik.http.services.fraxtal-mainnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/fraxtal-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/fraxtal-mainnet-archive/node`)}
- traefik.http.routers.fraxtal-mainnet-op-geth-archive-leveldb-hash-node.middlewares=fraxtal-mainnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
fraxtal-mainnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: fraxtal
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,209 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/fraxtal-mainnet-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/fraxtal-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
fraxtal-mainnet:
image: ${FRAXTAL_GETH_IMAGE:-ghcr.io/fraxfinance/fraxtal-op-geth}:${FRAXTAL_MAINNET_GETH_VERSION:-v1.101702.1-frax-1.3.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 10282:10282
- 10282:10282/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_BOOTNODES=enr:-J24QI8QR7VIgvQFuvLl09b9ocugoQ1WkS_AOMWKFgNX48-4P1hjgDKGeMFXZmKtfjYA2aEehxKT066riaktnxhh92OGAY5Sw_QsgmlkgnY0gmlwhCztZu2Hb3BzdGFja4P8AQCJc2VjcDI1NmsxoQM2KM0mkdH97Ze8AqwxLeqc934PKj8-xoKsyP6mAptWwIN0Y3CCdl2DdWRwgnZd,enr:-J24QGD1J-g2EPY9b7XiuwLhIoGocVp2qx2gWSfDI_CdftiPSHlgi7G6LtzkQlDskuSvRj4OXTg3vXLISubphXNNhqyGAY5Sw8GxgmlkgnY0gmlwhCzW_iGHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQPvMYlJHJUsEyciuJCTkKHLE2ogZ6cs2xuPI28CGq0CTIN0Y3CCdl2DdWRwgnZd,enr:-J24QCA5I3xroUXt7Ge_Kf04VCRBnI-GbZeyBxOkkpIDGGLrVsonrbngQG1hAEnufRb1TgS6sNFCGtaZ2ZpRx7AgciGGAY5SxEy0gmlkgnY0gmlwhCLzRQyHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQOaHzrtPQWYcwAcFJWFrbGlbNUsBC0VEhCcH02RbgEIwIN0Y3CCdl2DdWRwgnZd
- GETH_OVERRIDE_CANYON=0
- GETH_OVERRIDE_ECOTONE=1717009201
- GETH_OVERRIDE_FJORD=1733947201
- GETH_OVERRIDE_GRANITE=1738958401
- GETH_OVERRIDE_HOLOCENE=1744052401
- GETH_OVERRIDE_ISTHMUS=1755716401
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.mainnet.frax.com
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=full --datadir /data init --state.scheme=path /config/genesis.json; exec geth "$@"' --
command:
- --bootnodes=enr:-J24QI8QR7VIgvQFuvLl09b9ocugoQ1WkS_AOMWKFgNX48-4P1hjgDKGeMFXZmKtfjYA2aEehxKT066riaktnxhh92OGAY5Sw_QsgmlkgnY0gmlwhCztZu2Hb3BzdGFja4P8AQCJc2VjcDI1NmsxoQM2KM0mkdH97Ze8AqwxLeqc934PKj8-xoKsyP6mAptWwIN0Y3CCdl2DdWRwgnZd,enr:-J24QGD1J-g2EPY9b7XiuwLhIoGocVp2qx2gWSfDI_CdftiPSHlgi7G6LtzkQlDskuSvRj4OXTg3vXLISubphXNNhqyGAY5Sw8GxgmlkgnY0gmlwhCzW_iGHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQPvMYlJHJUsEyciuJCTkKHLE2ogZ6cs2xuPI28CGq0CTIN0Y3CCdl2DdWRwgnZd,enr:-J24QCA5I3xroUXt7Ge_Kf04VCRBnI-GbZeyBxOkkpIDGGLrVsonrbngQG1hAEnufRb1TgS6sNFCGtaZ2ZpRx7AgciGGAY5SxEy0gmlkgnY0gmlwhCLzRQyHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQOaHzrtPQWYcwAcFJWFrbGlbNUsBC0VEhCcH02RbgEIwIN0Y3CCdl2DdWRwgnZd
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=252
- --port=10282
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=snap
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${FRAXTAL_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-fraxtal-mainnet-op-geth-pruned-pebble-path}:/data
- ./op/fraxtal/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.fraxtal-mainnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/fraxtal-mainnet
- traefik.http.services.fraxtal-mainnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/fraxtal-mainnet`) || Path(`/fraxtal-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path.rule=Path(`/fraxtal-mainnet`) || Path(`/fraxtal-mainnet/`)}
- traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path.middlewares=fraxtal-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
fraxtal-mainnet-node:
image: ${FRAXTAL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${FRAXTAL_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 15282:15282
- 15282:15282/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${FRAXTAL_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=252
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://fraxtal-mainnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_BOOTNODES=enr:-J24QPGxmNmQ6Gsofjwnaaqt-RvC-2te44hHSU_wFGvCBpdnGnAuW0hKBCwzarXEmLN0TfwilwX3xS8xjEd9sQRqKXqGAY1ok0P3gmlkgnY0gmlwhDa-pcmHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQJA0echCE64KVt7m1lHfRF9_QgYxqIOSoPZ1UHcEArDu4N0Y3CCJAaDdWRwgiQG,enr:-J24QHPYu7uUXH4LCJ_pjHMD3fYhluZEgFRlewqOFFcja7ACaTDp4zG4GZBJdTPmLjsqskhTQa5ldKiVu4ypZYMzR_uGAY1ok_ABgmlkgnY0gmlwhCLvv1KHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQOEemNzZL5buGmwlN2naXLtz4nauCqBFeFxdmi4RL4rDIN0Y3CCJAaDdWRwgiQG,enr:-J24QBujtfGNIiE6GJrCgXEKJMs1F11wd4Y8Uvx7ZFn3Z1tyR0erNcpiW5EYIQEKQX0kL9PLJUDHWZFiaHWOTBvFg5aGAY1ok5p8gmlkgnY0gmlwhDbD-tqHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQLunzKLYJLvy6cWWkLgSSdLlILgSohrV8RT3tlKGwHBi4N0Y3CCJAaDdWRwgiQG
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15282
- KONA_NODE_P2P_LISTEN_UDP_PORT=15282
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
fraxtal-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/fraxtal/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.fraxtal-mainnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/fraxtal-mainnet/node
- traefik.http.services.fraxtal-mainnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/fraxtal-mainnet/node`)}
- ${NO_SSL:+traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/fraxtal-mainnet/node`)}
- traefik.http.routers.fraxtal-mainnet-op-geth-pruned-pebble-path-node.middlewares=fraxtal-mainnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
fraxtal-mainnet-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: fraxtal
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,202 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/fraxtal-testnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/fraxtal-testnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
fraxtal-testnet-archive:
image: ${FRAXTAL_GETH_IMAGE:-ghcr.io/fraxfinance/fraxtal-op-geth}:${FRAXTAL_TESTNET_GETH_VERSION:-v1.101702.1-frax-1.3.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_BOOTNODES=enr:-KO4QFOGWnVckCqXKTpKAPU_AZJmIbRjz8PTwPjkLgKJ9H_1bQT3fx57hU5OWeBqoLJ4Wa_VfA4paKQ_O-l7CJxj8ECGAZoNhOM7g2V0aMfGhGTaoWCAgmlkgnY0gmlwhCigGzaJc2VjcDI1NmsxoQJHFjvlp9CAbQ-YbO-QglEnykeVDLW8chF72qYUhax0T4RzbmFwwIN0Y3CCdmKDdWRwgnZi,enr:-KO4QCRQ8XyyqzjjYV2NcGWNc6R-kaMhp8KyYw-8mxoGbHsvUbBCO2H8f7PjtDE_ce85nSfcnVgHzfiqhpLvl5aSONWGAZoNdAX-g2V0aMfGhGTaoWCAgmlkgnY0gmlwhA_MbmOJc2VjcDI1NmsxoQO0Z6xvk6FhoaOAiEfRYHfjD5iBD-l0DFSn61-Y2Rf6VYRzbmFwwIN0Y3CCdmKDdWRwgnZi
- GETH_OVERRIDE_CANYON=0
- GETH_OVERRIDE_ECOTONE=0
- GETH_OVERRIDE_FJORD=0
- GETH_OVERRIDE_GRANITE=0
- GETH_OVERRIDE_HOLOCENE=0
- GETH_OVERRIDE_ISTHMUS=0
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.testnet.frax.com
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=leveldb --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --networkid=2523
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${FRAXTAL_TESTNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-fraxtal-testnet-op-geth-archive-leveldb-hash}:/data
- ./op/fraxtal/testnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.fraxtal-testnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/fraxtal-testnet-archive
- traefik.http.services.fraxtal-testnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/fraxtal-testnet-archive`) || Path(`/fraxtal-testnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash.rule=Path(`/fraxtal-testnet-archive`) || Path(`/fraxtal-testnet-archive/`)}
- traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash.middlewares=fraxtal-testnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
fraxtal-testnet-archive-node:
image: ${FRAXTAL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${FRAXTAL_TESTNET_KONA_VERSION:-v1.6.1}
ports:
- 15294:15294
- 15294:15294/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_HOODI_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${FRAXTAL_TESTNET_L1_EXECUTION_RPC:-${ETHEREUM_HOODI_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_HOODI_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=2523
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://fraxtal-testnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_BOOTNODES=enr:-J24QMswfOBuPJnTjWPN7p-jZDXlB0VIYznPmpbmdkYM6rWKXc9nP34X5iMECUJmO-r-ebFdB0lKKyCtwMx1K2iOWb6GAYv0JJTPgmlkgnY0gmlwhDaUK8yHb3BzdGFja4PaEwCJc2VjcDI1NmsxoQJ-3NmhyfH63mVHv81ZlfG95tW6RwHPh_4S5To1eqbJhYN0Y3CCJAaDdWRwgiQG,enr:-J24QAsDW6Q83Cxb_qZaKtjm4jkhYWX7S3zDOoore9_1gjgge-POCzksofNo-27mbnthX7T9m4y7tr6t5Limw52TVVqGAYv0JGdPgmlkgnY0gmlwhDavnMmHb3BzdGFja4PaEwCJc2VjcDI1NmsxoQM1128eBAblNUFycltYl2B6mvhDWuFs1ZInCkByriIWY4N0Y3CCJAaDdWRwgiQG,enr:-J24QNkAGsc3ptRO1I23guIZh6kPZfLRlkWRX5U--Fk3X27fdSnq3giOAOTsRFNDgUeuNy5wrpKBWR_5TueJTMRmg4eGAYv0JIFbgmlkgnY0gmlwhDbZXGmHb3BzdGFja4PaEwCJc2VjcDI1NmsxoQO8_h2GFnyeoW1GoxgGYtg_0qIXgO5IFdEsvXaCBh6RcIN0Y3CCJAaDdWRwgiQGenr:-J24QLWXBXHni0E8pqwsAxCpqq-W1-J9MIABLFpG3WQmNF_SGsHBLbxQXojGIFFMq904Hy9Q9uU9BDRwgm-6hmx50FOGAZoNhRvjgmlkgnY0gmlwhCigGzaHb3BzdGFja4PbEwCJc2VjcDI1NmsxoQJlIOBp-Tsu0KwuFBG8Nd_YyjvqgHJbrxqGHKfdLvQG4IN0Y3CCeMuDdWRwgnjL,enr:-J24QKkRJDmCMshdvGbg37TBi5kgVV5iHI-_o-M9aGfaSrMJHUUop6XXhSGZz-E_bBb_cUMsMClt2VWesE_I0u6zI2mGAZoNdD-IgmlkgnY0gmlwhA_MbmOHb3BzdGFja4PbEwCJc2VjcDI1NmsxoQJR7V9CwGDb4Xd7r9qu_nOluNy9HGI7E2WMQ6e60G6P8oN0Y3CCeMuDdWRwgnjL
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15294
- KONA_NODE_P2P_LISTEN_UDP_PORT=15294
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
fraxtal-testnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/fraxtal/testnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.fraxtal-testnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/fraxtal-testnet-archive/node
- traefik.http.services.fraxtal-testnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/fraxtal-testnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/fraxtal-testnet-archive/node`)}
- traefik.http.routers.fraxtal-testnet-op-geth-archive-leveldb-hash-node.middlewares=fraxtal-testnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
fraxtal-testnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: fraxtal-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,204 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/fraxtal-testnet-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/fraxtal-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
fraxtal-testnet:
image: ${FRAXTAL_GETH_IMAGE:-ghcr.io/fraxfinance/fraxtal-op-geth}:${FRAXTAL_TESTNET_GETH_VERSION:-v1.101702.1-frax-1.3.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_BOOTNODES=enr:-KO4QFOGWnVckCqXKTpKAPU_AZJmIbRjz8PTwPjkLgKJ9H_1bQT3fx57hU5OWeBqoLJ4Wa_VfA4paKQ_O-l7CJxj8ECGAZoNhOM7g2V0aMfGhGTaoWCAgmlkgnY0gmlwhCigGzaJc2VjcDI1NmsxoQJHFjvlp9CAbQ-YbO-QglEnykeVDLW8chF72qYUhax0T4RzbmFwwIN0Y3CCdmKDdWRwgnZi,enr:-KO4QCRQ8XyyqzjjYV2NcGWNc6R-kaMhp8KyYw-8mxoGbHsvUbBCO2H8f7PjtDE_ce85nSfcnVgHzfiqhpLvl5aSONWGAZoNdAX-g2V0aMfGhGTaoWCAgmlkgnY0gmlwhA_MbmOJc2VjcDI1NmsxoQO0Z6xvk6FhoaOAiEfRYHfjD5iBD-l0DFSn61-Y2Rf6VYRzbmFwwIN0Y3CCdmKDdWRwgnZi
- GETH_OVERRIDE_CANYON=0
- GETH_OVERRIDE_ECOTONE=0
- GETH_OVERRIDE_FJORD=0
- GETH_OVERRIDE_GRANITE=0
- GETH_OVERRIDE_HOLOCENE=0
- GETH_OVERRIDE_ISTHMUS=0
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.testnet.frax.com
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=full --datadir /data init --state.scheme=path /config/genesis.json; exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --networkid=2523
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${FRAXTAL_TESTNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-fraxtal-testnet-op-geth-pruned-pebble-path}:/data
- ./op/fraxtal/testnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.fraxtal-testnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/fraxtal-testnet
- traefik.http.services.fraxtal-testnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/fraxtal-testnet`) || Path(`/fraxtal-testnet/`))}
- ${NO_SSL:+traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path.rule=Path(`/fraxtal-testnet`) || Path(`/fraxtal-testnet/`)}
- traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path.middlewares=fraxtal-testnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
fraxtal-testnet-node:
image: ${FRAXTAL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${FRAXTAL_TESTNET_KONA_VERSION:-v1.6.1}
ports:
- 16370:16370
- 16370:16370/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_HOODI_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${FRAXTAL_TESTNET_L1_EXECUTION_RPC:-${ETHEREUM_HOODI_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_HOODI_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=2523
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://fraxtal-testnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_BOOTNODES=enr:-J24QMswfOBuPJnTjWPN7p-jZDXlB0VIYznPmpbmdkYM6rWKXc9nP34X5iMECUJmO-r-ebFdB0lKKyCtwMx1K2iOWb6GAYv0JJTPgmlkgnY0gmlwhDaUK8yHb3BzdGFja4PaEwCJc2VjcDI1NmsxoQJ-3NmhyfH63mVHv81ZlfG95tW6RwHPh_4S5To1eqbJhYN0Y3CCJAaDdWRwgiQG,enr:-J24QAsDW6Q83Cxb_qZaKtjm4jkhYWX7S3zDOoore9_1gjgge-POCzksofNo-27mbnthX7T9m4y7tr6t5Limw52TVVqGAYv0JGdPgmlkgnY0gmlwhDavnMmHb3BzdGFja4PaEwCJc2VjcDI1NmsxoQM1128eBAblNUFycltYl2B6mvhDWuFs1ZInCkByriIWY4N0Y3CCJAaDdWRwgiQG,enr:-J24QNkAGsc3ptRO1I23guIZh6kPZfLRlkWRX5U--Fk3X27fdSnq3giOAOTsRFNDgUeuNy5wrpKBWR_5TueJTMRmg4eGAYv0JIFbgmlkgnY0gmlwhDbZXGmHb3BzdGFja4PaEwCJc2VjcDI1NmsxoQO8_h2GFnyeoW1GoxgGYtg_0qIXgO5IFdEsvXaCBh6RcIN0Y3CCJAaDdWRwgiQGenr:-J24QLWXBXHni0E8pqwsAxCpqq-W1-J9MIABLFpG3WQmNF_SGsHBLbxQXojGIFFMq904Hy9Q9uU9BDRwgm-6hmx50FOGAZoNhRvjgmlkgnY0gmlwhCigGzaHb3BzdGFja4PbEwCJc2VjcDI1NmsxoQJlIOBp-Tsu0KwuFBG8Nd_YyjvqgHJbrxqGHKfdLvQG4IN0Y3CCeMuDdWRwgnjL,enr:-J24QKkRJDmCMshdvGbg37TBi5kgVV5iHI-_o-M9aGfaSrMJHUUop6XXhSGZz-E_bBb_cUMsMClt2VWesE_I0u6zI2mGAZoNdD-IgmlkgnY0gmlwhA_MbmOHb3BzdGFja4PbEwCJc2VjcDI1NmsxoQJR7V9CwGDb4Xd7r9qu_nOluNy9HGI7E2WMQ6e60G6P8oN0Y3CCeMuDdWRwgnjL
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=16370
- KONA_NODE_P2P_LISTEN_UDP_PORT=16370
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
fraxtal-testnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/fraxtal/testnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.fraxtal-testnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/fraxtal-testnet/node
- traefik.http.services.fraxtal-testnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/fraxtal-testnet/node`)}
- ${NO_SSL:+traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/fraxtal-testnet/node`)}
- traefik.http.routers.fraxtal-testnet-op-geth-pruned-pebble-path-node.middlewares=fraxtal-testnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
fraxtal-testnet-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: fraxtal-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,222 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/hashkeychain-mainnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/hashkeychain-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
hashkeychain-mainnet-archive-init:
image: alpine:3.21
user: root
entrypoint: [/bin/sh, -c]
command:
- |
apk add --no-cache curl wget
mkdir -p /config
[ -f /config/genesis.json ] || curl -fsSL -o /config/genesis.json "https://hashkeychain.s3.ap-southeast-1.amazonaws.com/mainnet/genesis.json"
restart: no
networks:
- chains
volumes:
- ${HASHKEYCHAIN_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_CONFIG:-hashkeychain-mainnet-op-geth-archive-leveldb-hash_config}:/config
logging: *logging-defaults
hashkeychain-mainnet-archive:
image: ${HASHKEYCHAIN_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${HASHKEYCHAIN_MAINNET_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 14113:14113
- 14113:14113/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_BOOTNODES=enode://5ecd6d2054a58fa00729b73396044a35e6aceeafe58373d2f26b3f50a3934175fb56f8efa538381430889771613beaabf1177805910bbd34e4b4840320914690@mainnet-bootnodes.hsk.xyz:30615,enode://bd244da2a066e15f82d4bfb7f2732c5b5bac44cefb36cefef01a4c0e87e72b42004d012c9a294b8402ebf67491777f280ffbcc93a71157921d6d358b19ddac67@mainnet-bootnodes.hsk.xyz:30616,enode://a5bba6459ac3a075a4a8941478a4ef8d167460191c89632004b17e4b2d7beea52cdc1a2d376f35e996ad44ccac8db25f900700aad6991d015bdc4db072832063@mainnet-bootnodes.hsk.xyz:30617
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://mainnet.hsk.xyz
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=leveldb --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --bootnodes=enode://5ecd6d2054a58fa00729b73396044a35e6aceeafe58373d2f26b3f50a3934175fb56f8efa538381430889771613beaabf1177805910bbd34e4b4840320914690@mainnet-bootnodes.hsk.xyz:30615,enode://bd244da2a066e15f82d4bfb7f2732c5b5bac44cefb36cefef01a4c0e87e72b42004d012c9a294b8402ebf67491777f280ffbcc93a71157921d6d358b19ddac67@mainnet-bootnodes.hsk.xyz:30616,enode://a5bba6459ac3a075a4a8941478a4ef8d167460191c89632004b17e4b2d7beea52cdc1a2d376f35e996ad44ccac8db25f900700aad6991d015bdc4db072832063@mainnet-bootnodes.hsk.xyz:30617
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=177
- --port=14113
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
depends_on:
hashkeychain-mainnet-archive-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${HASHKEYCHAIN_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_CONFIG:-hashkeychain-mainnet-op-geth-archive-leveldb-hash_config}:/config
- ${HASHKEYCHAIN_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-hashkeychain-mainnet-op-geth-archive-leveldb-hash}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-mainnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/hashkeychain-mainnet-archive
- traefik.http.services.hashkeychain-mainnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/hashkeychain-mainnet-archive`) || Path(`/hashkeychain-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash.rule=Path(`/hashkeychain-mainnet-archive`) || Path(`/hashkeychain-mainnet-archive/`)}
- traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash.middlewares=hashkeychain-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
hashkeychain-mainnet-archive-node:
image: ${HASHKEYCHAIN_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${HASHKEYCHAIN_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 19113:19113
- 19113:19113/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${HASHKEYCHAIN_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=177
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://hashkeychain-mainnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=19113
- KONA_NODE_P2P_LISTEN_UDP_PORT=19113
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
hashkeychain-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-mainnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/hashkeychain-mainnet-archive/node
- traefik.http.services.hashkeychain-mainnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/hashkeychain-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/hashkeychain-mainnet-archive/node`)}
- traefik.http.routers.hashkeychain-mainnet-op-geth-archive-leveldb-hash-node.middlewares=hashkeychain-mainnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
hashkeychain-mainnet-op-geth-archive-leveldb-hash:
hashkeychain-mainnet-op-geth-archive-leveldb-hash_config:
x-ephemeral-volumes:
- hashkeychain-mainnet-op-geth-archive-leveldb-hash_config
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: hashkey
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -144,7 +144,7 @@ services:
logging: *logging-defaults
hashkeychain-mainnet-archive-node:
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_MAINNET_NODE_VERSION:-v1.19.1}
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 19113:19113
- 19113:19113/udp
@@ -1,224 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/hashkeychain-mainnet-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/hashkeychain-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
hashkeychain-mainnet-init:
image: alpine:3.21
user: root
entrypoint: [/bin/sh, -c]
command:
- |
apk add --no-cache curl wget
mkdir -p /config
[ -f /config/genesis.json ] || curl -fsSL -o /config/genesis.json "https://hashkeychain.s3.ap-southeast-1.amazonaws.com/mainnet/genesis.json"
restart: no
networks:
- chains
volumes:
- ${HASHKEYCHAIN_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_CONFIG:-hashkeychain-mainnet-op-geth-pruned-pebble-path_config}:/config
logging: *logging-defaults
hashkeychain-mainnet:
image: ${HASHKEYCHAIN_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${HASHKEYCHAIN_MAINNET_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 12188:12188
- 12188:12188/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_BOOTNODES=enode://5ecd6d2054a58fa00729b73396044a35e6aceeafe58373d2f26b3f50a3934175fb56f8efa538381430889771613beaabf1177805910bbd34e4b4840320914690@mainnet-bootnodes.hsk.xyz:30615,enode://bd244da2a066e15f82d4bfb7f2732c5b5bac44cefb36cefef01a4c0e87e72b42004d012c9a294b8402ebf67491777f280ffbcc93a71157921d6d358b19ddac67@mainnet-bootnodes.hsk.xyz:30616,enode://a5bba6459ac3a075a4a8941478a4ef8d167460191c89632004b17e4b2d7beea52cdc1a2d376f35e996ad44ccac8db25f900700aad6991d015bdc4db072832063@mainnet-bootnodes.hsk.xyz:30617
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://mainnet.hsk.xyz
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=full --datadir /data init --state.scheme=path /config/genesis.json; exec geth "$@"' --
command:
- --bootnodes=enode://5ecd6d2054a58fa00729b73396044a35e6aceeafe58373d2f26b3f50a3934175fb56f8efa538381430889771613beaabf1177805910bbd34e4b4840320914690@mainnet-bootnodes.hsk.xyz:30615,enode://bd244da2a066e15f82d4bfb7f2732c5b5bac44cefb36cefef01a4c0e87e72b42004d012c9a294b8402ebf67491777f280ffbcc93a71157921d6d358b19ddac67@mainnet-bootnodes.hsk.xyz:30616,enode://a5bba6459ac3a075a4a8941478a4ef8d167460191c89632004b17e4b2d7beea52cdc1a2d376f35e996ad44ccac8db25f900700aad6991d015bdc4db072832063@mainnet-bootnodes.hsk.xyz:30617
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=177
- --port=12188
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=snap
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
depends_on:
hashkeychain-mainnet-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${HASHKEYCHAIN_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_CONFIG:-hashkeychain-mainnet-op-geth-pruned-pebble-path_config}:/config
- ${HASHKEYCHAIN_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-hashkeychain-mainnet-op-geth-pruned-pebble-path}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-mainnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/hashkeychain-mainnet
- traefik.http.services.hashkeychain-mainnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/hashkeychain-mainnet`) || Path(`/hashkeychain-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path.rule=Path(`/hashkeychain-mainnet`) || Path(`/hashkeychain-mainnet/`)}
- traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path.middlewares=hashkeychain-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
hashkeychain-mainnet-node:
image: ${HASHKEYCHAIN_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${HASHKEYCHAIN_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 17188:17188
- 17188:17188/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${HASHKEYCHAIN_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=177
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://hashkeychain-mainnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=17188
- KONA_NODE_P2P_LISTEN_UDP_PORT=17188
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
hashkeychain-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-mainnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/hashkeychain-mainnet/node
- traefik.http.services.hashkeychain-mainnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/hashkeychain-mainnet/node`)}
- ${NO_SSL:+traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/hashkeychain-mainnet/node`)}
- traefik.http.routers.hashkeychain-mainnet-op-geth-pruned-pebble-path-node.middlewares=hashkeychain-mainnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
hashkeychain-mainnet-op-geth-pruned-pebble-path:
hashkeychain-mainnet-op-geth-pruned-pebble-path_config:
x-ephemeral-volumes:
- hashkeychain-mainnet-op-geth-pruned-pebble-path_config
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: hashkey
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -144,7 +144,7 @@ services:
logging: *logging-defaults
hashkeychain-mainnet-node:
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_MAINNET_NODE_VERSION:-v1.19.1}
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 17188:17188
- 17188:17188/udp
@@ -1,220 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/hashkeychain-testnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/hashkeychain-testnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
hashkeychain-testnet-archive-init:
image: alpine:3.21
user: root
entrypoint: [/bin/sh, -c]
command:
- |
apk add --no-cache curl wget
mkdir -p /config
[ -f /config/genesis.json ] || curl -fsSL -o /config/genesis.json "https://hashkeychain.s3.ap-southeast-1.amazonaws.com/testnet/genesis.json"
restart: no
networks:
- chains
volumes:
- ./op/hashkeychain/testnet:/config
logging: *logging-defaults
hashkeychain-testnet-archive:
image: ${HASHKEYCHAIN_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${HASHKEYCHAIN_TESTNET_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 10789:10789
- 10789:10789/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_BOOTNODES=enode://0492e74fb10579a3c53a327ee42dc70db35e7e0aebd73793a806afccb86b30acecb8fe9d024e06bb3fd154c678926d884df3ae696c71adcbf1339a5762e19c4d@testnet-bootnodes.hsk.xyz:30303,enode://dba82c6b384844a00a54ecdfcb34c209ea714072558db80512d4c65e760846d054cf3f58a826cba33b6b410498559b7e41b147dfa487f8cba3d25d2b5bb9e7bc@testnet-bootnodes.hsk.xyz:30304
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://testnet.hsk.xyz
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=leveldb --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --bootnodes=enode://0492e74fb10579a3c53a327ee42dc70db35e7e0aebd73793a806afccb86b30acecb8fe9d024e06bb3fd154c678926d884df3ae696c71adcbf1339a5762e19c4d@testnet-bootnodes.hsk.xyz:30303,enode://dba82c6b384844a00a54ecdfcb34c209ea714072558db80512d4c65e760846d054cf3f58a826cba33b6b410498559b7e41b147dfa487f8cba3d25d2b5bb9e7bc@testnet-bootnodes.hsk.xyz:30304
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=133
- --port=10789
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
depends_on:
hashkeychain-testnet-archive-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${HASHKEYCHAIN_TESTNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-hashkeychain-testnet-op-geth-archive-leveldb-hash}:/data
- ./op/hashkeychain/testnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-testnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/hashkeychain-testnet-archive
- traefik.http.services.hashkeychain-testnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/hashkeychain-testnet-archive`) || Path(`/hashkeychain-testnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash.rule=Path(`/hashkeychain-testnet-archive`) || Path(`/hashkeychain-testnet-archive/`)}
- traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash.middlewares=hashkeychain-testnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
hashkeychain-testnet-archive-node:
image: ${HASHKEYCHAIN_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${HASHKEYCHAIN_TESTNET_KONA_VERSION:-v1.6.1}
ports:
- 15789:15789
- 15789:15789/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${HASHKEYCHAIN_TESTNET_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=133
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://hashkeychain-testnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15789
- KONA_NODE_P2P_LISTEN_UDP_PORT=15789
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
hashkeychain-testnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/hashkeychain/testnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-testnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/hashkeychain-testnet-archive/node
- traefik.http.services.hashkeychain-testnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/hashkeychain-testnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/hashkeychain-testnet-archive/node`)}
- traefik.http.routers.hashkeychain-testnet-op-geth-archive-leveldb-hash-node.middlewares=hashkeychain-testnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
hashkeychain-testnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: hashkey-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -144,7 +144,7 @@ services:
logging: *logging-defaults
hashkeychain-testnet-archive-node:
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_TESTNET_NODE_VERSION:-v1.19.1}
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_TESTNET_NODE_VERSION:-v1.19.0}
ports:
- 15789:15789
- 15789:15789/udp
@@ -1,220 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/hashkeychain-testnet-op-geth-pruned-pebble-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/hashkeychain-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
hashkeychain-testnet-init:
image: alpine:3.21
user: root
entrypoint: [/bin/sh, -c]
command:
- |
apk add --no-cache curl wget
mkdir -p /config
[ -f /config/genesis.json ] || curl -fsSL -o /config/genesis.json "https://hashkeychain.s3.ap-southeast-1.amazonaws.com/testnet/genesis.json"
restart: no
networks:
- chains
volumes:
- ./op/hashkeychain/testnet:/config
logging: *logging-defaults
hashkeychain-testnet:
image: ${HASHKEYCHAIN_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${HASHKEYCHAIN_TESTNET_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 12091:12091
- 12091:12091/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_BOOTNODES=enode://0492e74fb10579a3c53a327ee42dc70db35e7e0aebd73793a806afccb86b30acecb8fe9d024e06bb3fd154c678926d884df3ae696c71adcbf1339a5762e19c4d@testnet-bootnodes.hsk.xyz:30303,enode://dba82c6b384844a00a54ecdfcb34c209ea714072558db80512d4c65e760846d054cf3f58a826cba33b6b410498559b7e41b147dfa487f8cba3d25d2b5bb9e7bc@testnet-bootnodes.hsk.xyz:30304
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://testnet.hsk.xyz
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=full --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --bootnodes=enode://0492e74fb10579a3c53a327ee42dc70db35e7e0aebd73793a806afccb86b30acecb8fe9d024e06bb3fd154c678926d884df3ae696c71adcbf1339a5762e19c4d@testnet-bootnodes.hsk.xyz:30303,enode://dba82c6b384844a00a54ecdfcb34c209ea714072558db80512d4c65e760846d054cf3f58a826cba33b6b410498559b7e41b147dfa487f8cba3d25d2b5bb9e7bc@testnet-bootnodes.hsk.xyz:30304
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=133
- --port=12091
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
depends_on:
hashkeychain-testnet-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${HASHKEYCHAIN_TESTNET_OP_GETH_PRUNED_PEBBLE_HASH_DATA:-hashkeychain-testnet-op-geth-pruned-pebble-hash}:/data
- ./op/hashkeychain/testnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-testnet-op-geth-pruned-pebble-hash-stripprefix.stripprefix.prefixes=/hashkeychain-testnet
- traefik.http.services.hashkeychain-testnet-op-geth-pruned-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/hashkeychain-testnet`) || Path(`/hashkeychain-testnet/`))}
- ${NO_SSL:+traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash.rule=Path(`/hashkeychain-testnet`) || Path(`/hashkeychain-testnet/`)}
- traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash.middlewares=hashkeychain-testnet-op-geth-pruned-pebble-hash-stripprefix, ipallowlist
hashkeychain-testnet-node:
image: ${HASHKEYCHAIN_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${HASHKEYCHAIN_TESTNET_KONA_VERSION:-v1.6.1}
ports:
- 17091:17091
- 17091:17091/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${HASHKEYCHAIN_TESTNET_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=133
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://hashkeychain-testnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=17091
- KONA_NODE_P2P_LISTEN_UDP_PORT=17091
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
hashkeychain-testnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/hashkeychain/testnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-testnet-op-geth-pruned-pebble-hash-node-stripprefix.stripprefix.prefixes=/hashkeychain-testnet/node
- traefik.http.services.hashkeychain-testnet-op-geth-pruned-pebble-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/hashkeychain-testnet/node`)}
- ${NO_SSL:+traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash-node.rule=PathPrefix(`/hashkeychain-testnet/node`)}
- traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-hash-node.middlewares=hashkeychain-testnet-op-geth-pruned-pebble-hash-node-stripprefix, ipallowlist
volumes:
hashkeychain-testnet-op-geth-pruned-pebble-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: hashkey-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -144,7 +144,7 @@ services:
logging: *logging-defaults
hashkeychain-testnet-node:
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_TESTNET_NODE_VERSION:-v1.19.1}
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_TESTNET_NODE_VERSION:-v1.19.0}
ports:
- 17091:17091
- 17091:17091/udp
@@ -1,222 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/hashkeychain-testnet-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/hashkeychain-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
hashkeychain-testnet-init:
image: alpine:3.21
user: root
entrypoint: [/bin/sh, -c]
command:
- |
apk add --no-cache curl wget
mkdir -p /config
[ -f /config/genesis.json ] || curl -fsSL -o /config/genesis.json "https://hashkeychain.s3.ap-southeast-1.amazonaws.com/testnet/genesis.json"
restart: no
networks:
- chains
volumes:
- ./op/hashkeychain/testnet:/config
logging: *logging-defaults
hashkeychain-testnet:
image: ${HASHKEYCHAIN_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${HASHKEYCHAIN_TESTNET_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 11009:11009
- 11009:11009/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_BOOTNODES=enode://0492e74fb10579a3c53a327ee42dc70db35e7e0aebd73793a806afccb86b30acecb8fe9d024e06bb3fd154c678926d884df3ae696c71adcbf1339a5762e19c4d@testnet-bootnodes.hsk.xyz:30303,enode://dba82c6b384844a00a54ecdfcb34c209ea714072558db80512d4c65e760846d054cf3f58a826cba33b6b410498559b7e41b147dfa487f8cba3d25d2b5bb9e7bc@testnet-bootnodes.hsk.xyz:30304
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://testnet.hsk.xyz
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=full --datadir /data init --state.scheme=path /config/genesis.json; exec geth "$@"' --
command:
- --bootnodes=enode://0492e74fb10579a3c53a327ee42dc70db35e7e0aebd73793a806afccb86b30acecb8fe9d024e06bb3fd154c678926d884df3ae696c71adcbf1339a5762e19c4d@testnet-bootnodes.hsk.xyz:30303,enode://dba82c6b384844a00a54ecdfcb34c209ea714072558db80512d4c65e760846d054cf3f58a826cba33b6b410498559b7e41b147dfa487f8cba3d25d2b5bb9e7bc@testnet-bootnodes.hsk.xyz:30304
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=133
- --port=11009
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=snap
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
depends_on:
hashkeychain-testnet-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${HASHKEYCHAIN_TESTNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-hashkeychain-testnet-op-geth-pruned-pebble-path}:/data
- ./op/hashkeychain/testnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-testnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/hashkeychain-testnet
- traefik.http.services.hashkeychain-testnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/hashkeychain-testnet`) || Path(`/hashkeychain-testnet/`))}
- ${NO_SSL:+traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path.rule=Path(`/hashkeychain-testnet`) || Path(`/hashkeychain-testnet/`)}
- traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path.middlewares=hashkeychain-testnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
hashkeychain-testnet-node:
image: ${HASHKEYCHAIN_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${HASHKEYCHAIN_TESTNET_KONA_VERSION:-v1.6.1}
ports:
- 16009:16009
- 16009:16009/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${HASHKEYCHAIN_TESTNET_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=133
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://hashkeychain-testnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=16009
- KONA_NODE_P2P_LISTEN_UDP_PORT=16009
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
hashkeychain-testnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/hashkeychain/testnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.hashkeychain-testnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/hashkeychain-testnet/node
- traefik.http.services.hashkeychain-testnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/hashkeychain-testnet/node`)}
- ${NO_SSL:+traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/hashkeychain-testnet/node`)}
- traefik.http.routers.hashkeychain-testnet-op-geth-pruned-pebble-path-node.middlewares=hashkeychain-testnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
hashkeychain-testnet-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: hashkey-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -144,7 +144,7 @@ services:
logging: *logging-defaults
hashkeychain-testnet-node:
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_TESTNET_NODE_VERSION:-v1.19.1}
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_TESTNET_NODE_VERSION:-v1.19.0}
ports:
- 16009:16009
- 16009:16009/udp
@@ -107,7 +107,7 @@ services:
- traefik.http.routers.ink-mainnet-op-geth-archive-leveldb-hash.middlewares=ink-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
ink-mainnet-archive-node:
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_MAINNET_NODE_VERSION:-v1.19.1}
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 15713:15713
- 15713:15713/udp
@@ -107,7 +107,7 @@ services:
- traefik.http.routers.ink-mainnet-op-geth-pruned-pebble-path.middlewares=ink-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
ink-mainnet-node:
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_MAINNET_NODE_VERSION:-v1.19.1}
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 16271:16271
- 16271:16271/udp
@@ -107,7 +107,7 @@ services:
- traefik.http.routers.ink-sepolia-op-geth-archive-leveldb-hash.middlewares=ink-sepolia-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
ink-sepolia-archive-node:
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 16659:16659
- 16659:16659/udp
@@ -107,7 +107,7 @@ services:
- traefik.http.routers.ink-sepolia-op-geth-pruned-pebble-path.middlewares=ink-sepolia-op-geth-pruned-pebble-path-stripprefix, ipallowlist
ink-sepolia-node:
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 16869:16869
- 16869:16869/udp
@@ -105,7 +105,7 @@ services:
- traefik.http.routers.katana-testnet-op-geth-archive-leveldb-hash.middlewares=katana-testnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
katana-testnet-archive-node:
image: ${KATANA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${KATANA_TESTNET_NODE_VERSION:-v1.19.1}
image: ${KATANA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${KATANA_TESTNET_NODE_VERSION:-v1.19.0}
ports:
- 19922:19922
- 19922:19922/udp
@@ -105,7 +105,7 @@ services:
- traefik.http.routers.katana-testnet-op-geth-pruned-pebble-path.middlewares=katana-testnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
katana-testnet-node:
image: ${KATANA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${KATANA_TESTNET_NODE_VERSION:-v1.19.1}
image: ${KATANA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${KATANA_TESTNET_NODE_VERSION:-v1.19.0}
ports:
- 19484:19484
- 19484:19484/udp
@@ -110,7 +110,7 @@ services:
- traefik.http.routers.lisk-mainnet-op-geth-archive-leveldb-hash.middlewares=lisk-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
lisk-mainnet-archive-node:
image: ${LISK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${LISK_MAINNET_NODE_VERSION:-v1.19.1}
image: ${LISK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${LISK_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 16157:16157
- 16157:16157/udp
@@ -1,198 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/manta-pacific-mainnet-op-geth-archive-pebble-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/manta-pacific-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
manta-pacific-mainnet-archive:
image: ${MANTA_PACIFIC_GETH_IMAGE:-public.ecr.aws/i6b2w2n6/op-geth}:${MANTA_PACIFIC_MAINNET_GETH_VERSION:-5.2.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 11437:11437
- 11437:11437/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://manta-pacific.calderachain.xyz/http
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=169
- --port=11437
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=web3,net,eth,debug,admin
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=web3,net,eth,debug,admin
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${MANTA_PACIFIC_MAINNET_OP_GETH_ARCHIVE_PEBBLE_HASH_DATA:-manta-pacific-mainnet-op-geth-archive-pebble-hash}:/data
- ./op/manta-pacific/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.manta-pacific-mainnet-op-geth-archive-pebble-hash-stripprefix.stripprefix.prefixes=/manta-pacific-mainnet-archive
- traefik.http.services.manta-pacific-mainnet-op-geth-archive-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/manta-pacific-mainnet-archive`) || Path(`/manta-pacific-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash.rule=Path(`/manta-pacific-mainnet-archive`) || Path(`/manta-pacific-mainnet-archive/`)}
- traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash.middlewares=manta-pacific-mainnet-op-geth-archive-pebble-hash-stripprefix, ipallowlist
manta-pacific-mainnet-archive-node:
image: ${MANTA_PACIFIC_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${MANTA_PACIFIC_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 16437:16437
- 16437:16437/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${MANTA_PACIFIC_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=169
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://manta-pacific-mainnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=16437
- KONA_NODE_P2P_LISTEN_UDP_PORT=16437
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
manta-pacific-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/manta-pacific/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.manta-pacific-mainnet-op-geth-archive-pebble-hash-node-stripprefix.stripprefix.prefixes=/manta-pacific-mainnet-archive/node
- traefik.http.services.manta-pacific-mainnet-op-geth-archive-pebble-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/manta-pacific-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash-node.rule=PathPrefix(`/manta-pacific-mainnet-archive/node`)}
- traefik.http.routers.manta-pacific-mainnet-op-geth-archive-pebble-hash-node.middlewares=manta-pacific-mainnet-op-geth-archive-pebble-hash-node-stripprefix, ipallowlist
volumes:
manta-pacific-mainnet-op-geth-archive-pebble-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: manta-pacific
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -1,196 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/metal-mainnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/metal-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
metal-mainnet-archive:
image: ${METAL_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${METAL_MAINNET_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 10324:10324
- 10324:10324/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OP_NETWORK=metal-mainnet
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.metall2.com
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --port=10324
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${METAL_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-metal-mainnet-op-geth-archive-leveldb-hash}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.metal-mainnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/metal-mainnet-archive
- traefik.http.services.metal-mainnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/metal-mainnet-archive`) || Path(`/metal-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash.rule=Path(`/metal-mainnet-archive`) || Path(`/metal-mainnet-archive/`)}
- traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash.middlewares=metal-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
metal-mainnet-archive-node:
image: ${METAL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${METAL_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 15324:15324
- 15324:15324/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${METAL_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=1750
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://metal-mainnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15324
- KONA_NODE_P2P_LISTEN_UDP_PORT=15324
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
metal-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.metal-mainnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/metal-mainnet-archive/node
- traefik.http.services.metal-mainnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/metal-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/metal-mainnet-archive/node`)}
- traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash-node.middlewares=metal-mainnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
metal-mainnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: metall2
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -107,7 +107,7 @@ services:
- traefik.http.routers.metal-mainnet-op-geth-archive-leveldb-hash.middlewares=metal-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
metal-mainnet-archive-node:
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_MAINNET_NODE_VERSION:-v1.19.1}
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 15324:15324
- 15324:15324/udp
@@ -1,198 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/metal-mainnet-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/metal-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
metal-mainnet:
image: ${METAL_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${METAL_MAINNET_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 12821:12821
- 12821:12821/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OP_NETWORK=metal-mainnet
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.metall2.com
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --port=12821
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=snap
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${METAL_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-metal-mainnet-op-geth-pruned-pebble-path}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.metal-mainnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/metal-mainnet
- traefik.http.services.metal-mainnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/metal-mainnet`) || Path(`/metal-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path.rule=Path(`/metal-mainnet`) || Path(`/metal-mainnet/`)}
- traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path.middlewares=metal-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
metal-mainnet-node:
image: ${METAL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${METAL_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 17821:17821
- 17821:17821/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${METAL_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=1750
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://metal-mainnet:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=17821
- KONA_NODE_P2P_LISTEN_UDP_PORT=17821
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
metal-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.metal-mainnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/metal-mainnet/node
- traefik.http.services.metal-mainnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/metal-mainnet/node`)}
- ${NO_SSL:+traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/metal-mainnet/node`)}
- traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path-node.middlewares=metal-mainnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
metal-mainnet-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: metall2
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -107,7 +107,7 @@ services:
- traefik.http.routers.metal-mainnet-op-geth-pruned-pebble-path.middlewares=metal-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
metal-mainnet-node:
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_MAINNET_NODE_VERSION:-v1.19.1}
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_MAINNET_NODE_VERSION:-v1.19.0}
ports:
- 17821:17821
- 17821:17821/udp
@@ -1,193 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/metal-sepolia-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/metal-sepolia-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
metal-sepolia-archive:
image: ${METAL_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${METAL_SEPOLIA_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OP_NETWORK=metal-sepolia
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://testnet.rpc.metall2.com
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${METAL_SEPOLIA_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-metal-sepolia-op-geth-archive-leveldb-hash}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.metal-sepolia-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/metal-sepolia-archive
- traefik.http.services.metal-sepolia-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/metal-sepolia-archive`) || Path(`/metal-sepolia-archive/`))}
- ${NO_SSL:+traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash.rule=Path(`/metal-sepolia-archive`) || Path(`/metal-sepolia-archive/`)}
- traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash.middlewares=metal-sepolia-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
metal-sepolia-archive-node:
image: ${METAL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${METAL_SEPOLIA_KONA_VERSION:-v1.6.1}
ports:
- 19770:19770
- 19770:19770/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${METAL_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=1740
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://metal-sepolia-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=19770
- KONA_NODE_P2P_LISTEN_UDP_PORT=19770
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
metal-sepolia-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.metal-sepolia-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/metal-sepolia-archive/node
- traefik.http.services.metal-sepolia-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/metal-sepolia-archive/node`)}
- ${NO_SSL:+traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/metal-sepolia-archive/node`)}
- traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash-node.middlewares=metal-sepolia-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
metal-sepolia-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: metall2-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -103,7 +103,7 @@ services:
- traefik.http.routers.metal-sepolia-op-geth-archive-leveldb-hash.middlewares=metal-sepolia-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
metal-sepolia-archive-node:
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 19770:19770
- 19770:19770/udp
@@ -1,195 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/metal-sepolia-op-geth-pruned-pebble-path--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/metal-sepolia \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
metal-sepolia:
image: ${METAL_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${METAL_SEPOLIA_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_OP_NETWORK=metal-sepolia
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://testnet.rpc.metall2.com
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${METAL_SEPOLIA_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-metal-sepolia-op-geth-pruned-pebble-path}:/data
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.metal-sepolia-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/metal-sepolia
- traefik.http.services.metal-sepolia-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/metal-sepolia`) || Path(`/metal-sepolia/`))}
- ${NO_SSL:+traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path.rule=Path(`/metal-sepolia`) || Path(`/metal-sepolia/`)}
- traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path.middlewares=metal-sepolia-op-geth-pruned-pebble-path-stripprefix, ipallowlist
metal-sepolia-node:
image: ${METAL_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${METAL_SEPOLIA_KONA_VERSION:-v1.6.1}
ports:
- 19701:19701
- 19701:19701/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${METAL_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=1740
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://metal-sepolia:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_OVERRIDE_PECTRA_BLOB_SCHEDULE=1742486400
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=19701
- KONA_NODE_P2P_LISTEN_UDP_PORT=19701
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
metal-sepolia:
condition: service_started
restart: true
networks:
- chains
volumes:
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.metal-sepolia-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/metal-sepolia/node
- traefik.http.services.metal-sepolia-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/metal-sepolia/node`)}
- ${NO_SSL:+traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/metal-sepolia/node`)}
- traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path-node.middlewares=metal-sepolia-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
metal-sepolia-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: metall2-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...
@@ -103,7 +103,7 @@ services:
- traefik.http.routers.metal-sepolia-op-geth-pruned-pebble-path.middlewares=metal-sepolia-op-geth-pruned-pebble-path-stripprefix, ipallowlist
metal-sepolia-node:
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_SEPOLIA_NODE_VERSION:-v1.19.1}
image: ${METAL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${METAL_SEPOLIA_NODE_VERSION:-v1.19.0}
ports:
- 19701:19701
- 19701:19701/udp
@@ -1,198 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/mode-mainnet-op-geth-archive-leveldb-hash--kona.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/mode-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
mode-mainnet-archive:
image: ${MODE_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${MODE_MAINNET_GETH_VERSION:-v1.101702.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 10430:10430
- 10430:10430/udp
expose:
- 8545
- 6060
- 8551
environment:
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://mainnet.mode.network
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=leveldb --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=34443
- --port=10430
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${MODE_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-mode-mainnet-op-geth-archive-leveldb-hash}:/data
- ./op/mode/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.mode-mainnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/mode-mainnet-archive
- traefik.http.services.mode-mainnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/mode-mainnet-archive`) || Path(`/mode-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash.rule=Path(`/mode-mainnet-archive`) || Path(`/mode-mainnet-archive/`)}
- traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash.middlewares=mode-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
mode-mainnet-archive-node:
image: ${MODE_KONA_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node}:${MODE_MAINNET_KONA_VERSION:-v1.6.1}
ports:
- 15430:15430
- 15430:15430/udp
environment:
- KONA_METRICS_ADDR=0.0.0.0
- KONA_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- KONA_NODE_L1_ETH_RPC=${MODE_MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- KONA_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- KONA_NODE_L2_CHAIN_ID=34443
- KONA_NODE_L2_ENGINE_AUTH=/jwtsecret
- KONA_NODE_L2_ENGINE_RPC=http://mode-mainnet-archive:8551
- KONA_NODE_L2_ENGINE_TIMEOUT=120000
- KONA_NODE_L2_TRUST_RPC=true
- KONA_NODE_METRICS_PORT=7300
- KONA_NODE_MODE=Validator
- KONA_NODE_P2P_ADVERTISE_IP=${IP}
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
- KONA_NODE_P2P_LISTEN_TCP_PORT=15430
- KONA_NODE_P2P_LISTEN_UDP_PORT=15430
- KONA_NODE_RPC_ADDR=0.0.0.0
- KONA_NODE_RPC_PORT=9545
entrypoint: [kona-node, node]
restart: unless-stopped
depends_on:
mode-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/mode/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.mode-mainnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/mode-mainnet-archive/node
- traefik.http.services.mode-mainnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/mode-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/mode-mainnet-archive/node`)}
- traefik.http.routers.mode-mainnet-op-geth-archive-leveldb-hash-node.middlewares=mode-mainnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
mode-mainnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: mode
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

Some files were not shown because too many files have changed in this diff Show More