Compare commits
43
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ff21f54e4 | ||
|
|
b947d7ddf3 | ||
|
|
fe22be322e | ||
|
|
d57d19276e | ||
|
|
9e3b02c273 | ||
|
|
ae058b08e2 | ||
|
|
7fd660d86b | ||
|
|
9d67715131 | ||
|
|
c61f7de962 | ||
|
|
f2b245ada5 | ||
|
|
b2ef60bfde | ||
|
|
723b6eabb7 | ||
|
|
7b785f87f6 | ||
|
|
b493ef9988 | ||
|
|
d391f7e829 | ||
|
|
ef397187f4 | ||
|
|
229ae72f12 | ||
|
|
f2644310e6 | ||
|
|
996a815da7 | ||
|
|
3e7b6719b5 | ||
|
|
bf26f66e38 | ||
|
|
0ce5465562 | ||
|
|
6dc6f6edb8 | ||
|
|
ef6decff10 | ||
|
|
b61f5ddbd0 | ||
|
|
dac23e43d1 | ||
|
|
c3a7dd9ec6 | ||
|
|
0f7b16df80 | ||
|
|
144e5ed10d | ||
|
|
5a983027f9 | ||
|
|
286b9ee963 | ||
|
|
6f34b02017 | ||
|
|
642b05e6f0 | ||
|
|
76acb60d14 | ||
|
|
b67022e0a2 | ||
|
|
9fceb4f4fd | ||
|
|
eafe2fb3da | ||
|
|
80e6a818d9 | ||
|
|
c3ada4a51b | ||
|
|
4f4b904129 | ||
|
|
3a4bbcb166 | ||
|
|
174f95ef7e | ||
|
|
b162a351be |
@@ -831,6 +831,21 @@ debugging reference, see [VIBE.md](VIBE.md).
|
||||
| `force-recreate.sh <name>` | Restart a node |
|
||||
| `backup-node.sh <name>` | Create backup |
|
||||
| `restore-volumes.sh <name>` | Restore from backup |
|
||||
| `node-facts.sh` | Emit JSON node facts documents for monitoring and inventory |
|
||||
|
||||
### node-facts.sh — one JSON facts document per node
|
||||
|
||||
`./node-facts.sh [node_path ...] [--pretty]` prints one JSON line per node (schema v1): running client
|
||||
image/tag and reported version, peer count + peer version histogram + `newer_than_us`, the protocol
|
||||
upgrade schedule the running config knows (chain config / rollup config / beacon spec / avalanche
|
||||
`info.upgrades`), chain signals (avalanche ACPs), head, and for OP-stack / beacon pairs a `consensus`
|
||||
block with the same fields for the consensus client. Every field is present; anything a client cannot
|
||||
provide is `null` with a `reason`. Read-only: compose files + `docker ps` + HTTP through the local
|
||||
traefik routes (`/<node>`, `/<node>/node`, `/<node>/eth`), parallel over nodes and calls, ~200 ms per
|
||||
host. Exit 2 with one error line if `.env`/`COMPOSE_FILE` is unreadable. Consumers: JobServer verb
|
||||
`node-facts`, controller `node-facts-collect` (CouchDB `node_facts:*`), Checkmk `node_facts_check.py`.
|
||||
Self-test (no network, no docker): `./test-node-facts.sh` runs the real main body against
|
||||
`node-facts-test/` fixtures via `NODE_FACTS_FIXTURES`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
bitcoin-cash-mainnet:
|
||||
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_MAINNET_BITCOIND_VERSION:-0.33.11}
|
||||
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_MAINNET_BITCOIND_VERSION:-0.33.13}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
|
||||
+84
-12
@@ -3699,6 +3699,78 @@
|
||||
"goat-testnet3-geth-pruned-pebble-path"
|
||||
]
|
||||
},
|
||||
{
|
||||
"chain": "alpha",
|
||||
"client": "reth",
|
||||
"compose_file": "gravity/reth/gravity-alpha-reth-pruned-trace",
|
||||
"drpc_chain": "gravity-alpha",
|
||||
"features": [
|
||||
"trace"
|
||||
],
|
||||
"network": "gravity",
|
||||
"node": "aptosbft",
|
||||
"relay": null,
|
||||
"stack": null,
|
||||
"type": "pruned",
|
||||
"volumes": [
|
||||
"gravity-alpha-reth-pruned-trace",
|
||||
"gravity-alpha-reth-pruned-trace-consensus"
|
||||
]
|
||||
},
|
||||
{
|
||||
"chain": "alpha-sepolia",
|
||||
"client": "reth",
|
||||
"compose_file": "gravity/reth/gravity-alpha-sepolia-reth-pruned-trace",
|
||||
"drpc_chain": "gravity-alpha-sepolia",
|
||||
"features": [
|
||||
"trace"
|
||||
],
|
||||
"network": "gravity",
|
||||
"node": "aptosbft",
|
||||
"relay": null,
|
||||
"stack": null,
|
||||
"type": "pruned",
|
||||
"volumes": [
|
||||
"gravity-alpha-sepolia-reth-pruned-trace",
|
||||
"gravity-alpha-sepolia-reth-pruned-trace-consensus"
|
||||
]
|
||||
},
|
||||
{
|
||||
"chain": "mainnet",
|
||||
"client": "reth",
|
||||
"compose_file": "gravity/reth/gravity-mainnet-reth-pruned-trace",
|
||||
"drpc_chain": "gravity",
|
||||
"features": [
|
||||
"trace"
|
||||
],
|
||||
"network": "gravity",
|
||||
"node": "aptosbft",
|
||||
"relay": null,
|
||||
"stack": null,
|
||||
"type": "pruned",
|
||||
"volumes": [
|
||||
"gravity-mainnet-reth-pruned-trace",
|
||||
"gravity-mainnet-reth-pruned-trace-consensus"
|
||||
]
|
||||
},
|
||||
{
|
||||
"chain": "testnet",
|
||||
"client": "reth",
|
||||
"compose_file": "gravity/reth/gravity-testnet-reth-pruned-trace",
|
||||
"drpc_chain": "gravity-testnet",
|
||||
"features": [
|
||||
"trace"
|
||||
],
|
||||
"network": "gravity",
|
||||
"node": "aptosbft",
|
||||
"relay": null,
|
||||
"stack": null,
|
||||
"type": "pruned",
|
||||
"volumes": [
|
||||
"gravity-testnet-reth-pruned-trace",
|
||||
"gravity-testnet-reth-pruned-trace-consensus"
|
||||
]
|
||||
},
|
||||
{
|
||||
"chain": "mainnet",
|
||||
"client": "haqq",
|
||||
@@ -4878,7 +4950,7 @@
|
||||
"trace"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "kona",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "archive",
|
||||
@@ -4895,7 +4967,7 @@
|
||||
"trace"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "node",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "archive",
|
||||
@@ -7195,7 +7267,7 @@
|
||||
"leveldb"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": "kona",
|
||||
"node": "node",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "archive",
|
||||
@@ -7213,7 +7285,7 @@
|
||||
"leveldb"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "node",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "archive",
|
||||
@@ -7231,7 +7303,7 @@
|
||||
"pebble"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": "kona",
|
||||
"node": "node",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "pruned",
|
||||
@@ -7249,7 +7321,7 @@
|
||||
"pebble"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "node",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "pruned",
|
||||
@@ -7267,7 +7339,7 @@
|
||||
"leveldb"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "node",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "archive",
|
||||
@@ -7285,7 +7357,7 @@
|
||||
"pebble"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "node",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "pruned",
|
||||
@@ -8824,7 +8896,7 @@
|
||||
"trace"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "kona",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "pruned",
|
||||
@@ -8841,7 +8913,7 @@
|
||||
"trace"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "node",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "archive",
|
||||
@@ -8858,7 +8930,7 @@
|
||||
"trace"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "node",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "minimal",
|
||||
@@ -8892,7 +8964,7 @@
|
||||
"trace"
|
||||
],
|
||||
"network": "worldchain",
|
||||
"node": null,
|
||||
"node": "kona",
|
||||
"relay": null,
|
||||
"stack": "op",
|
||||
"type": "pruned",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# syntax = docker/dockerfile:1.2
|
||||
ARG REPO=https://github.com/erigontech/erigon.git
|
||||
ARG VERSION=v3.5.3
|
||||
ARG VERSION=v3.7.0
|
||||
ARG COMMIT=${COMMIT:-${VERSION}}
|
||||
|
||||
FROM docker.io/library/golang:1.24.1-alpine3.20 AS builder
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-mainnet-besu:
|
||||
image: ${ETHEREUM_BESU_IMAGE:-hyperledger/besu}:${ETHEREUM_MAINNET_BESU_VERSION:-26.8.1}
|
||||
image: ${ETHEREUM_BESU_IMAGE:-hyperledger/besu}:${ETHEREUM_MAINNET_BESU_VERSION:-26.9.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:
|
||||
ethereum-mainnet-erigon3-archive:
|
||||
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.5.3}
|
||||
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.7.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:
|
||||
ethereum-mainnet-erigon3-minimal:
|
||||
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.5.3}
|
||||
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.7.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:
|
||||
ethereum-mainnet-erigon3:
|
||||
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.5.3}
|
||||
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.7.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:
|
||||
ethereum-hoodi-reth:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_HOODI_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_HOODI_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=10606
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_HOODI_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --gpo.ignoreprice=2
|
||||
- --max-inbound-peers=50
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-hoodi-reth-pruned:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_HOODI_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_HOODI_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=12435
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_HOODI_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --gpo.ignoreprice=2
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-mainnet-reth:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=14563
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --gpo.ignoreprice=2
|
||||
- --max-inbound-peers=50
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-mainnet-reth:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=14563
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --gpo.ignoreprice=2
|
||||
- --max-inbound-peers=50
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-mainnet-reth:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=14563
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --gpo.ignoreprice=2
|
||||
- --max-inbound-peers=50
|
||||
|
||||
@@ -33,7 +33,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-mainnet-reth-minimal:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -63,6 +63,7 @@ services:
|
||||
- --discovery.port=14286
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --gpo.ignoreprice=2
|
||||
@@ -124,7 +125,7 @@ services:
|
||||
- pruning
|
||||
|
||||
ethereum-mainnet-reth-minimal-node:
|
||||
image: ${ETHEREUM_BLSYNC_IMAGE:-ethereum/client-go}:${ETHEREUM_MAINNET_BLSYNC_VERSION:-alltools-v1.17.5}
|
||||
image: ${ETHEREUM_BLSYNC_IMAGE:-ethereum/client-go}:${ETHEREUM_MAINNET_BLSYNC_VERSION:-alltools-v1.17.6}
|
||||
ports:
|
||||
- 19286:19286
|
||||
- 19286:19286/udp
|
||||
|
||||
@@ -52,7 +52,7 @@ services:
|
||||
args:
|
||||
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
|
||||
LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
|
||||
RETH_VERSION: ${ETHEREUM_MAINNET_RETH_VERSION:-v2.5.2}
|
||||
RETH_VERSION: ${ETHEREUM_MAINNET_RETH_VERSION:-v2.6.0}
|
||||
RETH_REPO: ${ETHEREUM_MAINNET_RETH_REPO:-https://github.com/paradigmxyz/reth}
|
||||
ARCH_TARGET: ${ARCH_TARGET:-native}
|
||||
PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
|
||||
@@ -85,6 +85,7 @@ services:
|
||||
- --discovery.port=14286
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --gpo.ignoreprice=2
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-mainnet-reth-pruned:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=10150
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --gpo.ignoreprice=2
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-mainnet-reth-pruned:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=10150
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --gpo.ignoreprice=2
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-mainnet-reth-pruned:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_MAINNET_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=10150
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --gpo.ignoreprice=2
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-sepolia-reth:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_SEPOLIA_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_SEPOLIA_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=14330
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_SEPOLIA_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --gpo.ignoreprice=2
|
||||
- --max-inbound-peers=50
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-sepolia-reth:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_SEPOLIA_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_SEPOLIA_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=14330
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_SEPOLIA_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --gpo.ignoreprice=2
|
||||
- --max-inbound-peers=50
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-sepolia-reth-pruned:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_SEPOLIA_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_SEPOLIA_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=12150
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_SEPOLIA_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --gpo.ignoreprice=2
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
ethereum-sepolia-reth-pruned:
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_SEPOLIA_RETH_VERSION:-v2.5.2}
|
||||
image: ${ETHEREUM_RETH_IMAGE:-ghcr.io/paradigmxyz/reth}:${ETHEREUM_SEPOLIA_RETH_VERSION:-v2.6.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
@@ -60,6 +60,7 @@ services:
|
||||
- --discovery.port=12150
|
||||
- --engine.cross-block-cache-size=${ETHEREUM_SEPOLIA_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=0
|
||||
- --engine.num-state-masking-blocks=0
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --gpo.ignoreprice=2
|
||||
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
gnosis-chiado-erigon3-archive:
|
||||
image: ${GNOSIS_ERIGON3_IMAGE:-erigontech/erigon}:${GNOSIS_CHIADO_ERIGON3_VERSION:-v3.6.0}
|
||||
image: ${GNOSIS_ERIGON3_IMAGE:-erigontech/erigon}:${GNOSIS_CHIADO_ERIGON3_VERSION:-v3.7.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:
|
||||
gnosis-chiado-erigon3-minimal:
|
||||
image: ${GNOSIS_ERIGON3_IMAGE:-erigontech/erigon}:${GNOSIS_CHIADO_ERIGON3_VERSION:-v3.6.0}
|
||||
image: ${GNOSIS_ERIGON3_IMAGE:-erigontech/erigon}:${GNOSIS_CHIADO_ERIGON3_VERSION:-v3.7.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:
|
||||
gnosis-chiado-erigon3:
|
||||
image: ${GNOSIS_ERIGON3_IMAGE:-erigontech/erigon}:${GNOSIS_CHIADO_ERIGON3_VERSION:-v3.6.0}
|
||||
image: ${GNOSIS_ERIGON3_IMAGE:-erigontech/erigon}:${GNOSIS_CHIADO_ERIGON3_VERSION:-v3.7.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:
|
||||
gnosis-mainnet-reth:
|
||||
image: ${GNOSIS_RETH_IMAGE:-ghcr.io/gnosischain/reth_gnosis}:${GNOSIS_MAINNET_RETH_VERSION:-v2.0.0}
|
||||
image: ${GNOSIS_RETH_IMAGE:-ghcr.io/gnosischain/reth_gnosis}:${GNOSIS_MAINNET_RETH_VERSION:-v2.1.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:
|
||||
gnosis-mainnet-reth-pruned:
|
||||
image: ${GNOSIS_RETH_IMAGE:-ghcr.io/gnosischain/reth_gnosis}:${GNOSIS_MAINNET_RETH_VERSION:-v2.0.0}
|
||||
image: ${GNOSIS_RETH_IMAGE:-ghcr.io/gnosischain/reth_gnosis}:${GNOSIS_MAINNET_RETH_VERSION:-v2.1.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
---
|
||||
x-logging-defaults: &logging-defaults
|
||||
driver: json-file
|
||||
options:
|
||||
max-size: "512m"
|
||||
max-file: "2"
|
||||
|
||||
# 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:gravity/reth/gravity-alpha-reth-pruned-trace.yml
|
||||
#
|
||||
# docker compose up -d
|
||||
#
|
||||
# curl -X POST https://${IP}.traefik.me/gravity-alpha \
|
||||
# -H "Content-Type: application/json" \
|
||||
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
|
||||
|
||||
services:
|
||||
gravity-alpha:
|
||||
image: ${GRAVITY_RETH_IMAGE:-ghcr.io/galxe/gravity-reth}:${GRAVITY_ALPHA_RETH_VERSION:-v0.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)
|
||||
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
|
||||
user: 0:0
|
||||
ports:
|
||||
- 13821:13821
|
||||
- 13821:13821/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 9001
|
||||
- 8551
|
||||
entrypoint: [reth, node]
|
||||
command:
|
||||
- --chain=gravity-alpha
|
||||
- --datadir=/execution
|
||||
- --discovery.port=13821
|
||||
- --engine.cross-block-cache-size=${GRAVITY_ALPHA_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=1024
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --max-inbound-peers=50
|
||||
- --max-outbound-peers=50
|
||||
- --metrics=0.0.0.0:9001
|
||||
- --nat=extip:${IP}
|
||||
- --port=13821
|
||||
- --rpc-cache.max-blocks=10000
|
||||
- --rpc-cache.max-concurrent-db-requests=2048
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.max-blocks-per-filter=0
|
||||
- --rpc.max-connections=50000
|
||||
- --rpc.max-logs-per-response=0
|
||||
- --http
|
||||
- --http.addr=0.0.0.0
|
||||
- --http.api=eth,net,web3,txpool,debug
|
||||
- --http.corsdomain=*
|
||||
- --http.port=8545
|
||||
- --ws
|
||||
- --ws.addr=0.0.0.0
|
||||
- --ws.api=eth,net,web3,txpool,debug
|
||||
- --ws.origins=*
|
||||
- --ws.port=8545
|
||||
- --authrpc.addr=0.0.0.0
|
||||
- --authrpc.jwtsecret=/jwtsecret
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 5m
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ${GRAVITY_ALPHA_RETH_PRUNED_TRACE_DATA:-gravity-alpha-reth-pruned-trace}:/execution
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
- prometheus-scrape.enabled=true
|
||||
- prometheus-scrape.port=9001
|
||||
- prometheus-scrape.path=/metrics
|
||||
- traefik.enable=true
|
||||
- traefik.http.middlewares.gravity-alpha-reth-pruned-trace-stripprefix.stripprefix.prefixes=/gravity-alpha
|
||||
- traefik.http.services.gravity-alpha-reth-pruned-trace.loadbalancer.server.port=8545
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-alpha-reth-pruned-trace.entrypoints=websecure}
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-alpha-reth-pruned-trace.tls.certresolver=myresolver}
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-alpha-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/gravity-alpha`) || Path(`/gravity-alpha/`))}
|
||||
- ${NO_SSL:+traefik.http.routers.gravity-alpha-reth-pruned-trace.rule=Path(`/gravity-alpha`) || Path(`/gravity-alpha/`)}
|
||||
- traefik.http.routers.gravity-alpha-reth-pruned-trace.middlewares=gravity-alpha-reth-pruned-trace-stripprefix, ipallowlist
|
||||
shm_size: 2gb
|
||||
|
||||
gravity-alpha-node:
|
||||
image: ${GRAVITY_APTOSBFT_IMAGE:-ghcr.io/galxe/gravity_node}:${GRAVITY_ALPHA_APTOSBFT_VERSION:-v1.10.0}
|
||||
user: 0:0
|
||||
ports:
|
||||
- 18821:26180
|
||||
- 18822:26181
|
||||
- 9001:9001
|
||||
environment:
|
||||
- GRAVITY_NETWORK=alpha
|
||||
- IP=${IP}
|
||||
entrypoint: [/bin/bash, -c]
|
||||
command:
|
||||
- |
|
||||
# Generate or use existing consensus config
|
||||
if [ ! -f /config/public_full_node.yaml ]; then
|
||||
gravity-node init --config-dir /config --chain alpha
|
||||
fi
|
||||
# Start the consensus node
|
||||
exec gravity-node run --config /config/public_full_node.yaml
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 5m
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ${GRAVITY_ALPHA_RETH_PRUNED_TRACE_CONSENSUS_DATA:-gravity-alpha-reth-pruned-trace-consensus}:/data/consensus:rw
|
||||
- ./gravity/alpha/genesis.blob:/config/genesis.blob:ro
|
||||
- ./gravity/alpha/public_full_node.yaml:/config/public_full_node.yaml:ro
|
||||
- ./gravity/alpha/waypoint.txt:/config/waypoint.txt:ro
|
||||
healthcheck:
|
||||
test: [CMD-SHELL, wget -qO- http://localhost:9001/health || exit 1]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
- prometheus-scrape.enabled=true
|
||||
- prometheus-scrape.port=9001
|
||||
|
||||
volumes:
|
||||
gravity-alpha-reth-pruned-trace:
|
||||
gravity-alpha-reth-pruned-trace-consensus:
|
||||
|
||||
x-upstreams:
|
||||
- id: $${ID}
|
||||
labels:
|
||||
provider: $${PROVIDER}
|
||||
connection:
|
||||
generic:
|
||||
rpc:
|
||||
url: $${RPC_URL}
|
||||
ws:
|
||||
frameSize: 20Mb
|
||||
msgSize: 50Mb
|
||||
url: $${WS_URL}
|
||||
chain: gravity-alpha
|
||||
method-groups:
|
||||
enabled:
|
||||
- debug
|
||||
- filter
|
||||
- trace
|
||||
methods:
|
||||
disabled:
|
||||
enabled:
|
||||
- name: txpool_content # TODO: should be disabled for rollup nodes
|
||||
...
|
||||
@@ -0,0 +1,176 @@
|
||||
---
|
||||
x-logging-defaults: &logging-defaults
|
||||
driver: json-file
|
||||
options:
|
||||
max-size: "512m"
|
||||
max-file: "2"
|
||||
|
||||
# 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:gravity/reth/gravity-alpha-sepolia-reth-pruned-trace.yml
|
||||
#
|
||||
# docker compose up -d
|
||||
#
|
||||
# curl -X POST https://${IP}.traefik.me/gravity-alpha-sepolia \
|
||||
# -H "Content-Type: application/json" \
|
||||
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
|
||||
|
||||
services:
|
||||
gravity-alpha-sepolia:
|
||||
image: ${GRAVITY_RETH_IMAGE:-ghcr.io/galxe/gravity-reth}:${GRAVITY_ALPHA_SEPOLIA_RETH_VERSION:-v0.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)
|
||||
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
|
||||
user: 0:0
|
||||
ports:
|
||||
- 11338:11338
|
||||
- 11338:11338/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 9001
|
||||
- 8551
|
||||
entrypoint: [reth, node]
|
||||
command:
|
||||
- --chain=gravity-alpha-sepolia
|
||||
- --datadir=/execution
|
||||
- --discovery.port=11338
|
||||
- --engine.cross-block-cache-size=${GRAVITY_ALPHA-SEPOLIA_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=1024
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --max-inbound-peers=50
|
||||
- --max-outbound-peers=50
|
||||
- --metrics=0.0.0.0:9001
|
||||
- --nat=extip:${IP}
|
||||
- --port=11338
|
||||
- --rpc-cache.max-blocks=10000
|
||||
- --rpc-cache.max-concurrent-db-requests=2048
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.max-blocks-per-filter=0
|
||||
- --rpc.max-connections=50000
|
||||
- --rpc.max-logs-per-response=0
|
||||
- --http
|
||||
- --http.addr=0.0.0.0
|
||||
- --http.api=eth,net,web3,txpool,debug
|
||||
- --http.corsdomain=*
|
||||
- --http.port=8545
|
||||
- --ws
|
||||
- --ws.addr=0.0.0.0
|
||||
- --ws.api=eth,net,web3,txpool,debug
|
||||
- --ws.origins=*
|
||||
- --ws.port=8545
|
||||
- --authrpc.addr=0.0.0.0
|
||||
- --authrpc.jwtsecret=/jwtsecret
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 5m
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ${GRAVITY_ALPHA_SEPOLIA_RETH_PRUNED_TRACE_DATA:-gravity-alpha-sepolia-reth-pruned-trace}:/execution
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
- prometheus-scrape.enabled=true
|
||||
- prometheus-scrape.port=9001
|
||||
- prometheus-scrape.path=/metrics
|
||||
- traefik.enable=true
|
||||
- traefik.http.middlewares.gravity-alpha-sepolia-reth-pruned-trace-stripprefix.stripprefix.prefixes=/gravity-alpha-sepolia
|
||||
- traefik.http.services.gravity-alpha-sepolia-reth-pruned-trace.loadbalancer.server.port=8545
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-alpha-sepolia-reth-pruned-trace.entrypoints=websecure}
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-alpha-sepolia-reth-pruned-trace.tls.certresolver=myresolver}
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-alpha-sepolia-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/gravity-alpha-sepolia`) || Path(`/gravity-alpha-sepolia/`))}
|
||||
- ${NO_SSL:+traefik.http.routers.gravity-alpha-sepolia-reth-pruned-trace.rule=Path(`/gravity-alpha-sepolia`) || Path(`/gravity-alpha-sepolia/`)}
|
||||
- traefik.http.routers.gravity-alpha-sepolia-reth-pruned-trace.middlewares=gravity-alpha-sepolia-reth-pruned-trace-stripprefix, ipallowlist
|
||||
shm_size: 2gb
|
||||
|
||||
gravity-alpha-sepolia-node:
|
||||
image: ${GRAVITY_APTOSBFT_IMAGE:-ghcr.io/galxe/gravity_node}:${GRAVITY_ALPHA_SEPOLIA_APTOSBFT_VERSION:-v1.10.0}
|
||||
user: 0:0
|
||||
ports:
|
||||
- 16338:26180
|
||||
- 16339:26181
|
||||
- 9001:9001
|
||||
environment:
|
||||
- GRAVITY_NETWORK=alpha-sepolia
|
||||
- IP=${IP}
|
||||
entrypoint: [/bin/bash, -c]
|
||||
command:
|
||||
- |
|
||||
# Generate or use existing consensus config
|
||||
if [ ! -f /config/public_full_node.yaml ]; then
|
||||
gravity-node init --config-dir /config --chain alpha-sepolia
|
||||
fi
|
||||
# Start the consensus node
|
||||
exec gravity-node run --config /config/public_full_node.yaml
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 5m
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ${GRAVITY_ALPHA_SEPOLIA_RETH_PRUNED_TRACE_CONSENSUS_DATA:-gravity-alpha-sepolia-reth-pruned-trace-consensus}:/data/consensus:rw
|
||||
- ./gravity/alpha-sepolia/genesis.blob:/config/genesis.blob:ro
|
||||
- ./gravity/alpha-sepolia/public_full_node.yaml:/config/public_full_node.yaml:ro
|
||||
- ./gravity/alpha-sepolia/waypoint.txt:/config/waypoint.txt:ro
|
||||
healthcheck:
|
||||
test: [CMD-SHELL, wget -qO- http://localhost:9001/health || exit 1]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
- prometheus-scrape.enabled=true
|
||||
- prometheus-scrape.port=9001
|
||||
|
||||
volumes:
|
||||
gravity-alpha-sepolia-reth-pruned-trace:
|
||||
gravity-alpha-sepolia-reth-pruned-trace-consensus:
|
||||
|
||||
x-upstreams:
|
||||
- id: $${ID}
|
||||
labels:
|
||||
provider: $${PROVIDER}
|
||||
connection:
|
||||
generic:
|
||||
rpc:
|
||||
url: $${RPC_URL}
|
||||
ws:
|
||||
frameSize: 20Mb
|
||||
msgSize: 50Mb
|
||||
url: $${WS_URL}
|
||||
chain: gravity-alpha-sepolia
|
||||
method-groups:
|
||||
enabled:
|
||||
- debug
|
||||
- filter
|
||||
- trace
|
||||
methods:
|
||||
disabled:
|
||||
enabled:
|
||||
- name: txpool_content # TODO: should be disabled for rollup nodes
|
||||
...
|
||||
@@ -0,0 +1,176 @@
|
||||
---
|
||||
x-logging-defaults: &logging-defaults
|
||||
driver: json-file
|
||||
options:
|
||||
max-size: "512m"
|
||||
max-file: "2"
|
||||
|
||||
# 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:gravity/reth/gravity-mainnet-reth-pruned-trace.yml
|
||||
#
|
||||
# docker compose up -d
|
||||
#
|
||||
# curl -X POST https://${IP}.traefik.me/gravity-mainnet \
|
||||
# -H "Content-Type: application/json" \
|
||||
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
|
||||
|
||||
services:
|
||||
gravity-mainnet:
|
||||
image: ${GRAVITY_RETH_IMAGE:-ghcr.io/galxe/gravity-reth}:${GRAVITY_MAINNET_RETH_VERSION:-v0.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)
|
||||
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
|
||||
user: 0:0
|
||||
ports:
|
||||
- 14825:14825
|
||||
- 14825:14825/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 9001
|
||||
- 8551
|
||||
entrypoint: [reth, node]
|
||||
command:
|
||||
- --chain=gravity
|
||||
- --datadir=/execution
|
||||
- --discovery.port=14825
|
||||
- --engine.cross-block-cache-size=${GRAVITY_MAINNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=1024
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --max-inbound-peers=50
|
||||
- --max-outbound-peers=50
|
||||
- --metrics=0.0.0.0:9001
|
||||
- --nat=extip:${IP}
|
||||
- --port=14825
|
||||
- --rpc-cache.max-blocks=10000
|
||||
- --rpc-cache.max-concurrent-db-requests=2048
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.max-blocks-per-filter=0
|
||||
- --rpc.max-connections=50000
|
||||
- --rpc.max-logs-per-response=0
|
||||
- --http
|
||||
- --http.addr=0.0.0.0
|
||||
- --http.api=eth,net,web3,txpool,debug
|
||||
- --http.corsdomain=*
|
||||
- --http.port=8545
|
||||
- --ws
|
||||
- --ws.addr=0.0.0.0
|
||||
- --ws.api=eth,net,web3,txpool,debug
|
||||
- --ws.origins=*
|
||||
- --ws.port=8545
|
||||
- --authrpc.addr=0.0.0.0
|
||||
- --authrpc.jwtsecret=/jwtsecret
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 5m
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ${GRAVITY_MAINNET_RETH_PRUNED_TRACE_DATA:-gravity-mainnet-reth-pruned-trace}:/execution
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
- prometheus-scrape.enabled=true
|
||||
- prometheus-scrape.port=9001
|
||||
- prometheus-scrape.path=/metrics
|
||||
- traefik.enable=true
|
||||
- traefik.http.middlewares.gravity-mainnet-reth-pruned-trace-stripprefix.stripprefix.prefixes=/gravity-mainnet
|
||||
- traefik.http.services.gravity-mainnet-reth-pruned-trace.loadbalancer.server.port=8545
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-mainnet-reth-pruned-trace.entrypoints=websecure}
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-mainnet-reth-pruned-trace.tls.certresolver=myresolver}
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-mainnet-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/gravity-mainnet`) || Path(`/gravity-mainnet/`))}
|
||||
- ${NO_SSL:+traefik.http.routers.gravity-mainnet-reth-pruned-trace.rule=Path(`/gravity-mainnet`) || Path(`/gravity-mainnet/`)}
|
||||
- traefik.http.routers.gravity-mainnet-reth-pruned-trace.middlewares=gravity-mainnet-reth-pruned-trace-stripprefix, ipallowlist
|
||||
shm_size: 2gb
|
||||
|
||||
gravity-mainnet-node:
|
||||
image: ${GRAVITY_APTOSBFT_IMAGE:-ghcr.io/galxe/gravity_node}:${GRAVITY_MAINNET_APTOSBFT_VERSION:-v1.10.0}
|
||||
user: 0:0
|
||||
ports:
|
||||
- 19825:26180
|
||||
- 19826:26181
|
||||
- 9001:9001
|
||||
environment:
|
||||
- GRAVITY_NETWORK=mainnet
|
||||
- IP=${IP}
|
||||
entrypoint: [/bin/bash, -c]
|
||||
command:
|
||||
- |
|
||||
# Generate or use existing consensus config
|
||||
if [ ! -f /config/public_full_node.yaml ]; then
|
||||
gravity-node init --config-dir /config --chain mainnet
|
||||
fi
|
||||
# Start the consensus node
|
||||
exec gravity-node run --config /config/public_full_node.yaml
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 5m
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ${GRAVITY_MAINNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-gravity-mainnet-reth-pruned-trace-consensus}:/data/consensus:rw
|
||||
- ./gravity/mainnet/genesis.blob:/config/genesis.blob:ro
|
||||
- ./gravity/mainnet/public_full_node.yaml:/config/public_full_node.yaml:ro
|
||||
- ./gravity/mainnet/waypoint.txt:/config/waypoint.txt:ro
|
||||
healthcheck:
|
||||
test: [CMD-SHELL, wget -qO- http://localhost:9001/health || exit 1]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
- prometheus-scrape.enabled=true
|
||||
- prometheus-scrape.port=9001
|
||||
|
||||
volumes:
|
||||
gravity-mainnet-reth-pruned-trace:
|
||||
gravity-mainnet-reth-pruned-trace-consensus:
|
||||
|
||||
x-upstreams:
|
||||
- id: $${ID}
|
||||
labels:
|
||||
provider: $${PROVIDER}
|
||||
connection:
|
||||
generic:
|
||||
rpc:
|
||||
url: $${RPC_URL}
|
||||
ws:
|
||||
frameSize: 20Mb
|
||||
msgSize: 50Mb
|
||||
url: $${WS_URL}
|
||||
chain: gravity
|
||||
method-groups:
|
||||
enabled:
|
||||
- debug
|
||||
- filter
|
||||
- trace
|
||||
methods:
|
||||
disabled:
|
||||
enabled:
|
||||
- name: txpool_content # TODO: should be disabled for rollup nodes
|
||||
...
|
||||
@@ -0,0 +1,176 @@
|
||||
---
|
||||
x-logging-defaults: &logging-defaults
|
||||
driver: json-file
|
||||
options:
|
||||
max-size: "512m"
|
||||
max-file: "2"
|
||||
|
||||
# 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:gravity/reth/gravity-testnet-reth-pruned-trace.yml
|
||||
#
|
||||
# docker compose up -d
|
||||
#
|
||||
# curl -X POST https://${IP}.traefik.me/gravity-testnet \
|
||||
# -H "Content-Type: application/json" \
|
||||
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
|
||||
|
||||
services:
|
||||
gravity-testnet:
|
||||
image: ${GRAVITY_RETH_IMAGE:-ghcr.io/galxe/gravity-reth}:${GRAVITY_TESTNET_RETH_VERSION:-v0.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)
|
||||
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
|
||||
user: 0:0
|
||||
ports:
|
||||
- 10052:10052
|
||||
- 10052:10052/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 9001
|
||||
- 8551
|
||||
entrypoint: [reth, node]
|
||||
command:
|
||||
- --chain=gravity-testnet
|
||||
- --datadir=/execution
|
||||
- --discovery.port=10052
|
||||
- --engine.cross-block-cache-size=${GRAVITY_TESTNET_RETH_STATE_CACHE:-4096}
|
||||
- --engine.memory-block-buffer-target=1024
|
||||
- --engine.persistence-threshold=0
|
||||
- --full
|
||||
- --max-inbound-peers=50
|
||||
- --max-outbound-peers=50
|
||||
- --metrics=0.0.0.0:9001
|
||||
- --nat=extip:${IP}
|
||||
- --port=10052
|
||||
- --rpc-cache.max-blocks=10000
|
||||
- --rpc-cache.max-concurrent-db-requests=2048
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.max-blocks-per-filter=0
|
||||
- --rpc.max-connections=50000
|
||||
- --rpc.max-logs-per-response=0
|
||||
- --http
|
||||
- --http.addr=0.0.0.0
|
||||
- --http.api=eth,net,web3,txpool,debug
|
||||
- --http.corsdomain=*
|
||||
- --http.port=8545
|
||||
- --ws
|
||||
- --ws.addr=0.0.0.0
|
||||
- --ws.api=eth,net,web3,txpool,debug
|
||||
- --ws.origins=*
|
||||
- --ws.port=8545
|
||||
- --authrpc.addr=0.0.0.0
|
||||
- --authrpc.jwtsecret=/jwtsecret
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 5m
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ${GRAVITY_TESTNET_RETH_PRUNED_TRACE_DATA:-gravity-testnet-reth-pruned-trace}:/execution
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
- prometheus-scrape.enabled=true
|
||||
- prometheus-scrape.port=9001
|
||||
- prometheus-scrape.path=/metrics
|
||||
- traefik.enable=true
|
||||
- traefik.http.middlewares.gravity-testnet-reth-pruned-trace-stripprefix.stripprefix.prefixes=/gravity-testnet
|
||||
- traefik.http.services.gravity-testnet-reth-pruned-trace.loadbalancer.server.port=8545
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-testnet-reth-pruned-trace.entrypoints=websecure}
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-testnet-reth-pruned-trace.tls.certresolver=myresolver}
|
||||
- ${NO_SSL:-traefik.http.routers.gravity-testnet-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/gravity-testnet`) || Path(`/gravity-testnet/`))}
|
||||
- ${NO_SSL:+traefik.http.routers.gravity-testnet-reth-pruned-trace.rule=Path(`/gravity-testnet`) || Path(`/gravity-testnet/`)}
|
||||
- traefik.http.routers.gravity-testnet-reth-pruned-trace.middlewares=gravity-testnet-reth-pruned-trace-stripprefix, ipallowlist
|
||||
shm_size: 2gb
|
||||
|
||||
gravity-testnet-node:
|
||||
image: ${GRAVITY_APTOSBFT_IMAGE:-ghcr.io/galxe/gravity_node}:${GRAVITY_TESTNET_APTOSBFT_VERSION:-v1.10.0}
|
||||
user: 0:0
|
||||
ports:
|
||||
- 15052:26180
|
||||
- 15053:26181
|
||||
- 9001:9001
|
||||
environment:
|
||||
- GRAVITY_NETWORK=testnet
|
||||
- IP=${IP}
|
||||
entrypoint: [/bin/bash, -c]
|
||||
command:
|
||||
- |
|
||||
# Generate or use existing consensus config
|
||||
if [ ! -f /config/public_full_node.yaml ]; then
|
||||
gravity-node init --config-dir /config --chain testnet
|
||||
fi
|
||||
# Start the consensus node
|
||||
exec gravity-node run --config /config/public_full_node.yaml
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 5m
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ${GRAVITY_TESTNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-gravity-testnet-reth-pruned-trace-consensus}:/data/consensus:rw
|
||||
- ./gravity/testnet/genesis.blob:/config/genesis.blob:ro
|
||||
- ./gravity/testnet/public_full_node.yaml:/config/public_full_node.yaml:ro
|
||||
- ./gravity/testnet/waypoint.txt:/config/waypoint.txt:ro
|
||||
healthcheck:
|
||||
test: [CMD-SHELL, wget -qO- http://localhost:9001/health || exit 1]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
- prometheus-scrape.enabled=true
|
||||
- prometheus-scrape.port=9001
|
||||
|
||||
volumes:
|
||||
gravity-testnet-reth-pruned-trace:
|
||||
gravity-testnet-reth-pruned-trace-consensus:
|
||||
|
||||
x-upstreams:
|
||||
- id: $${ID}
|
||||
labels:
|
||||
provider: $${PROVIDER}
|
||||
connection:
|
||||
generic:
|
||||
rpc:
|
||||
url: $${RPC_URL}
|
||||
ws:
|
||||
frameSize: 20Mb
|
||||
msgSize: 50Mb
|
||||
url: $${WS_URL}
|
||||
chain: gravity-testnet
|
||||
method-groups:
|
||||
enabled:
|
||||
- debug
|
||||
- filter
|
||||
- trace
|
||||
methods:
|
||||
disabled:
|
||||
enabled:
|
||||
- name: txpool_content # TODO: should be disabled for rollup nodes
|
||||
...
|
||||
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
|
||||
|
||||
services:
|
||||
kite-mainnet:
|
||||
image: ${KITE_GO_IMAGE:-ghcr.io/gokite-ai/gokite-chain}:${KITE_MAINNET_GO_VERSION:-v1.0.0}
|
||||
image: ${KITE_GO_IMAGE:-ghcr.io/gokite-ai/gokite-chain}:${KITE_MAINNET_GO_VERSION:-v1.15.0}
|
||||
sysctls:
|
||||
# TCP Performance
|
||||
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"database-type":"leveldb","log-level":"info","warp-api-enabled":true,"state-sync-enabled":true,"pruning-enabled":true,"eth-apis":["eth","eth-filter","net","admin","web3","internal-account","internal-blockchain","internal-debug","internal-eth","internal-personal","internal-transaction","internal-tx-pool","debug","debug-tracer","debug-file-tracer","debug-handler"]}
|
||||
{"database-type":"leveldb","state-sync-enabled":true,"pruning-enabled":true,"commit-interval":4096,"apis":["eth","eth-filter","net","web3","internal-account","internal-blockchain","internal-eth","internal-transaction","internal-tx-pool"]}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
services:
|
||||
avalanche-mainnet:
|
||||
image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_MAINNET_GO_VERSION:-v1.15.0}
|
||||
labels:
|
||||
- "traefik.http.middlewares.avalanche-mainnet-stripprefix.stripprefix.prefixes=/avalanche-mainnet"
|
||||
@@ -0,0 +1,10 @@
|
||||
services:
|
||||
ethereum-mainnet-geth:
|
||||
image: ethereum/client-go:v1.17.4
|
||||
labels:
|
||||
- "traefik.http.middlewares.ethereum-mainnet-geth-stripprefix.stripprefix.prefixes=/ethereum-mainnet-geth"
|
||||
ethereum-mainnet-geth-node:
|
||||
image: statusim/nimbus-eth2:multiarch-v26.8.0
|
||||
labels:
|
||||
- "traefik.http.middlewares.ethereum-mainnet-geth-node-stripprefix.stripprefix.prefixes=/ethereum-mainnet-geth"
|
||||
- "traefik.http.routers.ethereum-mainnet-geth-node.rule=Host(`$DOMAIN`) && PathPrefix(`/ethereum-mainnet-geth/eth`)"
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":{"protocols":{"eth":{"config":{"homesteadBlock":1150000,"shanghaiTime":1681338455,"cancunTime":1710338135,"pragueTime":1746612311}}}}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":[{"name":"Geth/v1.17.7-stable/linux-amd64"},{"name":"Geth/v1.17.7-stable/linux-amd64"},{"name":"reth/v2.7.0-abc/x86_64"},{"name":"Geth/v1.16.9-stable/linux"}]}
|
||||
@@ -0,0 +1,5 @@
|
||||
[{"container":"rpc-avalanche-mainnet-1","image":"avaplatform/avalanchego:v1.15.0","service":"avalanche-mainnet","files":""},
|
||||
{"container":"rpc-op-mainnet-op-reth-pruned-1","image":"us-docker.pkg.dev/oplabs-tools-artifacts/images/op-reth:v2.5.0","service":"op-mainnet-op-reth-pruned","files":""},
|
||||
{"container":"rpc-op-mainnet-op-reth-pruned-node-1","image":"us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node:v1.7.0","service":"op-mainnet-op-reth-pruned-node","files":""},
|
||||
{"container":"rpc-ethereum-mainnet-geth-1","image":"ethereum/client-go:v1.17.4","service":"ethereum-mainnet-geth","files":""},
|
||||
{"container":"rpc-ethereum-mainnet-geth-node-1","image":"statusim/nimbus-eth2:multiarch-v26.8.0","service":"ethereum-mainnet-geth-node","files":""}]
|
||||
@@ -0,0 +1,2 @@
|
||||
COMPOSE_FILE=base.yml:rpc.yml:avalanche/go/avalanche-mainnet-go-pruned-leveldb.yml:op/reth/op-mainnet-op-reth-pruned-trace--kona.yml:ethereum/geth/ethereum-mainnet-geth-pruned-pebble-path--nimbus.yml
|
||||
DOMAIN=fixture.local
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":{"number":"0x18ec9c7","timestamp":"0x68e3a1f0"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":false}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":{"acps":{"194":{"supportWeight":"1","supporters":["a","b"],"objectors":[],"abstainers":[]}}}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":{"version":"avalanchego/1.15.0","databaseVersion":"v1.4.5","vmVersions":{"evm":"v1.15.0"}}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":{"numPeers":3,"peers":[{"version":"avalanchego/1.15.0"},{"version":"avalanchego/1.15.1"},{"version":"avalanchego/1.15.1"}]}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":{"etnaTime":"2024-12-16T17:00:00Z","heliconTime":"2026-09-22T15:00:00Z"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":{"peers":{"p1":{"userAgent":"kona"},"p2":{"userAgent":"optimism"},"p3":{"userAgent":"kona"}}}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":{"canyon_time":1704992401,"ecotone_time":1710374401,"isthmus_time":1746806401,"karst_time":1783180801}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":{"unsafe_l2":{"number":157836486,"timestamp":1791353000},"safe_l2":{"number":157836400}}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":"v1.7.0-abcdef"}
|
||||
@@ -0,0 +1 @@
|
||||
{"data":{"ALTAIR_FORK_EPOCH":"74240","ELECTRA_FORK_EPOCH":"364032","FULU_FORK_EPOCH":"411392","FAR_FUTURE":"18446744073709551615"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"data":[{"state":"connected"},{"state":"connected"},{"state":"disconnected"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"data":{"head_slot":"15370643","is_syncing":false}}
|
||||
@@ -0,0 +1 @@
|
||||
{"data":{"version":"Nimbus/v26.8.0-404a00-stateofus"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"jsonrpc":"2.0","id":1,"result":"Geth/v1.17.4-stable/linux-amd64/go1.24"}
|
||||
@@ -0,0 +1,10 @@
|
||||
services:
|
||||
op-mainnet-op-reth-pruned:
|
||||
image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-reth:${OP_MAINNET_RETH_VERSION:-v2.5.0}
|
||||
labels:
|
||||
- "traefik.http.middlewares.op-mainnet-op-reth-pruned-stripprefix.stripprefix.prefixes=/op-mainnet-op-reth-pruned"
|
||||
op-mainnet-op-reth-pruned-node:
|
||||
image: us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node:v1.7.0
|
||||
labels:
|
||||
- "traefik.http.middlewares.op-mainnet-op-reth-pruned-node-stripprefix.stripprefix.prefixes=/op-mainnet-op-reth-pruned/node"
|
||||
- "traefik.http.routers.op-mainnet-op-reth-pruned-node.rule=Host(`$DOMAIN`) && PathPrefix(`/op-mainnet-op-reth-pruned/node`)"
|
||||
@@ -0,0 +1,2 @@
|
||||
-de
|
||||
health
|
||||
Executable
+290
@@ -0,0 +1,290 @@
|
||||
#!/usr/bin/env python3
|
||||
"""node-facts.sh [node_path ...] [--pretty] (hand-maintained; ansible_showcase/node-facts-plan.md)
|
||||
|
||||
One JSON 'node facts' document per node, same schema (v1) for every client family: own version, peer
|
||||
version histogram + newer_than_us, protocol upgrade schedule the running config knows, chain signals,
|
||||
head. Modelled on avalanchego's Info API; simulated best-effort for the others. Read-only: compose
|
||||
files + docker ps/inspect + HTTP through the local traefik (like sync-status.sh). Parallel over nodes
|
||||
and over the per-node calls. Every field present; null + reason instead of silence.
|
||||
Exit 0 always once .env is readable; exit 2 if .env/COMPOSE_FILE is missing (one error line).
|
||||
"""
|
||||
import concurrent.futures as cf, datetime, json, os, re, socket, subprocess, sys, time, urllib.request, ssl
|
||||
|
||||
BASE = os.path.dirname(os.path.abspath(__file__))
|
||||
FIXTURES = os.environ.get("NODE_FACTS_FIXTURES") # test mode: answer HTTP from <dir>/<method-or-path>.json, env from <dir>/env, no network
|
||||
INFRA = {"base", "rpc", "monitoring", "backup-http", "drpc", "drpc-free", "squidfura", "squidfura-backend", "oracle", "extra"}
|
||||
NOW = lambda: datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
SEMVER = re.compile(r"(\d+)\.(\d+)\.(\d+)")
|
||||
CTX = ssl.create_default_context()
|
||||
|
||||
|
||||
def env():
|
||||
e = {}
|
||||
try:
|
||||
envfile = os.path.join(FIXTURES, "env") if FIXTURES else os.path.join(BASE, ".env") # fixture mode: no dotfile needed
|
||||
for line in open(envfile):
|
||||
line = line.strip()
|
||||
if line and not line.startswith("#") and "=" in line:
|
||||
k, v = line.split("=", 1); e[k] = v.strip().strip('"').strip("'")
|
||||
except Exception:
|
||||
return None
|
||||
return e
|
||||
|
||||
|
||||
|
||||
|
||||
def _fixture(url, body):
|
||||
key = (body or {}).get("method") if body else url.split("/eth/", 1)[-1].replace("/", "_") if "/eth/" in url else os.path.basename(url)
|
||||
f = os.path.join(FIXTURES, f"{key}.json")
|
||||
if os.path.exists(f): return 1, 200, open(f).read(), None
|
||||
return 1, None, None, f"fixture missing: {key}"
|
||||
|
||||
|
||||
def http(url, body=None, timeout=5.0):
|
||||
"""-> (ms, status, text|None, err|None)"""
|
||||
if FIXTURES: return _fixture(url, body)
|
||||
t0 = time.time()
|
||||
try:
|
||||
req = urllib.request.Request(url, data=(json.dumps(body).encode() if body is not None else None),
|
||||
headers={"content-type": "application/json", "user-agent": "node-facts/1"})
|
||||
with urllib.request.urlopen(req, timeout=timeout, context=CTX) as r:
|
||||
return int((time.time() - t0) * 1000), r.status, r.read().decode(errors="replace"), None
|
||||
except urllib.error.HTTPError as ex:
|
||||
return int((time.time() - t0) * 1000), ex.code, None, f"http {ex.code}"
|
||||
except Exception as ex:
|
||||
return int((time.time() - t0) * 1000), None, None, f"{type(ex).__name__}: {str(ex)[:80]}"
|
||||
|
||||
|
||||
def rpc(url, method, params=None, timeout=5.0):
|
||||
ms, st, txt, err = http(url, {"jsonrpc": "2.0", "id": 1, "method": method, "params": params if params is not None else []}, timeout)
|
||||
if err: return ms, None, err
|
||||
try:
|
||||
d = json.loads(txt)
|
||||
except Exception:
|
||||
return ms, None, "non-json response"
|
||||
if "error" in d and d["error"]: return ms, None, f"rpc error: {str(d['error'].get('message', d['error']))[:80]}"
|
||||
return ms, d.get("result"), None
|
||||
|
||||
|
||||
def rest(url, timeout=5.0):
|
||||
ms, st, txt, err = http(url, None, timeout)
|
||||
if err: return ms, None, err
|
||||
try: return ms, json.loads(txt), None
|
||||
except Exception: return ms, None, "non-json response"
|
||||
|
||||
|
||||
def semver(s):
|
||||
m = SEMVER.search(s or ""); return tuple(int(x) for x in m.groups()) if m else None
|
||||
|
||||
|
||||
def docker_ps():
|
||||
out = subprocess.run(["docker", "ps", "--format", '{{.Names}}\t{{.Image}}\t{{.Label "com.docker.compose.service"}}\t{{.Label "com.docker.compose.project.config_files"}}'],
|
||||
capture_output=True, text=True, timeout=20).stdout
|
||||
rows = []
|
||||
for line in out.splitlines():
|
||||
p = line.split("\t")
|
||||
if len(p) == 4: rows.append({"container": p[0], "image": p[1], "service": p[2], "files": p[3]})
|
||||
return rows
|
||||
|
||||
|
||||
FAMILY = [("avalanchego", "avalanchego"), ("kona-node", "kona"), ("kona", "kona"), ("op-node", "op-node"), ("conduit-op-reth", "op-reth"), ("op-reth", "op-reth"),
|
||||
("op-geth", "op-geth"), ("op-erigon", "erigon"), ("lighthouse", "beacon"), ("prysm", "beacon"), ("nimbus", "beacon"), ("teku", "beacon"), ("lodestar", "beacon"),
|
||||
("grandine", "beacon"), ("client-go", "geth"), ("bnb-chain/bsc", "geth"), ("bsc", "geth"), ("/geth", "geth"), ("geth", "geth"), ("bor", "bor"), ("erigon", "erigon"),
|
||||
("nethermind", "nethermind"), ("besu", "besu"), ("reth-bsc", "reth"), ("bera-reth", "reth"), ("reth", "reth"), ("nitro", "nitro"), ("cometbft", "cometbft"),
|
||||
("gaiad", "cometbft"), ("external-node", "zksync-en"), ("maru", "maru"), ("arc-consensus", "arc"), ("arc-execution", "arc")]
|
||||
|
||||
|
||||
def family_of(image):
|
||||
low = image.lower()
|
||||
for sub, fam in FAMILY:
|
||||
if sub in low: return fam
|
||||
return "unknown"
|
||||
|
||||
|
||||
def labels_of(compose_text):
|
||||
"""traefik stripprefix prefixes found in the compose file -> set of paths like 'linea-mainnet', 'linea-mainnet/node'"""
|
||||
return set(re.findall(r"stripprefix\.prefixes=/([^\"'\s,]+)", compose_text))
|
||||
|
||||
|
||||
def node_facts(env_, node, containers, pretty=False):
|
||||
proto = "http" if env_.get("NO_SSL") else "https"; domain = env_.get("DOMAIN") or "0.0.0.0"
|
||||
compose = os.path.join(BASE, node + ".yml")
|
||||
try: text = open(compose).read()
|
||||
except Exception as ex:
|
||||
return {"schema": 1, "at": NOW(), "host": socket.gethostname().split(".")[0], "node_path": node, "network": None, "client": None,
|
||||
"version": None, "peers": None, "schedule": None, "signals": None, "head": None, "timing_ms": None, "error": f"compose file unreadable: {ex}"}
|
||||
# services defined in THIS compose file (top-level keys under services:) -> containers by compose service label
|
||||
svc_names = set(re.findall(r"^ ([A-Za-z0-9_.-]+):\s*$", text, re.M)) - {"services", "volumes", "networks", "x-upstreams"}
|
||||
mine = [c for c in containers if c["service"] in svc_names]
|
||||
paths = labels_of(text)
|
||||
client_paths = sorted(p for p in paths if "/" not in p); node_paths = sorted(p for p in paths if p.endswith("/node"))
|
||||
# beacon REST route (base node template): rule PathPrefix(`/<short>/eth`) with stripprefix /<short> -> URL base/<short>/eth/...
|
||||
eth_paths = sorted(set(re.findall(r"PathPrefix\(`/([^`]+?)/eth`\)", text)))
|
||||
base = f"{proto}://{domain}"
|
||||
# execution-side container = the one whose service does not end with -node / known CL images
|
||||
exec_c = next((c for c in mine if family_of(c["image"]) not in ("kona", "op-node", "beacon", "maru", "arc") and not c["service"].endswith("-node")), None) or (mine[0] if mine else None)
|
||||
cl_c = next((c for c in mine if family_of(c["image"]) in ("kona", "op-node", "beacon", "maru")), None)
|
||||
fam = family_of(exec_c["image"]) if exec_c else "unknown"
|
||||
net = os.path.basename(node).split("-")[0] if "/" in node else node
|
||||
m = re.search(r"\n\s+network:\s*([\w-]+)|chain:\s*\"?([\w-]+)", text)
|
||||
network = (m.group(1) or m.group(2)) if m else net
|
||||
def imgtag(c): return (c["image"].rsplit(":", 1) + [""])[:2] if c else ("", "")
|
||||
client = {"name": fam, "image": imgtag(exec_c)[0], "tag": imgtag(exec_c)[1], "container": exec_c["container"] if exec_c else None,
|
||||
"consensus": ({"name": family_of(cl_c["image"]), "image": imgtag(cl_c)[0], "tag": imgtag(cl_c)[1], "container": cl_c["container"]} if cl_c else None)}
|
||||
url = f"{base}/{client_paths[0]}" if client_paths else None
|
||||
timing = {}
|
||||
R = {"version": None, "peers": None, "schedule": None, "signals": None, "head": None}
|
||||
def nul(src, err): return {"source": src, "error": err}
|
||||
|
||||
# ---- per-family collectors (each returns dict for one field) ----
|
||||
def v_rpc():
|
||||
if not url: return {"reported": None, "db_version": None, **nul("web3_clientVersion", "no traefik route for the client")}
|
||||
ms, r, e = rpc(url, "web3_clientVersion"); timing["version"] = ms
|
||||
return {"reported": r.strip().splitlines()[0][:120] if isinstance(r, str) and r.strip() else None, "db_version": None, **nul("web3_clientVersion", e)}
|
||||
def p_admin():
|
||||
if not url: return {"count": None, "versions": None, "newer_than_us": None, **nul("admin_peers", "no traefik route for the client")}
|
||||
ms, r, e = rpc(url, "admin_peers", timeout=10); timing["peers"] = ms
|
||||
if e or not isinstance(r, list): return {"count": None, "versions": None, "newer_than_us": None, **nul("admin_peers", e or "admin namespace disabled or unexpected result")}
|
||||
hist = {}
|
||||
for p in r:
|
||||
name = (p.get("name") or "?"); ver = name.split("/")[1] if "/" in name else name
|
||||
hist[ver] = hist.get(ver, 0) + 1
|
||||
return {"count": len(r), "versions": hist, "newer_than_us": None, **nul("admin_peers", None)}
|
||||
def s_nodeinfo():
|
||||
if not url: return {"upgrades": None, **nul("admin_nodeInfo", "no traefik route for the client")}
|
||||
ms, r, e = rpc(url, "admin_nodeInfo"); timing["schedule"] = ms
|
||||
cfg = (((r or {}).get("protocols") or {}).get("eth") or {}).get("config") if isinstance(r, dict) else None
|
||||
if e or not isinstance(cfg, dict): return {"upgrades": None, **nul("admin_nodeInfo", e or "admin namespace disabled or no chain config in nodeInfo")}
|
||||
ups = {}
|
||||
for k, v in cfg.items():
|
||||
if k.endswith("Time") and isinstance(v, int): ups[k[:-4]] = {"time": datetime.datetime.fromtimestamp(v, datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), "block": None}
|
||||
elif k.endswith("Block") and isinstance(v, int): ups[k[:-5]] = {"time": None, "block": v}
|
||||
return {"upgrades": ups, **nul("admin_nodeInfo", None)}
|
||||
def h_eth():
|
||||
if not url: return {"height": None, "timestamp": None, "syncing": None, **nul("eth_syncing+eth_getBlockByNumber", "no traefik route for the client")}
|
||||
ms1, s, e1 = rpc(url, "eth_syncing"); ms2, b, e2 = rpc(url, "eth_getBlockByNumber", ["latest", False]); timing["head"] = ms1 + ms2
|
||||
h = {"height": int(b["number"], 16) if isinstance(b, dict) and b.get("number") else None,
|
||||
"timestamp": datetime.datetime.fromtimestamp(int(b["timestamp"], 16), datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") if isinstance(b, dict) and b.get("timestamp") else None,
|
||||
"syncing": (s is not False) if (s is not None and not e1) else None}
|
||||
return {**h, **nul("eth_syncing+eth_getBlockByNumber", e2 or e1)}
|
||||
def avax():
|
||||
# Info API is not routed through traefik; try the client route's host with /ext/info replaced, then bridge IP
|
||||
cand = []
|
||||
if url: cand.append(url.rsplit("/", 1)[0] + "/" + client_paths[0].split("/")[0] + "-info") # optional future route
|
||||
try:
|
||||
ip = subprocess.run(["docker", "inspect", exec_c["container"], "--format", "{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}"], capture_output=True, text=True, timeout=10).stdout.split()
|
||||
if ip: cand.append(f"http://{ip[0]}:9650")
|
||||
except Exception: pass
|
||||
info = None; used = None; err = "avalanche info API not reachable (needs /ext/info route or host->bridge access)"
|
||||
for c in cand:
|
||||
ms, r, e = rpc(c + "/ext/info", "info.getNodeVersion", {}); timing["version"] = ms
|
||||
if not e and isinstance(r, dict): info, used = c + "/ext/info", c; break
|
||||
err = e or err
|
||||
if not info:
|
||||
R["version"] = {"reported": None, "db_version": None, **nul("info.getNodeVersion", err)}
|
||||
R["peers"] = {"count": None, "versions": None, "newer_than_us": None, **nul("info.peers", err)}
|
||||
R["schedule"] = {"upgrades": None, **nul("info.upgrades", err)}; R["signals"] = None
|
||||
R["head"] = h_eth(); return
|
||||
def call(m):
|
||||
ms, r, e = rpc(info, m, {}, timeout=10); return ms, r, e
|
||||
with cf.ThreadPoolExecutor(4) as ex:
|
||||
fv, fp, fu, fa = ex.submit(call, "info.getNodeVersion"), ex.submit(call, "info.peers"), ex.submit(call, "info.upgrades"), ex.submit(call, "info.acps")
|
||||
ms, r, e = fv.result(); timing["version"] = ms
|
||||
R["version"] = {"reported": (r or {}).get("version") if isinstance(r, dict) else None, "db_version": (r or {}).get("databaseVersion") if isinstance(r, dict) else None,
|
||||
"vm_versions": (r or {}).get("vmVersions") if isinstance(r, dict) else None, **nul("info.getNodeVersion", e)}
|
||||
ms, r, e = fp.result(); timing["peers"] = ms
|
||||
if not e and isinstance(r, dict):
|
||||
hist = {}
|
||||
for p in r.get("peers") or []: hist[p.get("version") or "?"] = hist.get(p.get("version") or "?", 0) + 1
|
||||
R["peers"] = {"count": len(r.get("peers") or []), "versions": hist, "newer_than_us": None, **nul("info.peers", None)}
|
||||
else: R["peers"] = {"count": None, "versions": None, "newer_than_us": None, **nul("info.peers", e or "unexpected result")}
|
||||
ms, r, e = fu.result(); timing["schedule"] = ms
|
||||
R["schedule"] = {"upgrades": ({k[:-4]: {"time": v, "block": None} for k, v in r.items() if k.endswith("Time")} if isinstance(r, dict) else None), **nul("info.upgrades", e)}
|
||||
ms, r, e = fa.result()
|
||||
R["signals"] = ({"acps": {k: {"supporters": len(v.get("supporters") or []), "objectors": len(v.get("objectors") or []), "abstainers": len(v.get("abstainers") or []), "supportWeight": v.get("supportWeight")}
|
||||
for k, v in (r.get("acps") or {}).items()}, "source": "info.acps", "error": None} if not e and isinstance(r, dict) else {"acps": None, "source": "info.acps", "error": e})
|
||||
R["head"] = h_eth()
|
||||
def opnode():
|
||||
nurl = f"{base}/{node_paths[0]}" if node_paths else None
|
||||
C = {"version": None, "peers": None, "schedule": None, "head": None}
|
||||
if not nurl:
|
||||
C["peers"] = {"count": None, "versions": None, "newer_than_us": None, **nul("opp2p_peers", "no /<node>/node route")}
|
||||
C["schedule"] = {"upgrades": None, **nul("optimism_rollupConfig", "no /<node>/node route")}; R["consensus"] = C; return
|
||||
with cf.ThreadPoolExecutor(4) as ex:
|
||||
fp, fc, fs, fv = ex.submit(rpc, nurl, "opp2p_peers", [True], 10), ex.submit(rpc, nurl, "optimism_rollupConfig"), ex.submit(rpc, nurl, "optimism_syncStatus"), ex.submit(rpc, nurl, "optimism_version")
|
||||
ms, r, e = fv.result(); timing["consensus_version"] = ms
|
||||
C["version"] = {"reported": r if isinstance(r, str) else None, **nul("optimism_version", e)}
|
||||
ms, r, e = fp.result(); timing["consensus_peers"] = ms
|
||||
if not e and isinstance(r, dict):
|
||||
hist = {}
|
||||
for p in (r.get("peers") or {}).values():
|
||||
ua = p.get("userAgent") or "?"; hist[ua] = hist.get(ua, 0) + 1
|
||||
C["peers"] = {"count": len(r.get("peers") or {}), "versions": hist, "newer_than_us": None, **nul("opp2p_peers", None if any(semver(k) for k in hist) else "userAgent carries no version")}
|
||||
else: C["peers"] = {"count": None, "versions": None, "newer_than_us": None, **nul("opp2p_peers", e or "unexpected result")}
|
||||
ms, r, e = fc.result(); timing["consensus_schedule"] = ms
|
||||
C["schedule"] = {"upgrades": ({k[:-5]: {"time": datetime.datetime.fromtimestamp(v, datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), "block": None}
|
||||
for k, v in r.items() if k.endswith("_time") and isinstance(v, int)} if isinstance(r, dict) else None), **nul("optimism_rollupConfig", e)}
|
||||
ms, r, e = fs.result()
|
||||
if not e and isinstance(r, dict) and isinstance(r.get("unsafe_l2"), dict):
|
||||
u = r["unsafe_l2"]; C["head"] = {"height": u.get("number"), "timestamp": datetime.datetime.fromtimestamp(u["timestamp"], datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") if u.get("timestamp") else None,
|
||||
"syncing": None, "unsafe_minus_safe": (u.get("number") or 0) - ((r.get("safe_l2") or {}).get("number") or 0), **nul("optimism_syncStatus", None)}
|
||||
else: C["head"] = {"height": None, "timestamp": None, "syncing": None, **nul("optimism_syncStatus", e or "unexpected result")}
|
||||
R["consensus"] = C
|
||||
def beacon():
|
||||
eurl = f"{base}/{eth_paths[0]}" if eth_paths else None # eth/v1/... is appended below
|
||||
if not eurl:
|
||||
R["consensus_version"] = None; return
|
||||
with cf.ThreadPoolExecutor(4) as ex:
|
||||
fv, fp, fs, fc = ex.submit(rest, eurl + "/eth/v1/node/version"), ex.submit(rest, eurl + "/eth/v1/node/peers", 10), ex.submit(rest, eurl + "/eth/v1/node/syncing"), ex.submit(rest, eurl + "/eth/v1/config/spec")
|
||||
ms, r, e = fv.result(); timing["consensus_version"] = ms
|
||||
cv = {"reported": ((r or {}).get("data") or {}).get("version") if isinstance(r, dict) else None, **nul("eth/v1/node/version", e)}
|
||||
ms, r, e = fp.result()
|
||||
cp = ({"count": sum(1 for x in ((r or {}).get("data") or []) if (x.get("state") or "connected") == "connected"), "versions": None, "newer_than_us": None, **nul("eth/v1/node/peers", "beacon peers API carries no agent version")} if not e and isinstance(r, dict)
|
||||
else {"count": None, "versions": None, "newer_than_us": None, **nul("eth/v1/node/peers", e or "unexpected result")})
|
||||
ms, r, e = fs.result()
|
||||
d = (r or {}).get("data") if isinstance(r, dict) else None
|
||||
ch = ({"head_slot": int(d.get("head_slot")) if d.get("head_slot") is not None else None, "syncing": d.get("is_syncing"), **nul("eth/v1/node/syncing", None)} if isinstance(d, dict) else {"head_slot": None, "syncing": None, **nul("eth/v1/node/syncing", e)})
|
||||
ms, r, e = fc.result()
|
||||
spec = (r or {}).get("data") if isinstance(r, dict) else None
|
||||
cs = ({"upgrades": {k[:-11]: {"epoch": int(v)} for k, v in spec.items() if k.endswith("_FORK_EPOCH") and str(v).isdigit() and int(v) < 2**62}, **nul("eth/v1/config/spec", None)} if isinstance(spec, dict) else {"upgrades": None, **nul("eth/v1/config/spec", e)})
|
||||
R["consensus"] = {"version": cv, "peers": cp, "head": ch, "schedule": cs}
|
||||
|
||||
# ---- dispatch ----
|
||||
t0 = time.time()
|
||||
if fam == "avalanchego":
|
||||
avax()
|
||||
else:
|
||||
with cf.ThreadPoolExecutor(4) as ex:
|
||||
fv, fp, fs, fh = ex.submit(v_rpc), ex.submit(p_admin), ex.submit(s_nodeinfo), ex.submit(h_eth)
|
||||
R["version"], R["peers"], R["schedule"], R["head"] = fv.result(), fp.result(), fs.result(), fh.result()
|
||||
if fam in ("reth", "op-reth") and R["schedule"].get("upgrades") is None:
|
||||
R["schedule"]["error"] = "reth exposes no chain config over RPC"
|
||||
if fam in ("nitro", "zksync-en", "cometbft", "maru", "arc", "unknown") and R["peers"].get("count") is None:
|
||||
R["peers"]["error"] = f"no peer API via RPC for {fam}"
|
||||
if node_paths and (cl_c is None or family_of(cl_c["image"]) in ("kona", "op-node")): opnode()
|
||||
if eth_paths: beacon()
|
||||
# newer_than_us
|
||||
mine_v = semver((R["version"] or {}).get("reported")); hist = (R["peers"] or {}).get("versions")
|
||||
if mine_v and hist:
|
||||
R["peers"]["newer_than_us"] = sum(n for v, n in hist.items() if (semver(v) or (0,)) > mine_v)
|
||||
doc = {"schema": 1, "at": NOW(), "host": socket.gethostname().split(".")[0], "node_path": node, "network": network, "client": client,
|
||||
"version": R["version"], "peers": R["peers"], "schedule": R["schedule"], "signals": R.get("signals"), "head": R["head"],
|
||||
"consensus": R.get("consensus"), "timing_ms": {**timing, "total": int((time.time() - t0) * 1000)}}
|
||||
return doc
|
||||
|
||||
|
||||
def main():
|
||||
args = [a for a in sys.argv[1:] if not a.startswith("--")]; pretty = "--pretty" in sys.argv
|
||||
e = env()
|
||||
if not e or not e.get("COMPOSE_FILE"):
|
||||
print(json.dumps({"schema": 1, "at": NOW(), "host": None, "node_path": None, "error": "cannot read .env or COMPOSE_FILE empty"})); sys.exit(2)
|
||||
nodes = args or [f[:-4] for f in e["COMPOSE_FILE"].split(":") if f.endswith(".yml") and os.path.basename(f)[:-4] not in INFRA and not os.path.basename(f).startswith(("drpc", "squidfura", "oracle"))]
|
||||
try: containers = docker_ps() if not FIXTURES else json.load(open(os.path.join(FIXTURES, "docker_ps.json")))
|
||||
except Exception: containers = []
|
||||
with cf.ThreadPoolExecutor(int(os.environ.get("MAX_WORKERS", "8"))) as ex:
|
||||
for doc in ex.map(lambda n: node_facts(e, n, containers), nodes):
|
||||
print(json.dumps(doc, indent=2 if pretty else None), flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"genesis": {
|
||||
"l1": {
|
||||
"hash": "0x218132178d65c4bc490aadd93c31535326043fe1fe8fea2d87f26c1da83d45c2",
|
||||
"number": 19634321
|
||||
},
|
||||
"l2": {
|
||||
"hash": "0x8ed4903b7f9c3f7bb7a09374d63ae9c9852cd9aab1784b433c41dbeb47b4dba2",
|
||||
"number": 0
|
||||
},
|
||||
"l2_time": 1712861987,
|
||||
"system_config": {
|
||||
"batcherAddr": "0x08f9f14ff43e112b18c96f0986f28cb1878f1d11",
|
||||
"overhead": "0x00000000000000000000000000000000000000000000000000000000000000bc",
|
||||
"scalar": "0x00000000000000000000000000000000000000000000000000000000000a6fe0",
|
||||
"gasLimit": 30000000
|
||||
}
|
||||
},
|
||||
"block_time": 2,
|
||||
"max_sequencer_drift": 600,
|
||||
"seq_window_size": 3600,
|
||||
"channel_timeout": 300,
|
||||
"l1_chain_id": 1,
|
||||
"l2_chain_id": 60808,
|
||||
"regolith_time": 0,
|
||||
"canyon_time": 0,
|
||||
"delta_time": 0,
|
||||
"ecotone_time": 0,
|
||||
"batch_inbox_address": "0x3a75346f81302aac0333fb5dcdd407e12a6cfa83",
|
||||
"deposit_contract_address": "0x8adee124447435fe03e3cd24df3f4cae32e65a3e",
|
||||
"l1_system_config_address": "0xacb886b75d76d1c8d9248cfddfa09b70c71c5393",
|
||||
"protocol_versions_address": "0x0000000000000000000000000000000000000000",
|
||||
"da_challenge_address": "0x0000000000000000000000000000000000000000",
|
||||
"da_challenge_window": 0,
|
||||
"da_resolve_window": 0,
|
||||
"use_plasma": false,
|
||||
"fjord_time": 1720627201,
|
||||
"granite_time": 1726070401,
|
||||
"holocene_time": 1736445601,
|
||||
"isthmus_time": 1746806401,
|
||||
"jovian_time": 1773325801,
|
||||
"karst_time": 1790179201
|
||||
}
|
||||
@@ -107,7 +107,7 @@ services:
|
||||
shm_size: 2gb
|
||||
|
||||
base-mainnet-op-erigon-node:
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node-reth}:${BASE_MAINNET_NODE_VERSION:-v1.1.1}
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node}:${BASE_MAINNET_NODE_VERSION:-v1.4.2}
|
||||
ports:
|
||||
- 18092:18092
|
||||
- 18092:18092/udp
|
||||
|
||||
@@ -106,7 +106,7 @@ services:
|
||||
shm_size: 2gb
|
||||
|
||||
base-sepolia-op-erigon-node:
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node-reth}:${BASE_SEPOLIA_NODE_VERSION:-v1.2.0}
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node}:${BASE_SEPOLIA_NODE_VERSION:-v1.4.2}
|
||||
ports:
|
||||
- 18487:18487
|
||||
- 18487:18487/udp
|
||||
|
||||
@@ -90,6 +90,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_ERIGON_ARCHIVE_TRACE_DATA:-bob-mainnet-op-erigon-archive-trace}:/root/.local/share/erigon
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -130,6 +131,7 @@ services:
|
||||
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- KONA_NODE_P2P_LISTEN_TCP_PORT=16071
|
||||
- KONA_NODE_P2P_LISTEN_UDP_PORT=16071
|
||||
- KONA_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- KONA_NODE_RPC_ADDR=0.0.0.0
|
||||
- KONA_NODE_RPC_PORT=9545
|
||||
- OP_NODE_SYNCMODE=execution-layer
|
||||
@@ -142,6 +144,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -90,6 +90,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_ERIGON_ARCHIVE_TRACE_DATA:-bob-mainnet-op-erigon-archive-trace}:/root/.local/share/erigon
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -108,7 +109,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.6}
|
||||
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 16071:16071
|
||||
- 16071:16071/udp
|
||||
@@ -129,11 +130,11 @@ services:
|
||||
- OP_NODE_METRICS_ADDR=0.0.0.0
|
||||
- OP_NODE_METRICS_ENABLED=true
|
||||
- OP_NODE_METRICS_PORT=7300
|
||||
- OP_NODE_NETWORK=bob-mainnet
|
||||
- OP_NODE_P2P_ADVERTISE_IP=${IP}
|
||||
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- OP_NODE_P2P_LISTEN_TCP_PORT=16071
|
||||
- OP_NODE_P2P_LISTEN_UDP_PORT=16071
|
||||
- OP_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
|
||||
- OP_NODE_RPC_ADDR=0.0.0.0
|
||||
- OP_NODE_RPC_PORT=9545
|
||||
@@ -149,6 +150,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -66,9 +66,10 @@ services:
|
||||
- --metrics
|
||||
- --metrics.addr=0.0.0.0
|
||||
- --metrics.port=6060
|
||||
- --nodiscover
|
||||
- --nat=extip:${IP}
|
||||
- --p2p.allowed-ports=31732
|
||||
- --p2p.allowed-ports=36732
|
||||
- --port=11732
|
||||
- --rollup.sequencerhttp=https://mainnet.boba.network
|
||||
- --rpc.gascap=6000000000
|
||||
- --rpc.returndata.limit=1500000
|
||||
|
||||
@@ -129,6 +129,7 @@ services:
|
||||
- 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_ROLLUP_CONFIG=/config/rollup.json
|
||||
- KONA_NODE_RPC_ADDR=0.0.0.0
|
||||
- KONA_NODE_RPC_PORT=9545
|
||||
- OP_NODE_SYNCMODE=execution-layer
|
||||
|
||||
@@ -109,7 +109,7 @@ services:
|
||||
shm_size: 2gb
|
||||
|
||||
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.6}
|
||||
image: ${HASHKEYCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${HASHKEYCHAIN_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 16378:16378
|
||||
- 16378:16378/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.6}
|
||||
image: ${INK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${INK_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
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.6}
|
||||
image: ${LISK_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${LISK_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 19831:19831
|
||||
- 19831:19831/udp
|
||||
|
||||
@@ -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.6}
|
||||
image: ${MODE_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${MODE_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 17509:17509
|
||||
- 17509:17509/udp
|
||||
|
||||
@@ -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.6}
|
||||
image: ${MODE_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${MODE_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
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.6}
|
||||
image: ${OP_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${OP_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
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.6}
|
||||
image: ${OP_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${OP_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
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.6}
|
||||
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
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.6}
|
||||
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINATO_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 17283:17283
|
||||
- 17283:17283/udp
|
||||
|
||||
@@ -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.6}
|
||||
image: ${SWELL_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SWELL_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
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.6}
|
||||
image: ${UNICHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${UNICHAIN_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
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.6}
|
||||
image: ${UNICHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${UNICHAIN_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 18196:18196
|
||||
- 18196:18196/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.6}
|
||||
image: ${WORLDCHAIN_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${WORLDCHAIN_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 16046:16046
|
||||
- 16046:16046/udp
|
||||
|
||||
@@ -127,6 +127,7 @@ services:
|
||||
- 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_ROLLUP_CONFIG=/config/rollup.json
|
||||
- KONA_NODE_RPC_ADDR=0.0.0.0
|
||||
- KONA_NODE_RPC_PORT=9545
|
||||
- OP_NODE_SYNCMODE=execution-layer
|
||||
|
||||
@@ -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.6}
|
||||
image: ${ZORA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${ZORA_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 19360:19360
|
||||
- 19360:19360/udp
|
||||
|
||||
@@ -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.6}
|
||||
image: ${ZORA_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${ZORA_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 18839:18839
|
||||
- 18839:18839/udp
|
||||
|
||||
@@ -107,7 +107,7 @@ services:
|
||||
- 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_NODE_IMAGE:-ghcr.io/base/node-reth}:${BASE_MAINNET_NODE_VERSION:-v1.1.1}
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node}:${BASE_MAINNET_NODE_VERSION:-v1.4.2}
|
||||
ports:
|
||||
- 18596:18596
|
||||
- 18596:18596/udp
|
||||
|
||||
@@ -171,7 +171,7 @@ services:
|
||||
- traefik.http.routers.base-mainnet-op-geth-pruned-pebble-path-events.middlewares=ipallowlist
|
||||
|
||||
base-mainnet-node:
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node-reth}:${BASE_MAINNET_NODE_VERSION:-v1.1.1}
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node}:${BASE_MAINNET_NODE_VERSION:-v1.4.2}
|
||||
ports:
|
||||
- 16422:16422
|
||||
- 16422:16422/udp
|
||||
|
||||
@@ -107,7 +107,7 @@ services:
|
||||
- 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_NODE_IMAGE:-ghcr.io/base/node-reth}:${BASE_MAINNET_NODE_VERSION:-v1.1.1}
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node}:${BASE_MAINNET_NODE_VERSION:-v1.4.2}
|
||||
ports:
|
||||
- 16422:16422
|
||||
- 16422:16422/udp
|
||||
|
||||
@@ -107,7 +107,7 @@ services:
|
||||
- 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_NODE_IMAGE:-ghcr.io/base/node-reth}:${BASE_SEPOLIA_NODE_VERSION:-v1.2.0}
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node}:${BASE_SEPOLIA_NODE_VERSION:-v1.4.2}
|
||||
ports:
|
||||
- 15910:15910
|
||||
- 15910:15910/udp
|
||||
|
||||
@@ -107,7 +107,7 @@ services:
|
||||
- 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_NODE_IMAGE:-ghcr.io/base/node-reth}:${BASE_SEPOLIA_NODE_VERSION:-v1.2.0}
|
||||
image: ${BASE_NODE_IMAGE:-ghcr.io/base/node}:${BASE_SEPOLIA_NODE_VERSION:-v1.4.2}
|
||||
ports:
|
||||
- 17022:17022
|
||||
- 17022:17022/udp
|
||||
|
||||
@@ -45,6 +45,9 @@ services:
|
||||
ulimits:
|
||||
nofile: 1048576 # Max open files (for RPC/WS connections)
|
||||
user: root
|
||||
ports:
|
||||
- 10683:10683
|
||||
- 10683:10683/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 6060
|
||||
@@ -64,8 +67,9 @@ services:
|
||||
- --metrics
|
||||
- --metrics.addr=0.0.0.0
|
||||
- --metrics.port=6060
|
||||
- --nat=extip:${IP}
|
||||
- --networkid=81457
|
||||
- --nodiscover
|
||||
- --port=10683
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.txfeecap=0
|
||||
- --state.scheme=hash
|
||||
|
||||
@@ -45,6 +45,9 @@ services:
|
||||
ulimits:
|
||||
nofile: 1048576 # Max open files (for RPC/WS connections)
|
||||
user: root
|
||||
ports:
|
||||
- 10287:10287
|
||||
- 10287:10287/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 6060
|
||||
@@ -64,8 +67,9 @@ services:
|
||||
- --metrics
|
||||
- --metrics.addr=0.0.0.0
|
||||
- --metrics.port=6060
|
||||
- --nat=extip:${IP}
|
||||
- --networkid=81457
|
||||
- --nodiscover
|
||||
- --port=10287
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.txfeecap=0
|
||||
- --state.scheme=hash
|
||||
|
||||
@@ -45,6 +45,9 @@ services:
|
||||
ulimits:
|
||||
nofile: 1048576 # Max open files (for RPC/WS connections)
|
||||
user: root
|
||||
ports:
|
||||
- 12769:12769
|
||||
- 12769:12769/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 6060
|
||||
@@ -64,8 +67,9 @@ services:
|
||||
- --metrics
|
||||
- --metrics.addr=0.0.0.0
|
||||
- --metrics.port=6060
|
||||
- --nat=extip:${IP}
|
||||
- --networkid=81457
|
||||
- --nodiscover
|
||||
- --port=12769
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.txfeecap=0
|
||||
- --state.scheme=path
|
||||
|
||||
@@ -45,6 +45,9 @@ services:
|
||||
ulimits:
|
||||
nofile: 1048576 # Max open files (for RPC/WS connections)
|
||||
user: root
|
||||
ports:
|
||||
- 11591:11591
|
||||
- 11591:11591/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 6060
|
||||
@@ -63,8 +66,9 @@ services:
|
||||
- --metrics
|
||||
- --metrics.addr=0.0.0.0
|
||||
- --metrics.port=6060
|
||||
- --nat=extip:${IP}
|
||||
- --networkid=168587773
|
||||
- --nodiscover
|
||||
- --port=11591
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.txfeecap=0
|
||||
- --state.scheme=hash
|
||||
|
||||
@@ -92,6 +92,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-bob-mainnet-op-geth-archive-leveldb-hash}:/data
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -131,6 +132,7 @@ services:
|
||||
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- KONA_NODE_P2P_LISTEN_TCP_PORT=19046
|
||||
- KONA_NODE_P2P_LISTEN_UDP_PORT=19046
|
||||
- KONA_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- KONA_NODE_RPC_ADDR=0.0.0.0
|
||||
- KONA_NODE_RPC_PORT=9545
|
||||
- OP_NODE_SYNCMODE=execution-layer
|
||||
@@ -143,6 +145,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -92,6 +92,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-bob-mainnet-op-geth-archive-leveldb-hash}:/data
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -109,7 +110,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.6}
|
||||
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 19046:19046
|
||||
- 19046:19046/udp
|
||||
@@ -129,11 +130,11 @@ services:
|
||||
- OP_NODE_METRICS_ADDR=0.0.0.0
|
||||
- OP_NODE_METRICS_ENABLED=true
|
||||
- OP_NODE_METRICS_PORT=7300
|
||||
- OP_NODE_NETWORK=bob-mainnet
|
||||
- OP_NODE_P2P_ADVERTISE_IP=${IP}
|
||||
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- OP_NODE_P2P_LISTEN_TCP_PORT=19046
|
||||
- OP_NODE_P2P_LISTEN_UDP_PORT=19046
|
||||
- OP_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
|
||||
- OP_NODE_RPC_ADDR=0.0.0.0
|
||||
- OP_NODE_RPC_PORT=9545
|
||||
@@ -149,6 +150,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -92,6 +92,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_GETH_ARCHIVE_PEBBLE_HASH_DATA:-bob-mainnet-op-geth-archive-pebble-hash}:/data
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -131,6 +132,7 @@ services:
|
||||
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- KONA_NODE_P2P_LISTEN_TCP_PORT=17223
|
||||
- KONA_NODE_P2P_LISTEN_UDP_PORT=17223
|
||||
- KONA_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- KONA_NODE_RPC_ADDR=0.0.0.0
|
||||
- KONA_NODE_RPC_PORT=9545
|
||||
- OP_NODE_SYNCMODE=execution-layer
|
||||
@@ -143,6 +145,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -92,6 +92,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_GETH_ARCHIVE_PEBBLE_HASH_DATA:-bob-mainnet-op-geth-archive-pebble-hash}:/data
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -109,7 +110,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.6}
|
||||
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 17223:17223
|
||||
- 17223:17223/udp
|
||||
@@ -129,11 +130,11 @@ services:
|
||||
- OP_NODE_METRICS_ADDR=0.0.0.0
|
||||
- OP_NODE_METRICS_ENABLED=true
|
||||
- OP_NODE_METRICS_PORT=7300
|
||||
- OP_NODE_NETWORK=bob-mainnet
|
||||
- OP_NODE_P2P_ADVERTISE_IP=${IP}
|
||||
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- OP_NODE_P2P_LISTEN_TCP_PORT=17223
|
||||
- OP_NODE_P2P_LISTEN_UDP_PORT=17223
|
||||
- OP_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
|
||||
- OP_NODE_RPC_ADDR=0.0.0.0
|
||||
- OP_NODE_RPC_PORT=9545
|
||||
@@ -149,6 +150,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -92,6 +92,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_GETH_PRUNED_PEBBLE_HASH_DATA:-bob-mainnet-op-geth-pruned-pebble-hash}:/data
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -131,6 +132,7 @@ services:
|
||||
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- KONA_NODE_P2P_LISTEN_TCP_PORT=16363
|
||||
- KONA_NODE_P2P_LISTEN_UDP_PORT=16363
|
||||
- KONA_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- KONA_NODE_RPC_ADDR=0.0.0.0
|
||||
- KONA_NODE_RPC_PORT=9545
|
||||
- OP_NODE_SYNCMODE=execution-layer
|
||||
@@ -143,6 +145,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -92,6 +92,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_GETH_PRUNED_PEBBLE_HASH_DATA:-bob-mainnet-op-geth-pruned-pebble-hash}:/data
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -109,7 +110,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.6}
|
||||
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 16363:16363
|
||||
- 16363:16363/udp
|
||||
@@ -129,11 +130,11 @@ services:
|
||||
- OP_NODE_METRICS_ADDR=0.0.0.0
|
||||
- OP_NODE_METRICS_ENABLED=true
|
||||
- OP_NODE_METRICS_PORT=7300
|
||||
- OP_NODE_NETWORK=bob-mainnet
|
||||
- OP_NODE_P2P_ADVERTISE_IP=${IP}
|
||||
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- OP_NODE_P2P_LISTEN_TCP_PORT=16363
|
||||
- OP_NODE_P2P_LISTEN_UDP_PORT=16363
|
||||
- OP_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
|
||||
- OP_NODE_RPC_ADDR=0.0.0.0
|
||||
- OP_NODE_RPC_PORT=9545
|
||||
@@ -149,6 +150,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -92,6 +92,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-bob-mainnet-op-geth-pruned-pebble-path}:/data
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -131,6 +132,7 @@ services:
|
||||
- KONA_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- KONA_NODE_P2P_LISTEN_TCP_PORT=18347
|
||||
- KONA_NODE_P2P_LISTEN_UDP_PORT=18347
|
||||
- KONA_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- KONA_NODE_RPC_ADDR=0.0.0.0
|
||||
- KONA_NODE_RPC_PORT=9545
|
||||
- OP_NODE_SYNCMODE=execution-layer
|
||||
@@ -143,6 +145,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -92,6 +92,7 @@ services:
|
||||
- chains
|
||||
volumes:
|
||||
- ${BOB_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-bob-mainnet-op-geth-pruned-pebble-path}:/data
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
- /slowdisk:/slowdisk
|
||||
logging: *logging-defaults
|
||||
@@ -109,7 +110,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.6}
|
||||
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_MAINNET_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 18347:18347
|
||||
- 18347:18347/udp
|
||||
@@ -129,11 +130,11 @@ services:
|
||||
- OP_NODE_METRICS_ADDR=0.0.0.0
|
||||
- OP_NODE_METRICS_ENABLED=true
|
||||
- OP_NODE_METRICS_PORT=7300
|
||||
- OP_NODE_NETWORK=bob-mainnet
|
||||
- OP_NODE_P2P_ADVERTISE_IP=${IP}
|
||||
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
|
||||
- OP_NODE_P2P_LISTEN_TCP_PORT=18347
|
||||
- OP_NODE_P2P_LISTEN_UDP_PORT=18347
|
||||
- OP_NODE_ROLLUP_CONFIG=/config/rollup.json
|
||||
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
|
||||
- OP_NODE_RPC_ADDR=0.0.0.0
|
||||
- OP_NODE_RPC_PORT=9545
|
||||
@@ -149,6 +150,7 @@ services:
|
||||
networks:
|
||||
- chains
|
||||
volumes:
|
||||
- ./op/bob/mainnet:/config
|
||||
- .jwtsecret:/jwtsecret:ro
|
||||
logging: *logging-defaults
|
||||
labels:
|
||||
|
||||
@@ -45,6 +45,9 @@ services:
|
||||
ulimits:
|
||||
nofile: 1048576 # Max open files (for RPC/WS connections)
|
||||
user: root
|
||||
ports:
|
||||
- 10225:10225
|
||||
- 10225:10225/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 6060
|
||||
@@ -61,8 +64,9 @@ services:
|
||||
- --metrics
|
||||
- --metrics.addr=0.0.0.0
|
||||
- --metrics.port=6060
|
||||
- --nat=extip:${IP}
|
||||
- --networkid=808813
|
||||
- --nodiscover
|
||||
- --port=10225
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.txfeecap=0
|
||||
- --state.scheme=hash
|
||||
@@ -104,7 +108,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.6}
|
||||
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 15225:15225
|
||||
- 15225:15225/udp
|
||||
|
||||
@@ -45,6 +45,9 @@ services:
|
||||
ulimits:
|
||||
nofile: 1048576 # Max open files (for RPC/WS connections)
|
||||
user: root
|
||||
ports:
|
||||
- 12678:12678
|
||||
- 12678:12678/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 6060
|
||||
@@ -61,8 +64,9 @@ services:
|
||||
- --metrics
|
||||
- --metrics.addr=0.0.0.0
|
||||
- --metrics.port=6060
|
||||
- --nat=extip:${IP}
|
||||
- --networkid=808813
|
||||
- --nodiscover
|
||||
- --port=12678
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.txfeecap=0
|
||||
- --state.scheme=hash
|
||||
@@ -104,7 +108,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.6}
|
||||
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 17678:17678
|
||||
- 17678:17678/udp
|
||||
|
||||
@@ -45,6 +45,9 @@ services:
|
||||
ulimits:
|
||||
nofile: 1048576 # Max open files (for RPC/WS connections)
|
||||
user: root
|
||||
ports:
|
||||
- 12885:12885
|
||||
- 12885:12885/udp
|
||||
expose:
|
||||
- 8545
|
||||
- 6060
|
||||
@@ -61,8 +64,9 @@ services:
|
||||
- --metrics
|
||||
- --metrics.addr=0.0.0.0
|
||||
- --metrics.port=6060
|
||||
- --nat=extip:${IP}
|
||||
- --networkid=808813
|
||||
- --nodiscover
|
||||
- --port=12885
|
||||
- --rpc.gascap=600000000
|
||||
- --rpc.txfeecap=0
|
||||
- --state.scheme=hash
|
||||
@@ -104,7 +108,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.6}
|
||||
image: ${BOB_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${BOB_SEPOLIA_NODE_VERSION:-v1.19.7}
|
||||
ports:
|
||||
- 17885:17885
|
||||
- 17885:17885/udp
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user