277 Commits

Author SHA1 Message Date
53de81c09d ink-mainnet: remove orphaned op-geth compose files
Source already dropped ink-mainnet op-geth from config.yml, but
update.sh never prunes orphans — stale op/geth/ink-mainnet-op-geth-*.yml
files stayed in COMPOSE_FILE and fought op-reth for Traefik /ink-mainnet
(404). Delete the four orphans so only op-reth remains for that path.
2026-07-28 05:44:48 +00:00
093ecb0d7a op.superseed.sepolia: bump conduit-op-reth v2.1.1 -> v2.1.2
Also regenerates digibyte-mainnet compose to match already-landed digibyted 9.26.5 pin.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 02:43:25 +00:00
c3ce5da911 bump bsc reth-bsc v0.1.0-fix -> v0.1.1 (Pasteur-ready)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 00:42:19 +00:00
81985dbc98 digibyte: bump digibyted Dockerfile 9.26.4 -> 9.26.5
Post-activation maintenance release; update VERSION and tarball SHA256.
2026-07-26 06:14:11 +00:00
c17c4bd35e berachain-bepolia: bump bera-reth v1.4.3 -> v1.4.3-rc.0 (Osaka1)
v1.4.3 does not exist on GHCR; v1.4.3-rc.0 is the Osaka1 hardfork fix.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-26 06:08:05 +00:00
6078c661dc deploy: regenerate compose from vibe-node main 2d213d3bd0ee 2026-07-26 04:43:23 +00:00
3737986e27 taiko-hoodi: bump nethermind 1.39.1 -> 1.39.2 (.NET CVE patch)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-26 04:37:06 +00:00
d56b3a414b zircuit-garfield: migrate testnet to Conduit (op-reth + op-node)
Replace the old op-geth + zircuit1/op-node garfield (holesky L1, built-in
OP_NODE_NETWORK=garfield) with the Conduit node template:
- EL: ghcr.io/conduitxyz/conduit-op-reth:v2.1.1 (--chain=/config/genesis.json)
- CL: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.19.0
      (OP_NODE_ROLLUP_CONFIG=/config/rollup.json)
- L1: Ethereum Sepolia (l1_chain_id 11155111)
- rollup.json/genesis.json from api.conduit.xyz (slug zircuit-garfield-testnet;
  regenesis 2026-07-06, bedrockBlock 0)
- Conduit P2P static peer + bootnodes
Remove the 4 now-orphaned op-geth garfield composes (none were deployed).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-25 03:45:22 +00:00
05066c20d0 berachain-bepolia: bump bera-reth v1.4.2 -> v1.4.3
EL/CL baseFee mismatch at block 22961752; CL crash-loops on
INVALID payload from post-v1.4.2 block format while beacon-kit
is on v1.4.1. Also regenerates ink-mainnet OPE P2P bootnodes
from parent a790c3e and refreshes reference-rpc-endpoint (mova).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 10:55:03 +00:00
60fa1dd047 deploy: regenerate compose from vibe-node main 98bd87d192f5 2026-07-23 07:13:30 +00:00
b02c0971ce deploy: regenerate compose from vibe-node main de243b1ca320 2026-07-23 03:14:03 +00:00
99664129aa deploy: regenerate compose from vibe-node main 4a45537ac06b 2026-07-22 23:25:05 +00:00
rob
511a3621f2 jwt volumes join secrets as no-backup-by-design: benign skip in clone-backup, exempt from list-restorable restorability
-jwt volumes (EL/CL shared secret) are regenerated at create-node and never
backed up, same as -secrets. Two fixes:

- clone-backup.sh: extend the fd8dd15b secrets skip to *-jwt (both paths)
- list-restorable.sh: exclude *-jwt/*-secrets from the all-volumes-required
  restorability check. Both plasma composes showed Restorable: 0 for days
  (mainnet 407G + testnet 98G+29G data backups present since 07-18/19)
  purely because rpc_plasma-*-jwt had no backup; this misled the 07-16
  plasma restore assessment ('de-32: NO plasma backup').

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 22:35:08 +00:00
rob
fd8dd15b40 clone-backup: missing *-secrets backup is a benign skip, not a failure
Secrets volumes are regenerated at create-node and generally have no
backup by design. Counting the skip as Failed (exit 1) false-failed
whole provisions whose data volumes transferred fine (tempo de-32->de-27,
job e9634e66: executor's broken-pipe guard reset the action and would
have re-cloned everything). Reported by claude@ (inbox 829bc624).

- no-backup on a *-secrets volume -> return 2 (skip), both nc and ssh paths
- rc=2 tracked as Skipped in the summary, excluded from the failure count
- exit status now keys on failed_volumes only

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 10:59:49 +00:00
d4d4091939 Bump cronos-zkevm external-node from v31.0.0 to v31.3.0
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 06:09:43 +00:00
ad4c7e5528 arc.testnet: bump arc-execution + arc-consensus 0.7.2 → v0.7.3 (EL+CL lockstep)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 01:06:36 +00:00
28232799c7 deploy: regenerate compose from vibe-node main daf770f1b20d 2026-07-22 00:25:03 +00:00
35aa9c9d1e gnosis: expose nimbus CL beacon REST via Traefik (mirror ethereum)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 23:56:57 +00:00
63736e47a3 tempo: drop removed --consensus.fee-recipient flag (1.10.2 crash-loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 12:26:19 +00:00
eb7c5f0e64 bsc: bump bsc client 1.7.3 → 1.7.6 (Pasteur hardfork)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 11:24:18 +00:00
rob
ea3a1d541f drpc-free: default GW_FREE_REDIS_RAM to 512MB (empty var made redis-free crash-loop on us-45)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 09:35:48 +00:00
0068e82f6b berachain.mainnet: bump bera-reth v1.4.1 → v1.4.2
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 04:04:28 +00:00
rob
c7b29693e2 op-node fleet-wide: OP_NODE_L2_SKIP_SYNC_START_CHECK=true (trust unsafe head on restart)
The false default forced every op-node restart to walk back to the finalized head
before driving the EL. On nodes whose derivation lags days behind their serving
gossip head (hashkey us-40: 510k blocks / 12 days), that froze the EL for hours
while dRPC de-routed the sole US provider. true resumes at the unsafe head in
minutes; safe/finalized still verify and catch up in the background. ronin
already ran true per-chain (same lesson); xlayer keeps its deliberate false pin.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 04:01:02 +00:00
7db90e75e4 deploy: regenerate compose from vibe-node main b0f2d7c6cc87 2026-07-21 03:04:31 +00:00
rob
ceefedf5ab hashkeychain: commit genesis assets + drop config-download init containers
Removes the alpine genesis/rollup init containers and their
service_completed_successfully gate for all hashkeychain variants. The gate
wedged us-40: a reconcile compose-up recreated the op-reth EL but not the
init-gated op-node CL -> fresh EL + stale CL -> 2h engine freeze -> sole-provider
market -> $0 (2026-07-21). genesis.json now committed beside the existing
rollup.json so render_templates auto-detects custom_genesis/custom_rollup and
binds the local files; CL now depends only on the EL (service_started,
restart:true), identical to op-mainnet/op-sepolia. No S3 on the boot path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 02:14:30 +00:00
fbc5af63e2 deploy: regenerate compose from vibe-node main 00e25d8393e3 2026-07-21 01:01:56 +00:00
093babb50f drpc: cap dshackle JVM heap with JAVA_OPTS=-Xms1g -Xmx4g
Image default is -Xms1024M with no -Xmx, so heap can grow unbounded (~30GiB).
us-41 was at 90% memory with no swap; -Xmx4g provides a safety limit.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-20 16:24:22 +00:00
477afc412a bitcoin-cash: bump bitcoind (bitcoin-abc) 0.33.7 -> 0.33.8
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-20 15:37:46 +00:00
53503bc6e5 deploy: regenerate compose from vibe-node main 73a2d943c297 2026-07-20 13:10:03 +00:00
rob
c83d685d87 Bump Linea maru consensus client to 1.3.0-20260714-ced387a.
Catch up from v1.2.1/1.0.1 pins so mainnet and sepolia followers track the current Consensys/maru release.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 09:43:33 +00:00
rob
9c6a4ab148 Dogfood public bootstrap peers as secondary reinject seed.
Add bootstrap-peers.sh and fall back to stakesquid.eu/bootstrap when local peerset capture is empty; optional --seed-bootstrap on connect-peers.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 08:56:52 +00:00
6a19dc91e1 deploy: regenerate compose from vibe-node main e1cb79cc7707 2026-07-19 08:52:47 +00:00
rob
bfdc6e21ec Make maru versions OCI-observable and fix metrics scrape path.
Re-label consensys/maru FROM tag into image OCI labels (upstream leaves
version/vcs-ref empty) and scrape /metrics on :9090 instead of the 404ing
/debug/metrics/prometheus path.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 08:32:54 +00:00
rob
2919960697 Peer persistence hooks: capture before stop, reinject after start
Clients (esp. discovery-disabled OP-stack EL) lose peers across recreate.
Generic peer-capture/peer-reinject hooks + force-recreate wiring restore
the peerset from local peer-state via in-network admin_addPeer.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 05:25:27 +00:00
db81e62c73 plasma: add testnet compose + assets (reth + plasma-consensus)
Canonicalize plasma-testnet so the tracked compose adopts the same
volume/service names as the de-32 hand-written override (rpc_plasma-
testnet-reth-pruned-trace-{execution,consensus,jwt}). Also refresh
mainnet observer sed to be chain-agnostic.
2026-07-19 04:15:45 +00:00
rob
95360bd238 fix: rewrite tar extract onto target volumes root when it is a cross-device symlink
Hosts like rpc-us-32 put /var/lib/docker (or volumes/) on another mount;
tar -C / then EXDEV on every var/lib/docker/volumes/... member. Canonicalize
the deepest static prefix (readlink -f /var/lib/docker/volumes) and append a
--transform after SLOWDISK_TRANSFORMS. Keying only on /var/lib/docker misses
a real docker root with volumes/ as the symlink. No-op on normal hosts.
Per-volume _data static-file offload stays on SLOWDISK_TRANSFORMS.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 02:24:56 +00:00
38c43345f6 bump kona-node image tag v1.6.1 → v1.6.2
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 02:44:38 +00:00
f14b9ff27d celo+ronin: bump eigenda-proxy relay to 2.7.1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 01:55:07 +00:00
ab58da64b7 deploy: regenerate compose from vibe-node main 87142cd310ec 2026-07-18 00:12:57 +00:00
1fdef578b3 op.ink.sepolia: bump op-reth image tag v2.3.2 → v2.4.0
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 17:08:28 +00:00
64e0bef77a deploy: regenerate compose from vibe-node main 9ed685edcf50 2026-07-17 14:34:25 +00:00
07be37d3a4 deploy: regenerate compose from vibe-node main 2583bcb3d07e 2026-07-17 01:33:53 +00:00
3e22390e9a op.katana.mainnet: pin op-reth develop → v2.4.0
Also regenerate compose for already-merged hashkey static-peers / op-geth
static-nodes entrypoint (parent #1437) that had not yet landed in rpc.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 13:39:58 +00:00
671f293771 tempo-testnet: fix init exit when validator_key.json exists
Replace buggy && short-circuit with if/fi so the one-shot init
exits 0 when the signing key is already present (matches mainnet/
moderato and templates/clients/reth.tempo.yml), unblocking sync
resume on data-intact hosts still on the orphaned testnet compose.
2026-07-16 05:08:07 +00:00
d2dc6a607e nethermind: bump 1.39.0 → 1.39.1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 00:40:08 +00:00
6c48f8a8e5 deploy: regenerate compose from vibe-node main f34cc646017b 2026-07-15 23:17:07 +00:00
98d8a25e53 fix chain-name typos: ethereum-hoodie→hoodi, drop stale soneium-miniato compose
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-15 18:14:59 +00:00
b92e1a6e67 deploy: regenerate compose from vibe-node main 37cda84e5bde 2026-07-15 16:03:43 +00:00
810c5b8631 ethereum: bump prysm v7.1.4/v7.1.6 → v7.1.7 in generated compose defaults.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-15 13:06:09 +00:00
de7984c792 deploy: regenerate compose from vibe-node main dfabbf30beac 2026-07-15 12:14:04 +00:00
rob
d40fbfaac3 reload_dshackle.sh: detect-and-restart on SIGHUP reload failure
dshackle's SIGHUP reload silently fails for upstream REMOVALS (and method-set
changes, same remove+add path): it logs "Config is not reloaded, cause - ...",
updates the in-memory config but leaves runtime selectors stale (drift), and keeps
serving the old config. No runtime admin API exists to mutate upstreams, so a
container restart is the only way to actually apply such changes.

Replace the blind SIGHUP with: per-container SIGHUP, then check post-SIGHUP logs
for the failure marker ("Config is not reloaded, cause -") or a dropped concurrent
HUP ("Reloading is in progress"); on either, docker restart to load config fresh.
"Reloading config has been completed" is NOT success (finally-block) — deliberately
not treated as such. Exit 0 when config ends up applied (via SIGHUP or restart);
non-zero only if a needed restart fails or the container doesn't come back.

Layered on top of the override-weave (apply-dshackle-overrides.py) and the 1:1
invariant gate (validate-dshackle-1to1.py) — both run unchanged before the reload.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-15 06:49:39 +00:00
3dfe9cd8ef reload_dshackle.sh: gate the reload on the 1:1 invariant
Insert validate-dshackle-1to1.py between the overrides weave and the HUP signal:
a dshackle config routing >1 node for the same chain is REFUSED (exit 1) so the
live config stays active. Structural enforcement of 1 dshackle = 1 node/chain —
we can't attribute traffic to multiple nodes behind one proxy (no per-upstream
request metric; conn-seconds biases it). See /root/proxy-1to1-invariant-plan.md.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-15 01:02:52 +00:00
bcc24595a9 add validate-dshackle-1to1.py: structural 1:1 proxy invariant gate
Refuses to activate a dshackle config routing >1 upstream for the same chain
(any kind/client) — we cannot attribute traffic to multiple nodes behind one
proxy (no per-upstream request-count metric; conn-seconds biases it), and the
attribution model + placement planner both assume 1:1. Wire into
reload_dshackle.sh BEFORE the reload so a drifting config can never go live.
Host-local by design (the repo doesn't track host->dshackle assignment; 1:1 is
only checkable against the assembled dshackle config at /root/rpc/main_configs).
See /root/proxy-1to1-invariant-plan.md.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-15 00:12:48 +00:00
e67c16a432 cronos-testnet: use v1.7.8-testnet cronosd binary (tcrc bech32)
Mainnet cronosd v1.7.8 embeds crc/crcvaloper prefixes and cannot replay
testnet validator addresses (tcrc/tcrcvaloper), causing crash-loop on start.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 15:21:26 +00:00
f0ec0ba784 deploy: regenerate compose from vibe-node main 80a0c8998610 2026-07-14 15:06:31 +00:00
e165b81731 deploy: regenerate compose from vibe-node main bbf5b6cdb835 2026-07-14 12:50:47 +00:00
526f125d5a cronos: persist ws-origins=* in init.sh on every start
Empty ws-origins rejects WebSocket connections with an Origin header
(dshackle head-subscription monitoring). Sed under [json-rpc] like
address/ws-address so restarts keep the value.
2026-07-13 17:09:09 +00:00
14b3d70125 deploy: regenerate compose from vibe-node main e5b8e344f927 2026-07-13 16:58:03 +00:00
ba410ba7f6 plasma: vendor mainnet chain assets (genesis, non-validator config, validator keys) 2026-07-13 16:34:23 +00:00
a761bd7845 deploy: regenerate compose from vibe-node main b9a5ff49c3b4 2026-07-13 15:50:09 +00:00
2e9f31a6fb deploy: regenerate compose from vibe-node main 95fd32365c42 2026-07-13 04:19:56 +00:00
4509b5afd2 op/celo,op/ronin: revert eigenda-proxy 2.7.1 → v2.6.0
Restore prior eigenda-proxy relay image default in generated compose.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-13 01:06:36 +00:00
849f5e3235 op/celo: bump eigenda-proxy v2.6.0 → 2.7.1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 23:36:30 +00:00
59c8d67923 op.ronin: bump eigenda-proxy 2.7.0 → 2.7.1
Update default relay image tag for Ronin mainnet and Saigon testnet
compose profiles.
2026-07-12 20:36:27 +00:00
5dd087f10b fraxtal: bump op-node to v1.19.0-frax-1.2.1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 17:04:55 +00:00
050c67f48e deploy: regenerate compose from vibe-node main 88f325516e7b 2026-07-12 15:14:49 +00:00
10e8772e85 deploy: regenerate compose from vibe-node main 20e64aa33cad 2026-07-12 12:06:33 +00:00
7ba1b0944b aztec-testnet: bump AZTEC_TESTNET_AZTEC_VERSION to 5.0.0-rc.2
Testnet rollup protocol upgrade; rc.2 passes compatibility check.
2026-07-12 03:12:00 +00:00
rob
932617814a accesslog-shipper: emit __shipstat__ sent-line checkpoints for splits reconciliation
The splits completeness floor is TIME-based (trust hours complete since shipper
connect) and blind to event-loss-by-rotation (2026-07-10: raw_events rotated
every 1-2min, cruncher lost ~85% of us-32 events, floor still called the hours
complete). Shipper now injects {"__shipstat__":1,"sess":..,"sent":N,"ts":..}
every 1000 lines or 30s through the SAME tcp pipe. Cruncher diffs shipper-sent
vs DB-ingested per gateway/hour -> a reconciliation-based floor that catches the
loss a clock cannot. sess=connection-start epoch so resets on reconnect are
detectable. Logic in a mounted .awk file (not inline) to dodge sh/awk quoting.
Verified on busybox:1.36 (systime/fflush OK). NOT deployed until claude@'s
cruncher filters __shipstat__ from event parsing - coordinating via SIP.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 02:41:01 +00:00
ff41ec1c25 deploy: regenerate compose from vibe-node main 642ad0342dde 2026-07-12 02:09:52 +00:00
52d0d7cf05 deploy: regenerate compose from vibe-node main dbd3156992d7 2026-07-11 15:33:25 +00:00
25ba700ea2 Bump vanilla erigon3 compose image tag v3.5.0 → v3.5.1
Regenerated from context.clients.erigon3.client_version bump (ethereum,
gnosis, linea profiles only; polygon/BSC forks unchanged).
2026-07-11 13:07:23 +00:00
a47324ed0a deploy: regenerate compose from vibe-node main 91d4f07dcd8a 2026-07-11 10:32:47 +00:00
rob
ea7d207994 robinhood: nitro archive profile (pebble/hash) - mainnet archive for US-West placement (operator request 2026-07-11); pruned regen picks up filter-log-cache knob
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 05:15:25 +00:00
rob
190a23ceb8 clone-node: port both slowdisk extract fixes from clone-backup (EXDEV transform + script-file listener)
Same duplicated listener code, same two latent bugs. Not exercised today
(de-32 target has SLOWDISK=False) but any clone to a SLOWDISK=True host
would have failed identically.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 04:49:56 +00:00
4cc335cfce deploy: regenerate compose from vibe-node main 6e2f43c9c44b 2026-07-11 02:35:08 +00:00
rob
9898af951a clone-backup: ship the nc listener as a script file - inline bash -c quoting cannot carry --transform expressions
The slowdisk --transform args contain '|' and quotes; the ssh+screen+bash -c
stack strips one quoting level too many and splits the pipeline (broke the
katana retry within minutes of fccf2792). A heredoc-generated
/tmp/transfer_<key>.sh is parsed exactly once on the target. Applies to both
the screen and nohup listener branches; the direct-ssh fallback already had a
single shell layer and stays inline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 02:21:34 +00:00
rob
fccf279262 slowdisk offload: fix EXDEV - extract statics via tar --transform, not through symlinks
tar cannot create files through a directory symlink whose target is on
another device: open() fails with 'Invalid cross-device link' even under
--keep-directory-symlink (reproduced, GNU tar 1.34 and 1.35). This killed
the katana->uk-4 provision (place-provision-katana-EU-NorthWest-p1) and
means the slowdisk EXTRACT path never worked on hosts with a separate
/slowdisk device. Rewrite member paths with --transform so tar writes
directly into /slowdisk/rpc_<key>__data_<rel>; the symlink stays for the
container's runtime view. Also aligns restore-volumes' nested-path target
naming to the double-underscore convention clone-backup already uses.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 01:50:20 +00:00
defb9133ea deploy: regenerate compose from vibe-node main cea830d7ba6e 2026-07-11 01:20:00 +00:00
dd7d245625 deploy: regenerate compose from vibe-node main 39dc24762604 2026-07-11 00:36:48 +00:00
35f093e620 op/hashkeychain/testnet: add missing Granite–Jovian hardfork activation times
Node was forked at block 30194654 because rollup.json lacked holocene_time
and later fork timestamps; add granite/holocene/isthmus/jovian times so
op-node can apply post-Holocene batches after resync.
2026-07-10 20:31:45 +00:00
rob
f04d2f9440 cronos Dockerfile: support -testnet version suffix (release tag = base version, asset keeps suffix) - testnet builds use tcrc bech32 prefixes; mainnet binary crashes on testnet validator addresses
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 17:58:09 +00:00
3b46f53a4d deploy: regenerate compose from vibe-node main 3c76d7176c60 2026-07-10 17:20:01 +00:00
bd912b3616 deploy: regenerate compose from vibe-node main 92f020f27b22 2026-07-10 17:03:17 +00:00
rob
2814d358fe cronos-testnet: new pruned node compose (cronostestnet_338-3)
Verified from crypto-org-chain/cronos-testnets: genesis, 3 official seeds,
t3 statesync RPC, basetcro denom; official daily snapshots exist for restore
(sidesteps the cosmos binary-upgrade gauntlet). Closes the planner's
'cronos-testnet: no known node_path' escalation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 16:35:38 +00:00
rob
8c73946212 bor: env-parameterize --cache (default 1024 = bor's own default, rendering no-op) - polygon getLogs at 11.6s mean was pure cache starvation on a 125G/104G-free NVMe host
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 16:19:51 +00:00
rob
927afb2dab op-reth: env knobs for --rpc.max-trace-filter-blocks (default 10000 = previous hardcoded) and --rpc.max-response-size (default 160 = reth default) - tracer-mule tuning surface; max-tracing-requests deliberately NOT pinned (reth self-sizes to cores)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:55:51 +00:00
rob
3d22031a12 dshackle overrides: tab guard - dshackle silently skips hot-reloading YAML containing tabs (operator gotcha); refuse to write tabbed output + audit all configs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:17:35 +00:00
rob
091a759367 dshackle overrides: read chain-level disables from .env (DSHACKLE_<CHAIN>_METHOD_GROUPS_DISABLED) - flows from host_vars env_overrides through the standard envfile pipeline; host-local yaml remains as secondary source
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:05:27 +00:00
rob
f85b2f457f dshackle overrides weave: host-local method/option overrides survive config regens
/root/rpc-local/dshackle-overrides.yaml (host-local, like rpc-local/compose.d) is
re-woven into main_configs/*.yaml by reload_dshackle.sh on every config push.
Method-disable decisions are local to each gateway's market (operator eviction
rule: cost_ratio = time_share/call_share at flat pay); this makes them durable
inputs instead of fragile output patches. Step 1 of moving dshackle config
generation onto the gateway hosts (step 2: ssh forced-command upstreams fetch,
generic dshackle.yaml include list derived from drpc-gateways.json).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:04:43 +00:00
rob
2c6938dee5 method-economics.py: host-local method cost-vs-pay analysis
Each gateway serves its own regional market, so the eviction economics
(cost_ratio = time_share/call_share at flat per-call pay) are computed where
they apply: against the local dshackle's histograms. Silent on non-gateway
hosts. Offenders = candidates for per-upstream method-groups/methods disables
(operator eviction rule 2026-07-10). sendRawTransaction et al [protected].

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:01:06 +00:00
rob
f88ec86b47 cache knobs: env-parameterize geth/op-geth --cache (default 1024 = geth's own), l2geth --cache (default 8192 = previous hardcoded), nethermind MEMORYHINT (default 2048000000)
All defaults preserve current effective behavior - this deploy is a rendering no-op
until a host_var overrides a value. Part of the resource-optimizer knob rollout
(resource-optimizer/knob-manifest.yaml is the registry; verify_manifest.py enforces
default sync between templates and envfile).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 14:34:10 +00:00
rob
6ccd711ad5 mantle-sepolia: materialize static-peer template change into rendered composes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 14:34:10 +00:00
rob
36f5f34536 ink-mainnet: materialize merged Karst-genesis template changes (PR #38) into rendered composes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 14:33:31 +00:00
rob
5d0bc35eaf nitro: env-parameterized --execution.rpc.filter-log-cache-size (default 32) - getLogs is 22% of arbitrum traffic; big-RAM hosts can cache hours of log blocks
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 13:20:13 +00:00
rob
a8655586db beacon x-upstreams: disable-validation on all beacon-chain upstreams
dshackle 0.79.10's beacon health validator (GET /eth/v1/node/health via
GenericSingleCallValidator) times out after 5000ms on the spec-compliant
empty-body 200 that nimbus returns, marking the upstream UNAVAILABLE in a
flap loop; live requests routed during flap windows fail 'Source was empty'.
This is the root cause behind dRPC's 617k failed validators POSTs complaint
(2026-07-09). Reproduced + workaround verified on an isolated dshackle
instance on de-14. Head tracking still governs availability.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 12:22:18 +00:00
rob
8273fc9c5b aztec-mainnet: new pruned full-node compose (early dRPC presence, EU-West) - L1 via ETHEREUM_MAINNET_* env, p2p 13840
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 07:30:21 +00:00
rob
b824fb0cf4 aztec-testnet: 5.0.0-rc.1 -> 5.0.0-rc.2 - VK tree root mismatch with upgraded testnet rollup (node wedged 'Still waiting' on de-13)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 07:04:14 +00:00
sebastian
75d52b6d00 Merge pull request 'ink mainnet: add Karst genesis from superchain-registry' (#38) from issue-1124 into main
Reviewed-on: #38
2026-07-10 00:57:54 +00:00
dbacd49d86 ink-mainnet: add superchain-registry genesis for op-reth
Vendor the Ink mainnet L2 genesis (chain 57073, karstTime included) from
superchain-registry so op-reth can mount /config/genesis.json.
2026-07-09 23:53:10 +00:00
rob
9f96548ca3 drpc: fix shipper command YAML (colon-space in unquoted scalar broke compose)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 13:24:17 +00:00
rob
dc14e9cf2b drpc: accesslog-shipper sidecar (NDJSON tail -> splits listener)
Decoupled by design: dshackle writes the file regardless; a dead listener
or slow link stalls only the busybox sidecar. Retry resumes at file end
(bounded loss); the listener-side prometheus reconciliation surfaces gaps.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 13:10:10 +00:00
rob
00356d77e6 edge map: +177.54.154.0/24 Singapore (sentinel catch; adjacent /24 is Chicago)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 12:43:57 +00:00
rob
8cc850160d utils: canonical dRPC edge IP prefix -> region map (splits pipeline seed)
7 edge locations from us-16 + de-14 captures: Chicago/Ashburn/LA/Frankfurt/
Falkenstein(=eu-west2)/London/Tokyo/Singapore. /24 granularity mandatory
(adjacent /24s differ by city). eu-west3 reserved for the GCP edge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 12:41:05 +00:00
rob
53162f7ee0 drpc: mount ./dshackle_logs:/logs for the dshackle accessLog
Gateway request-splits pilot (earnings misattribution fix): the accessLog
stub in main_configs pointed at /logs which was never mounted. Host-side
dir lets the splits tailer aggregate per-caller response counts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 12:15:55 +00:00
rob
8baf603b48 Add hemi sepolia (testnet, chain 743111): op-geth pruned variant
hemi-testnet US-Central market $6/day with 2 providers. BTC side =
testnet3 (own hVM genesis @3522419), L1 = ethereum sepolia, snap sync,
genesis+rollup checked in per hemi-node testnet dir, fork overrides in
env/op/hemi/sepolia/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 09:35:25 +00:00
rob
b54bfa84ef slowdisk fit check: 90d growth headroom (statics grow; /slowdisk is often the root partition)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 07:22:13 +00:00
rob
a0b47b3631 restore-volumes: fail loudly when static offload cannot fit on /slowdisk
A silent fallback to primary-disk extraction violates the caller's NVMe
capacity math now that the planner treats slowdisk as a separate pool.
When SLOWDISK=True and the manifest's static sizes (accurate, replacing
the whole-archive x2 estimate that false-refuses large restores) do not
fit above the floor, error out with the explicit remedy: re-run with
--no-slowdisk as the conscious override. Operator directive 2026-07-09.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 07:20:52 +00:00
rob
331a9c27a8 Lift reth static-file symlink guard: op-reth v2.3.2 verified through symlink
Live test on rpc-uk-4 (unichain-mainnet pruned, 166G static_files moved to
/slowdisk + symlinked): reth healed consistency, initialized the
StaticFileProducer, and resumed committing canonical blocks - full
read/write through the symlink. The guard's premise (old reth refusing
symlinked static_files) no longer holds; pre-v2 reths fail loudly at start,
fallback is --no-slowdisk. Restores/clones of reth nodes to SLOWDISK=True
hosts now offload statics automatically (NVMe is the scarce resource).
Note: reth also has --datadir.static-files for a flag-based layout later.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 07:10:23 +00:00
d77ee75752 deploy: regenerate compose from vibe-node main 17caf065f38f 2026-07-09 02:04:21 +00:00
rob
5137dcbfba hemi mainnet: op-geth 05d4d8f -> 7cfc394 (2026-07-08 build)
Candidate fix for the receipts RLP decode failure that blocks snap sync
past block 4,178,637 (2026-04-12): peers dropped with 'invalid message
(code 10) receipt 1: rlp: ListEnd not positioned at EOL' on the previous
newest published image.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 01:41:19 +00:00
88dbbd1ef2 morph: bump l2geth 2.2.3 → 2.2.4 (ghcr.io/morph-l2/go-ethereum)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-09 01:40:20 +00:00
9ca7ddd52d deploy: regenerate compose from vibe-node main 5ac8fffb7d6c 2026-07-09 00:34:34 +00:00
090116d8c4 deploy: regenerate compose from vibe-node main 3fd0cf61f237 2026-07-08 13:17:12 +00:00
rob
c07dc9f720 show-status: footer listing fenced nodes (maintenance windows)
Fenced nodes are dropped from COMPOSE_FILE so show-status silently omitted
them - a fenced-but-running node looked 'gone'. rpc-update now writes
/root/rpc/.fenced (node | until | reason | owner per active window); print
it as a footer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 13:06:15 +00:00
7c2ef13238 op/lisk: bump op-node v1.19.1 → v1.19.2 on mainnet
Karst hardfork activates 2026-07-08T16:00:01 UTC; op-reth v2.3.3
already supports getPayloadV5.
2026-07-08 12:26:38 +00:00
rob
1ebabee93d volume-utils: per-volume-kind restorable floor (_config tars are legitimately tiny)
The 1MB near-empty guard (added for purged-volume zstd stubs) rejected every
legitimate _config volume archive (cronos: 68KB), so any node whose registry
entry includes a _config volume reported Restorable: 0 despite healthy
multi-GB data backups (cronos had three; 14 registry entries carry _config
volumes). _config archives now pass at >=4KB; data volumes keep the 1MB floor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 12:01:44 +00:00
cf26455d3a deploy: regenerate compose from vibe-node main 07b0472e0d1a 2026-07-08 11:49:07 +00:00
sebastian
ad93d73f12 Merge pull request 'cosmos gaiad: document Polkachu FULL snapshot bootstrap procedure' (#36) from issue-982 into main
Reviewed-on: #36
2026-07-08 11:46:24 +00:00
rob
9aa98718b6 hemi mainnet: syncmode full -> snap
hemi cannot full-sync across old BTC reorg points: EVM blocks referencing
orphaned Bitcoin Attributes ancestors are unexecutable once no peer retains
the stale BTC block (us-16 wedged at 3353463 on reorged-out block
00000000000000000001dcb3...b971). hemi's official l2-config.toml ships
SyncMode=snap. Registry: 150 entries gain node names (regen enrichment).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 11:44:52 +00:00
sebastian
c8f89a43d3 Merge pull request 'linea-mainnet: add engine-API healthcheck script' (#37) from issue-1049 into main
Reviewed-on: #37
2026-07-08 11:43:37 +00:00
rob
9ac5529ef5 R-2: gitignore chaindata/snapshot/tarball patterns 2026-07-08 04:20:06 +00:00
04b9a5356d linea: add engine API healthcheck script for geth mainnet
Shell probe signs a JWT from /jwtsecret and calls engine_exchangeCapabilities
on :8551 so compose can gate Maru startup on EL engine readiness.
2026-07-08 03:24:13 +00:00
rob
5ee02b85d4 Add unichain op-reth archive-trace variants (mainnet + sepolia)
Operator wants a reth archive sync on de-32 to compare footprint vs the
612G op-erigon archive.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 03:03:49 +00:00
73173299c9 cosmos gaiad: document Polkachu FULL snapshot bootstrap procedure
Fresh wasm-chain bootstrap needs a Polkachu full snapshot (includes wasm/),
the snapshots URL pattern, and CL_VERSION matching the live chain version.
2026-07-07 14:39:03 +00:00
990a406751 deploy: regenerate compose from vibe-node main cef3cb8cdb49 2026-07-07 14:19:44 +00:00
1ec43f481f deploy: regenerate compose from vibe-node main d0d784c8ff09 2026-07-07 13:45:47 +00:00
goldsquid
623deaf9d6 update 2026-07-07 18:22:08 +07:00
goldsquid
50c00156cf fix 2026-07-07 18:17:00 +07:00
41d4dd0d5c deploy: regenerate compose from vibe-node main 218c002b232e 2026-07-07 06:00:03 +00:00
33ea38b8d9 mode: add optimism.eip1559DenominatorCanyon=250 to mainnet genesis
Canyon-fork EIP-1559 denominator, present in the authoritative genesis
on rpc-de-32 but missing from the committed copy. Matches the fork-time
addition in d4fc9487.
2026-07-07 01:02:48 +00:00
d4fc948794 mode: add mainnet L2 fork times to genesis.json config
Add the post-Regolith OP-stack fork activation timestamps (canyon through
karst) to op/mode/mainnet/genesis.json, sourced from the authoritative
copy running on rpc-de-32 (sha256 ea320f6a). The committed genesis was
missing every fork time after regolithTime, so op-reth could not apply
the L2 hardfork schedule.

canyonTime=shanghaiTime=1704992401, deltaTime=1708560000,
ecotoneTime=1710374401, fjordTime=1720627201, graniteTime=1726070401,
holoceneTime=1736445601, isthmusTime=1746806401, jovianTime=1764691201,
karstTime=1783526401.
2026-07-06 15:39:48 +00:00
goldsquid
6ec29db531 fix 2026-07-06 22:24:00 +07:00
goldsquid
c14a357773 reth for mode 2026-07-06 22:02:42 +07:00
a397561afa ethereum: bump prysm v7.1.4 → v7.1.6 on mainnet only
Update Prysm beacon-chain image default for ethereum mainnet profiles
(geth pruned/minimal + reth trace); sepolia and hoodi remain on v7.1.4.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 14:38:43 +00:00
57db6a16fa multicurl: fix cat: '': No such file or directory when called without -o
$temp_file is only created when curl is invoked with -o (the -o loop
above), but the post-success null/error check always ran `cat "$temp_file"`.
When a caller omits -o (e.g. check-health.sh's Cosmos reference RPC), the
variable is empty, so bash executed `cat ""` and printed
"cat: '': No such file or directory" — once per show-status run.

In that no-o case the body is already captured in $output, so read the
response from $output when $temp_file is unset, and from $temp_file when
it exists. Behaviour with -o is unchanged; the result==null / JSON-RPC
error skip-to-next-URL fallback is preserved in both paths.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 14:00:30 +00:00
goldsquid
ea15f31844 fix 2026-07-06 20:53:10 +07:00
6d41b16150 deploy: regenerate compose from vibe-node main c828f26e351e 2026-07-06 13:35:00 +00:00
goldsquid
dec01b5a18 fix 2026-07-06 20:20:48 +07:00
goldsquid
5b33030773 fix 2026-07-06 20:10:56 +07:00
c83f2cc5de deploy: regenerate compose from vibe-node main 8ef91b9ce256 2026-07-06 13:04:10 +00:00
goldsquid
ce7f278f77 fix 2026-07-06 19:56:34 +07:00
goldsquid
d9072c7b4d fix 2026-07-06 19:34:01 +07:00
goldsquid
0e4b69c65d fix 2026-07-06 19:29:29 +07:00
goldsquid
27b33458de better discovery 2026-07-06 19:27:39 +07:00
8684fbb96b katana mainnet op-reth: execution-layer sync + conduit bootnodes
op-node env (env/op/katana/mainnet/node.env):
- OP_NODE_SYNCMODE: consensus-layer -> execution-layer
- add OP_NODE_SYNCMODE_OFFSET_EL_SAFE=12h
- add OP_NODE_P2P_BOOTNODES (conduit katana bootnodes)
- drop OP_NODE_L2_SKIP_SYNC_START_CHECK=true (global default false applies)

Regenerates katana-mainnet-op-reth-pruned-trace + -archive-trace.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 11:04:20 +00:00
2418c15d52 deploy: regenerate compose from vibe-node main f045d7a27b13 2026-07-06 09:32:53 +00:00
1760023975 sonic: bump Dockerfile Go base image 1.24 -> 1.26 for v2.2.0
v2.2.0 requires go 1.26.0 per upstream go.mod.
2026-07-06 01:58:26 +00:00
cf6fda7fa6 deploy: regenerate compose from vibe-node main 16db41852a31 2026-07-06 00:34:02 +00:00
goldsquid
a498b12b45 fix 2026-07-06 07:29:12 +07:00
55df34de69 ronin-saigon op-reth: op-node consensus-layer CL-sync (SKIP_SYNC_START_CHECK=true)
Match ronin-mainnet's EigenDA alt-DA recipe on both saigon profiles
(archive-trace + pruned-trace): OP_NODE_SYNCMODE execution-layer ->
consensus-layer and OP_NODE_L2_SKIP_SYNC_START_CHECK false -> true.
Hand-maintained edit (these CL-sync flags are not template-driven);
do NOT regenerate saigon via update.sh or it reverts. Mainnet untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 00:21:39 +00:00
6311aeae0b deploy: regenerate compose from vibe-node main 6463a06bc49f 2026-07-05 14:23:54 +00:00
f1661bd650 op/bnb,op/manta-pacific,op/blast: remove non-migratable kona compose profiles
Custom op-node forks on these chains cannot run kona-node; drop the
orphaned --kona.yml compose files and registry entries.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 09:37:06 +00:00
8bd024823b Remove broken kona-node variants for diverged OP chains; add worldchain reth+kona
Drop --kona compose profiles for base, fraxtal, zircuit, xlayer, and superseed
where kona-node v1.6.1 stalls or hash-mismatches on custom rollups. Add
worldchain-mainnet-op-reth-pruned-trace--kona for the planned geth→reth+kona swap.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 07:22:04 +00:00
a58f44b98c deploy: regenerate compose from vibe-node main f8ab5e434006 2026-07-05 02:40:11 +00:00
66ecc3d8bc op: add kona consensus-client variants for 13 OP-stack chains
Generate --kona compose profiles for base, mode, zircuit, fraxtal, zora,
metal, hashkeychain, superseed, swell, bnb, manta-pacific, blast, and xlayer
so production nodes can migrate off stock op-node before DRPC deprioritizes it.
Each kona variant shares the same EL data volume as its op-node sibling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 02:04:05 +00:00
018451b9b0 katana-mainnet: op-node consensus-layer sync for op-reth profiles
Persist OP_NODE_SYNCMODE=consensus-layer and OP_NODE_L2_SKIP_SYNC_START_CHECK=true
so op-node drives the EL via engine API (no EL P2P peers on katana mainnet).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 01:52:02 +00:00
2cdc238330 op/metal: add mainnet op-reth pruned-trace compose profile
Generated compose for metal-mainnet EL sync on op-reth (superchain
registry chain=metal, L1 ethereum-mainnet, chainid 1750), mirroring
other Superchain mainnet op-reth pruned nodes.
2026-07-05 00:53:30 +00:00
e79b2f017f worldchain: add mainnet op-reth pruned-trace compose
Add generated op/reth/worldchain-mainnet-op-reth-pruned-trace.yml and
register it in compose_registry.json for Superchain EL migration off op-geth.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 00:45:57 +00:00
03034ab069 deploy: regenerate compose from vibe-node main 2819af5125c4 2026-07-05 00:31:44 +00:00
0ba27e01fe cronos: build cronosd from GitHub release tarball; fix MIN_GAS and statesync RPC
GHCR image returns 403 on anonymous pulls — switch cometbft.Dockerfile to alpine +
public v1.7.8 tarball. init.sh sets minimum-gas-prices (5000000000000basecro) and
drops dead rpc-cronos.crypto.org statesync endpoint.
2026-07-04 21:07:11 +00:00
827b61911c lens: bump external-node v31.0.0 → v31.1.0 (mainnet only)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 15:34:46 +00:00
30eb36786d deploy: regenerate compose from vibe-node main 58d4347aac2c 2026-07-04 12:33:03 +00:00
dffdacaa3c digibyte: bump digibyted Dockerfile to v9.26.4
Update tarball VERSION default and SHA256 checksum for the v9.26.4 release.
2026-07-04 11:05:24 +00:00
5663570cad deploy: regenerate compose from vibe-node main 03ef7eb9ec15 2026-07-04 09:06:47 +00:00
361110f1ff cronos: wire init.sh pruning and statesync from context env
Read STATESYNC_RPC and app.toml pruning tunables from environment
(set by the generator from context.yml) instead of hardcoding them.
2026-07-04 04:10:27 +00:00
921fec2e86 deploy: regenerate compose from vibe-node main 1195854e5e9a 2026-07-04 00:34:32 +00:00
70b8cce5af cronos: wire init.sh to context.yml bootstrap env vars
Read chain_id, genesis_url, seeds, and app.toml json-rpc/evm tunables from
environment (set by the generator from context.yml). Fix seed wiring to use
ct_merge_seeds instead of ct_set_persistent_peers.
2026-07-03 22:08:10 +00:00
d94213fd5c fix(jovay/aldaba): replace VERSION subpath mount with startup cp
Docker 28.5.x fails container create when a volume subpath targets a
path that exists as a file in the image. Copy VERSION from the conf
volume mount instead of subpath-mounting onto /opt/l2_deploy/bin/VERSION.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 12:23:13 +00:00
fcf747c6ee taiko: use --chain=mainnet for alethia-reth v1.1.0
The alethia-reth binary expects --chain=mainnet, not --chain=alethia.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 12:19:04 +00:00
e56976adeb taiko: pass BUILD_ALETHIA_RETH=true for alethia-reth compose builds
Without this build arg reth.Dockerfile builds upstream reth and cargo fails
on asm-keccak/jemalloc features missing from the alethia-reth fork.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 10:19:06 +00:00
9d9da8342c ethereum: bump nimbus multiarch-v26.6.0 -> multiarch-v26.6.2
Regenerated compose defaults for all statusim/nimbus-eth2 profiles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 08:08:12 +00:00
99867025db deploy: regenerate compose from vibe-node main 67e5a65a31a1 2026-07-03 07:56:35 +00:00
bf508e8b07 deploy: regenerate compose from vibe-node main 0e76246fb875 2026-07-03 07:05:14 +00:00
052e74a00d bitcoin-cash: bump bitcoind client_version to 0.33.7
Update mainnet and testnet compose defaults to bitcoinabc/bitcoin-abc:0.33.7.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 06:43:46 +00:00
88bedb0956 fix(stop/start): scope compose to base.yml + node yml
stop.sh and start.sh previously relied on ambient COMPOSE_FILE, so
backup fencing left orchestration unable to stop or restart the target
node. Pass -f base.yml and the node yml explicitly and fail loudly.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 04:53:28 +00:00
e571efbea1 fix(backup): read remote backup list from stdin in selector
select_newest_remote_backup_from_list was sorting an empty process
substitution instead of the piped list-backups.sh output.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 04:38:31 +00:00
58adc446e2 backup: harden lifecycle fencing and skip near-empty archives
backup-node.sh now stops services, fences COMPOSE_FILE during backup, and
restores via EXIT trap; consumers skip <1MB .tar.zst artifacts so purged-
volume junk cannot shadow real backups.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 04:38:00 +00:00
6c0df2bce5 restore-volumes: add /slowdisk absolute floor gate for static offload
Skip static-file offload when projected /slowdisk free space after restore
would fall below SLOWDISK_FLOOR_GB (default 150 GB); warn after extract if
the floor is breached. Restore never aborts — falls back to primary extract.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 03:59:41 +00:00
8f57c8af68 jovay: tail aldaba/cubenet logs to docker logs via tini+bash wrapper
The aldaba_light binary writes sync and p2p logs only to rotating files
under /opt/l2_deploy/light/log/; wrap entry.sh so tail -n0 -F streams new
lines to stdout while preserving file logging and tini PID-1 semantics.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 03:37:22 +00:00
f8915ed59f catchup: per-protocol dispatch for bitcoin, cosmos, and ripple
Extend catchup.sh with protocol-aware branches (bitcoin height-gain,
cosmos CometBFT timestamp via timestamp.sh, ripple validated-ledger
seq) and explicit degradation for closed RPC / unsupported protocols.
Reuse sync-status/check-health idioms for protocol resolution and parsing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 03:10:24 +00:00
a98ced8af1 jovay: wire aldaba P2P advertise IP/port and host port mapping
Set ADVERTISE_NODE_IP=${IP} and ADVERTISE_NODE_PORT to the salted host
port; map client_port:19000 so inbound cubenet peering is dialable.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 02:47:54 +00:00
1c65fdb26f fix(check-health): retry on unreachable reference endpoint
When multicurl fails to reach the reference RPC (timeout/unreachable),
clean up the temp file, retry up to MAX_RETRIES, then exit with
'unverified (reference unreachable)' instead of falling through as success.

Also add Robinhood mainnet official RPC to reference-rpc-endpoint.json.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 01:36:42 +00:00
sebastian
2fbf996857 Merge pull request 'tac/tacchaind: add Polkachu seeds and statesync RPC config' (#26) from issue-734 into main
Reviewed-on: #26
2026-07-02 23:40:43 +00:00
sebastian
3c8623531f Merge pull request 'op/katana: add Prague/Osaka fork timestamps to genesis' (#27) from issue-739 into main
Reviewed-on: #27
2026-07-02 23:39:23 +00:00
27f10b29d3 babylon: pass --no-bls-password on babylond start
babylond v4.3.0 prompts for a BLS key password on every start when
bls_key.json exists unless start gets --no-bls-password; without it RPC
replicas crash-loop with "failed to get BLS password: EOF".

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 18:53:45 +00:00
23e9a5dcd5 katana mainnet: fix genesis.json — preserve alloc, add fork times only
Restore full genesis alloc section; add pragueTime (1746806401) and
osakaTime (1773066601) without truncating predeploy entries.
2026-07-02 16:38:27 +00:00
14b115b7bd katana mainnet: add pragueTime and osakaTime fork activations
op-reth requires pragueTime equal to isthmusTime for custom-genesis OP
chains per OP Upgrade 15; osakaTime added for upcoming Jovian fork.
2026-07-02 16:37:35 +00:00
cb7bb80490 fix: bitcoin rpcallowip IPv4, babylon BLS pre-create, tac peers+cosmos RPC
- Add -rpcallowip=0.0.0.0/0 family-wide via bitcoind template regen
- Pre-create empty-password BLS key in babylon init.sh (v4.3.0 EOF fix)
- TAC: seeds+persistent_peers, CometBFT :26657 traefik, protocol cosmos

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 16:04:01 +00:00
eda1068f45 tac mainnet: merge Polkachu seeds in init.sh for peer discovery
Call ct_merge_seeds() so SEEDS env populates config.toml; default
STATESYNC_RPC to tacchain-rpc.polkachu.com for statesync bootstrap.
2026-07-02 14:41:07 +00:00
75b931461d deploy: regenerate compose from vibe-node main de67ec1de6be 2026-07-02 14:08:34 +00:00
rob
4d5d8f4be1 Merge pull request 'katana-mainnet genesis: add isthmusTime + jovianTime (unblock op-reth) [issue-501]' (#25) from issue-501-katana-jovian into main
Reviewed-on: #25
2026-07-02 14:05:25 +00:00
865f80c56d babylon: add mainnet babylond pruned compose (bbn-1)
Family-C CometBFT node with statesync, wasm-only snapshot bootstrap,
and babylon-specific config (timeout_commit, btc-config, iavl-cache).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 14:02:17 +00:00
d058fe1db1 Add DigiByte and Dash mainnet bitcoin-family RPC nodes.
DigiByte uses a tarball-install digibyted.Dockerfile (v9.26.3); Dash uses
dashpay/dashd:23.1.7. Both follow the dogecoind bitcoind pattern for RPC
auth, ZMQ, traefik, and x-upstreams wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 13:51:15 +00:00
21c01e8de8 bitcoin: production-ready mainnet bitcoind for DRPC serving
Switch to bitcoin/bitcoin:31.0 with txindex and tuned RPC flags, drop the
esplora indexer sidecar, and add bitcoin-protocol health probes so fleet
status and wait-for-online work for bitcoin-family nodes.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 13:35:16 +00:00
73b65dbbc9 tac: re-declare ARG VERSION in tacchaind go-builder stage
Pre-FROM ARG VERSION is not visible inside build stages; compose passes
VERSION as a build arg but git checkout expanded empty without a stage-level
re-declaration.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 13:22:14 +00:00
79d2839a48 tac: install git in tacchaind go-builder stage
The golang:alpine go-builder stage runs git clone/checkout but never
installed git, causing compose build to fail with exit 127 on rpc-de-32.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 13:04:03 +00:00
0c8a3cc4b0 ripple: deployable mainnet + testnet rippled with health checks
Fix mainnet rippled.cfg (ws,http RPC, port_peer 13331), strip eth-isms
from x-upstreams, add testnet chain assets/compose, and wire --ripple
sync-status via check-health.sh server_info probe.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 11:46:03 +00:00
58d45c8576 katana mainnet: add isthmusTime/jovianTime to genesis for op-reth
op-reth reads OP-stack fork schedule from genesis.json; without
isthmusTime/jovianTime it rejects post-Jovian payloads (MinBaseFeeNotAllowedBeforeJovian).
2026-07-02 11:37:11 +00:00
sebastian
b8752b0c7e Merge pull request 'katana-mainnet: add Isthmus + Jovian fork times to genesis and rollup config' (#24) from issue-712 into main
Reviewed-on: #24
2026-07-02 11:27:10 +00:00
aab46a52b6 tac: add tacchaind pruned compose for mainnet and spb
Source-build Dockerfile (tacchain v1.6.0), init script with statesync via
cometbft-common.sh, EVM RPC/WS on 8545/8546, and dshackle slugs tac/tac-spb.
2026-07-02 11:25:25 +00:00
8629ed3e0c deploy: regenerate compose from vibe-node main 4985b130fd82 2026-07-02 10:55:08 +00:00
1b4c4d0d51 fix(robinhood): add full chain info-json to mainnet nitro baseConfig
Nitro crash-looped with "unsupported chain ID 4663" because baseConfig
only had chain.id. Add info-json with on-chain rollup addresses and
chain-config from genesis serializedChainConfig (BoLD v3.x, no validator-utils).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 10:04:16 +00:00
7fc876a321 jovay: add aldaba pruned compose for mainnet and sepolia
Vendor L2 RPC (jovay/l2-rpc:0.14.0-rc1) with init seeding, Traefik
/jovay-mainnet and /jovay-sepolia routes, and dshackle upstream labels.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 09:53:30 +00:00
9accd794c1 kite: add mainnet go-pruned-leveldb compose and subnet-evm config
Add KiteAI Avalanche subnet mainnet node using gokite-chain image with
stock entrypoint, AVAGO_* env configuration, and pruned leveldb chain config.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 09:39:00 +00:00
658ba6151e Bump dshackle gateway image 0.79.5 → 0.79.10
Adds Humanity chain support, Aztec getChainTips fallback, and hyperliquid fix.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 09:29:29 +00:00
7359f3ded8 arb/robinhood: add nitro pruned-pebble-path compose for mainnet and testnet
Orbit rollup on Ethereum/Sepolia with per-chain baseConfig assets (testnet
info-json from official config; mainnet genesis-json-file bootstrap).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 09:19:58 +00:00
af1348240c katana mainnet: add Isthmus/Jovian fork times to genesis and rollup
op-reth rejects post-Jovian blocks without isthmusTime/jovianTime in
genesis config and jovian_time in rollup.json; live chain passed both forks.
2026-07-02 06:33:41 +00:00
cecd0d5638 deploy: regenerate compose from vibe-node main cae6f8c29982 2026-07-02 01:19:44 +00:00
bbdc74faba deploy: regenerate compose from vibe-node main 548adca26eab 2026-07-01 14:49:26 +00:00
0e00127088 superseed-sepolia: add Karst fork time (2026-06-17T16:00:00Z)
Add karst_time to rollup.json and karstTime to genesis.json for the
Karst hardfork activation on chain 53302.
2026-07-01 11:08:10 +00:00
f1e71f6dbe polygon: pin bor client to 2.8.3
Downgrade from 2.9.0 to fix mainnet crash-loop on block 81541799
(sender not an eoa) after us-40 purge.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 04:21:17 +00:00
edf1254258 Bump Ethereum mainnet Besu image default to 26.6.1
Regenerated from context.yml client_version bump (hyperledger/besu).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-30 18:51:37 +00:00
0709866489 deploy: regenerate compose from vibe-node main e32de131428a 2026-06-30 15:18:53 +00:00
499275ea84 arc: add mainnet (chain 5042) — reth EL + malachite CL
Mirror arc-testnet for mainnet: --chain=arc-mainnet (bundled genesis, chainspec.rs
ARC_SUPPORTED), drpc chain 'arc' (CHAIN_ARC__MAINNET), forwarder rpc.arc.network.
malachite follows rpc.arc.network + arc.drpc.org (testnet endpoints are testnet-only
in Circle's docs). Generates arc/reth/arc-mainnet-reth-{pruned,archive}-trace.yml.
2026-06-30 06:04:29 +00:00
bd49c767da deploy: regenerate compose from vibe-node main 38d9a835af10 2026-06-30 05:15:12 +00:00
sebastian
dcc8c9b6ae Merge pull request 'op-mainnet op-reth: reduce TransactionLookup chunk_size to 500k' (#22) from issue-593 into main
Reviewed-on: #22
2026-06-30 01:05:48 +00:00
2dfe3e9325 deploy: regenerate compose from vibe-node main 6446617d6a59 2026-06-29 15:27:51 +00:00
288d9dcbdf op-mainnet: lower TransactionLookup chunk_size to 500k
Reduce stages.transaction_lookup.chunk_size from 5M to 500k in reth.toml
to prevent multi-hour pipeline stalls during large checkpoint windows on
op-reth-pruned-trace (rpc-de-32).
2026-06-29 15:11:55 +00:00
9fa0917326 arc reth: --full only for pruned/minimal; archive keeps full history
Mirror vanilla reth.yml's client_command_dbopts ({{ '- --full' if db_type in
['pruned','minimal'] else '' }}): the arc execution client now omits --full for the
archive variant (full history) and keeps it for pruned/minimal. Previously --full was
hardcoded so both variants ran identical pruned-sync flags.
2026-06-29 14:56:31 +00:00
e97a63832d deploy: regenerate compose from vibe-node main 9ce518e683bb 2026-06-29 12:03:52 +00:00
1743d869a8 arc: reth client + pruned/archive profiles; drop snapshot-download init container
- EL client renamed arc -> reth (it IS a reth fork); template arc.yml -> reth.arc.yml
  so find_template picks it as the arc-network reth override. Path is now
  arc/reth/arc-testnet-reth-{pruned,archive}-trace.yml (was arc/arc/arc-testnet-arc-full).
- profiles: full -> pruned[trace] + archive[trace] (there is no 'full' node type).
- removed the {{short_name}}-snapshots init container (arc-snapshots download, ~84 GB) and
  the consensus-init depends_on that pointed at it. Chain data is seeded OUT-OF-BAND, never
  via a compose service. Services: arc-testnet (EL) / arc-testnet-node (malachite CL) +
  consensus-init / sockets-init.
- git rm orphaned arc/arc/arc-testnet-arc-full.yml.
2026-06-29 11:51:43 +00:00
fc4ce97aee kona: KONA_NODE_MODE verifier -> Validator (fix startup crash-loop)
kona's NodeMode enum (crates/node/service/src/service/mode.rs) has only
Validator/Sequencer and parses via FromStr against the PascalCase display
strings. There is no 'verifier' mode, so the old value failed to parse and
kona-node crash-looped on startup. Validator is also kona's default.

Source change is env/op/kona.env (global default for all op-stack kona nodes),
so this regenerates KONA_NODE_MODE across all 38 op/*/...--kona compose files.
2026-06-29 10:35:45 +00:00
5533fcc5e3 deploy: regenerate compose from vibe-node main 285b1c2050bd 2026-06-29 09:03:51 +00:00
f843c4eb99 cronos: bump client image to v1.7.8
Update cronos-mainnet compose default CRONOS_CRONOS_VERSION from v1.7.7 to v1.7.8.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 06:31:18 +00:00
a27fbfd5d6 deploy: regenerate compose from vibe-node main b612fafd4d04 2026-06-29 02:11:54 +00:00
0a711cf868 linea: bump linea-besu-package to 1.1.1-20260626-d9f04f0
Update default image tags for mainnet and sepolia besu compose profiles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 11:03:42 +00:00
fa5bfd2e97 deploy: regenerate compose from vibe-node main 41a32b597527 2026-06-28 05:42:52 +00:00
b929939205 deploy: regenerate compose from vibe-node main 688dbbc13dce 2026-06-27 09:03:58 +00:00
75326c3528 taiko-hoodi: wire jwtsecret into preconfirmation server for driver v2.4.0
Add PRECONFIRMATION_SERVER_JWT_SECRET and --preconfirmation.jwtSecret=/jwtsecret
to archive hoodi driver services so taiko-client v2.4.0 can start the
preconfirmation block server when PRECONFIRMATION_SERVER_PORT is enabled.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 10:18:12 +00:00
5693ddd469 deploy: regenerate compose from vibe-node main 69e13b5f6372 2026-06-26 06:33:05 +00:00
8c30d2c7fa base-mainnet: bump ghcr.io/base/node-reth to v1.1.1 for Beryl hardfork
Update EL (op-reth) and CL (op-node) image defaults in all seven
base-mainnet compose profiles. Also aligns OP_NODE_RPC_PORT with
env/op/node.env (9545) on regen.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 05:38:57 +00:00
41e2f83926 taiko-hoodi: set INBOX for taiko-client v2.4.0 driver
Rename SHASTA_INBOX to INBOX (v2.4.0 reads --inbox from INBOX env var
and no longer honors PACAYA_INBOX/SHASTA_INBOX). Remove unused PACAYA_INBOX.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 03:26:41 +00:00
3fa32c9f94 rootstock-bamboo: bump rskj default to VETIVER-9.0.3
Fixes testnet crash-loop after restart (Invalid block header size: 22).
Regenerated from vibe-node context.yml; includes pending template regen.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-25 20:21:16 +00:00
3500ebefbb deploy: regenerate compose from vibe-node main 0d8a5fa83aa0 2026-06-25 09:20:11 +00:00
ee3fbd39e4 deploy: regenerate compose from vibe-node main c56d34414bfa 2026-06-24 05:20:48 +00:00
eb1b37d5c0 deploy: regenerate compose from vibe-node main 3260c7459abd 2026-06-24 02:41:51 +00:00
ba03444493 deploy: regenerate compose from vibe-node main 77ee80b87aff 2026-06-23 03:48:48 +00:00
rob
915192acc5 Add CURSOR.md (seeded from VIBE.md) for cursor-agent implementer backend
Faithful copy of VIBE.md to seed cursor-specific tuning. The implement-vibe-node-change
wrapper, when run with VN_ENGINE=cursor (now the default), points cursor-agent at this
doc instead of VIBE.md so the two backends' instructions can diverge over time.
2026-06-23 02:54:14 +00:00
fd27c9633b deploy: regenerate compose from vibe-node main 8e38de510e99 2026-06-22 11:10:31 +00:00
sebastian
52b1201388 Merge pull request 'op/zora/mainnet: add missing hardfork timestamps to genesis.json' (#21) from issue-189 into main
Reviewed-on: #21
2026-06-22 11:06:01 +00:00
rob
dd8ce689e4 Add VIBE.md debugging guide and update README.md
- Add VIBE.md as primary debugging reference for automated tools
- Rewrite README.md as human-focused operator guide
- Fix README.md inaccuracies (remove show-networks.sh references, fix typo)
- Split content: README for humans, VIBE for agents

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-22 08:37:38 +00:00
9bf8fb51ab deploy: regenerate compose from vibe-node main d369514b705f 2026-06-22 07:28:37 +00:00
afafaea429 op/zora/mainnet: add missing hardfork timestamps and eip1559DenominatorCanyon to genesis.json
Fixes op-reth stuck at genesis (block 0) due to missing Shanghai/Canyon+ forks.
op-node feeds current-head payloads with withdrawals but op-reth rejects them
as 'withdrawals pre-Shanghai' without these timestamps.

Added hardfork timestamps:
- shanghaiTime: 1704992401 (activates Shanghai/withdrawals)
- canyonTime: 1704992401 (activates Canyon)
- deltaTime: 1708560000
- ecotoneTime: 1710374401
- fjordTime: 1720627201
- graniteTime: 1726070401
- holoceneTime: 1736445601
- isthmusTime: 1746806401
- jovianTime: 1764691201
- karstTime: 1783526401

Added optimism.eip1559DenominatorCanyon: 250

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-22 07:15:40 +00:00
d7ff81b9aa op/lisk/mainnet: change op-reth node_sync to consensus-layer mode
- Set OP_NODE_SYNCMODE=consensus-layer for lisk-mainnet-op-reth pruned and archive variants
- Template automatically applies appropriate P2P config (disable-discovery, no host ports)
- Fixes bootstrap issue with empty datadir (3.5 MB) stuck at eth_blockNumber=0

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-22 05:13:03 +00:00
14dfd52da5 deploy: regenerate compose from vibe-node main 9cc5bd2c70d3 2026-06-22 03:52:12 +00:00
sebastian
0785ee5482 Merge pull request 'zora-mainnet: add op-reth pruned-trace profile' (#20) from issue-162 into main
Reviewed-on: #20
2026-06-22 03:36:14 +00:00
c28bab03e2 xlayer: update reth client version to v0.0.6.3 for June 22nd hard fork
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-22 02:12:49 +00:00
cd216609bc deploy: regenerate compose from vibe-node main 1833b2463be2 2026-06-22 02:02:09 +00:00
cf35b08a4e deploy: regenerate compose from vibe-node main 533200b9d987 2026-06-22 01:30:34 +00:00
fb0ba537ec deploy: regenerate compose from vibe-node main dd2f311ede7c 2026-06-22 01:26:03 +00:00
120c070a1e zora: add rollup.json and reth.toml for op-reth pruned-trace profile 2026-06-22 00:56:24 +00:00
d2c2de7341 deploy: regenerate compose from vibe-node main ed4a4cd8a117 2026-06-21 10:52:36 +00:00
d9d8920752 xlayer-mainnet: set OP_NODE_L2_SKIP_SYNC_START_CHECK=false for op-node v0.1.5.1
In xlayer/op-node:v0.1.5.1, the =true path triggers an infinite
'Found highest L2 block with canonical L1 origin. Skip further sanity check
and jump to the safe head' loop that prevents block derivation entirely.
Setting =false restores normal startup: op-node advances through the check
and begins deriving blocks. No newer op-node image exists (v0.1.5.1 is latest).

Affects all xlayer-mainnet op-node variants (geth, reth) as they share
the same op-node consensus layer.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-21 09:19:43 +00:00
1758c921d7 deploy: regenerate compose from vibe-node main ed38c887a775 2026-06-21 06:52:38 +00:00
f7b585307e lisk/mainnet: add isthmusTime, jovianTime, karstTime fork timestamps to genesis.json 2026-06-21 06:03:35 +00:00
39df507eee deploy: regenerate compose from vibe-node main 7ab720b29b61 2026-06-21 01:24:43 +00:00
9e666ca476 starknet: bump pathfinder v0.22.3→v0.22.6
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-20 22:41:24 +00:00
f713744bb8 deploy: regenerate compose from vibe-node main 9920718c233e 2026-06-20 13:05:30 +00:00
377d3af961 deploy: regenerate compose from vibe-node main 15f7736e5719 2026-06-20 08:30:13 +00:00
sebastian
a54459e55f Merge pull request 'shibarium heimdall: fix REST listen flag (--laddr not --rest-server.addr)' (#17) from shibarium-heimdall-restflag into main
Reviewed-on: #17
2026-06-20 04:41:36 +00:00
rob
25b0ab049c shibarium heimdall: fix REST listen-address flag (--laddr, not --rest-server.addr)
heimdall crash-looped on 'unknown flag: --rest-server.addr'. Per heimdalld start
--help, the bone-fork binary takes --rest-server (bool) to enable REST/LCD and
--laddr (default tcp://0.0.0.0:1317) for its listen address — there is no
--rest-server.addr. Swap it. (The rest_server-injection + idempotent-init fixes
from the prior PR worked: init now skips re-init, fetches the heimdall-109 genesis,
no more 'rest_server already defined'.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 04:30:59 +00:00
8471404897 deploy: regenerate compose from vibe-node main 2b1459ec36c8 2026-06-20 04:22:01 +00:00
rob
39d2fa93e2 shibarium heimdall init.sh: stop injecting rest_server (crash fix) + idempotent init
heimdall crash-looped on 'toml: key rest_server is already defined'. init.sh
inserted 'rest_server = true' after [rpc] on EVERY boot (non-idempotent), piling up
duplicates; rest_server is not a valid CometBFT config.toml key anyway — REST is
enabled by the --rest-server flag in the start command.

- Remove the rest_server / rest_server_addr config injection.
- Self-heal: strip any previously-injected rest_server lines (so already-corrupted
  volumes recover on next boot — no volume wipe needed).
- Guard heimdalld init to first boot only (config.toml absent) so restarts don't
  reset node identity or re-parse the existing config.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 03:24:37 +00:00
fb3dc6214c deploy: regenerate compose from vibe-node main 388142ccafa4 2026-06-20 03:01:11 +00:00
rob
9fc368f405 shibarium: build heimdall from source (cometbft.Dockerfile)
A parallel change reverted this to FROM shibaone/heimdall:v1.0.7-bone — an image
that exists on no registry, so the heimdall build fails. Restore the source build:
clone shibaone/heimdall@${CL_VERSION}, make install, then layer the CometBFT init
entrypoint. Pairs with vibe-node PR (node_build + standalone service name).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 02:56:17 +00:00
6ce0fc2346 deploy: regenerate compose from vibe-node main c66ad823f9e3 2026-06-20 00:58:03 +00:00
7ce0428db4 erigon3: bump Dockerfile VERSION from v3.0.7 to v3.4.4 2026-06-19 16:36:18 +00:00
b72cf641a9 deploy: regenerate compose from vibe-node main 666f653d478a 2026-06-19 16:03:20 +00:00
5891d050f9 deploy: regenerate compose from vibe-node main 59f3f7f3cf2e 2026-06-19 14:40:16 +00:00
196744cf4f deploy: regenerate compose from vibe-node main 276ea4d82e62 2026-06-19 14:29:52 +00:00
rob
4dd902e9af Merge branch 'issue-63' 2026-06-19 14:19:50 +00:00
a7e9d4a65d deploy: regenerate compose from vibe-node main 60976572a3c4 2026-06-19 13:05:25 +00:00
sebastian
8c46b66bdc Merge pull request 'shibarium: build bor + heimdall from source (bone fork, chain 109)' (#12) from shibarium-bone-fork-fix into main
Reviewed-on: #12
2026-06-19 13:02:00 +00:00
rob
ee21a0245e shibarium: build bor + heimdall from source (no published images)
shibaone ships no docker images for the bone fork — only source + .deb config
packages — so both Dockerfiles must clone+build, not FROM a (nonexistent) image.

- bor.Dockerfile: clone shibaone/bor@${BOR_VERSION}, make bor, cp build/bin/bor
  (was: alpine + wrong /src/build/bor path). golang:1.22.1 like upstream.
- cometbft.Dockerfile: clone shibaone/heimdall@${CL_VERSION}, make install
  (was: FROM shibaone/heimdall:v1.0.7-bone — that tag does not exist on any
  registry), then layer the CometBFT init entrypoint.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 11:46:00 +00:00
bda550eef6 shibarium: add bone fork build-from-source assets
- Update heimdall init.sh with heimdall-109 chain_id and mainnet seeds
- Update cometbft.Dockerfile with v1.0.7-bone version
- Add bor.Dockerfile for building shibaone/bor from source at v1.3.9-bone

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-19 11:05:34 +00:00
59ff415fdb cronos: add mainnet EVM chain (chain-id 25) as client-type node
Add cronosd cometbft.Dockerfile and init.sh for Cronos EVM mainnet.
- Dockerfile: layer cometbft-common.sh + init.sh onto upstream cronos image
- init.sh: adapted from haqq pattern with EVM JSON-RPC on 8545, WS on 8546,
  CometBFT RPC on 26657, P2P on 10521, chain-id cronosmainnet_25-1
- Statesync via ct_configure_statesync, genesis from official repo
- Pruning: custom with keep-recent=100, interval=19

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-19 09:35:50 +00:00
701 changed files with 94255 additions and 4326 deletions

15
.gitignore vendored
View File

@@ -1,2 +1,17 @@
.env
peer-backups/
# R-2 (fleet-audit): keep chaindata/snapshots/tarballs out of git status. Some land
# in-tree via per-host _DATA overrides or snapshot staging; evict to /slowdisk at the
# next maintenance window — see fleet-audit-2026-07-07.md §R-2.
*.tar
*.tar.*
*.lz4
*.zst
snapshots/
*.bak
*.swp
# Task C local peer capture state
peer-state/

729
CURSOR.md Normal file
View File

@@ -0,0 +1,729 @@
# VIBE.md — ethereum-rpc-docker Operations & Debugging Guide
You are an LLM agent or operator **running or debugging blockchain RPC nodes** from this
repository. This file is your **primary reference** for all operational tasks.
This repo contains Docker Compose configurations for blockchain RPC nodes plus operational
scripts for managing them. Everything you need to run, monitor, debug, and fix nodes is here.
---
## 0. WHEN A NODE IS FAULTY — Start Here
### Immediate Triage (30 seconds)
```bash
# 1. Is the container running?
./show-running.sh
# 2. Check overall status of all configured nodes
./show-status.sh
# 3. If you know the config name, check its specific status
./sync-status.sh <config-name>
# 4. Check logs for the faulty node
./logs.sh <config-name>
```
**If the container isn't running**, go to [§3. Container Lifecycle Issues](#3-container-lifecycle-issues)
**If the container is running but not synced**, go to [§4. Sync Issues](#4-sync-issues)
**If the container is running and synced but RPC fails**, go to [§5. RPC/Connectivity Issues](#5-rpcconnectivity-issues)
**If you see errors in logs but aren't sure what they mean**, go to [§6. Log Interpretation](#6-log-interpretation)
---
## 1. Repository Overview
### What This Repo Contains
```
rpc/
├── *.yml # Docker Compose files for node configurations
├── *.sh # Operational scripts (YOUR PRIMARY TOOLS)
├── scripts/ # Additional helper scripts (CometBFT support)
├── <network>/ # Network directories (e.g., ethereum/, op/, arb/)
│ ├── *.yml # Compose files for specific chains
│ └── <chain>/ # Chain-specific assets
│ ├── genesis.json # Custom genesis files
│ ├── rollup.json # Rollup configurations (OP Stack)
│ └── *.Dockerfile # Custom build files
├── README.md # User documentation
└── VIBE.md # THIS FILE — operations guide
```
### Key Concepts
- **Config name**: The compose filename WITHOUT `.yml` (e.g., `ethereum-mainnet-geth-pruned`)
- **Service name**: Derived from config name, used in `docker compose` commands
- **Short name**: Used in URL paths, container labels. Format: `{network}-{chain}[-{client}][-{db_type}]`
- **Volume names**: Docker volumes follow the full config name pattern
### Supported Networks
**Layer 1**: Ethereum, Polygon, BSC, Avalanche, Gnosis, Fantom, Core, Berachain, Ronin, Viction, Fuse, Tron, ThunderCore, Goat, AlephZero, Haqq, Taiko, Rootstock, Dogecoin, Litecoin, Bitcoin, Bitcoin-Cash, Ripple, Solana, Tron
**Layer 2 (OP Stack)**: Optimism, Base, Zora, Mode, Blast, Fraxtal, Bob, Boba, Worldchain, Metal, Ink, Lisk, SNAX, Celo
**Layer 2 (Arbitrum)**: Arbitrum One, Arbitrum Nova, Everclear, Playblock, Real, Connext, OpenCampusCodex
**Other L2s**: Linea, Scroll, zkSync Era, Metis, Moonbeam, Starknet, zkEVM, Immutable zkEVM, Polygon zkEVM
---
## 2. Essential Scripts Reference
### Status & Monitoring Scripts
| Script | Usage | What It Does |
|---|---|---|
| `show-status.sh` | `[config-name]` | Lists ALL configured nodes with sync status, block height, health |
| `show-running.sh` | | Lists currently running containers |
| `sync-status.sh` | `<config-name>` | Detailed sync status for one config |
| `latest.sh` | `<config-name>` | Latest block number + hash |
| `logs.sh` | `<config-name>` | Tail logs from all containers in a config |
| `show-db-size.sh` | | Disk usage of ALL Docker volumes, sorted by size |
| `show-ram.sh` | `<config-name>` | Memory usage of containers |
| `show-cpu.sh` | | CPU usage display |
| `peer-count.sh` | | P2P peer count for all running nodes |
| `time-since-last-block.sh` | `<config-name>` | How long since last block was processed |
| `ping.sh` | `<container-name>` | Test network connectivity from container |
| `show-errors.sh` | | Show error counts/logs across containers |
| `show-size.sh` | | Show size of containers/volumes |
| `show-file-size.sh` | | Show static file sizes |
| `show-static-file-size.sh` | | Show static file sizes (alternative) |
### Lifecycle Management Scripts
| Script | Usage | What It Does |
|---|---|---|
| `start.sh` | `<config-name>` | Start all containers for a config |
| `stop.sh` | `<config-name>` | Stop all containers for a config |
| `force-recreate.sh` | `<config-name>` | Force recreate containers (keeps volumes) |
| `rm.sh` | `<config-name>` | Remove containers (keeps volumes) |
| `delete-volumes.sh` | `<config-name>` | **DESTRUCTIVE** - Remove containers AND volumes |
| `delete-node-keys.sh` | `<config-name>` | Remove node keys (for re-initialization) |
### Backup & Restore Scripts
| Script | Usage | What It Does |
|---|---|---|
| `backup-node.sh` | `<config-name> [url]` | Backup volumes locally or to WebDAV |
| `restore-volumes.sh` | `<config-name> [url]` | Restore volumes from local or HTTP |
| `clone-node.sh` | `<config-name>` | Clone a node's state |
| `clone-backup.sh` | | Clone backup files |
| `clone-peers.sh` | | Clone peer information |
| `restore-peers.sh` | | Restore peer connections |
| `list-backups.sh` | | List available backup files |
| `list-peer-backups.sh` | | List peer backup files |
| `list-restorable.sh` | | List restorable configurations |
| `cleanup-backups.sh` | | Remove old backups |
| `cleanup-volumes.sh` | | Clean up unused volumes |
### Network & Connectivity Scripts
| Script | Usage | What It Does |
|---|---|---|
| `upstreams.sh` | | Generate dshackle upstream configuration |
| `connect-peers.sh` | | Connect to peer nodes |
| `search-node.sh` | `<query>` | Search compose files for patterns |
| `search-compose.sh` | `<query>` | Search compose files |
| `network-to-config.sh` | | Map network names to config files |
| `reload_dshackle.sh` | | Reload dshackle configuration |
| `update-whitelist.sh` | | Update IP whitelist |
| `update-ip.sh` | | Update IP configuration |
### Specialized Scripts
| Script | Usage | What It Does |
|---|---|---|
| `op-wheel.sh` | | OP rollup maintenance (rewind, set forkchoice) |
| `op-wheel-finalize-latest-block.sh` | `<client_svc> [node_svc]` | Finalize latest block (nuclear option) |
| `catchup.sh` | `<config-name>` | Help node catch up to chain head |
| `success-if-almost-synced.sh` | `<config-name> <seconds>` | Exit 0 if node is almost synced |
| `groq.sh` | | Query using Groq |
| `trai.sh` | | Trace transaction |
| `multicurl.sh` | | Parallel curl requests |
| `blocknumber.sh` | | Get block number |
| `get-block.sh` | | Get block information |
| `get-local-url.sh` | | Get local RPC URL |
| `get-shortname.sh` | `<config-file>` | Get short name for a config |
| `disk-space.sh` | | Check disk space |
| `limit-bandwidth.sh` | | Limit bandwidth |
| `maintenance.sh` | | Maintenance helper |
| `random-port.sh` | | Generate random port |
| `reference-rpc-endpoint.sh` | | Reference RPC endpoint helper |
| `reset-terminal.sh` | | Reset terminal |
| `setup-bandwidth-limit-cron.sh` | | Setup cron for bandwidth limiting |
---
## 3. Container Lifecycle Issues
### Symptom: Container Won't Start
```bash
# Check why it failed
./logs.sh <config-name> 2>&1 | tail -50
# Check container exit code
docker ps -a --filter "name=<config-name>" --format "{{.Names}} | {{.State}} | {{.Status}}"
# Inspect the container
docker inspect <container-name> | jq '.[0].State'
```
**Common causes:**
- **Port conflict**: Two services trying to bind to same host port
- **Volume permission issues**: Docker can't write to volume
- **Missing environment variables**: `.env` file incomplete
- **Invalid compose syntax**: YAML parsing error
- **Image pull failure**: Network issue or private registry auth
**Fixes:**
```bash
# Check for port conflicts
grep -h "^[0-9]\{1,5\}:[0-9]" *.yml | sort | uniq -d
# Validate compose syntax
docker compose -f <config-file>.yml config
# Pull images manually
docker compose -f <config-file>.yml pull
# Start with --build if using custom Dockerfiles
docker compose -f <config-file>.yml up -d --build
```
### Symptom: Container Exits Immediately After Starting
```bash
# View the last 100 lines of logs before exit
./logs.sh <config-name> 2>&1 | tail -100
# Check exit code
docker ps -a --filter "name=<service>" --format "{{.Status}}"
# Run interactively to see error
docker compose -f <config-file>.yml run --rm <service-name> sh
```
**Common causes:**
- **Missing config files**: `/config/` mount empty or wrong path
- **Invalid flags**: Command-line arguments malformed
- **Database corruption**: Existing data incompatible with new version
- **Checkpoint/genesis mismatch**: Chain ID or genesis doesn't match
**Fixes:**
```bash
# Verify config directory exists (if using custom configs)
ls -la <network>/<chain>/
# Try with fresh volumes (DESTRUCTIVE)
./delete-volumes.sh <config-name>
./start.sh <config-name>
```
### Symptom: Container Restarts Repeatedly (Crash Loop)
```bash
# Watch logs in real-time
./logs.sh <config-name> -f
# Check restart count
docker inspect <container-name> | jq '.[0].RestartCount'
# Check last restart reason
docker inspect <container-name> | jq '.[0].State.ExitCode, .[0].State.Error'
```
**Common causes:**
- **OOM killed**: Memory limit exceeded
- **Out of disk space**: No space left on device
- **Segmentation fault**: Client bug or bad data
- **Panic**: Go client panic
**Fixes:**
```bash
# Check memory usage
./show-ram.sh <config-name>
# Check disk space
df -h /var/lib/docker
./show-db-size.sh
# Increase resources in compose file or .env
# Then force recreate
./force-recreate.sh <config-name>
```
---
## 4. Sync Issues
### Symptom: Node Not Syncing (Stuck at Block 0 or Low Block)
```bash
# Check sync status
./sync-status.sh <config-name>
# Check current block
./latest.sh <config-name>
# Check logs for sync errors
./logs.sh <config-name> | grep -i -E "sync|error|fail|warn|stuck|behind"
# Check peer count
./peer-count.sh | grep <config-name>
```
**Common causes:**
- **No peers**: P2P network connection failed
- **Wrong network**: Connected to wrong chain
- **Checkpoint too old**: Checkpoint URL unavailable or outdated
- **Snapshot download failed**: Snapshot server unreachable
**Fixes:**
```bash
# Check if checkpoint/snapshot is configured
grep -E "(checkpoint|snapshot)" <config-file>.yml
# Test checkpoint URL manually
curl -I $(grep checkpoint <config-file>.yml | grep -oE 'http[^ ]+')
# Check peer connections (geth example)
docker exec <client-container> admin_peers | jq '.[] | .network.remoteAddress' | wc -l
```
### Symptom: Sync is Very Slow
```bash
# Check sync speed over time
./latest.sh <config-name>; sleep 60; ./latest.sh <config-name>
# Check if node is processing blocks
./time-since-last-block.sh <config-name>
# Check CPU and memory
top -d 1 -p $(docker inspect <container> | jq -r '.[0].State.Pid')
```
**Common causes:**
- **Resource constrained**: CPU throttled, memory swapped
- **Disk I/O bottleneck**: Slow storage or contention
- **Network rate limited**: P2P or RPC rate limiting
- **Too many peers**: P2P overhead
- **Wrong sync mode**: Full sync instead of snap sync
### Symptom: Sync Stuck at Specific Block
```bash
# Check logs around the stuck block
./logs.sh <config-name> | grep -A 10 -B 10 "block <stuck-block-number>"
# Check if it's a known bad block
# Search online: <chain> bad block <number>
```
**Common causes:**
- **Bad block in chain**: Requires client patch or manual intervention
- **State trie inconsistency**: Database corruption
- **Fork choice issue**: Node on wrong fork
**Fixes for OP Stack:**
```bash
# Try to finalize past the block
./op-wheel-finalize-latest-block.sh <client-service>
```
### Symptom: Node on Wrong Fork / Chain
```bash
# Check chain ID
./latest.sh <config-name> | grep -i chain
# Check what chain the node thinks it's on
docker exec <client-container> ethdo chain --endpoint=http://localhost:8545
# Compare with expected chain ID
grep chainId <config-file>.yml
```
---
## 5. RPC/Connectivity Issues
### Symptom: RPC Endpoint Not Responding
```bash
# Test from host
curl -s http://localhost:<port> | head -c 100
# Check if traefik/proxy is running
docker ps | grep -E "(traefik|proxy|nginx)"
# Check traefik logs
docker logs <traefik-container> | tail -50
```
**Common causes:**
- **Container not running**: Client crashed
- **Port not exposed**: Wrong port mapping
- **Traefik misconfiguration**: Labels wrong or missing
- **Firewall blocking**: Host firewall or cloud security group
### Symptom: RPC Returns Wrong Chain ID
```bash
# Query chain ID from RPC
curl -s -X POST http://localhost:<port> \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
```
### Symptom: Cannot Connect to P2P Network
```bash
# Check peer count
./peer-count.sh | grep <config-name>
# Test P2P connectivity from container
docker exec <client-container> nc -zv <bootstrap-node> <p2p-port>
```
**Fixes:**
```bash
# Set public IP in .env
IP=$(curl -s ipinfo.io/ip)
echo "IP=$IP" >> .env
./force-recreate.sh <config-name>
```
---
## 6. Log Interpretation
### Common Log Patterns
#### Warnings (Node may still function)
| Pattern | Meaning | Action |
|---|---|---|
| `WARN.*sync.*slow` | Sync slower than expected | Check resources |
| `WARN.*peers.*low` | Fewer peers than desired | Check P2P connectivity |
| `WARN.*rate.*limit` | API rate limiting active | Normal for public endpoints |
#### Errors (Node is degraded)
| Pattern | Meaning | Action |
|---|---|---|
| `Error.*database.*corrupt` | Database corruption | Restore from backup or resync |
| `Error.*handshake.*fail` | P2P handshake failed | Check chain ID |
| `Error.*no.*peers` | Cannot connect to P2P | Check bootstrap nodes |
| `Error.*timeout` | RPC/HTTP timeout | Check network, increase timeout |
#### Fatal (Node will not function)
| Pattern | Meaning | Action |
|---|---|---|
| `Fatal.*panic` | Client crashed | Check client version |
| `Fatal.*OOM` | Out of memory | Increase memory limit |
| `Fatal.*disk.*full` | No disk space | Free space |
| `Fatal.*permission.*denied` | Filesystem permissions | Fix volume permissions |
---
## 7. Resource Issues
### High CPU Usage
```bash
./show-ram.sh <config-name>
./show-cpu.sh
docker stats <container-name> --no-stream
```
### High Memory Usage
```bash
./show-ram.sh <config-name>
docker stats <container-name> --no-stream --format "{{.Container}} | {{.MemUsage}} | {{.MemPerc}}"
```
### High Disk Usage
```bash
./show-db-size.sh
docker system df -v
```
### Disk I/O Bottleneck
```bash
iotop -o -d 1
```
---
## 8. Backup and Restore
### Creating a Backup
```bash
# Local backup (to /backup directory)
./backup-node.sh <config-name>
# Remote backup (to WebDAV)
./backup-node.sh <config-name> https://backup-server.tld/dav
```
### Restoring from Backup
```bash
# List available backups
./list-backups.sh
# Restore latest backup for config
./restore-volumes.sh <config-name>
# Restore from specific URL
./restore-volumes.sh <config-name> https://backup-server.tld/backup/
```
### Cloning a Node
```bash
# Clone a node to a new location
./clone-node.sh <config-name>
# Clone peers (for faster sync)
./clone-peers.sh <config-name>
```
### Nuclear Option: Full Reset
```bash
# WARNING: This deletes ALL data for the config
./stop.sh <config-name> && \
./rm.sh <config-name> && \
./delete-volumes.sh <config-name> && \
./delete-node-keys.sh <config-name> && \
./force-recreate.sh <config-name>
# Then check logs
./logs.sh <config-name>
```
---
## 9. Common Error Messages
### Database Errors
| Error | Cause | Solution |
|---|---|---|
| `database is corrupted` | Power loss, bug | Restore from backup or resync |
| `database version mismatch` | Client version changed | Delete and resync |
### P2P Errors
| Error | Cause | Solution |
|---|---|---|
| `no configured peers` | Missing bootstrap nodes | Add bootstrap nodes |
| `handshake failed` | Chain ID mismatch | Verify genesis.json |
### RPC Errors
| Error | Cause | Solution |
|---|---|---|
| `method not found` | Wrong client | Use correct client |
| `connection refused` | Port not open | Check container running, port mapping |
---
## 10. OP Stack Specific Debugging
### OP Node Issues
```bash
# Check op-node logs
./logs.sh <config-name> | grep -i "op-node\|rollup\|sequencer"
# Check rollup configuration (if custom)
cat op/<network>/ethereum/rollup.json | jq .
# Check if rollup.json is mounted
docker exec <op-node-container> cat /config/rollup.json | jq .
```
### OP Wheel (Manual Intervention)
```bash
# Rewind to specific block (DANGEROUS - only if you know what you're doing)
./op-wheel.sh engine set-forkchoice \
--unsafe=<block-hash> \
--safe=<block-hash> \
--finalized=<block-hash> \
--engine=http://<client-service>:8551/ \
--engine.open=http://<client-service>:8545 \
--engine.jwt-secret-path=/jwtsecret
# Nuclear option: finalize latest local block
./op-wheel-finalize-latest-block.sh <client-service> <node-service>
```
---
## 11. CometBFT Family (Cosmos, etc.) Specific
### Init Container Issues
```bash
# CometBFT chains use init.sh inside the container
# The master script is at scripts/cometbft-common.sh
# Check if init completed
./logs.sh <config-name> | grep -i "init\|setup\|complete"
# Check the init script
cat <network>/<chain>/scripts/init.sh
```
---
## 12. Quick Start Guide
### Starting a Node
```bash
# 1. Set up environment
echo "IP=$(curl -s ipinfo.io/ip)" > .env
echo "DOMAIN=${IP//./-}.traefik.me" >> .env
echo "MAIL=your-email@example.com" >> .env
# 2. Select which nodes to run
# Add compose files to COMPOSE_FILE (colon-separated)
echo "COMPOSE_FILE=base.yml:rpc.yml:ethereum-mainnet-geth-pruned.yml" >> .env
# 3. Start the node
docker compose up -d
# 4. Verify it's running
./show-status.sh
```
### Accessing Your Node
```bash
# Once running, access via:
# HTTP: http://<your-domain>/ethereum-mainnet-geth-pruned
# HTTPS: https://<your-domain>/ethereum-mainnet-geth-pruned
# WebSocket: wss://<your-domain>/ethereum-mainnet-geth-pruned
# Or locally (if NO_SSL=true):
# HTTP: http://localhost:<port>
```
---
## 13. Configuration Reference
### Environment Variables
**Required for most setups:**
```bash
IP=203.0.113.42 # Your public IP
DOMAIN=203-0-113-42.traefik.me # Your domain (traefik.me for testing)
MAIL=your-email@example.com # For Let's Encrypt SSL
WHITELIST=0.0.0.0/0 # IP whitelist (0.0.0.0/0 = all)
```
**Optional:**
```bash
NO_SSL=true # Disable SSL (testing only)
CHAINS_SUBNET=192.168.0.0/26 # Docker network subnet
```
**Chain-specific (examples):**
```bash
ETHEREUM_MAINNET_EXECUTION_RPC=https://fallback-rpc.example.com
ARBITRUM_SEPOLIA_EXECUTION_RPC=https://arb-sepolia-rpc.example.com
OP_NODE_NETWORK=mainnet
OP_NODE_L1_RPC_URL=https://l1-rpc.example.com
```
### Compose File Structure
Each compose file defines one or more services:
- **client**: Execution layer (Geth, Erigon, Reth, etc.)
- **node**: Consensus/derivation node (op-node, lighthouse, etc.)
- **relay**: DA relay (eigenda-proxy, op-alt, etc.)
- **proxy**: HTTP/WS proxy (nginx, etc.)
- **database**: External database (Postgres, etc.)
### Volume Naming
Volumes are named after the config:
```
<config-name>_<service>_data
<config-name>_<service>_config
```
Example: `ethereum-mainnet-geth-pruned_client_data`
---
## 14. Quick Debugging Checklist
Use this checklist when debugging an issue:
- [ ] **Is the container running?**`./show-running.sh`
- [ ] **Are there errors in logs?**`./logs.sh <config> | grep -i error`
- [ ] **Is the node synced?**`./sync-status.sh <config>`
- [ ] **Are peers connected?**`./peer-count.sh`
- [ ] **Are resources adequate?**`./show-ram.sh`, `./show-db-size.sh`
- [ ] **Is P2P working?** → Check peer count
- [ ] **Is RPC responding?** → Test with curl
- [ ] **Is disk space available?**`df -h /var/lib/docker`
- [ ] **Is the config file correct?**`docker compose -f <file>.yml config`
- [ ] **Are environment variables set?** → Check `.env`
- [ ] **Is the genesis file correct?** → Check chain ID
---
## 15. When to Escalate
Escalate to a human operator if:
- [ ] Node stuck for > 2 hours with no progress
- [ ] Repeated `Fatal` or `panic` errors after restart
- [ ] Database corruption confirmed
- [ ] Issue affects multiple nodes across different chains
- [ ] Need to force-push to this repo
---
## 16. File Locations Quick Reference
| What You Need | Where to Find It |
|---|---|
| Compose files | Root of this repo (`*.yml`) |
| Operational scripts | Root of this repo (`*.sh`) |
| Chain assets | `<network>/<chain>/` or `<stack>/<network>/<settlement>/` |
| Genesis files | `<stack>/<network>/<settlement>/genesis.json` |
| Rollup configs | `op/<network>/<settlement>/rollup.json` |
| Custom Dockerfiles | `<path>/*.Dockerfile` |
| Init scripts | `<path>/scripts/init.sh` |
| CometBFT common | `scripts/cometbft-common.sh` |
| Compose registry | `compose_registry.json` |
| RPC endpoints | `reference-rpc-endpoint.json` |
| Environment | `.env` |
---
## 17. Resource Requirements Reference
| Node Type | Disk | RAM | CPU |
|---|---|---|---|
| Ethereum pruned | ~500GB | 8GB | 2+ cores |
| Ethereum archive | ~2TB+ | 16GB+ | 4+ cores |
| Ethereum archive-trace | ~4TB+ | 32GB+ | 8+ cores |
| L2 pruned | ~100-500GB | 4-8GB | 2+ cores |
| L2 archive | ~1-2TB | 8-16GB | 4+ cores |
**Note:** Requirements vary by chain. Check specific chain documentation.
---
*This file is your complete operations and debugging reference. For additional user documentation, see README.md.*

962
README.md

File diff suppressed because it is too large Load Diff

729
VIBE.md Normal file
View File

@@ -0,0 +1,729 @@
# VIBE.md — ethereum-rpc-docker Operations & Debugging Guide
You are an LLM agent or operator **running or debugging blockchain RPC nodes** from this
repository. This file is your **primary reference** for all operational tasks.
This repo contains Docker Compose configurations for blockchain RPC nodes plus operational
scripts for managing them. Everything you need to run, monitor, debug, and fix nodes is here.
---
## 0. WHEN A NODE IS FAULTY — Start Here
### Immediate Triage (30 seconds)
```bash
# 1. Is the container running?
./show-running.sh
# 2. Check overall status of all configured nodes
./show-status.sh
# 3. If you know the config name, check its specific status
./sync-status.sh <config-name>
# 4. Check logs for the faulty node
./logs.sh <config-name>
```
**If the container isn't running**, go to [§3. Container Lifecycle Issues](#3-container-lifecycle-issues)
**If the container is running but not synced**, go to [§4. Sync Issues](#4-sync-issues)
**If the container is running and synced but RPC fails**, go to [§5. RPC/Connectivity Issues](#5-rpcconnectivity-issues)
**If you see errors in logs but aren't sure what they mean**, go to [§6. Log Interpretation](#6-log-interpretation)
---
## 1. Repository Overview
### What This Repo Contains
```
rpc/
├── *.yml # Docker Compose files for node configurations
├── *.sh # Operational scripts (YOUR PRIMARY TOOLS)
├── scripts/ # Additional helper scripts (CometBFT support)
├── <network>/ # Network directories (e.g., ethereum/, op/, arb/)
│ ├── *.yml # Compose files for specific chains
│ └── <chain>/ # Chain-specific assets
│ ├── genesis.json # Custom genesis files
│ ├── rollup.json # Rollup configurations (OP Stack)
│ └── *.Dockerfile # Custom build files
├── README.md # User documentation
└── VIBE.md # THIS FILE — operations guide
```
### Key Concepts
- **Config name**: The compose filename WITHOUT `.yml` (e.g., `ethereum-mainnet-geth-pruned`)
- **Service name**: Derived from config name, used in `docker compose` commands
- **Short name**: Used in URL paths, container labels. Format: `{network}-{chain}[-{client}][-{db_type}]`
- **Volume names**: Docker volumes follow the full config name pattern
### Supported Networks
**Layer 1**: Ethereum, Polygon, BSC, Avalanche, Gnosis, Fantom, Core, Berachain, Ronin, Viction, Fuse, Tron, ThunderCore, Goat, AlephZero, Haqq, Taiko, Rootstock, Dogecoin, Litecoin, Bitcoin, Bitcoin-Cash, Ripple, Solana, Tron
**Layer 2 (OP Stack)**: Optimism, Base, Zora, Mode, Blast, Fraxtal, Bob, Boba, Worldchain, Metal, Ink, Lisk, SNAX, Celo
**Layer 2 (Arbitrum)**: Arbitrum One, Arbitrum Nova, Everclear, Playblock, Real, Connext, OpenCampusCodex
**Other L2s**: Linea, Scroll, zkSync Era, Metis, Moonbeam, Starknet, zkEVM, Immutable zkEVM, Polygon zkEVM
---
## 2. Essential Scripts Reference
### Status & Monitoring Scripts
| Script | Usage | What It Does |
|---|---|---|
| `show-status.sh` | `[config-name]` | Lists ALL configured nodes with sync status, block height, health |
| `show-running.sh` | | Lists currently running containers |
| `sync-status.sh` | `<config-name>` | Detailed sync status for one config |
| `latest.sh` | `<config-name>` | Latest block number + hash |
| `logs.sh` | `<config-name>` | Tail logs from all containers in a config |
| `show-db-size.sh` | | Disk usage of ALL Docker volumes, sorted by size |
| `show-ram.sh` | `<config-name>` | Memory usage of containers |
| `show-cpu.sh` | | CPU usage display |
| `peer-count.sh` | | P2P peer count for all running nodes |
| `time-since-last-block.sh` | `<config-name>` | How long since last block was processed |
| `ping.sh` | `<container-name>` | Test network connectivity from container |
| `show-errors.sh` | | Show error counts/logs across containers |
| `show-size.sh` | | Show size of containers/volumes |
| `show-file-size.sh` | | Show static file sizes |
| `show-static-file-size.sh` | | Show static file sizes (alternative) |
### Lifecycle Management Scripts
| Script | Usage | What It Does |
|---|---|---|
| `start.sh` | `<config-name>` | Start all containers for a config |
| `stop.sh` | `<config-name>` | Stop all containers for a config |
| `force-recreate.sh` | `<config-name>` | Force recreate containers (keeps volumes) |
| `rm.sh` | `<config-name>` | Remove containers (keeps volumes) |
| `delete-volumes.sh` | `<config-name>` | **DESTRUCTIVE** - Remove containers AND volumes |
| `delete-node-keys.sh` | `<config-name>` | Remove node keys (for re-initialization) |
### Backup & Restore Scripts
| Script | Usage | What It Does |
|---|---|---|
| `backup-node.sh` | `<config-name> [url]` | Backup volumes locally or to WebDAV |
| `restore-volumes.sh` | `<config-name> [url]` | Restore volumes from local or HTTP |
| `clone-node.sh` | `<config-name>` | Clone a node's state |
| `clone-backup.sh` | | Clone backup files |
| `clone-peers.sh` | | Clone peer information |
| `restore-peers.sh` | | Restore peer connections |
| `list-backups.sh` | | List available backup files |
| `list-peer-backups.sh` | | List peer backup files |
| `list-restorable.sh` | | List restorable configurations |
| `cleanup-backups.sh` | | Remove old backups |
| `cleanup-volumes.sh` | | Clean up unused volumes |
### Network & Connectivity Scripts
| Script | Usage | What It Does |
|---|---|---|
| `upstreams.sh` | | Generate dshackle upstream configuration |
| `connect-peers.sh` | | Connect to peer nodes |
| `search-node.sh` | `<query>` | Search compose files for patterns |
| `search-compose.sh` | `<query>` | Search compose files |
| `network-to-config.sh` | | Map network names to config files |
| `reload_dshackle.sh` | | Reload dshackle configuration |
| `update-whitelist.sh` | | Update IP whitelist |
| `update-ip.sh` | | Update IP configuration |
### Specialized Scripts
| Script | Usage | What It Does |
|---|---|---|
| `op-wheel.sh` | | OP rollup maintenance (rewind, set forkchoice) |
| `op-wheel-finalize-latest-block.sh` | `<client_svc> [node_svc]` | Finalize latest block (nuclear option) |
| `catchup.sh` | `<config-name>` | Help node catch up to chain head |
| `success-if-almost-synced.sh` | `<config-name> <seconds>` | Exit 0 if node is almost synced |
| `groq.sh` | | Query using Groq |
| `trai.sh` | | Trace transaction |
| `multicurl.sh` | | Parallel curl requests |
| `blocknumber.sh` | | Get block number |
| `get-block.sh` | | Get block information |
| `get-local-url.sh` | | Get local RPC URL |
| `get-shortname.sh` | `<config-file>` | Get short name for a config |
| `disk-space.sh` | | Check disk space |
| `limit-bandwidth.sh` | | Limit bandwidth |
| `maintenance.sh` | | Maintenance helper |
| `random-port.sh` | | Generate random port |
| `reference-rpc-endpoint.sh` | | Reference RPC endpoint helper |
| `reset-terminal.sh` | | Reset terminal |
| `setup-bandwidth-limit-cron.sh` | | Setup cron for bandwidth limiting |
---
## 3. Container Lifecycle Issues
### Symptom: Container Won't Start
```bash
# Check why it failed
./logs.sh <config-name> 2>&1 | tail -50
# Check container exit code
docker ps -a --filter "name=<config-name>" --format "{{.Names}} | {{.State}} | {{.Status}}"
# Inspect the container
docker inspect <container-name> | jq '.[0].State'
```
**Common causes:**
- **Port conflict**: Two services trying to bind to same host port
- **Volume permission issues**: Docker can't write to volume
- **Missing environment variables**: `.env` file incomplete
- **Invalid compose syntax**: YAML parsing error
- **Image pull failure**: Network issue or private registry auth
**Fixes:**
```bash
# Check for port conflicts
grep -h "^[0-9]\{1,5\}:[0-9]" *.yml | sort | uniq -d
# Validate compose syntax
docker compose -f <config-file>.yml config
# Pull images manually
docker compose -f <config-file>.yml pull
# Start with --build if using custom Dockerfiles
docker compose -f <config-file>.yml up -d --build
```
### Symptom: Container Exits Immediately After Starting
```bash
# View the last 100 lines of logs before exit
./logs.sh <config-name> 2>&1 | tail -100
# Check exit code
docker ps -a --filter "name=<service>" --format "{{.Status}}"
# Run interactively to see error
docker compose -f <config-file>.yml run --rm <service-name> sh
```
**Common causes:**
- **Missing config files**: `/config/` mount empty or wrong path
- **Invalid flags**: Command-line arguments malformed
- **Database corruption**: Existing data incompatible with new version
- **Checkpoint/genesis mismatch**: Chain ID or genesis doesn't match
**Fixes:**
```bash
# Verify config directory exists (if using custom configs)
ls -la <network>/<chain>/
# Try with fresh volumes (DESTRUCTIVE)
./delete-volumes.sh <config-name>
./start.sh <config-name>
```
### Symptom: Container Restarts Repeatedly (Crash Loop)
```bash
# Watch logs in real-time
./logs.sh <config-name> -f
# Check restart count
docker inspect <container-name> | jq '.[0].RestartCount'
# Check last restart reason
docker inspect <container-name> | jq '.[0].State.ExitCode, .[0].State.Error'
```
**Common causes:**
- **OOM killed**: Memory limit exceeded
- **Out of disk space**: No space left on device
- **Segmentation fault**: Client bug or bad data
- **Panic**: Go client panic
**Fixes:**
```bash
# Check memory usage
./show-ram.sh <config-name>
# Check disk space
df -h /var/lib/docker
./show-db-size.sh
# Increase resources in compose file or .env
# Then force recreate
./force-recreate.sh <config-name>
```
---
## 4. Sync Issues
### Symptom: Node Not Syncing (Stuck at Block 0 or Low Block)
```bash
# Check sync status
./sync-status.sh <config-name>
# Check current block
./latest.sh <config-name>
# Check logs for sync errors
./logs.sh <config-name> | grep -i -E "sync|error|fail|warn|stuck|behind"
# Check peer count
./peer-count.sh | grep <config-name>
```
**Common causes:**
- **No peers**: P2P network connection failed
- **Wrong network**: Connected to wrong chain
- **Checkpoint too old**: Checkpoint URL unavailable or outdated
- **Snapshot download failed**: Snapshot server unreachable
**Fixes:**
```bash
# Check if checkpoint/snapshot is configured
grep -E "(checkpoint|snapshot)" <config-file>.yml
# Test checkpoint URL manually
curl -I $(grep checkpoint <config-file>.yml | grep -oE 'http[^ ]+')
# Check peer connections (geth example)
docker exec <client-container> admin_peers | jq '.[] | .network.remoteAddress' | wc -l
```
### Symptom: Sync is Very Slow
```bash
# Check sync speed over time
./latest.sh <config-name>; sleep 60; ./latest.sh <config-name>
# Check if node is processing blocks
./time-since-last-block.sh <config-name>
# Check CPU and memory
top -d 1 -p $(docker inspect <container> | jq -r '.[0].State.Pid')
```
**Common causes:**
- **Resource constrained**: CPU throttled, memory swapped
- **Disk I/O bottleneck**: Slow storage or contention
- **Network rate limited**: P2P or RPC rate limiting
- **Too many peers**: P2P overhead
- **Wrong sync mode**: Full sync instead of snap sync
### Symptom: Sync Stuck at Specific Block
```bash
# Check logs around the stuck block
./logs.sh <config-name> | grep -A 10 -B 10 "block <stuck-block-number>"
# Check if it's a known bad block
# Search online: <chain> bad block <number>
```
**Common causes:**
- **Bad block in chain**: Requires client patch or manual intervention
- **State trie inconsistency**: Database corruption
- **Fork choice issue**: Node on wrong fork
**Fixes for OP Stack:**
```bash
# Try to finalize past the block
./op-wheel-finalize-latest-block.sh <client-service>
```
### Symptom: Node on Wrong Fork / Chain
```bash
# Check chain ID
./latest.sh <config-name> | grep -i chain
# Check what chain the node thinks it's on
docker exec <client-container> ethdo chain --endpoint=http://localhost:8545
# Compare with expected chain ID
grep chainId <config-file>.yml
```
---
## 5. RPC/Connectivity Issues
### Symptom: RPC Endpoint Not Responding
```bash
# Test from host
curl -s http://localhost:<port> | head -c 100
# Check if traefik/proxy is running
docker ps | grep -E "(traefik|proxy|nginx)"
# Check traefik logs
docker logs <traefik-container> | tail -50
```
**Common causes:**
- **Container not running**: Client crashed
- **Port not exposed**: Wrong port mapping
- **Traefik misconfiguration**: Labels wrong or missing
- **Firewall blocking**: Host firewall or cloud security group
### Symptom: RPC Returns Wrong Chain ID
```bash
# Query chain ID from RPC
curl -s -X POST http://localhost:<port> \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
```
### Symptom: Cannot Connect to P2P Network
```bash
# Check peer count
./peer-count.sh | grep <config-name>
# Test P2P connectivity from container
docker exec <client-container> nc -zv <bootstrap-node> <p2p-port>
```
**Fixes:**
```bash
# Set public IP in .env
IP=$(curl -s ipinfo.io/ip)
echo "IP=$IP" >> .env
./force-recreate.sh <config-name>
```
---
## 6. Log Interpretation
### Common Log Patterns
#### Warnings (Node may still function)
| Pattern | Meaning | Action |
|---|---|---|
| `WARN.*sync.*slow` | Sync slower than expected | Check resources |
| `WARN.*peers.*low` | Fewer peers than desired | Check P2P connectivity |
| `WARN.*rate.*limit` | API rate limiting active | Normal for public endpoints |
#### Errors (Node is degraded)
| Pattern | Meaning | Action |
|---|---|---|
| `Error.*database.*corrupt` | Database corruption | Restore from backup or resync |
| `Error.*handshake.*fail` | P2P handshake failed | Check chain ID |
| `Error.*no.*peers` | Cannot connect to P2P | Check bootstrap nodes |
| `Error.*timeout` | RPC/HTTP timeout | Check network, increase timeout |
#### Fatal (Node will not function)
| Pattern | Meaning | Action |
|---|---|---|
| `Fatal.*panic` | Client crashed | Check client version |
| `Fatal.*OOM` | Out of memory | Increase memory limit |
| `Fatal.*disk.*full` | No disk space | Free space |
| `Fatal.*permission.*denied` | Filesystem permissions | Fix volume permissions |
---
## 7. Resource Issues
### High CPU Usage
```bash
./show-ram.sh <config-name>
./show-cpu.sh
docker stats <container-name> --no-stream
```
### High Memory Usage
```bash
./show-ram.sh <config-name>
docker stats <container-name> --no-stream --format "{{.Container}} | {{.MemUsage}} | {{.MemPerc}}"
```
### High Disk Usage
```bash
./show-db-size.sh
docker system df -v
```
### Disk I/O Bottleneck
```bash
iotop -o -d 1
```
---
## 8. Backup and Restore
### Creating a Backup
```bash
# Local backup (to /backup directory)
./backup-node.sh <config-name>
# Remote backup (to WebDAV)
./backup-node.sh <config-name> https://backup-server.tld/dav
```
### Restoring from Backup
```bash
# List available backups
./list-backups.sh
# Restore latest backup for config
./restore-volumes.sh <config-name>
# Restore from specific URL
./restore-volumes.sh <config-name> https://backup-server.tld/backup/
```
### Cloning a Node
```bash
# Clone a node to a new location
./clone-node.sh <config-name>
# Clone peers (for faster sync)
./clone-peers.sh <config-name>
```
### Nuclear Option: Full Reset
```bash
# WARNING: This deletes ALL data for the config
./stop.sh <config-name> && \
./rm.sh <config-name> && \
./delete-volumes.sh <config-name> && \
./delete-node-keys.sh <config-name> && \
./force-recreate.sh <config-name>
# Then check logs
./logs.sh <config-name>
```
---
## 9. Common Error Messages
### Database Errors
| Error | Cause | Solution |
|---|---|---|
| `database is corrupted` | Power loss, bug | Restore from backup or resync |
| `database version mismatch` | Client version changed | Delete and resync |
### P2P Errors
| Error | Cause | Solution |
|---|---|---|
| `no configured peers` | Missing bootstrap nodes | Add bootstrap nodes |
| `handshake failed` | Chain ID mismatch | Verify genesis.json |
### RPC Errors
| Error | Cause | Solution |
|---|---|---|
| `method not found` | Wrong client | Use correct client |
| `connection refused` | Port not open | Check container running, port mapping |
---
## 10. OP Stack Specific Debugging
### OP Node Issues
```bash
# Check op-node logs
./logs.sh <config-name> | grep -i "op-node\|rollup\|sequencer"
# Check rollup configuration (if custom)
cat op/<network>/ethereum/rollup.json | jq .
# Check if rollup.json is mounted
docker exec <op-node-container> cat /config/rollup.json | jq .
```
### OP Wheel (Manual Intervention)
```bash
# Rewind to specific block (DANGEROUS - only if you know what you're doing)
./op-wheel.sh engine set-forkchoice \
--unsafe=<block-hash> \
--safe=<block-hash> \
--finalized=<block-hash> \
--engine=http://<client-service>:8551/ \
--engine.open=http://<client-service>:8545 \
--engine.jwt-secret-path=/jwtsecret
# Nuclear option: finalize latest local block
./op-wheel-finalize-latest-block.sh <client-service> <node-service>
```
---
## 11. CometBFT Family (Cosmos, etc.) Specific
### Init Container Issues
```bash
# CometBFT chains use init.sh inside the container
# The master script is at scripts/cometbft-common.sh
# Check if init completed
./logs.sh <config-name> | grep -i "init\|setup\|complete"
# Check the init script
cat <network>/<chain>/scripts/init.sh
```
---
## 12. Quick Start Guide
### Starting a Node
```bash
# 1. Set up environment
echo "IP=$(curl -s ipinfo.io/ip)" > .env
echo "DOMAIN=${IP//./-}.traefik.me" >> .env
echo "MAIL=your-email@example.com" >> .env
# 2. Select which nodes to run
# Add compose files to COMPOSE_FILE (colon-separated)
echo "COMPOSE_FILE=base.yml:rpc.yml:ethereum-mainnet-geth-pruned.yml" >> .env
# 3. Start the node
docker compose up -d
# 4. Verify it's running
./show-status.sh
```
### Accessing Your Node
```bash
# Once running, access via:
# HTTP: http://<your-domain>/ethereum-mainnet-geth-pruned
# HTTPS: https://<your-domain>/ethereum-mainnet-geth-pruned
# WebSocket: wss://<your-domain>/ethereum-mainnet-geth-pruned
# Or locally (if NO_SSL=true):
# HTTP: http://localhost:<port>
```
---
## 13. Configuration Reference
### Environment Variables
**Required for most setups:**
```bash
IP=203.0.113.42 # Your public IP
DOMAIN=203-0-113-42.traefik.me # Your domain (traefik.me for testing)
MAIL=your-email@example.com # For Let's Encrypt SSL
WHITELIST=0.0.0.0/0 # IP whitelist (0.0.0.0/0 = all)
```
**Optional:**
```bash
NO_SSL=true # Disable SSL (testing only)
CHAINS_SUBNET=192.168.0.0/26 # Docker network subnet
```
**Chain-specific (examples):**
```bash
ETHEREUM_MAINNET_EXECUTION_RPC=https://fallback-rpc.example.com
ARBITRUM_SEPOLIA_EXECUTION_RPC=https://arb-sepolia-rpc.example.com
OP_NODE_NETWORK=mainnet
OP_NODE_L1_RPC_URL=https://l1-rpc.example.com
```
### Compose File Structure
Each compose file defines one or more services:
- **client**: Execution layer (Geth, Erigon, Reth, etc.)
- **node**: Consensus/derivation node (op-node, lighthouse, etc.)
- **relay**: DA relay (eigenda-proxy, op-alt, etc.)
- **proxy**: HTTP/WS proxy (nginx, etc.)
- **database**: External database (Postgres, etc.)
### Volume Naming
Volumes are named after the config:
```
<config-name>_<service>_data
<config-name>_<service>_config
```
Example: `ethereum-mainnet-geth-pruned_client_data`
---
## 14. Quick Debugging Checklist
Use this checklist when debugging an issue:
- [ ] **Is the container running?**`./show-running.sh`
- [ ] **Are there errors in logs?**`./logs.sh <config> | grep -i error`
- [ ] **Is the node synced?**`./sync-status.sh <config>`
- [ ] **Are peers connected?**`./peer-count.sh`
- [ ] **Are resources adequate?**`./show-ram.sh`, `./show-db-size.sh`
- [ ] **Is P2P working?** → Check peer count
- [ ] **Is RPC responding?** → Test with curl
- [ ] **Is disk space available?**`df -h /var/lib/docker`
- [ ] **Is the config file correct?**`docker compose -f <file>.yml config`
- [ ] **Are environment variables set?** → Check `.env`
- [ ] **Is the genesis file correct?** → Check chain ID
---
## 15. When to Escalate
Escalate to a human operator if:
- [ ] Node stuck for > 2 hours with no progress
- [ ] Repeated `Fatal` or `panic` errors after restart
- [ ] Database corruption confirmed
- [ ] Issue affects multiple nodes across different chains
- [ ] Need to force-push to this repo
---
## 16. File Locations Quick Reference
| What You Need | Where to Find It |
|---|---|
| Compose files | Root of this repo (`*.yml`) |
| Operational scripts | Root of this repo (`*.sh`) |
| Chain assets | `<network>/<chain>/` or `<stack>/<network>/<settlement>/` |
| Genesis files | `<stack>/<network>/<settlement>/genesis.json` |
| Rollup configs | `op/<network>/<settlement>/rollup.json` |
| Custom Dockerfiles | `<path>/*.Dockerfile` |
| Init scripts | `<path>/scripts/init.sh` |
| CometBFT common | `scripts/cometbft-common.sh` |
| Compose registry | `compose_registry.json` |
| RPC endpoints | `reference-rpc-endpoint.json` |
| Environment | `.env` |
---
## 17. Resource Requirements Reference
| Node Type | Disk | RAM | CPU |
|---|---|---|---|
| Ethereum pruned | ~500GB | 8GB | 2+ cores |
| Ethereum archive | ~2TB+ | 16GB+ | 4+ cores |
| Ethereum archive-trace | ~4TB+ | 32GB+ | 8+ cores |
| L2 pruned | ~100-500GB | 4-8GB | 2+ cores |
| L2 archive | ~1-2TB | 8-16GB | 4+ cores |
**Note:** Requirements vary by chain. Check specific chain documentation.
---
*This file is your complete operations and debugging reference. For additional user documentation, see README.md.*

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
abstract-mainnet-archive:
image: ${ABSTRACT_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${ABSTRACT_MAINNET_EXTERNAL_NODE_VERSION:-v29.17.0}
image: ${ABSTRACT_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${ABSTRACT_MAINNET_EXTERNAL_NODE_VERSION:-v31.0.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -98,6 +98,7 @@ services:
- traefik.http.routers.abstract-mainnet-external-node-archive.service=abstract-mainnet-external-node-archive
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-archive-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-archive-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-archive-ws.rule=Host(`$DOMAIN`) && (Path(`/abstract-mainnet-archive`) || Path(`/abstract-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.abstract-mainnet-external-node-archive-ws.rule=(Path(`/abstract-mainnet-archive`) || Path(`/abstract-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.abstract-mainnet-external-node-archive-ws.middlewares=abstract-mainnet-external-node-archive-stripprefix, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
abstract-mainnet:
image: ${ABSTRACT_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${ABSTRACT_MAINNET_EXTERNAL_NODE_VERSION:-v29.17.0}
image: ${ABSTRACT_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${ABSTRACT_MAINNET_EXTERNAL_NODE_VERSION:-v31.0.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -98,6 +98,7 @@ services:
- traefik.http.routers.abstract-mainnet-external-node-pruned.service=abstract-mainnet-external-node-pruned
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-pruned-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-pruned-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-pruned-ws.rule=Host(`$DOMAIN`) && (Path(`/abstract-mainnet`) || Path(`/abstract-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.abstract-mainnet-external-node-pruned-ws.rule=(Path(`/abstract-mainnet`) || Path(`/abstract-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.abstract-mainnet-external-node-pruned-ws.middlewares=abstract-mainnet-external-node-pruned-stripprefix, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
abstract-testnet-archive:
image: ${ABSTRACT_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${ABSTRACT_TESTNET_EXTERNAL_NODE_VERSION:-v29.17.0}
image: ${ABSTRACT_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${ABSTRACT_TESTNET_EXTERNAL_NODE_VERSION:-v31.0.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -98,6 +98,7 @@ services:
- traefik.http.routers.abstract-testnet-external-node-archive.service=abstract-testnet-external-node-archive
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-archive-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-archive-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-archive-ws.rule=Host(`$DOMAIN`) && (Path(`/abstract-testnet-archive`) || Path(`/abstract-testnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.abstract-testnet-external-node-archive-ws.rule=(Path(`/abstract-testnet-archive`) || Path(`/abstract-testnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.abstract-testnet-external-node-archive-ws.middlewares=abstract-testnet-external-node-archive-stripprefix, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
abstract-testnet:
image: ${ABSTRACT_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${ABSTRACT_TESTNET_EXTERNAL_NODE_VERSION:-v29.17.0}
image: ${ABSTRACT_EXTERNAL_NODE_IMAGE:-matterlabs/external-node}:${ABSTRACT_TESTNET_EXTERNAL_NODE_VERSION:-v31.0.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -98,6 +98,7 @@ services:
- traefik.http.routers.abstract-testnet-external-node-pruned.service=abstract-testnet-external-node-pruned
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-pruned-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-pruned-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-pruned-ws.rule=Host(`$DOMAIN`) && (Path(`/abstract-testnet`) || Path(`/abstract-testnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.abstract-testnet-external-node-pruned-ws.rule=(Path(`/abstract-testnet`) || Path(`/abstract-testnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.abstract-testnet-external-node-pruned-ws.middlewares=abstract-testnet-external-node-pruned-stripprefix, ipallowlist

18
accesslog-shipper.awk Normal file
View File

@@ -0,0 +1,18 @@
# Streams dshackle access-log lines unchanged, and every 1000 lines OR 30s
# injects a __shipstat__ checkpoint carrying the cumulative sent-count for this
# connection. The splits cruncher (claude host) filters these OUT of event
# processing and uses them to reconcile shipped-vs-ingested per gateway per hour
# — the completeness signal the time-based floor cannot see (event-loss-by-
# rotation, 2026-07-10). `sess` = connection-start epoch so the cruncher detects
# counter resets on shipper reconnect (retry loop resumes at file END).
BEGIN { sess = systime(); last = sess; n = 0 }
{
n++
print
now = systime()
if (n % 1000 == 0 || now - last >= 30) {
printf "{\"__shipstat__\":1,\"sess\":%d,\"sent\":%d,\"ts\":%d}\n", sess, n, now
fflush()
last = now
}
}

143
apply-dshackle-overrides.py Executable file
View File

@@ -0,0 +1,143 @@
#!/usr/bin/env python3
"""apply-dshackle-overrides.py - weave HOST-LOCAL dshackle upstream overrides into
the generated main_configs/*.yaml so they survive every configure-drpc regeneration.
Override file (NOT in the repo - host-local, like rpc-local/compose.d):
/root/rpc-local/dshackle-overrides.yaml
Schema (match by upstream id OR by chain; id wins):
upstreams:
uk-4-base-mainnet-op-reth-pruned: # or e.g. "chain:base"
method_groups_disabled: [trace, debug] # removed from enabled, added to disabled
methods_disabled: [eth_getFilterLogs] # per-method disables (methods.disabled)
options:
disable-validation: true # merged into upstream options
Rationale: heavy methods at flat per-call pay poison the chain's latency scoring
(operator method-eviction rule 2026-07-10; see method-economics.py). The disable
decision is local to the gateway's market, so the config lives on the gateway.
Called by reload_dshackle.sh before signaling dshackle - i.e. re-applied on every
ansible config push. NOTE: dshackle only re-reads upstream method lists on RESTART;
this keeps the on-disk config permanently correct, the next restart activates it.
Idempotent. Silent no-op when the override file is absent.
"""
import glob
import os
import sys
import yaml
OVERRIDES = '/root/rpc-local/dshackle-overrides.yaml'
CONFIG_DIR = '/root/rpc/main_configs'
def apply(upstream, ov):
changed = False
mg = upstream.setdefault('method-groups', {}) or {}
for grp in ov.get('method_groups_disabled') or []:
en = mg.get('enabled') or []
if grp in en:
en.remove(grp)
mg['enabled'] = en
changed = True
dis = mg.get('disabled') or []
if grp not in dis:
dis.append(grp)
mg['disabled'] = dis
changed = True
if mg:
upstream['method-groups'] = mg
for meth in ov.get('methods_disabled') or []:
methods = upstream.setdefault('methods', {}) or {}
dis = methods.get('disabled') or []
if not any((d.get('name') if isinstance(d, dict) else d) == meth for d in dis):
dis.append({'name': meth})
methods['disabled'] = dis
upstream['methods'] = methods
changed = True
for k, v in (ov.get('options') or {}).items():
opts = upstream.setdefault('options', {}) or {}
if opts.get(k) != v:
opts[k] = v
upstream['options'] = opts
changed = True
return changed
ENVFILE = '/root/rpc/.env'
def env_overrides():
"""Chain-level overrides from .env (rendered from host_vars env_overrides):
DSHACKLE_<CHAIN>_METHOD_GROUPS_DISABLED=trace,debug
DSHACKLE_<CHAIN>_METHODS_DISABLED=eth_getFilterLogs
<CHAIN> = dshackle chain name, upper, '-' -> '_' (e.g. BASE, ETH_BEACON_CHAIN)."""
spec = {}
if not os.path.exists(ENVFILE):
return spec
import re as _re
for line in open(ENVFILE):
m = _re.match(r'DSHACKLE_([A-Z0-9_]+)_(METHOD_GROUPS|METHODS)_DISABLED=(.*)', line.strip())
if not m:
continue
chain = m.group(1).lower().replace('_', '-')
key = 'method_groups_disabled' if m.group(2) == 'METHOD_GROUPS' else 'methods_disabled'
vals = [v.strip() for v in m.group(3).split(',') if v.strip()]
if vals:
spec.setdefault(f'chain:{chain}', {}).setdefault(key, []).extend(vals)
return spec
def main():
spec = env_overrides()
if os.path.exists(OVERRIDES):
for k, v in ((yaml.safe_load(open(OVERRIDES)) or {}).get('upstreams') or {}).items():
cur = spec.setdefault(k, {})
for kk, vv in (v or {}).items():
if isinstance(vv, list):
cur[kk] = sorted(set((cur.get(kk) or []) + vv))
else:
cur.setdefault(kk, vv)
if not spec:
return
total = 0
for path in glob.glob(os.path.join(CONFIG_DIR, '*.yaml')):
try:
doc = yaml.safe_load(open(path))
except yaml.YAMLError:
continue
if not isinstance(doc, dict) or 'upstreams' not in doc:
continue
changed = False
for up in doc['upstreams'] or []:
if not isinstance(up, dict):
continue
ov = spec.get(up.get('id')) or spec.get(f"chain:{up.get('chain')}")
if ov and apply(up, ov):
changed = True
if changed:
text = yaml.safe_dump(doc, default_flow_style=False, sort_keys=False)
# dshackle silently refuses to hot-reload configs containing TABS
# (operator gotcha 2026-07-10) - fail loudly, never write a tabbed file.
if '\t' in text:
print(f'dshackle-overrides: REFUSING to write {path} - tab in output')
continue
with open(path, 'w') as f:
f.write(text)
total += 1
print(f'dshackle-overrides: rewove {path}')
# tab audit on ALL configs (even unchanged): a tabbed file silently fails
# dshackle's hot-reload, so disk and running state diverge invisibly.
for path in glob.glob(os.path.join(CONFIG_DIR, '*.yaml')):
try:
if '\t' in open(path, errors='replace').read():
print(f'dshackle-overrides: WARNING {path} contains TABS - dshackle will SILENTLY skip reloading it')
except OSError:
pass
if total:
print(f'dshackle-overrides: {total} file(s) rewoven (dshackle hot-reloads on the HUP that follows)')
if __name__ == '__main__':
main()

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
alephzero-mainnet-archive:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.feed.input.url=wss://feed.alephzero.raas.gelato.cloud
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
alephzero-mainnet:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.feed.input.url=wss://feed.alephzero.raas.gelato.cloud
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
alephzero-sepolia-archive:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.feed.input.url=wss://feed.alephzero-testnet.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
alephzero-sepolia:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.feed.input.url=wss://feed.alephzero-testnet.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -73,7 +73,7 @@ services:
- --node.feed.input.url=wss://apechain.calderachain.xyz/feed
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.connection.url=${ARBITRUM_ONE_EXECUTION_RPC}
- --parent-chain.connection.url=https://arb1.arbitrum.io/rpc
- --persistent.chain=/root/.arbitrum/apechain-mainnet-archive
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -73,7 +73,7 @@ services:
- --node.feed.input.url=wss://apechain.calderachain.xyz/feed
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.connection.url=${ARBITRUM_ONE_EXECUTION_RPC}
- --parent-chain.connection.url=https://arb1.arbitrum.io/rpc
- --persistent.chain=/root/.arbitrum/apechain-mainnet
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -62,6 +62,7 @@ services:
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -63,6 +63,7 @@ services:
- --http.port=8545
- --http.vhosts=*
- --init.prune=minimal
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -62,6 +62,7 @@ services:
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -63,6 +63,7 @@ services:
- --http.port=8545
- --http.vhosts=*
- --init.prune=full
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -62,6 +62,7 @@ services:
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
connext-sepolia-archive:
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.feed.input.url=wss://feed.connext-sepolia.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
connext-sepolia:
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.feed.input.url=wss://feed.connext-sepolia.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
everclear-mainnet-archive:
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.feed.input.url=wss://feed.everclear.raas.gelato.cloud
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
everclear-mainnet:
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.feed.input.url=wss://feed.everclear.raas.gelato.cloud
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
opencampuscodex-sepolia-archive:
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.feed.input.url=wss://feed.open-campus-codex.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
opencampuscodex-sepolia:
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.feed.input.url=wss://feed.open-campus-codex.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
playblock-mainnet-archive:
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.playblock.io
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.playblock.io
- --node.feed.input.url=wss://feed.playblock.io
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
playblock-mainnet:
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.playblock.io
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.playblock.io
- --node.feed.input.url=wss://feed.playblock.io
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-mainnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-mainnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-mainnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-mainnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-testnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-testnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-testnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-testnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
real-mainnet-archive:
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.feed.input.url=wss://feed.realforreal.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
real-mainnet-archive:
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.feed.input.url=wss://feed.realforreal.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
real-mainnet:
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.feed.input.url=wss://feed.realforreal.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -0,0 +1,143 @@
---
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:arb/nitro/robinhood-mainnet-nitro-archive-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/robinhood-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
robinhood-mainnet-archive:
image: ${ROBINHOOD_NITRO_IMAGE:-offchainlabs/nitro-node}:${ROBINHOOD_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=true
- --execution.caching.database-cache=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_SNAPSHOT_CACHE:-400}
- --execution.caching.trie-clean-cache=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.mainnet.chain.robinhood.com
- --execution.rpc.filter-log-cache-size=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_FILTER_LOG_CACHE:-32}
- --execution.rpc.gas-cap=5500000000
- --execution.rpc.log-history=0
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.feed.input.url=wss://feed.mainnet.chain.robinhood.com
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/robinhood-mainnet-archive
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_DATA:-robinhood-mainnet-nitro-archive-pebble-hash}:/root/.arbitrum
- ./arb/robinhood/mainnet:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.robinhood-mainnet-nitro-archive-pebble-hash-stripprefix.stripprefix.prefixes=/robinhood-mainnet-archive
- traefik.http.services.robinhood-mainnet-nitro-archive-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/robinhood-mainnet-archive`) || Path(`/robinhood-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.rule=Path(`/robinhood-mainnet-archive`) || Path(`/robinhood-mainnet-archive/`)}
- traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.middlewares=robinhood-mainnet-nitro-archive-pebble-hash-stripprefix, ipallowlist
volumes:
robinhood-mainnet-nitro-archive-pebble-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: robinhood
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

View File

@@ -0,0 +1,144 @@
---
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:arb/nitro/robinhood-mainnet-nitro-pruned-pebble-path.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/robinhood-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
robinhood-mainnet:
image: ${ROBINHOOD_NITRO_IMAGE:-offchainlabs/nitro-node}:${ROBINHOOD_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=${ROBINHOOD_MAINNET_ARCHIVE_DB:-false}
- --execution.caching.database-cache=${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_SNAPSHOT_CACHE:-400}
- --execution.caching.state-scheme=path
- --execution.caching.trie-clean-cache=${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.mainnet.chain.robinhood.com
- --execution.rpc.gas-cap=5500000000
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.feed.input.url=wss://feed.mainnet.chain.robinhood.com
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/robinhood-mainnet
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_DATA:-robinhood-mainnet-nitro-pruned-pebble-path}:/root/.arbitrum
- ./arb/robinhood/mainnet:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.robinhood-mainnet-nitro-pruned-pebble-path-stripprefix.stripprefix.prefixes=/robinhood-mainnet
- traefik.http.services.robinhood-mainnet-nitro-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/robinhood-mainnet`) || Path(`/robinhood-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.rule=Path(`/robinhood-mainnet`) || Path(`/robinhood-mainnet/`)}
- traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.middlewares=robinhood-mainnet-nitro-pruned-pebble-path-stripprefix, ipallowlist
volumes:
robinhood-mainnet-nitro-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: robinhood
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

View File

@@ -0,0 +1,143 @@
---
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:arb/nitro/robinhood-testnet-nitro-archive-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/robinhood-testnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
robinhood-testnet-archive:
image: ${ROBINHOOD_NITRO_IMAGE:-offchainlabs/nitro-node}:${ROBINHOOD_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=true
- --execution.caching.database-cache=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_SNAPSHOT_CACHE:-400}
- --execution.caching.trie-clean-cache=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.testnet.chain.robinhood.com
- --execution.rpc.filter-log-cache-size=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_FILTER_LOG_CACHE:-32}
- --execution.rpc.gas-cap=5500000000
- --execution.rpc.log-history=0
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.feed.input.url=wss://feed.testnet.chain.robinhood.com
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/robinhood-testnet-archive
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_DATA:-robinhood-testnet-nitro-archive-pebble-hash}:/root/.arbitrum
- ./arb/robinhood/testnet:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.robinhood-testnet-nitro-archive-pebble-hash-stripprefix.stripprefix.prefixes=/robinhood-testnet-archive
- traefik.http.services.robinhood-testnet-nitro-archive-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/robinhood-testnet-archive`) || Path(`/robinhood-testnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.rule=Path(`/robinhood-testnet-archive`) || Path(`/robinhood-testnet-archive/`)}
- traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.middlewares=robinhood-testnet-nitro-archive-pebble-hash-stripprefix, ipallowlist
volumes:
robinhood-testnet-nitro-archive-pebble-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: robinhood-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

View File

@@ -0,0 +1,144 @@
---
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:arb/nitro/robinhood-testnet-nitro-pruned-pebble-path.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/robinhood-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
robinhood-testnet:
image: ${ROBINHOOD_NITRO_IMAGE:-offchainlabs/nitro-node}:${ROBINHOOD_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=${ROBINHOOD_TESTNET_ARCHIVE_DB:-false}
- --execution.caching.database-cache=${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_SNAPSHOT_CACHE:-400}
- --execution.caching.state-scheme=path
- --execution.caching.trie-clean-cache=${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.testnet.chain.robinhood.com
- --execution.rpc.gas-cap=5500000000
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.feed.input.url=wss://feed.testnet.chain.robinhood.com
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/robinhood-testnet
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_DATA:-robinhood-testnet-nitro-pruned-pebble-path}:/root/.arbitrum
- ./arb/robinhood/testnet:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.robinhood-testnet-nitro-pruned-pebble-path-stripprefix.stripprefix.prefixes=/robinhood-testnet
- traefik.http.services.robinhood-testnet-nitro-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/robinhood-testnet`) || Path(`/robinhood-testnet/`))}
- ${NO_SSL:+traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.rule=Path(`/robinhood-testnet`) || Path(`/robinhood-testnet/`)}
- traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.middlewares=robinhood-testnet-nitro-pruned-pebble-path-stripprefix, ipallowlist
volumes:
robinhood-testnet-nitro-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: robinhood-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

View File

@@ -0,0 +1,8 @@
{
"chain": {
"info-json": "[{\"chain-id\":4663,\"parent-chain-id\":1,\"parent-chain-is-arbitrum\":false,\"chain-name\":\"robinhood\",\"chain-config\":{\"chainId\":4663,\"homesteadBlock\":0,\"daoForkBlock\":null,\"daoForkSupport\":true,\"eip150Block\":0,\"eip150Hash\":\"0x0000000000000000000000000000000000000000000000000000000000000000\",\"eip155Block\":0,\"eip158Block\":0,\"byzantiumBlock\":0,\"constantinopleBlock\":0,\"petersburgBlock\":0,\"istanbulBlock\":0,\"muirGlacierBlock\":0,\"berlinBlock\":0,\"londonBlock\":0,\"clique\":{\"period\":0,\"epoch\":0},\"arbitrum\":{\"EnableArbOS\":true,\"AllowDebugPrecompiles\":false,\"DataAvailabilityCommittee\":false,\"InitialArbOSVersion\":51,\"InitialChainOwner\":\"0xc8451c5DE260E7ea1b879e7994967077e71230Ca\",\"GenesisBlockNum\":0,\"MaxCodeSize\":98304,\"MaxInitCodeSize\":196608}},\"rollup\":{\"bridge\":\"0xDf8755334ce7A73cCF6b581C02eA649AE3E864b3\",\"inbox\":\"0x1A07cc4BD17E0118BdB54D70990D2158AbAD7a2D\",\"sequencer-inbox\":\"0xBd0D173EEb87D57A09521c24388a12789F33ba96\",\"rollup\":\"0x23A19d23e89166adedbDcB432518AB01e4272D94\",\"validator-wallet-creator\":\"0xB7FE37712e46F28C8f22Ec4bAA33A09fb8B52BD0\",\"stake-token\":\"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\"deployed-at\":24994238}}]"
},
"init": {
"genesis-json-file": "/config/robinhood-genesis.json"
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
{
"chain": {
"info-json": "[{\"chain-id\":46630,\"parent-chain-id\":11155111,\"parent-chain-is-arbitrum\":false,\"chain-name\":\"Robinhood Chain Sepolia\",\"chain-config\":{\"chainId\":46630,\"homesteadBlock\":0,\"daoForkBlock\":null,\"daoForkSupport\":true,\"eip150Block\":0,\"eip150Hash\":\"0x0000000000000000000000000000000000000000000000000000000000000000\",\"eip155Block\":0,\"eip158Block\":0,\"byzantiumBlock\":0,\"constantinopleBlock\":0,\"petersburgBlock\":0,\"istanbulBlock\":0,\"muirGlacierBlock\":0,\"berlinBlock\":0,\"londonBlock\":0,\"clique\":{\"period\":0,\"epoch\":0},\"arbitrum\":{\"EnableArbOS\":true,\"AllowDebugPrecompiles\":false,\"DataAvailabilityCommittee\":false,\"InitialArbOSVersion\":51,\"InitialChainOwner\":\"0x7131b1c28Df46d845Ee044f2f79AC19Ba14526a8\",\"GenesisBlockNum\":0,\"MaxCodeSize\":98304,\"MaxInitCodeSize\":196608}},\"rollup\":{\"bridge\":\"0x96295BDad104eaD97cC08797b3dC68efF59CcF30\",\"inbox\":\"0xF2939afA86F6f933A3CE17fCAB007907B6b0B7a4\",\"sequencer-inbox\":\"0xA0D9dB3DC9791D54b5183C1C1866eFe1eCA7D414\",\"rollup\":\"0xdc5F8E399DBd8a9F5F87AeC4C23Beb12431b386D\",\"validator-utils\":\"0x0000000000000000000000000000000000000000\",\"validator-wallet-creator\":\"0xB7FE37712e46F28C8f22Ec4bAA33A09fb8B52BD0\",\"stake-token\":\"0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9\",\"deployed-at\":10204516}}]"
}
}

View File

@@ -0,0 +1,180 @@
---
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:arc/reth/arc-mainnet-reth-archive-trace.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/arc-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-mainnet-archive-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_MAINNET_CONSENSUS_VERSION:-0.7.2}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
- --home=/data/consensus
restart: no
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_ARCHIVE_TRACE_CONSENSUS_DATA:-arc-mainnet-reth-archive-trace-consensus}:/data/consensus
logging: *logging-defaults
arc-mainnet-archive-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets]
restart: no
depends_on:
arc-mainnet-archive-consensus-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- arc-mainnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
arc-mainnet-archive:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_MAINNET_RETH_VERSION:-0.7.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: 0:0
expose:
- 8545
- 9001
entrypoint: [/usr/local/bin/arc-node-execution, node]
command:
- --auth-ipc
- --auth-ipc.path=/sockets/auth.ipc
- --chain=arc-mainnet
- --datadir=/data/execution
- --disable-discovery
- --enable-arc-rpc
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,txpool,trace,debug
- --http.port=8545
- --ipcpath=/sockets/reth.ipc
- --log.file.directory=/data/execution/logs
- --metrics=0.0.0.0:9001
- --rpc.forwarder=https://rpc.arc.network/
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-mainnet-archive-sockets-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_ARCHIVE_TRACE_EXECUTION_DATA:-arc-mainnet-reth-archive-trace-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-mainnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-mainnet-reth-archive-trace-stripprefix.stripprefix.prefixes=/arc-mainnet-archive
- traefik.http.services.arc-mainnet-reth-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/arc-mainnet-archive`) || Path(`/arc-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.arc-mainnet-reth-archive-trace.rule=Path(`/arc-mainnet-archive`) || Path(`/arc-mainnet-archive/`)}
- traefik.http.routers.arc-mainnet-reth-archive-trace.middlewares=arc-mainnet-reth-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
arc-mainnet-archive-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_MAINNET_CONSENSUS_VERSION:-0.7.2}
user: 0:0
expose:
- 31000
- 29000
entrypoint: [/usr/local/bin/arc-node-consensus, start]
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --follow.endpoint=https://arc.drpc.org,wss=arc.drpc.org
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --rpc.addr=0.0.0.0:31000
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-mainnet-archive-consensus-init:
condition: service_completed_successfully
arc-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_ARCHIVE_TRACE_CONSENSUS_DATA:-arc-mainnet-reth-archive-trace-consensus}:/data/consensus
- arc-mainnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-mainnet-reth-archive-trace-consensus:
arc-mainnet-reth-archive-trace-execution:
arc-mainnet-reth-archive-trace-sockets:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
chain: arc
method-groups:
enabled:
- debug
- filter
- trace
methods:
enabled:
- name: txpool_content
...

View File

@@ -0,0 +1,181 @@
---
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:arc/reth/arc-mainnet-reth-pruned-trace.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/arc-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-mainnet-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_MAINNET_CONSENSUS_VERSION:-0.7.2}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
- --home=/data/consensus
restart: no
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-mainnet-reth-pruned-trace-consensus}:/data/consensus
logging: *logging-defaults
arc-mainnet-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets]
restart: no
depends_on:
arc-mainnet-consensus-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- arc-mainnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
arc-mainnet:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_MAINNET_RETH_VERSION:-0.7.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: 0:0
expose:
- 8545
- 9001
entrypoint: [/usr/local/bin/arc-node-execution, node]
command:
- --auth-ipc
- --auth-ipc.path=/sockets/auth.ipc
- --chain=arc-mainnet
- --datadir=/data/execution
- --disable-discovery
- --enable-arc-rpc
- --full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,txpool,trace,debug
- --http.port=8545
- --ipcpath=/sockets/reth.ipc
- --log.file.directory=/data/execution/logs
- --metrics=0.0.0.0:9001
- --rpc.forwarder=https://rpc.arc.network/
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-mainnet-sockets-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_PRUNED_TRACE_EXECUTION_DATA:-arc-mainnet-reth-pruned-trace-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-mainnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-mainnet-reth-pruned-trace-stripprefix.stripprefix.prefixes=/arc-mainnet
- traefik.http.services.arc-mainnet-reth-pruned-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-pruned-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-pruned-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/arc-mainnet`) || Path(`/arc-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.arc-mainnet-reth-pruned-trace.rule=Path(`/arc-mainnet`) || Path(`/arc-mainnet/`)}
- traefik.http.routers.arc-mainnet-reth-pruned-trace.middlewares=arc-mainnet-reth-pruned-trace-stripprefix, ipallowlist
shm_size: 2gb
arc-mainnet-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_MAINNET_CONSENSUS_VERSION:-0.7.2}
user: 0:0
expose:
- 31000
- 29000
entrypoint: [/usr/local/bin/arc-node-consensus, start]
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --follow.endpoint=https://arc.drpc.org,wss=arc.drpc.org
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --rpc.addr=0.0.0.0:31000
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-mainnet-consensus-init:
condition: service_completed_successfully
arc-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-mainnet-reth-pruned-trace-consensus}:/data/consensus
- arc-mainnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-mainnet-reth-pruned-trace-consensus:
arc-mainnet-reth-pruned-trace-execution:
arc-mainnet-reth-pruned-trace-sockets:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
chain: arc
method-groups:
enabled:
- debug
- filter
- trace
methods:
enabled:
- name: txpool_content
...

View File

@@ -0,0 +1,180 @@
---
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:arc/reth/arc-testnet-reth-archive-trace.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/arc-testnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-testnet-archive-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-v0.7.3}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
- --home=/data/consensus
restart: no
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_ARCHIVE_TRACE_CONSENSUS_DATA:-arc-testnet-reth-archive-trace-consensus}:/data/consensus
logging: *logging-defaults
arc-testnet-archive-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets]
restart: no
depends_on:
arc-testnet-archive-consensus-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- arc-testnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
arc-testnet-archive:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-v0.7.3}
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
expose:
- 8545
- 9001
entrypoint: [/usr/local/bin/arc-node-execution, node]
command:
- --auth-ipc
- --auth-ipc.path=/sockets/auth.ipc
- --chain=arc-testnet
- --datadir=/data/execution
- --disable-discovery
- --enable-arc-rpc
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,txpool,trace,debug
- --http.port=8545
- --ipcpath=/sockets/reth.ipc
- --log.file.directory=/data/execution/logs
- --metrics=0.0.0.0:9001
- --rpc.forwarder=https://rpc.quicknode.testnet.arc.network/
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-testnet-archive-sockets-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_ARCHIVE_TRACE_EXECUTION_DATA:-arc-testnet-reth-archive-trace-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-testnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-testnet-reth-archive-trace-stripprefix.stripprefix.prefixes=/arc-testnet-archive
- traefik.http.services.arc-testnet-reth-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/arc-testnet-archive`) || Path(`/arc-testnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.arc-testnet-reth-archive-trace.rule=Path(`/arc-testnet-archive`) || Path(`/arc-testnet-archive/`)}
- traefik.http.routers.arc-testnet-reth-archive-trace.middlewares=arc-testnet-reth-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
arc-testnet-archive-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-v0.7.3}
user: 0:0
expose:
- 31000
- 29000
entrypoint: [/usr/local/bin/arc-node-consensus, start]
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --rpc.addr=0.0.0.0:31000
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-testnet-archive-consensus-init:
condition: service_completed_successfully
arc-testnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_ARCHIVE_TRACE_CONSENSUS_DATA:-arc-testnet-reth-archive-trace-consensus}:/data/consensus
- arc-testnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-testnet-reth-archive-trace-consensus:
arc-testnet-reth-archive-trace-execution:
arc-testnet-reth-archive-trace-sockets:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
chain: arc-testnet
method-groups:
enabled:
- debug
- filter
- trace
methods:
enabled:
- name: txpool_content
...

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -20,7 +20,7 @@ x-logging-defaults: &logging-defaults
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:arc/arc/arc-testnet-arc-full.yml
# COMPOSE_FILE=base.yml:rpc.yml:arc/reth/arc-testnet-reth-pruned-trace.yml
#
# docker compose up -d
#
@@ -29,36 +29,17 @@ x-logging-defaults: &logging-defaults
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-testnet-snapshots:
image: ${ARC_ARC_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_ARC_VERSION:-0.7.2}
user: 0:0
entrypoint: [/usr/local/bin/arc-snapshots, download]
command:
- --chain=arc-testnet
- --consensus-path=/data/consensus
- --execution-path=/data/execution
restart: no
networks:
- chains
volumes:
- ${ARC_TESTNET_ARC_FULL_CONSENSUS_DATA:-arc-testnet-arc-full-consensus}:/data/consensus
- ${ARC_TESTNET_ARC_FULL_EXECUTION_DATA:-arc-testnet-arc-full-execution}:/data/execution
logging: *logging-defaults
arc-testnet-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.7.2}
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-v0.7.3}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
- --home=/data/consensus
restart: no
depends_on:
arc-testnet-snapshots:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_TESTNET_ARC_FULL_CONSENSUS_DATA:-arc-testnet-arc-full-consensus}:/data/consensus
- ${ARC_TESTNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-testnet-reth-pruned-trace-consensus}:/data/consensus
logging: *logging-defaults
arc-testnet-sockets-init:
@@ -72,11 +53,11 @@ services:
networks:
- chains
volumes:
- arc-testnet-arc-full-sockets:/sockets
- arc-testnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
arc-testnet:
image: ${ARC_ARC_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_ARC_VERSION:-0.7.2}
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-v0.7.3}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -90,6 +71,7 @@ services:
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
expose:
- 8545
@@ -119,25 +101,26 @@ services:
networks:
- chains
volumes:
- ${ARC_TESTNET_ARC_FULL_EXECUTION_DATA:-arc-testnet-arc-full-execution}:/data/execution
- ${ARC_TESTNET_RETH_PRUNED_TRACE_EXECUTION_DATA:-arc-testnet-reth-pruned-trace-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-testnet-arc-full-sockets:/sockets
- arc-testnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-testnet-arc-full-stripprefix.stripprefix.prefixes=/arc-testnet
- traefik.http.services.arc-testnet-arc-full.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-testnet-arc-full.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-testnet-arc-full.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-testnet-arc-full.rule=Host(`$DOMAIN`) && (Path(`/arc-testnet`) || Path(`/arc-testnet/`))}
- ${NO_SSL:+traefik.http.routers.arc-testnet-arc-full.rule=Path(`/arc-testnet`) || Path(`/arc-testnet/`)}
- traefik.http.routers.arc-testnet-arc-full.middlewares=arc-testnet-arc-full-stripprefix, ipallowlist
- traefik.http.middlewares.arc-testnet-reth-pruned-trace-stripprefix.stripprefix.prefixes=/arc-testnet
- traefik.http.services.arc-testnet-reth-pruned-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/arc-testnet`) || Path(`/arc-testnet/`))}
- ${NO_SSL:+traefik.http.routers.arc-testnet-reth-pruned-trace.rule=Path(`/arc-testnet`) || Path(`/arc-testnet/`)}
- traefik.http.routers.arc-testnet-reth-pruned-trace.middlewares=arc-testnet-reth-pruned-trace-stripprefix, ipallowlist
shm_size: 2gb
arc-testnet-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.7.2}
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-v0.7.3}
user: 0:0
expose:
- 31000
@@ -146,12 +129,11 @@ services:
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=50
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --follow.endpoint=https://rpc.drpc.testnet.arc.network,wss=rpc.drpc.testnet.arc.network
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
@@ -163,20 +145,21 @@ services:
condition: service_completed_successfully
arc-testnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ${ARC_TESTNET_ARC_FULL_CONSENSUS_DATA:-arc-testnet-arc-full-consensus}:/data/consensus
- arc-testnet-arc-full-sockets:/sockets
- ${ARC_TESTNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-testnet-reth-pruned-trace-consensus}:/data/consensus
- arc-testnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-testnet-arc-full-consensus:
arc-testnet-arc-full-execution:
arc-testnet-arc-full-sockets:
arc-testnet-reth-pruned-trace-consensus:
arc-testnet-reth-pruned-trace-execution:
arc-testnet-reth-pruned-trace-sockets:
x-upstreams:
- id: $${ID}

View File

@@ -0,0 +1,181 @@
---
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:arc/reth/arc-testnet-reth-pruned.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/arc-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-testnet-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-v0.7.3}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
- --home=/data/consensus
restart: no
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_PRUNED_CONSENSUS_DATA:-arc-testnet-reth-pruned-consensus}:/data/consensus
logging: *logging-defaults
arc-testnet-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets]
restart: no
depends_on:
arc-testnet-consensus-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- arc-testnet-reth-pruned-sockets:/sockets
logging: *logging-defaults
arc-testnet:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-v0.7.3}
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
expose:
- 8545
- 9001
entrypoint: [/usr/local/bin/arc-node-execution, node]
command:
- --auth-ipc
- --auth-ipc.path=/sockets/auth.ipc
- --chain=arc-testnet
- --datadir=/data/execution
- --disable-discovery
- --enable-arc-rpc
- --full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,txpool,trace,debug
- --http.port=8545
- --ipcpath=/sockets/reth.ipc
- --log.file.directory=/data/execution/logs
- --metrics=0.0.0.0:9001
- --rpc.forwarder=https://rpc.quicknode.testnet.arc.network/
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-testnet-sockets-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_PRUNED_EXECUTION_DATA:-arc-testnet-reth-pruned-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-testnet-reth-pruned-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-testnet-reth-pruned-stripprefix.stripprefix.prefixes=/arc-testnet
- traefik.http.services.arc-testnet-reth-pruned.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned.rule=Host(`$DOMAIN`) && (Path(`/arc-testnet`) || Path(`/arc-testnet/`))}
- ${NO_SSL:+traefik.http.routers.arc-testnet-reth-pruned.rule=Path(`/arc-testnet`) || Path(`/arc-testnet/`)}
- traefik.http.routers.arc-testnet-reth-pruned.middlewares=arc-testnet-reth-pruned-stripprefix, ipallowlist
shm_size: 2gb
arc-testnet-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-v0.7.3}
user: 0:0
expose:
- 31000
- 29000
entrypoint: [/usr/local/bin/arc-node-consensus, start]
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --rpc.addr=0.0.0.0:31000
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-testnet-consensus-init:
condition: service_completed_successfully
arc-testnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_PRUNED_CONSENSUS_DATA:-arc-testnet-reth-pruned-consensus}:/data/consensus
- arc-testnet-reth-pruned-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-testnet-reth-pruned-consensus:
arc-testnet-reth-pruned-execution:
arc-testnet-reth-pruned-sockets:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
chain: arc-testnet
method-groups:
enabled:
- debug
- filter
- trace
methods:
enabled:
- name: txpool_content
...

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-fuji-go-archive-leveldb.service=avalanche-fuji-go-archive-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji-archive`) || Path(`/avalanche-fuji-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.rule=(Path(`/avalanche-fuji-archive`) || Path(`/avalanche-fuji-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.middlewares=avalanche-fuji-go-archive-leveldb-stripprefix, avalanche-fuji-go-archive-leveldb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-fuji-go-pruned-leveldb.service=avalanche-fuji-go-pruned-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.rule=(Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.middlewares=avalanche-fuji-go-pruned-leveldb-stripprefix, avalanche-fuji-go-pruned-leveldb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-fuji-go-pruned-leveldb.service=avalanche-fuji-go-pruned-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.rule=(Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.middlewares=avalanche-fuji-go-pruned-leveldb-stripprefix, avalanche-fuji-go-pruned-leveldb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.service=avalanche-fuji-go-pruned-pebbledb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.rule=(Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.middlewares=avalanche-fuji-go-pruned-pebbledb-stripprefix, avalanche-fuji-go-pruned-pebbledb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.service=avalanche-fuji-go-pruned-pebbledb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.rule=(Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.middlewares=avalanche-fuji-go-pruned-pebbledb-stripprefix, avalanche-fuji-go-pruned-pebbledb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-archive-leveldb.service=avalanche-mainnet-go-archive-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet-archive`) || Path(`/avalanche-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.rule=(Path(`/avalanche-mainnet-archive`) || Path(`/avalanche-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.middlewares=avalanche-mainnet-go-archive-leveldb-stripprefix, avalanche-mainnet-go-archive-leveldb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-pruned-leveldb.service=avalanche-mainnet-go-pruned-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.rule=(Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.middlewares=avalanche-mainnet-go-pruned-leveldb-stripprefix, avalanche-mainnet-go-pruned-leveldb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-pruned-leveldb.service=avalanche-mainnet-go-pruned-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.rule=(Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.middlewares=avalanche-mainnet-go-pruned-leveldb-stripprefix, avalanche-mainnet-go-pruned-leveldb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb.service=avalanche-mainnet-go-pruned-pebbledb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.rule=(Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.middlewares=avalanche-mainnet-go-pruned-pebbledb-stripprefix, avalanche-mainnet-go-pruned-pebbledb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb.service=avalanche-mainnet-go-pruned-pebbledb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.rule=(Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.middlewares=avalanche-mainnet-go-pruned-pebbledb-stripprefix, avalanche-mainnet-go-pruned-pebbledb-set-ws-path, ipallowlist

View File

@@ -0,0 +1,112 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Aztec full node. See https://docs.aztec.network/network/setup/running_a_node
# Admin port (8880) is not exposed; use docker exec for admin API.
# 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:aztec/aztec/aztec-mainnet-aztec-pruned.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/aztec-mainnet-pruned \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
aztec-mainnet-pruned:
image: ${AZTEC_AZTEC_IMAGE:-aztecprotocol/aztec}:${AZTEC_MAINNET_AZTEC_VERSION:-5.0.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 13840:13840
- 13840:13840/udp
expose:
- 8545
environment:
AZTEC_ADMIN_PORT: '8880'
AZTEC_PORT: '8545'
DATA_DIRECTORY: /var/lib/data
ETHEREUM_DEBUG_HOSTS: ${ETHEREUM_MAINNET_DEBUG_HOSTS:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
ETHEREUM_HOSTS: ${ETHEREUM_MAINNET_EXECUTION_RPC}
L1_CONSENSUS_HOST_URLS: ${ETHEREUM_MAINNET_BEACON_REST}
LOG_LEVEL: ${AZTEC_LOG_LEVEL:-info}
P2P_IP: ${IP}
P2P_PORT: '13840'
entrypoint: [node, --no-warnings, /usr/src/yarn-project/aztec/dest/bin/index.js, start]
command:
- --node
- --network=mainnet
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${AZTEC_MAINNET_AZTEC_PRUNED_DATA:-aztec-mainnet-aztec-pruned}:/var/lib/data
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=false
- traefik.enable=true
- traefik.http.middlewares.aztec-mainnet-aztec-pruned-stripprefix.stripprefix.prefixes=/aztec-mainnet-pruned
- traefik.http.services.aztec-mainnet-aztec-pruned.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.aztec-mainnet-aztec-pruned.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.aztec-mainnet-aztec-pruned.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.aztec-mainnet-aztec-pruned.rule=Host(`$DOMAIN`) && (Path(`/aztec-mainnet-pruned`) || Path(`/aztec-mainnet-pruned/`))}
- ${NO_SSL:+traefik.http.routers.aztec-mainnet-aztec-pruned.rule=Path(`/aztec-mainnet-pruned`) || Path(`/aztec-mainnet-pruned/`)}
- traefik.http.routers.aztec-mainnet-aztec-pruned.middlewares=aztec-mainnet-aztec-pruned-stripprefix, ipallowlist
volumes:
aztec-mainnet-aztec-pruned:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: aztec-mainnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Aztec full node. See https://docs.aztec.network/network/setup/running_a_node
# Admin port (8880) is not exposed; use docker exec for admin API.
@@ -32,7 +32,7 @@ x-logging-defaults: &logging-defaults
services:
aztec-testnet-pruned:
image: ${AZTEC_AZTEC_IMAGE:-aztecprotocol/aztec}:${AZTEC_TESTNET_AZTEC_VERSION:-5.0.0-rc.1}
image: ${AZTEC_AZTEC_IMAGE:-aztecprotocol/aztec}:${AZTEC_TESTNET_AZTEC_VERSION:-5.0.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -56,6 +56,7 @@ services:
AZTEC_ADMIN_PORT: '8880'
AZTEC_PORT: '8545'
DATA_DIRECTORY: /var/lib/data
ETHEREUM_DEBUG_HOSTS: ${ETHEREUM_SEPOLIA_DEBUG_HOSTS:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
ETHEREUM_HOSTS: ${ETHEREUM_SEPOLIA_EXECUTION_RPC}
L1_CONSENSUS_HOST_URLS: ${ETHEREUM_SEPOLIA_BEACON_REST}
LOG_LEVEL: ${AZTEC_LOG_LEVEL:-info}

View File

@@ -0,0 +1,128 @@
---
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:babylon/babylond/babylon-mainnet-babylond-pruned.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/babylon-mainnet-pruned \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
babylon-mainnet-pruned:
build:
context: ./babylon
dockerfile: cometbft.Dockerfile
args:
CL_IMAGE: ${BABYLON_BABYLOND_IMAGE:-babylonlabs/babylond}
CL_VERSION: ${BABYLON_MAINNET_BABYLOND_VERSION:-v4.3.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 10871:10871
- 10871:10871/udp
expose:
- 26657
- 26660
- 9090
- 1317
environment:
- CHAIN_ID=bbn-1
- GENESIS_URL=https://raw.githubusercontent.com/babylonlabs-io/networks/main/bbn-1/network-artifacts/genesis.json
- IP=${IP}
- MIN_GAS=0.002ubbn
- MONIKER=d${DOMAIN:-local}
- P2P_PORT=10871
- SEEDS=42fad8afbf7dfca51020c3c6e1a487ce17c4c218@babylon-seed-1.nodes.guru:55706,ade4d8bc8cbe014af6ebdf3cb7b1e9ad36f412c0@seeds.polkachu.com:20656
- STATESYNC_RPC=https://babylon-rpc.polkachu.com:443
- WASM_SNAPSHOT_URL=https://snapshots.polkachu.com/wasm/babylon/babylon_wasmonly.tar.lz4
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BABYLON_MAINNET_BABYLOND_PRUNED_DATA:-babylon-mainnet-babylond-pruned}:/root/.babylond
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=26660
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.babylon-mainnet-babylond-pruned-stripprefix.stripprefix.prefixes=/babylon-mainnet-pruned
- traefik.http.services.babylon-mainnet-babylond-pruned.loadbalancer.server.port=26657
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned.rule=Host(`$DOMAIN`) && (Path(`/babylon-mainnet-pruned`) || Path(`/babylon-mainnet-pruned/`))}
- ${NO_SSL:+traefik.http.routers.babylon-mainnet-babylond-pruned.rule=Path(`/babylon-mainnet-pruned`) || Path(`/babylon-mainnet-pruned/`)}
- traefik.http.routers.babylon-mainnet-babylond-pruned.middlewares=babylon-mainnet-babylond-pruned-stripprefix, ipallowlist
- traefik.http.routers.babylon-mainnet-babylond-pruned.priority=50 # gets any request that is not GET with UPGRADE header
- traefik.http.routers.babylon-mainnet-babylond-pruned-ws.priority=100 # answers GET requests first
- traefik.http.middlewares.babylon-mainnet-babylond-pruned-set-ws-path.replacepath.path=/websocket
- traefik.http.services.babylon-mainnet-babylond-pruned-ws.loadbalancer.server.port=26657
- traefik.http.routers.babylon-mainnet-babylond-pruned-ws.service=babylon-mainnet-babylond-pruned-ws
- traefik.http.routers.babylon-mainnet-babylond-pruned.service=babylon-mainnet-babylond-pruned
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned-ws.rule=Host(`$DOMAIN`) && (Path(`/babylon-mainnet-pruned`) || Path(`/babylon-mainnet-pruned/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.babylon-mainnet-babylond-pruned-ws.rule=(Path(`/babylon-mainnet-pruned`) || Path(`/babylon-mainnet-pruned/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.babylon-mainnet-babylond-pruned-ws.middlewares=babylon-mainnet-babylond-pruned-stripprefix, babylon-mainnet-babylond-pruned-set-ws-path, ipallowlist
volumes:
babylon-mainnet-babylond-pruned:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: babylon
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -0,0 +1,11 @@
ARG CL_IMAGE
ARG CL_VERSION
FROM ${CL_IMAGE}:${CL_VERSION}
# Layer the shared CometBFT bootstrap lib + the chain init.sh onto the upstream
# babylond binary image (alpine-based, has sh+apk; runs nonroot by default — the compose
# sets user: root so init.sh can apk-add curl and write the /root home).
USER root
COPY ./scripts/cometbft-common.sh /usr/local/bin/cometbft-common.sh
COPY ./scripts/init.sh /usr/local/bin/init.sh
RUN chmod +x /usr/local/bin/init.sh /usr/local/bin/cometbft-common.sh
ENTRYPOINT ["init.sh"]

View File

@@ -0,0 +1,223 @@
#!/bin/sh
# cometbft-common.sh — reusable CometBFT-node bootstrap helpers (family C).
#
# Source this from a chain-specific init.sh. It encapsulates the operations every
# CometBFT-consensus node needs (init, fetch config artifacts, patch config.toml /
# app.toml, seed priv_validator_state), extracted verbatim from the proven berachain
# beacon-kit entrypoint so callers inherit known-good behavior.
#
# Each function takes explicit arguments (paths/values) — it is binary-agnostic. The
# caller owns the binary name, the `<binary> init` invocation, the artifact URLs, and
# the final `exec <binary> start ...`. EL-driven chains (beacon-kit, morph) also call
# the JWT / engine-dial helpers; pure-consensus chains (gaiad) skip them.
#
# Conventions: POSIX sh (alpine). Config dir is conventionally $HOME_DIR/config.
# Used by: morph-node, gaiad (cosmos batch), and any future family-C chain.
# beacon-kit (berachain) keeps its own bespoke init.sh on purpose — do not retrofit it.
set -e
ct_log() { echo "[cometbft-init] $*"; }
# Ensure curl exists (alpine base images often omit it). Idempotent.
ct_require_curl() {
if ! command -v curl >/dev/null 2>&1; then
ct_log "installing curl"
apk add --no-cache curl
fi
}
# ct_fetch URL DEST [required]
# Download URL -> DEST. If the 3rd arg is "required", a failure is fatal;
# otherwise a missing/failed fetch is logged and skipped (returns 0).
ct_fetch() {
_url="$1"; _dest="$2"; _req="${3:-optional}"
[ -n "$_url" ] || { [ "$_req" = required ] && { ct_log "FATAL: empty URL for $_dest"; exit 1; }; return 0; }
if curl -fsSL "$_url" -o "$_dest"; then
ct_log "fetched $_url -> $_dest"
else
if [ "$_req" = required ]; then
ct_log "FATAL: failed to fetch required $_url"; exit 1
fi
ct_log "skip: could not fetch optional $_url"
fi
}
# ct_patch_p2p CONFIG_TOML IP P2P_PORT
# Bind p2p to 0.0.0.0:PORT and advertise IP:PORT (only within the [p2p] section).
ct_patch_p2p() {
_cfg="$1"; _ip="$2"; _port="$3"
[ -f "$_cfg" ] || { ct_log "patch_p2p: $_cfg missing, skipping"; return 0; }
_laddr="tcp:\\/\\/0\\.0\\.0\\.0\\:${_port}"
sed -i "/^\[p2p\]/,/^\[/{s|^laddr = .*|laddr = \"$_laddr\"|}" "$_cfg"
sed -i "/^\[p2p\]/,/^\[/{s|^external_address = .*|external_address = \"${_ip}:${_port}\"|}" "$_cfg"
}
# ct_merge_seeds CONFIG_TOML CONFIGURED_SEEDS [SEEDS_URL]
# Merge operator-configured seeds with an optional official seed list (1 entry per
# line, first line skipped like the berachain cl-seeds.txt header), dedupe, write.
ct_merge_seeds() {
_cfg="$1"; _seeds="$2"; _url="$3"
[ -f "$_cfg" ] || return 0
if [ -n "$_url" ]; then
_official=$(curl -f -s "$_url" | tail -n +2 | tr '\n' ',' | sed 's/,$//' || true)
if [ -n "$_official" ]; then
ct_log "merging official seeds from $_url"
_seeds=$(echo "${_seeds},${_official}" | tr ',' '\n' | sed '/^$/d' | sort -u | paste -sd,)
else
ct_log "no official seeds fetched from $_url (continuing with configured)"
fi
fi
if [ -n "$_seeds" ]; then
sed -i "s/^seeds = \".*\"/seeds = \"${_seeds}\"/" "$_cfg"
fi
}
# ct_set_persistent_peers CONFIG_TOML PEERS
# Handles both cometbft-classic `persistent_peers` (underscore) and forks that use
# `persistent-peers` (hyphen, e.g. sei) — patches whichever key is present.
ct_set_persistent_peers() {
_cfg="$1"; _peers="$2"
[ -f "$_cfg" ] || return 0
[ -n "$_peers" ] || return 0
sed -i "s/^persistent_peers = \".*\"/persistent_peers = \"${_peers}\"/" "$_cfg"
sed -i "s/^persistent-peers = \".*\"/persistent-peers = \"${_peers}\"/" "$_cfg"
return 0
}
# ct_set_moniker CONFIG_TOML MONIKER
ct_set_moniker() {
_cfg="$1"; _mon="$2"
[ -f "$_cfg" ] || return 0
[ -n "$_mon" ] && sed -i "s/^moniker = \".*\"/moniker = \"$_mon\"/" "$_cfg"
return 0
}
# ct_set_addrbook CONFIG_DIR ADDRBOOK_URL
# Optional: cosmos chains often seed an addrbook.json for faster peer discovery.
ct_set_addrbook() {
_dir="$1"; _url="$2"
[ -n "$_url" ] || return 0
ct_fetch "$_url" "$_dir/addrbook.json" optional
}
# ct_write_jwt CONFIG_DIR [JWT_SRC]
# EL-driven chains: copy the shared engine JWT (default /jwtsecret) into the config
# dir as jwt.hex so the CL can authenticate to the EL engine API.
ct_write_jwt() {
_dir="$1"; _src="${2:-/jwtsecret}"
[ -f "$_src" ] || { ct_log "write_jwt: $_src missing, skipping"; return 0; }
cat "$_src" > "$_dir/jwt.hex"
}
# ct_set_rpc_dial_url APP_TOML AUTH_RPC
# beacon-kit / app.toml-style EL engine endpoint (e.g. http://<el>:8551).
ct_set_rpc_dial_url() {
_app="$1"; _rpc="$2"
[ -f "$_app" ] || return 0
[ -n "$_rpc" ] && sed -i "s|^rpc-dial-url = \".*\"|rpc-dial-url = \"$_rpc\"|" "$_app"
return 0
}
# ct_seed_priv_validator_state HOME_DIR
# Ensure data/priv_validator_state.json exists (cometbft refuses to start without it
# when one is present in config/). Mirrors the berachain init.sh behavior.
ct_seed_priv_validator_state() {
_home="$1"
if [ -e "$_home/config/priv_validator_state.json" ] && [ ! -e "$_home/data/priv_validator_state.json" ]; then
mkdir -p "$_home/data"
cp "$_home/config/priv_validator_state.json" "$_home/data/priv_validator_state.json"
fi
return 0
}
# ct_apk PKG...
# Install alpine packages idempotently (most cosmos init scripts need curl, some jq).
ct_apk() {
apk add --no-cache "$@"
}
# ct_localize_home CONFIG_DIR
# Rewrite `~/` to `/root/` in config.toml + app.toml. Cosmos `init` writes home-relative
# paths; the container runs as root with a static home, so make paths absolute.
ct_localize_home() {
_dir="$1"
[ -f "$_dir/config.toml" ] && sed -i 's|~/|/root/|g' "$_dir/config.toml"
[ -f "$_dir/app.toml" ] && sed -i 's|~/|/root/|g' "$_dir/app.toml"
return 0
}
# ct_set_min_gas_prices APP_TOML PRICE
# Cosmos chains reject txs (and sometimes refuse to start) with an empty
# minimum-gas-prices. PRICE e.g. "0.01usei", "0.0025uatom", "0.01hqq".
ct_set_min_gas_prices() {
_app="$1"; _price="$2"
[ -f "$_app" ] || return 0
[ -n "$_price" ] || return 0
sed -i "s/minimum-gas-prices = \"\"/minimum-gas-prices = \"${_price}\"/g" "$_app"
return 0
}
# ct_configure_statesync CONFIG_TOML RPC_SERVERS [TRUST_OFFSET]
# Enable cometbft state-sync so a fresh node bootstraps near chainhead instead of
# replaying from genesis — the single biggest lever for "can't keep it at chainhead"
# chains. RPC_SERVERS = comma list of trusted RPC endpoints (>=2 recommended; a single
# endpoint is duplicated). TRUST_OFFSET = blocks below head to trust (default 2000).
# Requires jq + curl. No-op (logged) if head height can't be fetched.
ct_configure_statesync() {
_cfg="$1"; _rpc="$2"; _offset="${3:-2000}"
[ -f "$_cfg" ] || return 0
# NEVER re-arm statesync on a node that already has application state (a restored
# snapshot or a prior sync). Re-statesyncing over it leaves a broken/partial datadir and,
# for wasm chains, drops the wasm files -> startup panic. _cfg is $HOME/config/config.toml,
# so application state lives at $HOME/data/application.db.
_home=$(dirname "$(dirname "$_cfg")")
if [ -e "$_home/data/application.db" ]; then
ct_log "statesync: existing data dir, skipping"
return 0
fi
[ -n "$_rpc" ] || { ct_log "statesync: no RPC servers given, skipping"; return 0; }
_primary=$(echo "$_rpc" | cut -d, -f1)
_latest=$(curl -s "$_primary/block" | jq -r '.result.block.header.height // .block.header.height' 2>/dev/null || true)
if [ -z "$_latest" ] || [ "$_latest" = null ]; then
ct_log "statesync: could not read head height from $_primary, skipping"; return 0
fi
_trust_h=$((_latest - _offset))
_trust_hash=$(curl -s "$_primary/block?height=$_trust_h" | jq -r '.result.block_id.hash // .block_id.hash' 2>/dev/null || true)
[ -n "$_trust_hash" ] && [ "$_trust_hash" != null ] || { ct_log "statesync: no trust hash, skipping"; return 0; }
# second server defaults to the first (cometbft wants >=2 for light-client cross-check)
echo "$_rpc" | grep -q ',' || _rpc="$_rpc,$_rpc"
ct_log "statesync: enable trust_height=$_trust_h trust_hash=$_trust_hash"
# Patch ONLY the [statesync] section. CometBFT config.toml uses underscore keys
# (rpc_servers/trust_height/trust_hash); tolerate hyphen variants with [_-].
sed -i.bak -E "/^\[statesync\]/,/^\[/{
s|^([[:space:]]*enable[[:space:]]*=[[:space:]]*).*|\1true|
s|^([[:space:]]*rpc[_-]servers[[:space:]]*=[[:space:]]*).*|\1\"$_rpc\"|
s|^([[:space:]]*trust[_-]height[[:space:]]*=[[:space:]]*).*|\1$_trust_h|
s|^([[:space:]]*trust[_-]hash[[:space:]]*=[[:space:]]*).*|\1\"$_trust_hash\"|
}" "$_cfg"
return 0
}
# ct_ensure_wasm HOME_DIR WASM_SNAPSHOT_URL
# CosmWasm + IBC 08-wasm bytecode are FILES on disk that state-sync does NOT restore, so
# a state-synced wasm chain panics at startup ("wasmlckeeper failed initialize pinned codes
# / Error opening Wasm file"). Seed them from a wasm-only snapshot (e.g. polkachu
# cosmos_wasmonly.tar.lz4) when the wasm dir is missing/empty. No-op if URL unset or wasm
# already present. Best-effort (logs on failure); the fully robust path for wasm chains is a
# FULL snapshot restore. Requires lz4 + tar (installed here).
ct_ensure_wasm() {
_home="$1"; _url="$2"
[ -n "$_url" ] || return 0
if [ -d "$_home/wasm" ] && [ -n "$(ls -A "$_home/wasm" 2>/dev/null)" ]; then
return 0 # wasm already present
fi
ct_log "wasm: empty, fetching snapshot $_url"
ct_apk lz4 tar
if curl -sL "$_url" | lz4 -dc | tar -xf - -C "$_home"; then
ct_log "wasm: extracted into $_home"
else
ct_log "WARN wasm: fetch/extract failed ($_url)"
fi
return 0
}

55
babylon/scripts/init.sh Normal file
View File

@@ -0,0 +1,55 @@
#!/bin/sh
# babylon-genesis (babylond) entrypoint — family C, pure CometBFT (no EL). Thin: sources the
# shared cometbft-common.sh and orchestrates init + statesync bootstrap + start.
# Genesis replay is impractical; statesync near head with the current binary.
# Serves CometBFT RPC :26657 (the dshackle upstream).
set -e
. /usr/local/bin/cometbft-common.sh
HOME_DIR="/root/.babylond"
CONFIG_DIR="$HOME_DIR/config"
CHAIN_ID="${CHAIN_ID:-bbn-1}"
GENESIS_URL="${GENESIS_URL:-https://raw.githubusercontent.com/babylonlabs-io/networks/main/bbn-1/network-artifacts/genesis.json}"
STATESYNC_RPC="${STATESYNC_RPC:-https://babylon-rpc.polkachu.com:443}"
MIN_GAS="${MIN_GAS:-0.002ubbn}"
MONIKER="${MONIKER:-rpc-node}"
ct_apk curl jq
if babylond init "$MONIKER" --chain-id "$CHAIN_ID" --home "$HOME_DIR" >/dev/null 2>&1; then
ct_log "fresh init; fetching genesis"
ct_fetch "$GENESIS_URL" "$CONFIG_DIR/genesis.json" required
ct_localize_home "$CONFIG_DIR"
ct_set_min_gas_prices "$CONFIG_DIR/app.toml" "$MIN_GAS"
else
ct_log "already initialized, continuing"
fi
# v4.x start prompts for a BLS password if no key exists; RPC replicas never sign
# checkpoints, so pre-create an empty-password key before the first start.
if [ ! -f "$CONFIG_DIR/bls_key.json" ]; then
ct_log "pre-creating BLS key (no password — RPC replica)"
babylond create-bls-key --home "$HOME_DIR" --no-bls-password
fi
# Serve RPC on all interfaces (dshackle/traefik upstream); default is 127.0.0.1.
sed -i '/^\[rpc\]/,/^\[/{s|^laddr = .*|laddr = "tcp://0.0.0.0:26657"|}' "$CONFIG_DIR/config.toml"
# Babylon Genesis block time (9200ms) — required for consensus.
sed -i 's|^timeout_commit = .*|timeout_commit = "9200ms"|' "$CONFIG_DIR/config.toml"
# BTC checkpointing network params only — no bitcoind needed for an RPC replica.
sed -i '/^\[btc-config\]/,/^\[/{s|^network = .*|network = "mainnet"|}' "$CONFIG_DIR/app.toml"
# Recommended for pruned RPC nodes (reduces memory pressure).
sed -i 's|^iavl-cache-size = .*|iavl-cache-size = 0|' "$CONFIG_DIR/app.toml"
ct_patch_p2p "$CONFIG_DIR/config.toml" "$IP" "${P2P_PORT:-26656}"
ct_merge_seeds "$CONFIG_DIR/config.toml" "$SEEDS"
ct_set_persistent_peers "$CONFIG_DIR/config.toml" "$PERSISTENT_PEERS"
ct_set_moniker "$CONFIG_DIR/config.toml" "$MONIKER"
ct_configure_statesync "$CONFIG_DIR/config.toml" "$STATESYNC_RPC"
ct_ensure_wasm "$HOME_DIR" "$WASM_SNAPSHOT_URL"
ct_seed_priv_validator_state "$HOME_DIR"
exec babylond start --home "$HOME_DIR" --minimum-gas-prices "$MIN_GAS" --no-bls-password "$@"

View File

@@ -1,10 +1,73 @@
#!/bin/bash
#
# Backup persistent compose volumes to /backup or WebDAV.
#
# Usage:
# ./backup-node.sh [--hot] [--force] <compose-name> [webdav-url]
#
# Lifecycle (default, omitted with --hot):
# stop services -> fence compose out of COMPOSE_FILE -> tar+zstd -> unfence+start (EXIT trap).
# Hot backups skip stop/fence; leveldb/pebble live tars are NOT restore-trustworthy.
#
# --force Allow backing up an existing but very small datadir (<1GB reported size).
# Does NOT bypass a missing volume path (always fatal).
BASEPATH="$(dirname "$0")"
source "$BASEPATH/volume-utils.sh"
backup_dir="/backup"
remote_target="$2"
HOT_BACKUP=false
FORCE_SMALL=false
_pos=()
for _a in "$@"; do
case "$_a" in
--hot) HOT_BACKUP=true ;;
--force) FORCE_SMALL=true ;;
*) _pos+=("$_a") ;;
esac
done
set -- "${_pos[@]}"
if [ -z "${1:-}" ] || [ ! -f "/root/rpc/$1.yml" ]; then
echo "Error: Either no argument provided or /root/rpc/$1.yml does not exist."
exit 1
fi
compose_name="$1"
remote_target="${2:-}"
lifecycle_active=false
fenced=false
stopped=false
backup_lifecycle_cleanup() {
local rc=$?
if [[ "$lifecycle_active" != true ]]; then
exit "$rc"
fi
if [[ "$fenced" == true ]]; then
unfence_compose_in_env "$compose_name" || true
fenced=false
fi
if [[ "$stopped" == true ]]; then
"$BASEPATH/start.sh" "$compose_name" || true
stopped=false
fi
exit "$rc"
}
if [[ "$HOT_BACKUP" == true ]]; then
echo "WARNING: --hot backup skips stop/fence; live leveldb/pebble archives may not restore cleanly"
else
trap backup_lifecycle_cleanup EXIT
lifecycle_active=true
echo "Stopping services for $compose_name before backup..."
"$BASEPATH/stop.sh" "$compose_name"
stopped=true
if fence_compose_in_env "$compose_name"; then
fenced=true
fi
fi
if [[ -n "$remote_target" ]] && is_local_backup_url "$remote_target"; then
echo "Target URL points to this server, using local /backup instead of $remote_target"
remote_target=""
@@ -62,13 +125,19 @@ generate_volume_metadata() {
}
# Read the JSON input and extract the list of keys
keys=$(get_persistent_volume_keys "/root/rpc/$1.yml")
keys=$(get_persistent_volume_keys "/root/rpc/$compose_name.yml")
# Iterate over the list of keys
for key in $keys; do
echo "Executing command with key: /var/lib/docker/volumes/rpc_$key/_data"
source_folder="/var/lib/docker/volumes/rpc_$key/_data"
if [[ ! -d "$source_folder" ]]; then
echo "FATAL: volume data directory missing, refusing backup: $source_folder" >&2
exit 1
fi
folder_size=$(du -shL "$source_folder" | awk '{
size = $1
sub(/[Kk]$/, "", size) # Remove 'K' suffix if present
@@ -87,6 +156,11 @@ for key in $keys; do
folder_size_gb=$(printf "%.0f" "$folder_size")
if (( folder_size_gb < 1 )) && [[ "$FORCE_SMALL" != true ]]; then
echo "FATAL: existing datadir too small for backup (${folder_size_gb}G at $source_folder); use --force if intentional" >&2
exit 1
fi
timestamp=$(date +'%Y-%m-%d-%H-%M-%S')
target_file="rpc_$key-${timestamp}-${folder_size_gb}G.tar.zst"
metadata_file_name="rpc_$key-${timestamp}-${folder_size_gb}G.txt"
@@ -119,5 +193,5 @@ done
echo ""
echo "=== Overall Size Summary ==="
if [[ -f "$BASEPATH/show-size.sh" ]]; then
"$BASEPATH/show-size.sh" "$1" 2>&1
"$BASEPATH/show-size.sh" "$compose_name" 2>&1
fi

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -112,7 +112,7 @@ services:
context: ./berachain
dockerfile: beacon-kit.Dockerfile
args:
BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.1}
BEACONKIT_IMAGE: ${BERACHAIN_BEPOLIA_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports:
- 19888:19888

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -112,7 +112,7 @@ services:
context: ./berachain
dockerfile: beacon-kit.Dockerfile
args:
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.1}
BEACONKIT_IMAGE: ${BERACHAIN_MAINNET_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports:
- 16562:16562

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# you should backup the peers of your beacond node frequently.
# docker exec -it rpc-berachain-bartio-reth-node-1 curl http://localhost:26657/net_info | jq -r '
# .result.peers[]

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# you should backup the peers of your beacond node frequently.
# docker exec -it rpc-berachain-bartio-reth-pruned-node-1 curl http://localhost:26657/net_info | jq -r '
# .result.peers[]

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# you should backup the peers of your beacond node frequently.
# docker exec -it rpc-berachain-bepolia-reth-node-1 curl http://localhost:26657/net_info | jq -r '
# .result.peers[]
@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services:
berachain-bepolia-reth:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.0}
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.3-rc.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -152,7 +152,7 @@ services:
context: ./berachain
dockerfile: beacon-kit.Dockerfile
args:
BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.1}
BEACONKIT_IMAGE: ${BERACHAIN_BEPOLIA_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports:
- 16347:16347

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# you should backup the peers of your beacond node frequently.
# docker exec -it rpc-berachain-bepolia-reth-pruned-node-1 curl http://localhost:26657/net_info | jq -r '
# .result.peers[]
@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services:
berachain-bepolia-reth-pruned:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.0}
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.3-rc.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -153,7 +153,7 @@ services:
context: ./berachain
dockerfile: beacon-kit.Dockerfile
args:
BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.1}
BEACONKIT_IMAGE: ${BERACHAIN_BEPOLIA_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports:
- 17274:17274

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# you should backup the peers of your beacond node frequently.
# docker exec -it rpc-berachain-mainnet-reth-node-1 curl http://localhost:26657/net_info | jq -r '
# .result.peers[]
@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services:
berachain-mainnet-reth:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.0}
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -89,10 +89,10 @@ services:
- CHAINID=80094
- CHAINNAME=mainnet
- CHAIN_SPEC=mainnet
entrypoint: [/bin/bash, -c, "trap 'exit 0' SIGTERM; while [ ! -f /config/eth-genesis.json ] && [ ! -f /tmp/stop ]; do sleep 1 & wait $!; done; exec bera-reth node \"$@\"", --]
entrypoint: [bera-reth, node]
command:
- --bootnodes=enode://0c5a4a3c0e81fce2974e4d317d88df783731183d534325e32e0fdf8f4b119d7889fa254d3a38890606ec300d744e2aa9c87099a4a032f5c94efe53f3fcdfecfe@34.64.176.79:30303,enode://b6a3137d3a36ef37c4d31843775a9dc293f41bcbde33b6309c80b1771b6634827cd188285136a57474427bd8845adc2f6fe2e0b106bd58d14795b08910b9c326@34.64.181.70:30303,enode://0b6633300614bc2b9749aee0cace7a091ec5348762aee7b1d195f7616d03a9409019d9bef336624bab72e0d069cd4cf0b0de6fbbf53f04f6b6e4c5b39c6bdca6@34.64.39.31:30303,enode://552b001abebb5805fcd734ad367cd05d9078d18f23ec598d7165460fadcfc51116ad95c418f7ea9a141aa8cbc496c8bea3322b67a5de0d3380f11aab1a797513@34.64.183.158:30303,enode://5b037f66099d5ded86eb7e1619f6d06ceb15609e8cc345ced22a4772b06178004e1490a3cd32fd1222789de4c6e4021c2d648a3d750f6d5323e64b771bbd8de7@34.87.142.180:30303,enode://846db253c53753d3ea1197aec296306dc84c25f3afdf142b65cb0fe0f984de55072daa3bbf05a9aea046a38a2292403137b6eafefd5646fcf62120b74e3b898d@34.142.170.110:30303,enode://64b7f6ee9bcd942ad4949c70f2077627f078a057dfd930e6e904e12643d8952f5ae87c91e24559765393f244a72c9d5c011d7d5176e59191d38f315db85a20f5@34.126.161.16:30303,enode://cf4d19bfb8ec507427ec882bac0bac85a0c8c9ddaa0ec91b773bb614e5e09d107cd9fbe323b96f62f31c493f8f42cc5495c18b87c08560c5dea1dfd25256dcf6@35.247.162.2:30303,enode://bb7e44178543431feac8f0ee3827056b7b84d8235b802a8bdbbcd4939dab7f7dd2579ff577a38b002bb0139792af67abd2dd5c9f4f85b8da6e914fa76dca82bc@35.198.150.35:30303,enode://8fef1f5df45e7b31be00a21e1da5665d5a5f5bf4c379086b843f03eade941bdd157f08c95b31880c492577edb9a9b185df7191eaebf54ab06d5bd683b289f3af@34.107.7.241:30303,enode://ce9c87cfe089f6811d26c96913fa3ec10b938d9017fc6246684c74a33679ee34ceca9447180fb509e37bf2b706c2877a82085d34bfd83b5b520ee1288b0fc32f@35.198.109.49:30303,enode://713657eb6a53feadcbc47e634ad557326a51eb6818a3e19a00a8111492f50a666ccbf2f5d334d247ecf941e68d242ef5c3b812b63c44d381ef11f79c2cdb45c7@34.141.15.100:30303,enode://d071fa740e063ce1bb9cdc2b7937baeff6dc4000f91588d730a731c38a6ff0d4015814812c160fab8695e46f74b9b618735368ea2f16db4d785f16d29b3fb7b0@35.203.2.210:30303,enode://ffc452fe451a2e5f89fe634744aea334d92dcd30d881b76209d2db7dbf4b7ee047e7c69a5bb1633764d987a7441d9c4bc57ccdbfd6442a2f860bf953bc89a9b9@34.152.50.224:30303,enode://da94328302a1d1422209d1916744e90b6095a48b2340dcec39b22002c098bb4d58a880dab98eb26edf03fa4705d1b62f99a8c5c14e6666e4726b6d3066d8a4d7@34.95.61.106:30303,enode://19c7671a4844699b481e81a5bcfe7bafc7fefa953c16ebbe1951b1046371e73839e9058de6b7d3c934318fe7e7233dde3621c1c1018eb8b294ea3d4516147150@35.203.82.137:30303
- --chain=/config/eth-genesis.json
- --chain=mainnet
- --datadir=/root/.local/share/reth
- --discovery.port=12881
- --engine.always-process-payload-attributes-on-canonical-head
@@ -131,7 +131,6 @@ services:
- ${BERACHAIN_MAINNET_RETH_ARCHIVE_TRACE_DATA:-berachain-mainnet-reth-archive-trace}:/root/.local/share/reth
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
- berachain-mainnet-reth-archive-trace_config:/config
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
@@ -152,7 +151,7 @@ services:
context: ./berachain
dockerfile: beacon-kit.Dockerfile
args:
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.1}
BEACONKIT_IMAGE: ${BERACHAIN_MAINNET_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports:
- 17881:17881

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# you should backup the peers of your beacond node frequently.
# docker exec -it rpc-berachain-mainnet-reth-pruned-node-1 curl http://localhost:26657/net_info | jq -r '
# .result.peers[]
@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services:
berachain-mainnet-reth-pruned:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.0}
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -153,7 +153,7 @@ services:
context: ./berachain
dockerfile: beacon-kit.Dockerfile
args:
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.1}
BEACONKIT_IMAGE: ${BERACHAIN_MAINNET_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports:
- 15900:15900

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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.6}
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_MAINNET_BITCOIND_VERSION:-0.33.8}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -60,6 +60,7 @@ services:
- -externalip=${IP}
- -port=10863
- -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
bitcoin-cash-testnet:
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_TESTNET_BITCOIND_VERSION:-0.33.6}
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_TESTNET_BITCOIND_VERSION:-0.33.8}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -60,6 +60,7 @@ services:
- -externalip=${IP}
- -port=14363
- -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
bitcoin-mainnet:
image: ${BITCOIN_BITCOIND_IMAGE:-lncm/bitcoind}:${BITCOIN_MAINNET_BITCOIND_VERSION:-v28.0}
image: ${BITCOIN_BITCOIND_IMAGE:-bitcoin/bitcoin}:${BITCOIN_MAINNET_BITCOIND_VERSION:-31.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -57,14 +57,21 @@ services:
entrypoint: [bitcoind]
command:
- -datadir=/data
- -dbcache=4096
- -disablewallet=1
- -externalip=${IP}
- -maxconnections=64
- -port=12518
- -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0
- -rpcport=8545
- -rpcthreads=16
- -rpcworkqueue=512
- -server
- -txindex=1
- -zmqpubhashblock=tcp://0.0.0.0:28332
- -zmqpubhashtx=tcp://0.0.0.0:28333
- -zmqpubrawblock=tcp://0.0.0.0:28334
@@ -117,40 +124,8 @@ services:
- ${NO_SSL:+traefik.http.routers.bitcoin-mainnet-bitcoind-full-rawtx.rule=PathPrefix(`/bitcoin-mainnet/rawtx`)}
- traefik.http.routers.bitcoin-mainnet-bitcoind-full-rawtx.middlewares=bitcoin-mainnet-bitcoind-full-stripprefix, ipallowlist
bitcoin-mainnet-indexer:
image: blockstream/esplora
expose:
- 3000 # HTTP
- 50001 # RPC (electrum)
environment:
- ELECTRS_DAEMON_P2P_ADDR=bitcoin-mainnet:12518
- ELECTRS_DAEMON_RPC_ADDR=bitcoin-mainnet:8545
- ELECTRS_DB_DIR=/data/electrs
- ELECTRS_ELECTRUM_RPC_ADDR=0.0.0.0:50001
- ELECTRS_HTTP_ADDR=0.0.0.0:3000
- ELECTRS_JSONRPC_IMPORT=true
- ELECTRS_NETWORK=bitcoin
- ELECTRS_RPC_PASS=password
- ELECTRS_RPC_USER=username
networks:
- chains
volumes:
- ${BITCOIN_MAINNET_BITCOIND_FULL__ESPLORA_DATA:-bitcoin-mainnet-bitcoind-full_esplora}:/data
logging: *logging-defaults
labels:
- traefik.enable=true
- traefik.http.routers.bitcoin-mainnet-bitcoind-full-esplora.service=bitcoin-mainnet-bitcoind-full-esplora
- traefik.http.middlewares.bitcoin-mainnet-bitcoind-full-esplora-stripprefix.stripprefix.prefixes=/bitcoin-mainnet
- traefik.http.services.bitcoin-mainnet-bitcoind-full-esplora.loadbalancer.server.port=3000
- ${NO_SSL:-traefik.http.routers.bitcoin-mainnet-bitcoind-full-esplora.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bitcoin-mainnet-bitcoind-full-esplora.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bitcoin-mainnet-bitcoind-full-esplora.rule=Host(`$DOMAIN`) && (PathPrefix(`bitcoin-mainnet/address`) || PathPrefix(`bitcoin-mainnet/tx`) || PathPrefix(`bitcoin-mainnet/block`) || PathPrefix(`bitcoin-mainnet/blocks`) || PathPrefix(`bitcoin-mainnet/mempool`) || PathPrefix(`bitcoin-mainnet/fee-estimates`) || PathPrefix(`bitcoin-mainnet/scripthash`) || PathPrefix(`bitcoin-mainnet/asset`))}
- ${NO_SSL:+traefik.http.routers.bitcoin-mainnet-bitcoind-full-esplora.rule=PathPrefix(`bitcoin-mainnet/address`) || PathPrefix(`bitcoin-mainnet/tx`) || PathPrefix(`bitcoin-mainnet/block`) || PathPrefix(`bitcoin-mainnet/blocks`) || PathPrefix(`bitcoin-mainnet/mempool`) || PathPrefix(`bitcoin-mainnet/fee-estimates`) || PathPrefix(`bitcoin-mainnet/scripthash`) || PathPrefix(`bitcoin-mainnet/asset`))}
- traefik.http.routers.bitcoin-mainnet-bitcoind-full-esplora.middlewares=bitcoin-mainnet-bitcoind-full-esplora-stripprefix, ipallowlist
volumes:
bitcoin-mainnet-bitcoind-full:
bitcoin-mainnet-bitcoind-full_esplora:
x-upstreams:
- id: $${ID}

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
bitcoin-testnet:
image: ${BITCOIN_BITCOIND_IMAGE:-lncm/bitcoind}:${BITCOIN_TESTNET_BITCOIND_VERSION:-v28.0}
image: ${BITCOIN_BITCOIND_IMAGE:-bitcoin/bitcoin}:${BITCOIN_TESTNET_BITCOIND_VERSION:-31.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -57,15 +57,22 @@ services:
entrypoint: [bitcoind]
command:
- -datadir=/data
- -dbcache=4096
- -disablewallet=1
- -externalip=${IP}
- -maxconnections=64
- -port=13668
- -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0
- -rpcport=8545
- -rpcthreads=16
- -rpcworkqueue=512
- -server
- -testnet
- -txindex=1
- -zmqpubhashblock=tcp://0.0.0.0:28332
- -zmqpubhashtx=tcp://0.0.0.0:28333
- -zmqpubrawblock=tcp://0.0.0.0:28334
@@ -118,40 +125,8 @@ services:
- ${NO_SSL:+traefik.http.routers.bitcoin-testnet-bitcoind-full-rawtx.rule=PathPrefix(`/bitcoin-testnet/rawtx`)}
- traefik.http.routers.bitcoin-testnet-bitcoind-full-rawtx.middlewares=bitcoin-testnet-bitcoind-full-stripprefix, ipallowlist
bitcoin-testnet-indexer:
image: blockstream/esplora
expose:
- 3000 # HTTP
- 50001 # RPC (electrum)
environment:
- ELECTRS_DAEMON_P2P_ADDR=bitcoin-testnet:13668
- ELECTRS_DAEMON_RPC_ADDR=bitcoin-testnet:8545
- ELECTRS_DB_DIR=/data/electrs
- ELECTRS_ELECTRUM_RPC_ADDR=0.0.0.0:50001
- ELECTRS_HTTP_ADDR=0.0.0.0:3000
- ELECTRS_JSONRPC_IMPORT=true
- ELECTRS_NETWORK=bitcoin-testnet
- ELECTRS_RPC_PASS=password
- ELECTRS_RPC_USER=username
networks:
- chains
volumes:
- ${BITCOIN_TESTNET_BITCOIND_FULL__ESPLORA_DATA:-bitcoin-testnet-bitcoind-full_esplora}:/data
logging: *logging-defaults
labels:
- traefik.enable=true
- traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.service=bitcoin-testnet-bitcoind-full-esplora
- traefik.http.middlewares.bitcoin-testnet-bitcoind-full-esplora-stripprefix.stripprefix.prefixes=/bitcoin-testnet
- traefik.http.services.bitcoin-testnet-bitcoind-full-esplora.loadbalancer.server.port=3000
- ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.rule=Host(`$DOMAIN`) && (PathPrefix(`bitcoin-testnet/address`) || PathPrefix(`bitcoin-testnet/tx`) || PathPrefix(`bitcoin-testnet/block`) || PathPrefix(`bitcoin-testnet/blocks`) || PathPrefix(`bitcoin-testnet/mempool`) || PathPrefix(`bitcoin-testnet/fee-estimates`) || PathPrefix(`bitcoin-testnet/scripthash`) || PathPrefix(`bitcoin-testnet/asset`))}
- ${NO_SSL:+traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.rule=PathPrefix(`bitcoin-testnet/address`) || PathPrefix(`bitcoin-testnet/tx`) || PathPrefix(`bitcoin-testnet/block`) || PathPrefix(`bitcoin-testnet/blocks`) || PathPrefix(`bitcoin-testnet/mempool`) || PathPrefix(`bitcoin-testnet/fee-estimates`) || PathPrefix(`bitcoin-testnet/scripthash`) || PathPrefix(`bitcoin-testnet/asset`))}
- traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.middlewares=bitcoin-testnet-bitcoind-full-esplora-stripprefix, ipallowlist
volumes:
bitcoin-testnet-bitcoind-full:
bitcoin-testnet-bitcoind-full_esplora:
x-upstreams:
- id: $${ID}

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