Compare commits

..
1 Commits
Author SHA1 Message Date
claude 9f6ca383ac linea-mainnet: disable eth_getProof on pruned geth upstream for rpc-us-40
DRPC gateway probes eth_getProof and marks the upstream 81% unavailable
when the pruned geth node returns 'header not found'. This is a false
positive - the node is healthy and advancing. Disable eth_getProof on the
linea pruned geth upstream to prevent DRPC from marking it unavailable.

Mirrors the existing pattern for BSC minimal in rpc-us-41.yaml.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-21 15:13:02 +00:00
440 changed files with 1631 additions and 16919 deletions
-729
View File
@@ -1,729 +0,0 @@
# 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.*
+233 -727
View File
File diff suppressed because it is too large Load Diff
-729
View File
@@ -1,729 +0,0 @@
# 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.*
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
alephzero-mainnet-archive: alephzero-mainnet-archive:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.11.0-a618155} image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud - --node.data-availability.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.feed.input.url=wss://feed.alephzero.raas.gelato.cloud - --node.feed.input.url=wss://feed.alephzero.raas.gelato.cloud
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
alephzero-mainnet: alephzero-mainnet:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.11.0-a618155} image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud - --node.data-availability.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.feed.input.url=wss://feed.alephzero.raas.gelato.cloud - --node.feed.input.url=wss://feed.alephzero.raas.gelato.cloud
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
alephzero-sepolia-archive: alephzero-sepolia-archive:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital - --node.data-availability.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.feed.input.url=wss://feed.alephzero-testnet.gelato.digital - --node.feed.input.url=wss://feed.alephzero-testnet.gelato.digital
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
alephzero-sepolia: alephzero-sepolia:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital - --node.data-availability.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.feed.input.url=wss://feed.alephzero-testnet.gelato.digital - --node.feed.input.url=wss://feed.alephzero-testnet.gelato.digital
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-nova-archive: arbitrum-nova-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-nova-archive: arbitrum-nova-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-nova-minimal: arbitrum-nova-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-nova-minimal: arbitrum-nova-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-nova: arbitrum-nova:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-nova: arbitrum-nova:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-one-archive: arbitrum-one-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-one-archive: arbitrum-one-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-one-archive: arbitrum-one-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-one-minimal: arbitrum-one-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-one-minimal: arbitrum-one-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-one: arbitrum-one:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-one: arbitrum-one:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-sepolia-archive: arbitrum-sepolia-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-sepolia-minimal: arbitrum-sepolia-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-sepolia-minimal: arbitrum-sepolia-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-sepolia: arbitrum-sepolia:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
arbitrum-sepolia: arbitrum-sepolia:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
connext-sepolia-archive: connext-sepolia-archive:
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital - --node.data-availability.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.feed.input.url=wss://feed.connext-sepolia.gelato.digital - --node.feed.input.url=wss://feed.connext-sepolia.gelato.digital
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
connext-sepolia: connext-sepolia:
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital - --node.data-availability.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.feed.input.url=wss://feed.connext-sepolia.gelato.digital - --node.feed.input.url=wss://feed.connext-sepolia.gelato.digital
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
everclear-mainnet-archive: everclear-mainnet-archive:
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.11.0-a618155} image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud - --node.data-availability.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.feed.input.url=wss://feed.everclear.raas.gelato.cloud - --node.feed.input.url=wss://feed.everclear.raas.gelato.cloud
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
everclear-mainnet: everclear-mainnet:
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.11.0-a618155} image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud - --node.data-availability.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.feed.input.url=wss://feed.everclear.raas.gelato.cloud - --node.feed.input.url=wss://feed.everclear.raas.gelato.cloud
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
opencampuscodex-sepolia-archive: opencampuscodex-sepolia-archive:
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital - --node.data-availability.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.feed.input.url=wss://feed.open-campus-codex.gelato.digital - --node.feed.input.url=wss://feed.open-campus-codex.gelato.digital
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
opencampuscodex-sepolia: opencampuscodex-sepolia:
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.11.0-a618155} image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital - --node.data-availability.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.feed.input.url=wss://feed.open-campus-codex.gelato.digital - --node.feed.input.url=wss://feed.open-campus-codex.gelato.digital
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
playblock-mainnet-archive: playblock-mainnet-archive:
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.11.0-a618155} image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.playblock.io - --node.data-availability.rest-aggregator.urls=https://das.playblock.io
- --node.feed.input.url=wss://feed.playblock.io - --node.feed.input.url=wss://feed.playblock.io
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
playblock-mainnet: playblock-mainnet:
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.11.0-a618155} image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.playblock.io - --node.data-availability.rest-aggregator.urls=https://das.playblock.io
- --node.feed.input.url=wss://feed.playblock.io - --node.feed.input.url=wss://feed.playblock.io
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
plume-mainnet-archive: plume-mainnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.1-8512b8c} image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz - --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz - --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
plume-mainnet-archive: plume-mainnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.1-8512b8c} image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz - --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz - --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
plume-mainnet: plume-mainnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.1-8512b8c} image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz - --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz - --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
plume-mainnet: plume-mainnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.1-8512b8c} image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz - --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz - --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
plume-testnet-archive: plume-testnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.0-a618155} image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz - --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz - --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
plume-testnet-archive: plume-testnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.0-a618155} image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz - --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz - --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
plume-testnet: plume-testnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.0-a618155} image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz - --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz - --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
plume-testnet: plume-testnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.0-a618155} image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz - --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz - --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
real-mainnet-archive: real-mainnet-archive:
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.11.0-a618155} image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.realforreal.gelato.digital - --node.data-availability.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.feed.input.url=wss://feed.realforreal.gelato.digital - --node.feed.input.url=wss://feed.realforreal.gelato.digital
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
real-mainnet-archive: real-mainnet-archive:
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.11.0-a618155} image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.realforreal.gelato.digital - --node.data-availability.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.feed.input.url=wss://feed.realforreal.gelato.digital - --node.feed.input.url=wss://feed.realforreal.gelato.digital
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
real-mainnet: real-mainnet:
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.11.0-a618155} image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle 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.addr=0.0.0.0
- --metrics-server.port=6070 - --metrics-server.port=6070
- --node.batch-poster.enable=false - --node.batch-poster.enable=false
- --node.da.anytrust.enable=true - --node.data-availability.enable=true
- --node.da.anytrust.rest-aggregator.enable=true - --node.data-availability.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.realforreal.gelato.digital - --node.data-availability.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.feed.input.url=wss://feed.realforreal.gelato.digital - --node.feed.input.url=wss://feed.realforreal.gelato.digital
- --node.sequencer=false - --node.sequencer=false
- --node.staker.enable=false - --node.staker.enable=false
@@ -1,144 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml: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.1-8512b8c}
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
...
@@ -1,144 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml: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.1-8512b8c}
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
...
-8
View File
@@ -1,8 +0,0 @@
{
"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
-5
View File
@@ -1,5 +0,0 @@
{
"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}}]"
}
}
-12
View File
@@ -1,12 +0,0 @@
# One-shot Arc snapshot downloader for compose init containers.
# Wraps arc-snapshots with a shell entrypoint so operators can optionally
# override EL/CL snapshot URLs via environment variables.
ARG ARC_EXECUTION_IMAGE=docker.cloudsmith.io/circle/arc-network/arc-execution:0.7.2
FROM ${ARC_EXECUTION_IMAGE} AS arc-bin
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates libssl3 zlib1g \
&& rm -rf /var/lib/apt/lists/*
COPY --from=arc-bin /usr/local/bin/arc-snapshots /usr/local/bin/arc-snapshots
COPY scripts/snapshot-init.sh /usr/local/bin/snapshot-init.sh
RUN chmod +x /usr/local/bin/snapshot-init.sh
ENTRYPOINT ["/usr/local/bin/snapshot-init.sh"]
@@ -20,7 +20,7 @@ x-logging-defaults: &logging-defaults
# ... # ...
# IP=$(curl ipinfo.io/ip) # IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me # DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:arc/reth/arc-testnet-reth-pruned-trace.yml # COMPOSE_FILE=base.yml:rpc.yml:arc/arc/arc-testnet-arc-full.yml
# #
# docker compose up -d # docker compose up -d
# #
@@ -29,6 +29,22 @@ x-logging-defaults: &logging-defaults
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' # --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services: 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: 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:-0.7.2}
user: 0:0 user: 0:0
@@ -36,10 +52,13 @@ services:
command: command:
- --home=/data/consensus - --home=/data/consensus
restart: no restart: no
depends_on:
arc-testnet-snapshots:
condition: service_completed_successfully
networks: networks:
- chains - chains
volumes: volumes:
- ${ARC_TESTNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-testnet-reth-pruned-trace-consensus}:/data/consensus - ${ARC_TESTNET_ARC_FULL_CONSENSUS_DATA:-arc-testnet-arc-full-consensus}:/data/consensus
logging: *logging-defaults logging: *logging-defaults
arc-testnet-sockets-init: arc-testnet-sockets-init:
@@ -53,11 +72,11 @@ services:
networks: networks:
- chains - chains
volumes: volumes:
- arc-testnet-reth-pruned-trace-sockets:/sockets - arc-testnet-arc-full-sockets:/sockets
logging: *logging-defaults logging: *logging-defaults
arc-testnet: arc-testnet:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-0.7.2} image: ${ARC_ARC_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_ARC_VERSION:-0.7.2}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -71,7 +90,6 @@ services:
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits: ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections) nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: 0:0 user: 0:0
expose: expose:
- 8545 - 8545
@@ -101,23 +119,22 @@ services:
networks: networks:
- chains - chains
volumes: volumes:
- ${ARC_TESTNET_RETH_PRUNED_TRACE_EXECUTION_DATA:-arc-testnet-reth-pruned-trace-execution}:/data/execution - ${ARC_TESTNET_ARC_FULL_EXECUTION_DATA:-arc-testnet-arc-full-execution}:/data/execution
- /slowdisk:/slowdisk - /slowdisk:/slowdisk
- arc-testnet-reth-pruned-trace-sockets:/sockets - arc-testnet-arc-full-sockets:/sockets
logging: *logging-defaults logging: *logging-defaults
labels: labels:
- prometheus-scrape.enabled=true - prometheus-scrape.enabled=true
- prometheus-scrape.port=9001 - prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.arc-testnet-reth-pruned-trace-stripprefix.stripprefix.prefixes=/arc-testnet - traefik.http.middlewares.arc-testnet-arc-full-stripprefix.stripprefix.prefixes=/arc-testnet
- traefik.http.services.arc-testnet-reth-pruned-trace.loadbalancer.server.port=8545 - traefik.http.services.arc-testnet-arc-full.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned-trace.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.arc-testnet-arc-full.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned-trace.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.arc-testnet-arc-full.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-arc-full.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/`)} - ${NO_SSL:+traefik.http.routers.arc-testnet-arc-full.rule=Path(`/arc-testnet`) || Path(`/arc-testnet/`)}
- traefik.http.routers.arc-testnet-reth-pruned-trace.middlewares=arc-testnet-reth-pruned-trace-stripprefix, ipallowlist - traefik.http.routers.arc-testnet-arc-full.middlewares=arc-testnet-arc-full-stripprefix, ipallowlist
shm_size: 2gb
arc-testnet-node: 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:-0.7.2}
@@ -146,21 +163,20 @@ services:
condition: service_completed_successfully condition: service_completed_successfully
arc-testnet: arc-testnet:
condition: service_started condition: service_started
restart: true
networks: networks:
- chains - chains
volumes: volumes:
- ${ARC_TESTNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-testnet-reth-pruned-trace-consensus}:/data/consensus - ${ARC_TESTNET_ARC_FULL_CONSENSUS_DATA:-arc-testnet-arc-full-consensus}:/data/consensus
- arc-testnet-reth-pruned-trace-sockets:/sockets - arc-testnet-arc-full-sockets:/sockets
logging: *logging-defaults logging: *logging-defaults
labels: labels:
- prometheus-scrape.enabled=true - prometheus-scrape.enabled=true
- prometheus-scrape.port=29000 - prometheus-scrape.port=29000
volumes: volumes:
arc-testnet-reth-pruned-trace-consensus: arc-testnet-arc-full-consensus:
arc-testnet-reth-pruned-trace-execution: arc-testnet-arc-full-execution:
arc-testnet-reth-pruned-trace-sockets: arc-testnet-arc-full-sockets:
x-upstreams: x-upstreams:
- id: $${ID} - id: $${ID}
-180
View File
@@ -1,180 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml: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=50
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://arc.drpc.org,wss=arc.drpc.org
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --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
...
-181
View File
@@ -1,181 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml: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=50
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://arc.drpc.org,wss=arc.drpc.org
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --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
...
-181
View File
@@ -1,181 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml: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:-0.7.2}
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:-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-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:-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=50
- --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
- --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
...
-23
View File
@@ -1,23 +0,0 @@
#!/bin/sh
set -eu
CHAIN="${ARC_SNAPSHOT_CHAIN:-arc-testnet}"
EXEC_PATH="${ARC_SNAPSHOT_EXECUTION_PATH:-/data/execution}"
CONS_PATH="${ARC_SNAPSHOT_CONSENSUS_PATH:-/data/consensus}"
if [ -n "${ARC_SNAPSHOT_EXECUTION_URL:-}" ] && [ -n "${ARC_SNAPSHOT_CONSENSUS_URL:-}" ]; then
exec /usr/local/bin/arc-snapshots download \
--chain="${CHAIN}" \
--execution-path="${EXEC_PATH}" \
--consensus-path="${CONS_PATH}" \
--execution-url="${ARC_SNAPSHOT_EXECUTION_URL}" \
--consensus-url="${ARC_SNAPSHOT_CONSENSUS_URL}"
elif [ -n "${ARC_SNAPSHOT_EXECUTION_URL:-}" ] || [ -n "${ARC_SNAPSHOT_CONSENSUS_URL:-}" ]; then
echo "Both ARC_SNAPSHOT_EXECUTION_URL and ARC_SNAPSHOT_CONSENSUS_URL must be set together" >&2
exit 1
else
exec /usr/local/bin/arc-snapshots download \
--chain="${CHAIN}" \
--execution-path="${EXEC_PATH}" \
--consensus-path="${CONS_PATH}"
fi
@@ -1,127 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml: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}
- ${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
...
-11
View File
@@ -1,11 +0,0 @@
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"]
-223
View File
@@ -1,223 +0,0 @@
#!/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
View File
@@ -1,55 +0,0 @@
#!/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 "$@"
+3 -77
View File
@@ -1,73 +1,10 @@
#!/bin/bash #!/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")" BASEPATH="$(dirname "$0")"
source "$BASEPATH/volume-utils.sh" source "$BASEPATH/volume-utils.sh"
backup_dir="/backup" backup_dir="/backup"
HOT_BACKUP=false remote_target="$2"
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 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" echo "Target URL points to this server, using local /backup instead of $remote_target"
remote_target="" remote_target=""
@@ -125,19 +62,13 @@ generate_volume_metadata() {
} }
# Read the JSON input and extract the list of keys # Read the JSON input and extract the list of keys
keys=$(get_persistent_volume_keys "/root/rpc/$compose_name.yml") keys=$(get_persistent_volume_keys "/root/rpc/$1.yml")
# Iterate over the list of keys # Iterate over the list of keys
for key in $keys; do for key in $keys; do
echo "Executing command with key: /var/lib/docker/volumes/rpc_$key/_data" echo "Executing command with key: /var/lib/docker/volumes/rpc_$key/_data"
source_folder="/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 '{ folder_size=$(du -shL "$source_folder" | awk '{
size = $1 size = $1
sub(/[Kk]$/, "", size) # Remove 'K' suffix if present sub(/[Kk]$/, "", size) # Remove 'K' suffix if present
@@ -156,11 +87,6 @@ for key in $keys; do
folder_size_gb=$(printf "%.0f" "$folder_size") 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') timestamp=$(date +'%Y-%m-%d-%H-%M-%S')
target_file="rpc_$key-${timestamp}-${folder_size_gb}G.tar.zst" target_file="rpc_$key-${timestamp}-${folder_size_gb}G.tar.zst"
metadata_file_name="rpc_$key-${timestamp}-${folder_size_gb}G.txt" metadata_file_name="rpc_$key-${timestamp}-${folder_size_gb}G.txt"
@@ -193,5 +119,5 @@ done
echo "" echo ""
echo "=== Overall Size Summary ===" echo "=== Overall Size Summary ==="
if [[ -f "$BASEPATH/show-size.sh" ]]; then if [[ -f "$BASEPATH/show-size.sh" ]]; then
"$BASEPATH/show-size.sh" "$compose_name" 2>&1 "$BASEPATH/show-size.sh" "$1" 2>&1
fi fi
@@ -112,7 +112,7 @@ services:
context: ./berachain context: ./berachain
dockerfile: beacon-kit.Dockerfile dockerfile: beacon-kit.Dockerfile
args: args:
BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.1} BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_IMAGE: ${BERACHAIN_BEPOLIA_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit} BEACONKIT_IMAGE: ${BERACHAIN_BEPOLIA_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports: ports:
- 19888:19888 - 19888:19888
@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services: services:
berachain-bepolia-reth: berachain-bepolia-reth:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.1} image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -152,7 +152,7 @@ services:
context: ./berachain context: ./berachain
dockerfile: beacon-kit.Dockerfile dockerfile: beacon-kit.Dockerfile
args: args:
BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.1} BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_IMAGE: ${BERACHAIN_BEPOLIA_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit} BEACONKIT_IMAGE: ${BERACHAIN_BEPOLIA_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports: ports:
- 16347:16347 - 16347:16347
@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services: services:
berachain-bepolia-reth-pruned: berachain-bepolia-reth-pruned:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.1} image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -153,7 +153,7 @@ services:
context: ./berachain context: ./berachain
dockerfile: beacon-kit.Dockerfile dockerfile: beacon-kit.Dockerfile
args: args:
BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.1} BEACONKIT_VERSION: ${BERACHAIN_BEPOLIA_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_IMAGE: ${BERACHAIN_BEPOLIA_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit} BEACONKIT_IMAGE: ${BERACHAIN_BEPOLIA_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports: ports:
- 17274:17274 - 17274:17274
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
bitcoin-cash-mainnet: bitcoin-cash-mainnet:
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_MAINNET_BITCOIND_VERSION:-0.33.7} image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_MAINNET_BITCOIND_VERSION:-0.33.6}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -60,7 +60,6 @@ services:
- -externalip=${IP} - -externalip=${IP}
- -port=10863 - -port=10863
- -printtoconsole - -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0 - -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7 - -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0 - -rpcbind=0.0.0.0
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
bitcoin-cash-testnet: bitcoin-cash-testnet:
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_TESTNET_BITCOIND_VERSION:-0.33.7} image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_TESTNET_BITCOIND_VERSION:-0.33.6}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -60,7 +60,6 @@ services:
- -externalip=${IP} - -externalip=${IP}
- -port=14363 - -port=14363
- -printtoconsole - -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0 - -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7 - -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0 - -rpcbind=0.0.0.0
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
bitcoin-mainnet: bitcoin-mainnet:
image: ${BITCOIN_BITCOIND_IMAGE:-bitcoin/bitcoin}:${BITCOIN_MAINNET_BITCOIND_VERSION:-31.0} image: ${BITCOIN_BITCOIND_IMAGE:-lncm/bitcoind}:${BITCOIN_MAINNET_BITCOIND_VERSION:-v28.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -57,21 +57,14 @@ services:
entrypoint: [bitcoind] entrypoint: [bitcoind]
command: command:
- -datadir=/data - -datadir=/data
- -dbcache=4096
- -disablewallet=1
- -externalip=${IP} - -externalip=${IP}
- -maxconnections=64
- -port=12518 - -port=12518
- -printtoconsole - -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0 - -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7 - -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0 - -rpcbind=0.0.0.0
- -rpcport=8545 - -rpcport=8545
- -rpcthreads=16
- -rpcworkqueue=512
- -server - -server
- -txindex=1
- -zmqpubhashblock=tcp://0.0.0.0:28332 - -zmqpubhashblock=tcp://0.0.0.0:28332
- -zmqpubhashtx=tcp://0.0.0.0:28333 - -zmqpubhashtx=tcp://0.0.0.0:28333
- -zmqpubrawblock=tcp://0.0.0.0:28334 - -zmqpubrawblock=tcp://0.0.0.0:28334
@@ -124,8 +117,40 @@ services:
- ${NO_SSL:+traefik.http.routers.bitcoin-mainnet-bitcoind-full-rawtx.rule=PathPrefix(`/bitcoin-mainnet/rawtx`)} - ${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 - 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: volumes:
bitcoin-mainnet-bitcoind-full: bitcoin-mainnet-bitcoind-full:
bitcoin-mainnet-bitcoind-full_esplora:
x-upstreams: x-upstreams:
- id: $${ID} - id: $${ID}
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
bitcoin-testnet: bitcoin-testnet:
image: ${BITCOIN_BITCOIND_IMAGE:-bitcoin/bitcoin}:${BITCOIN_TESTNET_BITCOIND_VERSION:-31.0} image: ${BITCOIN_BITCOIND_IMAGE:-lncm/bitcoind}:${BITCOIN_TESTNET_BITCOIND_VERSION:-v28.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -57,22 +57,15 @@ services:
entrypoint: [bitcoind] entrypoint: [bitcoind]
command: command:
- -datadir=/data - -datadir=/data
- -dbcache=4096
- -disablewallet=1
- -externalip=${IP} - -externalip=${IP}
- -maxconnections=64
- -port=13668 - -port=13668
- -printtoconsole - -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0 - -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7 - -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0 - -rpcbind=0.0.0.0
- -rpcport=8545 - -rpcport=8545
- -rpcthreads=16
- -rpcworkqueue=512
- -server - -server
- -testnet - -testnet
- -txindex=1
- -zmqpubhashblock=tcp://0.0.0.0:28332 - -zmqpubhashblock=tcp://0.0.0.0:28332
- -zmqpubhashtx=tcp://0.0.0.0:28333 - -zmqpubhashtx=tcp://0.0.0.0:28333
- -zmqpubrawblock=tcp://0.0.0.0:28334 - -zmqpubrawblock=tcp://0.0.0.0:28334
@@ -125,8 +118,40 @@ services:
- ${NO_SSL:+traefik.http.routers.bitcoin-testnet-bitcoind-full-rawtx.rule=PathPrefix(`/bitcoin-testnet/rawtx`)} - ${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 - 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: volumes:
bitcoin-testnet-bitcoind-full: bitcoin-testnet-bitcoind-full:
bitcoin-testnet-bitcoind-full_esplora:
x-upstreams: x-upstreams:
- id: $${ID} - id: $${ID}
@@ -49,7 +49,7 @@ services:
args: args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm} LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042} LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6.3} RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6-beta}
RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git} RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native} ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf} PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
+1 -1
View File
@@ -49,7 +49,7 @@ services:
args: args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm} LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042} LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6.3} RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6-beta}
RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git} RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native} ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf} PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
@@ -49,7 +49,7 @@ services:
args: args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm} LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042} LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6.3} RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6-beta}
RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git} RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native} ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf} PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
+1 -1
View File
@@ -49,7 +49,7 @@ services:
args: args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm} LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042} LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6.3} RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6-beta}
RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git} RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native} ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf} PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
@@ -49,7 +49,7 @@ services:
args: args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm} LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042} LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_MAINNET_RETH_VERSION:-v0.0.6.3} RETH_VERSION: ${BSC_MAINNET_RETH_VERSION:-v0.0.6-beta}
RETH_REPO: ${BSC_MAINNET_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git} RETH_REPO: ${BSC_MAINNET_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native} ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf} PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
+1 -1
View File
@@ -49,7 +49,7 @@ services:
args: args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm} LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042} LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_MAINNET_RETH_VERSION:-v0.0.6.3} RETH_VERSION: ${BSC_MAINNET_RETH_VERSION:-v0.0.6-beta}
RETH_REPO: ${BSC_MAINNET_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git} RETH_REPO: ${BSC_MAINNET_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native} ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf} PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
@@ -49,7 +49,7 @@ services:
args: args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm} LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042} LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_MAINNET_RETH_VERSION:-v0.0.6.3} RETH_VERSION: ${BSC_MAINNET_RETH_VERSION:-v0.0.6-beta}
RETH_REPO: ${BSC_MAINNET_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git} RETH_REPO: ${BSC_MAINNET_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native} ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf} PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
+1 -1
View File
@@ -49,7 +49,7 @@ services:
args: args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm} LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042} LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_MAINNET_RETH_VERSION:-v0.0.6.3} RETH_VERSION: ${BSC_MAINNET_RETH_VERSION:-v0.0.6-beta}
RETH_REPO: ${BSC_MAINNET_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git} RETH_REPO: ${BSC_MAINNET_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native} ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf} PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
-489
View File
@@ -32,495 +32,6 @@ s_to_human_readable() {
BASEPATH="$(dirname "$0")" BASEPATH="$(dirname "$0")"
source $BASEPATH/.env 2>/dev/null || true source $BASEPATH/.env 2>/dev/null || true
compose_base="$1"
seconds_to_measure=${2:-10}
if [ -z "$compose_base" ]; then
echo -e "${RED}Error: compose file path (sans .yml) required${NC}"
exit 1
fi
compose_yml="$BASEPATH/${compose_base}.yml"
if [ ! -f "$compose_yml" ]; then
echo -e "${RED}Error: compose file not found: $compose_yml${NC}"
exit 1
fi
if [ -n "$NO_SSL" ]; then
PROTO="http"
DOMAIN="${DOMAIN:-0.0.0.0}"
else
PROTO="https"
fi
# Resolve traefik RPC path from compose labels (first non-blacklisted path).
compose_rpc_path() {
local pathlist path
pathlist=$(grep -oP "stripprefix\.prefixes.*?/\K[^\"]+" "$compose_yml" 2>/dev/null)
for path in $pathlist; do
echo "$path"
return 0
done
return 1
}
compose_rpc_url() {
local path
path=$(compose_rpc_path) || return 1
echo "$PROTO://$DOMAIN/$path"
}
compose_chain_slug() {
grep -oP '^\s*chain:\s*\K\S+' "$compose_yml" 2>/dev/null | head -1
}
# Registry protocol via x-upstreams chain label; path-substring fallback for legacy composes.
resolve_protocol() {
local chain_slug protocol path
chain_slug=$(compose_chain_slug)
protocol=""
if [ -n "$chain_slug" ]; then
protocol=$($BASEPATH/reference-rpc-endpoint.sh --protocol "$chain_slug" 2>/dev/null) || protocol=""
fi
if [ -z "$protocol" ]; then
path=$(compose_rpc_path 2>/dev/null) || path=""
if echo "$path" | grep -qi "starknet"; then
protocol="starknet"
elif echo "$path" | grep -qi "aztec"; then
protocol="aztec"
elif echo "$path" | grep -qiE "bitcoin|digibyte|dogecoin|dash"; then
protocol="bitcoin"
elif echo "$path" | grep -qi "ripple"; then
protocol="ripple"
elif echo "$path" | grep -qiE "cosmos|babylon|haqq|gaiad|tac"; then
protocol="cosmos"
else
protocol="eth"
fi
fi
echo "$protocol"
}
# Bitcoin-family RPC URL (traefik path) and basic-auth from x-upstreams (fallback username:password).
bitcoin_rpc_url() {
compose_rpc_url
}
bitcoin_rpc_auth() {
# Prefer creds from compose x-upstreams basic-auth; per-chain rpcauth may differ on-host.
local user pass
user=$(grep -A5 'basic-auth:' "$compose_yml" 2>/dev/null | grep -oP '^\s*username:\s*\K\S+' | head -1)
pass=$(grep -A5 'basic-auth:' "$compose_yml" 2>/dev/null | grep -oP '^\s*password:\s*\K\S+' | head -1)
[ -z "$user" ] && user="username"
[ -z "$pass" ] && pass="password"
echo "${user}:${pass}"
}
bitcoin_rpc_call() {
local method="$1"
local params="${2:-[]}"
local url auth
url=$(bitcoin_rpc_url) || return 1
auth=$(bitcoin_rpc_auth)
curl -L --ipv4 -m 5 -s -u "$auth" -X POST -H "Content-Type: application/json" \
--data "{\"jsonrpc\":\"1.0\",\"id\":1,\"method\":\"$method\",\"params\":$params}" "$url"
}
bitcoin_parse_blocks_headers() {
local info="$1"
local blocks headers
blocks=$(echo "$info" | jq -r '.result.blocks // empty' 2>/dev/null)
headers=$(echo "$info" | jq -r '.result.headers // empty' 2>/dev/null)
if [[ ! "$blocks" =~ ^[0-9]+$ ]] || [[ ! "$headers" =~ ^[0-9]+$ ]]; then
return 1
fi
echo "$blocks $headers"
}
bitcoin_reference_height() {
local chain_slug="$1"
local ref_urls ref_url resp height
ref_urls=$($BASEPATH/reference-rpc-endpoint.sh --chain "$chain_slug" 2>/dev/null) || return 1
ref_url=$(echo "$ref_urls" | awk '{print $1}')
[ -z "$ref_url" ] && return 1
resp=$(curl -L --ipv4 -m 5 -s -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"1.0","id":1,"method":"getblockcount","params":[]}' "$ref_url")
if [ -z "$resp" ] || echo "$resp" | grep -qi 'Unknown network'; then
return 2
fi
height=$(echo "$resp" | jq -r '.result // empty' 2>/dev/null)
if [[ ! "$height" =~ ^[0-9]+$ ]]; then
return 2
fi
echo "$height"
}
bitcoin_pick_seed_peer() {
local chain_slug="$1" path
path=$(compose_rpc_path 2>/dev/null) || path=""
if echo "$chain_slug $path" | grep -qi "digibyte"; then
echo "seed.digibyte.co:12024"
return 0
fi
if echo "$chain_slug $path" | grep -qi "dogecoin"; then
# TODO: dogecoin wire seeds
return 1
fi
if echo "$chain_slug $path" | grep -qi "dash"; then
# TODO: dash wire seeds
return 1
fi
# Bitcoin mainnet / testnet / cash family default
echo "seed.bitcoin.sipa.be:8333"
}
bitcoin_try_addnode() {
local chain_slug="$1" peer resp
peer=""
local ref_urls ref_url pinfo
ref_urls=$($BASEPATH/reference-rpc-endpoint.sh --chain "$chain_slug" 2>/dev/null) || ref_urls=""
ref_url=$(echo "$ref_urls" | awk '{print $1}')
if [ -n "$ref_url" ]; then
pinfo=$(curl -L --ipv4 -m 5 -s -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"1.0","id":1,"method":"getpeerinfo","params":[]}' "$ref_url" 2>/dev/null)
peer=$(echo "$pinfo" | jq -r '.result[0].addr // empty' 2>/dev/null)
fi
if [ -z "$peer" ] || [ "$peer" = "null" ]; then
peer=$(bitcoin_pick_seed_peer "$chain_slug") || return 0
fi
resp=$(bitcoin_rpc_call "addnode" "[\"$peer\", \"onetry\"]")
if echo "$resp" | jq -e '.error == null' >/dev/null 2>&1; then
echo "Issued harmless addnode onetry to $peer"
fi
}
report_block_catchup_rate() {
local gap_change="$1"
local interval="$2"
local block_time_ms="$3"
local gap_remaining="$4"
local label="${5:-blocks}"
local block_time_sec realtime_units effective catchup_rate
block_time_sec=$(echo "scale=6; $block_time_ms / 1000" | bc)
realtime_units=$(echo "scale=6; $interval / $block_time_sec" | bc)
effective=$(echo "scale=6; $realtime_units - $gap_change" | bc)
catchup_rate=$(echo "scale=3; $effective / $realtime_units" | bc)
echo "First measurement: $label behind = $((gap_remaining - gap_change)) $label"
echo "Second measurement: $label behind = $gap_remaining $label"
echo "Gap change in $interval seconds: $gap_change $label"
echo "Calculated catchup rate: ${catchup_rate}x realtime"
if (( $(echo "$catchup_rate < 0" | bc -l) )); then
local falling_behind_rate
falling_behind_rate=$(echo "scale=2; -1 * $catchup_rate" | bc)
echo -e "${RED}Node is FALLING BEHIND by ${falling_behind_rate}x realtime${NC}"
echo -e "${RED}The gap increased by $gap_change $label over $interval seconds${NC}"
return 1
elif (( $(echo "$catchup_rate < 1" | bc -l) )); then
echo -e "${YELLOW}WARNING: Node is processing at ${catchup_rate}x realtime${NC}"
echo -e "${YELLOW}This is too slow - node will never catch up to chain head${NC}"
return 2
else
echo -e "${GREEN}Node is processing at ${catchup_rate}x realtime${NC}"
local time_to_catchup
time_to_catchup=$(echo "scale=0; $gap_remaining * $block_time_sec / ($catchup_rate - 1)" | bc)
echo -e "${GREEN}Estimated time until synced:${NC}"
s_to_human_readable "$time_to_catchup"
return 0
fi
}
bitcoin_catchup() {
local chain_slug="$1"
local interval="$2"
local block_time_ms info1 info2 blocks1 headers1 blocks2 headers2
local ref1 ref2 use_pseudo=false gap1 gap2 gap_change
block_time_ms=$($BASEPATH/reference-rpc-endpoint.sh --block-time-ms "$chain_slug" 2>/dev/null) || block_time_ms="600000"
echo "Checking sync status for $compose_base (bitcoin-family)..."
info1=$(bitcoin_rpc_call "getblockchaininfo")
if [ -z "$info1" ]; then
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
fi
read -r blocks1 headers1 < <(bitcoin_parse_blocks_headers "$info1") || {
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
}
ref1=$(bitcoin_reference_height "$chain_slug")
local ref_rc1=$?
if [ "$ref_rc1" -eq 2 ]; then
use_pseudo=true
ref1=$headers1
echo "Reference RPC unavailable (Unknown network) — using local headers as pseudo-reference"
elif [ "$ref_rc1" -ne 0 ]; then
use_pseudo=true
ref1=$headers1
echo "Reference RPC unavailable — using local headers as pseudo-reference"
fi
gap1=$((ref1 - blocks1))
echo "Current chain head is $gap1 blocks behind reference"
s_to_human_readable $(echo "scale=0; $gap1 * $block_time_ms / 1000" | bc)
echo "Measuring progress over $interval seconds..."
sleep "$interval"
info2=$(bitcoin_rpc_call "getblockchaininfo")
if [ -z "$info2" ]; then
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
fi
read -r blocks2 headers2 < <(bitcoin_parse_blocks_headers "$info2") || {
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
}
if $use_pseudo; then
ref2=$headers2
else
ref2=$(bitcoin_reference_height "$chain_slug")
local ref_rc2=$?
if [ "$ref_rc2" -ne 0 ]; then
ref2=$headers2
use_pseudo=true
fi
fi
gap2=$((ref2 - blocks2))
gap_change=$((gap2 - gap1))
report_block_catchup_rate "$gap_change" "$interval" "$block_time_ms" "$gap2" "blocks"
local rc=$?
if [ "$rc" -eq 1 ] && [ -n "$chain_slug" ]; then
bitcoin_try_addnode "$chain_slug"
fi
exit "$rc"
}
ripple_rpc_call() {
local url
url=$(compose_rpc_url) || return 1
curl -L --ipv4 -m 5 -s -X POST -H "Content-Type: application/json" \
--data '{"method":"server_info"}' "$url"
}
ripple_validated_seq() {
local resp="$1" seq
seq=$(echo "$resp" | jq -r '.result.info.validated_ledger.seq // .info.validated_ledger.seq // empty' 2>/dev/null)
if [[ ! "$seq" =~ ^[0-9]+$ ]]; then
return 1
fi
echo "$seq"
}
ripple_reference_seq() {
local chain_slug="$1" ref_urls ref_url resp
ref_urls=$($BASEPATH/reference-rpc-endpoint.sh --chain "$chain_slug" 2>/dev/null) || return 1
ref_url=$(echo "$ref_urls" | awk '{print $1}')
[ -z "$ref_url" ] && return 1
resp=$(curl -L --ipv4 -m 5 -s -X POST -H "Content-Type: application/json" \
--data '{"method":"server_info"}' "$ref_url")
ripple_validated_seq "$resp"
}
ripple_catchup() {
local chain_slug="$1"
local interval="$2"
local block_time_ms resp1 resp2 seq1 seq2 ref1 ref2 gap1 gap2 gap_change
block_time_ms=$($BASEPATH/reference-rpc-endpoint.sh --block-time-ms "$chain_slug" 2>/dev/null) || block_time_ms="4000"
echo "Checking sync status for $compose_base (ripple)..."
resp1=$(ripple_rpc_call)
if [ -z "$resp1" ]; then
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
fi
seq1=$(ripple_validated_seq "$resp1") || {
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
}
ref1=$(ripple_reference_seq "$chain_slug") || ref1=""
if [ -z "$ref1" ]; then
gap1=0
echo "Reference RPC unavailable — measuring local validated-ledger progress only"
else
gap1=$((ref1 - seq1))
echo "Current chain head is $gap1 ledgers behind reference"
s_to_human_readable $(echo "scale=0; $gap1 * $block_time_ms / 1000" | bc)
fi
echo "Measuring progress over $interval seconds..."
sleep "$interval"
resp2=$(ripple_rpc_call)
if [ -z "$resp2" ]; then
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
fi
seq2=$(ripple_validated_seq "$resp2") || {
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
}
ref2=$(ripple_reference_seq "$chain_slug") || ref2=""
if [ -z "$ref1" ] || [ -z "$ref2" ]; then
local seq_gain=$((seq2 - seq1))
local realtime_units effective catchup_rate
realtime_units=$(echo "scale=6; $interval * 1000 / $block_time_ms" | bc)
effective=$(echo "scale=6; $seq_gain" | bc)
catchup_rate=$(echo "scale=3; $effective / $realtime_units" | bc)
echo "Validated ledger gain in $interval seconds: $seq_gain ledgers"
echo "Calculated catchup rate: ${catchup_rate}x realtime"
if (( $(echo "$catchup_rate < 1" | bc -l) )); then
if (( $(echo "$catchup_rate < 0" | bc -l) )); then
echo -e "${RED}Node is FALLING BEHIND${NC}"
exit 1
fi
echo -e "${YELLOW}WARNING: Node is processing at ${catchup_rate}x realtime${NC}"
exit 2
fi
echo -e "${GREEN}Node is processing at ${catchup_rate}x realtime${NC}"
exit 0
fi
gap2=$((ref2 - seq2))
gap_change=$((gap2 - gap1))
report_block_catchup_rate "$gap_change" "$interval" "$block_time_ms" "$gap2" "ledgers"
exit $?
}
cosmos_catching_up() {
local url status catching_up
url=$(compose_rpc_url) || return 1
status=$(curl -L --ipv4 -m 5 -s -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","id":1,"method":"status"}' "$url")
catching_up=$(echo "$status" | jq -r '.result.sync_info.catching_up // .sync_info.catching_up // empty' 2>/dev/null)
echo "$catching_up"
}
cosmos_catchup() {
local catching_up
echo "Checking sync status for $compose_base (cosmos/cometbft)..."
catching_up=$(cosmos_catching_up)
if [ "$catching_up" = "true" ]; then
echo "CometBFT reports catching_up=true (node is still syncing)"
elif [ -z "$catching_up" ]; then
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
fi
# Standard timestamp-lag algorithm via timestamp.sh (cosmos /status source).
echo "Debug: Running ./timestamp.sh $compose_base"
timestamp_output=$(./timestamp.sh "$compose_base" 2>&1)
timestamp_exit_code=$?
echo "Debug: timestamp.sh output: '$timestamp_output'"
echo "Debug: timestamp.sh exit code: $timestamp_exit_code"
latest_block_timestamp_decimal=$(echo "$timestamp_output" | grep -o '[0-9]\+' | head -1)
if [[ $timestamp_exit_code -ne 0 || -z "$latest_block_timestamp_decimal" ]]; then
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
fi
current_time=$(date +%s)
time_difference=$((current_time - latest_block_timestamp_decimal))
echo "Current chain head is $time_difference seconds behind real time"
if [ "$catching_up" = "true" ]; then
echo "(catching_up=true)"
fi
s_to_human_readable $time_difference
echo "Measuring progress over $seconds_to_measure seconds..."
sleep $seconds_to_measure
catching_up=$(cosmos_catching_up)
if [ "$catching_up" = "true" ]; then
echo "CometBFT still reports catching_up=true"
fi
echo "Debug: Running ./timestamp.sh $compose_base (second measurement)"
timestamp_output=$(./timestamp.sh "$compose_base" 2>&1)
timestamp_exit_code=$?
echo "Debug: timestamp.sh output (second): '$timestamp_output'"
echo "Debug: timestamp.sh exit code (second): $timestamp_exit_code"
latest_block_timestamp2=$(echo "$timestamp_output" | grep -o '[0-9]\+' | head -1)
if [[ $timestamp_exit_code -ne 0 || -z "$latest_block_timestamp2" ]]; then
echo -e "${RED}rpc-not-open (expected mid-sync for stage-sync/bootstrap clients — avalanchego, erigon/reth stage-sync, statesync bootstraps); re-run at chainhead${NC}"
exit 1
fi
current_time2=$(date +%s)
time_difference2=$((current_time2 - latest_block_timestamp2))
gap_change=$((time_difference2 - time_difference))
effective_catchup_seconds=$((seconds_to_measure - gap_change))
catchup_rate=$(echo "scale=3; $effective_catchup_seconds / $seconds_to_measure" | bc)
echo "First measurement: Time behind = $time_difference seconds"
echo "Second measurement: Time behind = $time_difference2 seconds"
if [ "$catching_up" = "true" ]; then
echo "(catching_up=true)"
fi
echo "Gap change in $seconds_to_measure seconds: $gap_change seconds"
echo "Calculated catchup rate: $catchup_rate× realtime"
if (( $(echo "$catchup_rate < 0" | bc -l) )); then
falling_behind_rate=$(echo "scale=2; -1 * $catchup_rate" | bc)
echo -e "${RED}Node is FALLING BEHIND by $falling_behind_rate× realtime${NC}"
echo -e "${RED}The gap increased by $gap_change seconds over $seconds_to_measure seconds${NC}"
exit 1
elif (( $(echo "$catchup_rate < 1" | bc -l) )); then
echo -e "${YELLOW}WARNING: Node is processing at $catchup_rate× realtime${NC}"
echo -e "${YELLOW}This is too slow - node will never catch up to chain head${NC}"
exit 2
else
echo -e "${GREEN}Node is processing at $catchup_rate× realtime${NC}"
time_to_catchup=$(echo "scale=0; $time_difference2 / ($catchup_rate - 1)" | bc)
echo -e "${GREEN}Estimated time until synced:${NC}"
s_to_human_readable $time_to_catchup
exit 0
fi
}
protocol=$(resolve_protocol)
chain_slug=$(compose_chain_slug)
case "$protocol" in
bitcoin)
bitcoin_catchup "$chain_slug" "$seconds_to_measure"
;;
ripple)
ripple_catchup "$chain_slug" "$seconds_to_measure"
;;
cosmos)
cosmos_catchup
;;
eth|starknet|aztec)
;;
*)
echo "unsupported protocol $protocol for catchup"
exit 1
;;
esac
# --- eth / starknet / aztec: original timestamp-lag path (unchanged) ---
seconds_to_measure=${2:-10} seconds_to_measure=${2:-10}
# First measurement # First measurement
+1 -84
View File
@@ -10,12 +10,10 @@ fi
RPC_URL=$1 RPC_URL=$1
shift shift
# Check for --starknet / --aztec / --cosmos / --ripple / --bitcoin flag # Check for --starknet / --aztec / --cosmos flag
is_starknet=false is_starknet=false
is_aztec=false is_aztec=false
is_cosmos=false is_cosmos=false
is_ripple=false
is_bitcoin=false
if [ "$1" == "--starknet" ]; then if [ "$1" == "--starknet" ]; then
is_starknet=true is_starknet=true
shift shift
@@ -25,12 +23,6 @@ elif [ "$1" == "--aztec" ]; then
elif [ "$1" == "--cosmos" ]; then elif [ "$1" == "--cosmos" ]; then
is_cosmos=true is_cosmos=true
shift shift
elif [ "$1" == "--ripple" ]; then
is_ripple=true
shift
elif [ "$1" == "--bitcoin" ]; then
is_bitcoin=true
shift
fi fi
REF="" REF=""
@@ -67,73 +59,6 @@ if $is_cosmos; then
echo "online"; exit 0 echo "online"; exit 0
fi fi
# XRPL rippled: server_info — server_state full/proposing + fresh validated ledger = online.
# Short-circuits here; the EVM/starknet/aztec block-comparison path below is not used.
if $is_ripple; then
status=$(curl -L --ipv4 -m $timeout -s -X POST -H "Content-Type: application/json" --data '{"method":"server_info"}' "$RPC_URL")
if [ $? -ne 0 ] || [ -z "$status" ]; then echo "error"; exit 1; fi
server_state=$(echo "$status" | jq -r '.result.info.server_state // .info.server_state' 2>/dev/null)
ledger_age=$(echo "$status" | jq -r '.result.info.validated_ledger.age // .info.validated_ledger.age' 2>/dev/null)
node_seq=$(echo "$status" | jq -r '.result.info.validated_ledger.seq // .info.validated_ledger.seq' 2>/dev/null)
if [ -z "$server_state" ] || [ "$server_state" = "null" ]; then echo "error"; exit 1; fi
case "$server_state" in
connected|syncing|tracking)
echo "syncing"; exit 1 ;;
full|proposing)
;;
*)
echo "error"; exit 1 ;;
esac
if [ -z "$ledger_age" ] || [ "$ledger_age" = "null" ] || [ "$ledger_age" -gt 20 ] 2>/dev/null; then
echo "behind"; exit 1
fi
if [ -n "$ref" ]; then
ref_status=$($BASEPATH/multicurl.sh -L --ipv4 -m $timeout -s -X POST -H "Content-Type: application/json" --data '{"method":"server_info"}' $ref)
ref_seq=$(echo "$ref_status" | jq -r '.result.info.validated_ledger.seq // .info.validated_ledger.seq' 2>/dev/null)
if [ -n "$ref_seq" ] && [ "$ref_seq" != "null" ] && [ "$ref_seq" -gt 0 ] 2>/dev/null && [ -n "$node_seq" ] && [ "$node_seq" != "null" ]; then
lag=$(( ref_seq - node_seq ))
lo=${LAGGING_LAG:-5}; hi=${SYNCING_LAG:-10}
if [ "$lo" -gt "$hi" ]; then tmp=$lo; lo=$hi; hi=$tmp; fi
if [ "$lag" -le "$lo" ]; then
echo "online"; exit 0
elif [ "$lag" -le "$hi" ]; then
echo "lagging"; exit 0
else
echo "syncing"; exit 1
fi
fi
fi
echo "online"; exit 0
fi
# Bitcoin-family (bitcoind/dogecoind): getblockchaininfo — initialblockdownload=true means syncing.
# Short-circuits here; the EVM/starknet/aztec block-comparison path below is not used.
if $is_bitcoin; then
status=$(curl -L --ipv4 -m $timeout -s -u username:password -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"1.0","id":1,"method":"getblockchaininfo","params":[]}' "$RPC_URL")
if [ $? -ne 0 ] || [ -z "$status" ]; then echo "error"; exit 1; fi
ibd=$(echo "$status" | jq -r '.result.initialblockdownload' 2>/dev/null)
node_height=$(echo "$status" | jq -r '.result.blocks' 2>/dev/null)
if [ -z "$node_height" ] || [ "$node_height" = "null" ]; then echo "error"; exit 1; fi
if [ "$ibd" = "true" ]; then echo "syncing"; exit 1; fi
if [ -n "$ref" ]; then
ref_status=$($BASEPATH/multicurl.sh -L --ipv4 -m $timeout -s -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"1.0","id":1,"method":"getblockcount","params":[]}' $ref)
ref_height=$(echo "$ref_status" | jq -r '.result' 2>/dev/null)
if [ -n "$ref_height" ] && [ "$ref_height" != "null" ] && [ "$ref_height" -gt 0 ] 2>/dev/null; then
lag=$(( ref_height - node_height ))
lo=${LAGGING_LAG:-2}; hi=${SYNCING_LAG:-6}
if [ "$lo" -gt "$hi" ]; then tmp=$lo; lo=$hi; hi=$tmp; fi
if [ "$lag" -le "$lo" ]; then
echo "online"; exit 0
elif [ "$lag" -le "$hi" ]; then
echo "lagging"; exit 0
else
echo "syncing"; exit 1
fi
fi
fi
echo "online"; exit 0
fi
response_file=$(mktemp) response_file=$(mktemp)
# Use appropriate RPC method based on chain type # Use appropriate RPC method based on chain type
@@ -380,14 +305,6 @@ if [ $? -eq 0 ]; then
echo "unverified ($http_status_code2)" echo "unverified ($http_status_code2)"
exit 1 exit 1
fi fi
else
rm "$response_file2"
if [ $attempt -lt $MAX_RETRIES ]; then
attempt=$((attempt + 1))
continue
fi
echo "unverified (reference unreachable)"
exit 1
fi fi
done done
-16
View File
@@ -14,8 +14,6 @@
set -euo pipefail set -euo pipefail
BASEPATH="$(cd "$(dirname "$0")" && pwd)" BASEPATH="$(cd "$(dirname "$0")" && pwd)"
# shellcheck source=volume-utils.sh
source "$BASEPATH/volume-utils.sh"
BACKUP_DIR="${BACKUP_DIR:-/backup}" BACKUP_DIR="${BACKUP_DIR:-/backup}"
TRASH_DIR="${TRASH_DIR:-$BACKUP_DIR/trash}" TRASH_DIR="${TRASH_DIR:-$BACKUP_DIR/trash}"
KEEP_COUNT="${KEEP_COUNT:-3}" KEEP_COUNT="${KEEP_COUNT:-3}"
@@ -165,20 +163,6 @@ cleanup_volume_backups() {
continue continue
fi fi
if ! is_restorable_backup_archive "$file"; then
local near_size
near_size=$(backup_archive_size_bytes "$file")
local near_meta
near_meta=$(metadata_for_archive "$file")
add_trashed_bytes "$file"
trash_file "$file" "near-empty artifact (${near_size} bytes, excluded from KEEP_COUNT)"
if [[ -f "$near_meta" ]]; then
add_trashed_bytes "$near_meta"
trash_file "$near_meta" "metadata for near-empty artifact"
fi
continue
fi
volume_files["$volume_key"]+="$file"$'\n' volume_files["$volume_key"]+="$file"$'\n'
done < <(find "$BACKUP_DIR" -maxdepth 1 -type f -name 'rpc_*-*.tar.zst' -print0 2>/dev/null) done < <(find "$BACKUP_DIR" -maxdepth 1 -type f -name 'rpc_*-*.tar.zst' -print0 2>/dev/null)
+6 -8
View File
@@ -294,12 +294,11 @@ transfer_backup() {
local key=$1 local key=$1
local volume_name="rpc_$key" local volume_name="rpc_$key"
# Find the newest restorable backup file (skip near-empty artifacts) # Find the newest backup file
local backup_file local backup_file=$(ls -1 "$backup_dir"/"${volume_name}"-[0-9]*G.tar.zst 2>/dev/null | sort | tail -n 1)
backup_file=$(select_newest_local_backup "$backup_dir" "$volume_name")
if [[ -z "$backup_file" ]] || [[ ! -f "$backup_file" ]]; then if [[ -z "$backup_file" ]] || [[ ! -f "$backup_file" ]]; then
echo "Warning: No restorable backup file found for $volume_name, skipping" echo "Warning: No backup file found for $volume_name, skipping"
return 1 return 1
fi fi
@@ -483,12 +482,11 @@ transfer_backup_ssh() {
local key=$1 local key=$1
local volume_name="rpc_$key" local volume_name="rpc_$key"
# Find the newest restorable backup file (skip near-empty artifacts) # Find the newest backup file
local backup_file local backup_file=$(ls -1 "$backup_dir"/"${volume_name}"-[0-9]*G.tar.zst 2>/dev/null | sort | tail -n 1)
backup_file=$(select_newest_local_backup "$backup_dir" "$volume_name")
if [[ -z "$backup_file" ]] || [[ ! -f "$backup_file" ]]; then if [[ -z "$backup_file" ]] || [[ ! -f "$backup_file" ]]; then
echo "Warning: No restorable backup file found for $volume_name, skipping" echo "Warning: No backup file found for $volume_name, skipping"
return 1 return 1
fi fi
+54 -924
View File
File diff suppressed because it is too large Load Diff
+2 -10
View File
@@ -34,7 +34,7 @@ services:
context: ./cronos context: ./cronos
dockerfile: cometbft.Dockerfile dockerfile: cometbft.Dockerfile
args: args:
CRONOS_CRONOS_VERSION: ${CRONOS_MAINNET_CRONOS_VERSION:-v1.7.8} CRONOS_CRONOS_VERSION: ${CRONOS_MAINNET_CRONOS_VERSION:-v1.7.7}
CRONOS_CRONOS_IMAGE: ${CRONOS_MAINNET_CRONOS_IMAGE:-ghcr.io/crypto-org-chain/cronos} CRONOS_CRONOS_IMAGE: ${CRONOS_MAINNET_CRONOS_IMAGE:-ghcr.io/crypto-org-chain/cronos}
sysctls: sysctls:
# TCP Performance # TCP Performance
@@ -61,18 +61,10 @@ services:
environment: environment:
- API=eth,txpool,net,debug,web3 - API=eth,txpool,net,debug,web3
- CHAINID=cronosmainnet_25-1 - CHAINID=cronosmainnet_25-1
- EVM_MAX_TX_GAS_WANTED=500000 - CHAINNAME=mainnet
- GENESIS_URL=https://raw.githubusercontent.com/crypto-org-chain/cronos-mainnet/master/cronosmainnet_25-1/genesis.json
- IP=${IP} - IP=${IP}
- JSON_RPC_BLOCK_RANGE_CAP=10000
- JSON_RPC_ENABLE=true
- JSON_RPC_ENABLE_INDEXER=true
- JSON_RPC_FEEHISTORY_CAP=100
- JSON_RPC_HTTP_TIMEOUT=30s
- JSON_RPC_LOGS_CAP=10000
- MONIKER=d${DOMAIN:-local} - MONIKER=d${DOMAIN:-local}
- P2P_PORT=10521 - P2P_PORT=10521
- SEEDS=0d5cf1394a1cfde28dc8f023567222abc0f47534@seed-0.cronos.com:26656,3032073adc06d710dd512240281637c1bd0c8a7b@seed-1.cronos.com:26656,04f43116b4c6c70054d9c2b7485383df5b1ed1da@seed-2.cronos.com:26656,337377dcda43d79c537d2c4d93ad3b698ce9452e@bd-cronos-mainnet-seed-node-01.bdnodes.net:26656
restart: unless-stopped restart: unless-stopped
stop_grace_period: 5m stop_grace_period: 5m
networks: networks:
+54 -38
View File
@@ -1,53 +1,69 @@
#!/bin/sh #!/bin/sh
# cronosd entrypoint — Cronos (Cosmos-SDK + embedded EVM). EVM JSON-RPC :8545 / WS :8546
# are the dshackle/traefik upstream; CometBFT :26657 stays internal. Bootstrap params set -e # Exit on failure
# (chain_id, genesis_url, seeds, app.toml tunables) come from context.yml via env.
set -e echo "MONIKER: $MONIKER"
CHAINID=${CHAINID:-cronosmainnet_25-1}
CHAINNAME=${CHAINNAME:-mainnet}
API=${API:-eth,txpool,net,debug,web3}
CONFIG_DIR="/root/.cronos/config"
# Create config directory
mkdir -p "$CONFIG_DIR"
P2P_STRING="tcp:\/\/0\.0\.0\.0\:${P2P_PORT:-10521}"
NAT_STRING="${IP}:${P2P_PORT:-10521}"
env
# this goes first because it won't overwrite shit
apk add curl jq
if [ $? -ne 0 ]; then exit 1; fi
# Source the shared CometBFT helpers
. /usr/local/bin/cometbft-common.sh . /usr/local/bin/cometbft-common.sh
HOME_DIR="/root/.cronos" if cronosd init ${MONIKER} --chain-id ${CHAINID} --home /root/.cronos/; then
CONFIG_DIR="$HOME_DIR/config" # Define variables
CHAINID="${CHAINID:-cronosmainnet_25-1}" GENESIS_URL="https://raw.githubusercontent.com/crypto-org-chain/cronos-mainnet/master/cronosmainnet_25-1/genesis.json"
API="${API:-eth,txpool,net,debug,web3}" SEEDS="0d5cf1394a1cfde28dc8f023567222abc0f47534@cronos-seed-0.crypto.org:26656,3032073adc06d710dd512240281637c1bd0c8a7b@cronos-seed-1.crypto.org:26656,04f43116b4c6c70054d9c2b7485383df5b1ed1da@cronos-seed-2.crypto.org:26656"
GENESIS_URL="${GENESIS_URL:-https://raw.githubusercontent.com/crypto-org-chain/cronos-mainnet/master/cronosmainnet_25-1/genesis.json}"
SEEDS="${SEEDS:-0d5cf1394a1cfde28dc8f023567222abc0f47534@seed-0.cronos.com:26656,3032073adc06d710dd512240281637c1bd0c8a7b@seed-1.cronos.com:26656,04f43116b4c6c70054d9c2b7485383df5b1ed1da@seed-2.cronos.com:26656,337377dcda43d79c537d2c4d93ad3b698ce9452e@bd-cronos-mainnet-seed-node-01.bdnodes.net:26656}"
JSON_RPC_ENABLE="${JSON_RPC_ENABLE:-true}"
JSON_RPC_ENABLE_INDEXER="${JSON_RPC_ENABLE_INDEXER:-true}"
JSON_RPC_FEEHISTORY_CAP="${JSON_RPC_FEEHISTORY_CAP:-100}"
JSON_RPC_LOGS_CAP="${JSON_RPC_LOGS_CAP:-10000}"
JSON_RPC_BLOCK_RANGE_CAP="${JSON_RPC_BLOCK_RANGE_CAP:-10000}"
JSON_RPC_HTTP_TIMEOUT="${JSON_RPC_HTTP_TIMEOUT:-30s}"
EVM_MAX_TX_GAS_WANTED="${EVM_MAX_TX_GAS_WANTED:-500000}"
ct_apk curl jq # Download config files
curl -sL "$GENESIS_URL" -o "$CONFIG_DIR/genesis.json"
if cronosd init "${MONIKER:-rpc-node}" --chain-id "$CHAINID" --home "$HOME_DIR" >/dev/null 2>&1; then # somehow it's better to make home static to /root
ct_log "fresh init; fetching genesis" sed -i 's|~/|/root/|g' "$CONFIG_DIR/config.toml"
ct_fetch "$GENESIS_URL" "$CONFIG_DIR/genesis.json" required sed -i 's|~/|/root/|g' "$CONFIG_DIR/app.toml"
ct_localize_home "$CONFIG_DIR"
else else
ct_log "already initialized, continuing" echo "Already initialized, continuing!" >&2
fi fi
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" "$CONFIG_DIR/app.toml" # Localize home directory paths
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" "$CONFIG_DIR/app.toml" ct_localize_home /root/.cronos/config
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" "$CONFIG_DIR/app.toml"
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" "$CONFIG_DIR/config.toml" # apply a port change to the config
ct_patch_p2p "$CONFIG_DIR/config.toml" "$IP" "${P2P_PORT:-10521}"
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $CONFIG_DIR/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $CONFIG_DIR/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $CONFIG_DIR/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $CONFIG_DIR/config.toml
sed -i "/^\[json-rpc\]/,/^\[/{s|^address = .*|address = \"0.0.0.0:8545\"|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^address = .*|address = \"0.0.0.0:8545\"|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^ws-address = .*|ws-address = \"0.0.0.0:8546\"|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^ws-address = .*|ws-address = \"0.0.0.0:8546\"|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^api = .*|api = \"$API\"|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^api = .*|api = \"$API\"|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^enable = .*|enable = $JSON_RPC_ENABLE|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^enable-indexer = .*|enable-indexer = $JSON_RPC_ENABLE_INDEXER|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^feehistory-cap = .*|feehistory-cap = $JSON_RPC_FEEHISTORY_CAP|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^logs-cap = .*|logs-cap = $JSON_RPC_LOGS_CAP|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^block-range-cap = .*|block-range-cap = $JSON_RPC_BLOCK_RANGE_CAP|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^http-timeout = .*|http-timeout = \"$JSON_RPC_HTTP_TIMEOUT\"|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[evm\]/,/^\[/{s|^max-tx-gas-wanted = .*|max-tx-gas-wanted = $EVM_MAX_TX_GAS_WANTED|}" "$CONFIG_DIR/app.toml"
ct_patch_p2p "$CONFIG_DIR/config.toml" "$IP" "${P2P_PORT:-10521}" # Set seeds
ct_merge_seeds "$CONFIG_DIR/config.toml" "$SEEDS" ct_set_persistent_peers "$CONFIG_DIR/config.toml" "$SEEDS"
# Configure state sync using official RPC endpoints
ct_configure_statesync "$CONFIG_DIR/config.toml" "https://rpc-cronos.crypto.org:443,https://cronos-rpc.publicnode.com:443" 2000 ct_configure_statesync "$CONFIG_DIR/config.toml" "https://rpc-cronos.crypto.org:443,https://cronos-rpc.publicnode.com:443" 2000
ct_set_moniker "$CONFIG_DIR/config.toml" "${MONIKER:-rpc-node}"
exec cronosd start --chain-id "$CHAINID" "$@" # Update moniker if set
if [ -n "$MONIKER" ] && [ -f "$CONFIG_DIR/config.toml" ]; then
ct_set_moniker "$CONFIG_DIR/config.toml" "$MONIKER"
fi
exec cronosd start --chain-id ${CHAINID} $@
-141
View File
@@ -1,141 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:dash/dashd/dash-mainnet-dashd-full.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/dash-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
dash-mainnet:
image: ${DASH_DASHD_IMAGE:-dashpay/dashd}:${DASH_MAINNET_DASHD_VERSION:-23.1.7}
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:
- 11650:11650
- 11650:11650/udp
expose:
- 8545
- '28332' # ZMQ hashblock port
- '28333' # ZMQ hashtx port
- '28334' # ZMQ rawblock port
- '28335' # ZMQ rawtx port
entrypoint: [dashd]
command:
- -datadir=/data
- -dbcache=2048
- -disablewallet=1
- -externalip=${IP}
- -port=11650
- -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0
- -rpcport=8545
- -server
- -txindex=1
- -zmqpubhashblock=tcp://0.0.0.0:28332
- -zmqpubhashtx=tcp://0.0.0.0:28333
- -zmqpubrawblock=tcp://0.0.0.0:28334
- -zmqpubrawtx=tcp://0.0.0.0:28335
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${DASH_MAINNET_DASHD_FULL_DATA:-dash-mainnet-dashd-full}:/data
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=false
- traefik.enable=true
- traefik.http.middlewares.dash-mainnet-dashd-full-stripprefix.stripprefix.prefixes=/dash-mainnet
- traefik.http.services.dash-mainnet-dashd-full.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full.rule=Host(`$DOMAIN`) && (Path(`/dash-mainnet`) || Path(`/dash-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full.rule=Path(`/dash-mainnet`) || Path(`/dash-mainnet/`)}
- traefik.http.routers.dash-mainnet-dashd-full.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist
- traefik.http.routers.dash-mainnet-dashd-full.service=dash-mainnet-dashd-full
- traefik.http.routers.dash-mainnet-dashd-full-hashblock.service=dash-mainnet-dashd-full-hashblock
- traefik.http.services.dash-mainnet-dashd-full-hashblock.loadbalancer.server.port=28332
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashblock.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashblock.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashblock.rule=Host(`$DOMAIN`) && PathPrefix(`/dash-mainnet/hashblock`)}
- ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full-hashblock.rule=PathPrefix(`/dash-mainnet/hashblock`)}
- traefik.http.routers.dash-mainnet-dashd-full-hashblock.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist
- traefik.http.routers.dash-mainnet-dashd-full-hashtx.service=dash-mainnet-dashd-full-hashtx
- traefik.http.services.dash-mainnet-dashd-full-hashtx.loadbalancer.server.port=28333
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashtx.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashtx.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashtx.rule=Host(`$DOMAIN`) && PathPrefix(`/dash-mainnet/hashtx`)}
- ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full-hashtx.rule=PathPrefix(`/dash-mainnet/hashtx`)}
- traefik.http.routers.dash-mainnet-dashd-full-hashtx.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist
- traefik.http.routers.dash-mainnet-dashd-full-rawblock.service=dash-mainnet-dashd-full-rawblock
- traefik.http.services.dash-mainnet-dashd-full-rawblock.loadbalancer.server.port=28334
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawblock.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawblock.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawblock.rule=Host(`$DOMAIN`) && PathPrefix(`/dash-mainnet/rawblock`)}
- ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full-rawblock.rule=PathPrefix(`/dash-mainnet/rawblock`)}
- traefik.http.routers.dash-mainnet-dashd-full-rawblock.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist
- traefik.http.routers.dash-mainnet-dashd-full-rawtx.service=dash-mainnet-dashd-full-rawtx
- traefik.http.services.dash-mainnet-dashd-full-rawtx.loadbalancer.server.port=28335
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawtx.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawtx.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawtx.rule=Host(`$DOMAIN`) && PathPrefix(`/dash-mainnet/rawtx`)}
- ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full-rawtx.rule=PathPrefix(`/dash-mainnet/rawtx`)}
- traefik.http.routers.dash-mainnet-dashd-full-rawtx.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist
volumes:
dash-mainnet-dashd-full:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
bitcoin:
rpc:
url: $${RPC_URL}
basic-auth:
username: username
password: password
zeromq:
address: $${RPC_URL}/hashblock
chain: dash
...
-24
View File
@@ -1,24 +0,0 @@
# digibyted — official release tarball (no Docker image upstream).
ARG VERSION=9.26.3
FROM debian:stable-slim
ARG VERSION
ARG SHA256=51465a7a7409dc9a734e463b8fd95fb9773033753d79504de946ab2a0aa0991c
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /tmp
RUN curl -fsSL -o digibyte.tar.gz \
"https://github.com/DigiByte-Core/digibyte/releases/download/v${VERSION}/digibyte-${VERSION}-x86_64-linux-gnu.tar.gz" \
&& echo "${SHA256} digibyte.tar.gz" | sha256sum -c - \
&& tar xzf digibyte.tar.gz \
&& cp "digibyte-${VERSION}/bin/digibyted" "digibyte-${VERSION}/bin/digibyte-cli" /usr/local/bin/ \
&& rm -rf /tmp/*
EXPOSE 8545 12024
ENTRYPOINT ["digibyted"]
@@ -1,145 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:digibyte/digibyted/digibyte-mainnet-digibyted-full.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/digibyte-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
digibyte-mainnet:
build:
context: ./digibyte
dockerfile: digibyted.Dockerfile
args:
VERSION: ${DIGIBYTE_MAINNET_DIGIBYTED_VERSION:-9.26.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)
user: root
ports:
- 11254:11254
- 11254:11254/udp
expose:
- 8545
- '28332' # ZMQ hashblock port
- '28333' # ZMQ hashtx port
- '28334' # ZMQ rawblock port
- '28335' # ZMQ rawtx port
entrypoint: [digibyted]
command:
- -datadir=/data
- -dbcache=2048
- -disablewallet=1
- -externalip=${IP}
- -port=11254
- -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0
- -rpcport=8545
- -server
- -txindex=1
- -zmqpubhashblock=tcp://0.0.0.0:28332
- -zmqpubhashtx=tcp://0.0.0.0:28333
- -zmqpubrawblock=tcp://0.0.0.0:28334
- -zmqpubrawtx=tcp://0.0.0.0:28335
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${DIGIBYTE_MAINNET_DIGIBYTED_FULL_DATA:-digibyte-mainnet-digibyted-full}:/data
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=false
- traefik.enable=true
- traefik.http.middlewares.digibyte-mainnet-digibyted-full-stripprefix.stripprefix.prefixes=/digibyte-mainnet
- traefik.http.services.digibyte-mainnet-digibyted-full.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full.rule=Host(`$DOMAIN`) && (Path(`/digibyte-mainnet`) || Path(`/digibyte-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full.rule=Path(`/digibyte-mainnet`) || Path(`/digibyte-mainnet/`)}
- traefik.http.routers.digibyte-mainnet-digibyted-full.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist
- traefik.http.routers.digibyte-mainnet-digibyted-full.service=digibyte-mainnet-digibyted-full
- traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.service=digibyte-mainnet-digibyted-full-hashblock
- traefik.http.services.digibyte-mainnet-digibyted-full-hashblock.loadbalancer.server.port=28332
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.rule=Host(`$DOMAIN`) && PathPrefix(`/digibyte-mainnet/hashblock`)}
- ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.rule=PathPrefix(`/digibyte-mainnet/hashblock`)}
- traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist
- traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.service=digibyte-mainnet-digibyted-full-hashtx
- traefik.http.services.digibyte-mainnet-digibyted-full-hashtx.loadbalancer.server.port=28333
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.rule=Host(`$DOMAIN`) && PathPrefix(`/digibyte-mainnet/hashtx`)}
- ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.rule=PathPrefix(`/digibyte-mainnet/hashtx`)}
- traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist
- traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.service=digibyte-mainnet-digibyted-full-rawblock
- traefik.http.services.digibyte-mainnet-digibyted-full-rawblock.loadbalancer.server.port=28334
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.rule=Host(`$DOMAIN`) && PathPrefix(`/digibyte-mainnet/rawblock`)}
- ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.rule=PathPrefix(`/digibyte-mainnet/rawblock`)}
- traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist
- traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.service=digibyte-mainnet-digibyted-full-rawtx
- traefik.http.services.digibyte-mainnet-digibyted-full-rawtx.loadbalancer.server.port=28335
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.rule=Host(`$DOMAIN`) && PathPrefix(`/digibyte-mainnet/rawtx`)}
- ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.rule=PathPrefix(`/digibyte-mainnet/rawtx`)}
- traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist
volumes:
digibyte-mainnet-digibyted-full:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
bitcoin:
rpc:
url: $${RPC_URL}
basic-auth:
username: username
password: password
zeromq:
address: $${RPC_URL}/hashblock
chain: digibyte
...
@@ -60,7 +60,6 @@ services:
- -externalip=${IP} - -externalip=${IP}
- -port=12577 - -port=12577
- -printtoconsole - -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0 - -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7 - -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0 - -rpcbind=0.0.0.0
@@ -60,7 +60,6 @@ services:
- -externalip=${IP} - -externalip=${IP}
- -port=10859 - -port=10859
- -printtoconsole - -printtoconsole
- -rpcallowip=0.0.0.0/0
- -rpcallowip=::/0 - -rpcallowip=::/0
- -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7 - -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7
- -rpcbind=0.0.0.0 - -rpcbind=0.0.0.0
+1 -1
View File
@@ -1,6 +1,6 @@
services: services:
dshackle-free: dshackle-free:
image: drpcorg/dshackle:0.79.10 image: drpcorg/dshackle:0.79.5
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- ./free_configs:/etc/dshackle - ./free_configs:/etc/dshackle
+1 -1
View File
@@ -1,6 +1,6 @@
services: services:
dshackle: dshackle:
image: drpcorg/dshackle:0.79.10 image: drpcorg/dshackle:0.79.5
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- ./main_configs:/etc/dshackle - ./main_configs:/etc/dshackle
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-mainnet-besu: ethereum-mainnet-besu:
image: ${ETHEREUM_BESU_IMAGE:-hyperledger/besu}:${ETHEREUM_MAINNET_BESU_VERSION:-26.6.1} image: ${ETHEREUM_BESU_IMAGE:-hyperledger/besu}:${ETHEREUM_MAINNET_BESU_VERSION:-26.5.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -114,7 +114,7 @@ services:
- traefik.http.routers.ethereum-mainnet-besu-pruned-bonsai-ws.middlewares=ethereum-mainnet-besu-pruned-bonsai-stripprefix, ipallowlist - traefik.http.routers.ethereum-mainnet-besu-pruned-bonsai-ws.middlewares=ethereum-mainnet-besu-pruned-bonsai-stripprefix, ipallowlist
ethereum-mainnet-besu-node: ethereum-mainnet-besu-node:
image: ${ETHEREUM_NIMBUS_IMAGE:-statusim/nimbus-eth2}:${ETHEREUM_MAINNET_NIMBUS_VERSION:-multiarch-v26.6.2} image: ${ETHEREUM_NIMBUS_IMAGE:-statusim/nimbus-eth2}:${ETHEREUM_MAINNET_NIMBUS_VERSION:-multiarch-v26.5.0}
user: root user: root
ports: ports:
- 18205:18205 - 18205:18205
@@ -137,9 +137,7 @@ services:
- --web3-url=http://ethereum-mainnet-besu:8551 - --web3-url=http://ethereum-mainnet-besu:8551
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
ethereum-mainnet-besu: - ethereum-mainnet-besu
condition: service_started
restart: true
networks: networks:
- chains - chains
volumes: volumes:
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-hoodi-erigon3-archive: ethereum-hoodi-erigon3-archive:
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_HOODI_ERIGON3_VERSION:-v3.5.0} image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_HOODI_ERIGON3_VERSION:-v3.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -53,6 +53,10 @@ services:
- 19715:19715/udp - 19715:19715/udp
- 29715:29715 - 29715:29715
- 29715:29715/udp - 29715:29715/udp
- 34715:34715
- 34715:34715/udp
- 39715:39715
- 39715:39715/udp
expose: expose:
- 8545 - 8545
- 5555 - 5555
@@ -79,6 +83,8 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=34715
- --p2p.allowed-ports=39715
- --port=14715 - --port=14715
- --prune.mode=archive - --prune.mode=archive
- --rpc.evmtimeout=${ETHEREUM_HOODI_ERIGON3_ARCHIVE_TRACE_EVMTIMEOUT:-5m0s} - --rpc.evmtimeout=${ETHEREUM_HOODI_ERIGON3_ARCHIVE_TRACE_EVMTIMEOUT:-5m0s}
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-hoodi-erigon3-minimal: ethereum-hoodi-erigon3-minimal:
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_HOODI_ERIGON3_VERSION:-v3.5.0} image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_HOODI_ERIGON3_VERSION:-v3.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -53,6 +53,10 @@ services:
- 17832:17832/udp - 17832:17832/udp
- 27832:27832 - 27832:27832
- 27832:27832/udp - 27832:27832/udp
- 32832:32832
- 32832:32832/udp
- 37832:37832
- 37832:37832/udp
expose: expose:
- 8545 - 8545
- 5555 - 5555
@@ -78,6 +82,8 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=32832
- --p2p.allowed-ports=37832
- --persist.receipts=false - --persist.receipts=false
- --port=12832 - --port=12832
- --prune.mode=minimal - --prune.mode=minimal
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-hoodi-erigon3: ethereum-hoodi-erigon3:
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_HOODI_ERIGON3_VERSION:-v3.5.0} image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_HOODI_ERIGON3_VERSION:-v3.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -53,6 +53,10 @@ services:
- 16857:16857/udp - 16857:16857/udp
- 26857:26857 - 26857:26857
- 26857:26857/udp - 26857:26857/udp
- 31857:31857
- 31857:31857/udp
- 36857:36857
- 36857:36857/udp
expose: expose:
- 8545 - 8545
- 5555 - 5555
@@ -78,6 +82,8 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=31857
- --p2p.allowed-ports=36857
- --persist.receipts=false - --persist.receipts=false
- --port=11857 - --port=11857
- --prune.mode=full - --prune.mode=full
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-mainnet-erigon3-archive: ethereum-mainnet-erigon3-archive:
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.5.0} image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -53,6 +53,10 @@ services:
- 16675:16675/udp - 16675:16675/udp
- 26675:26675 - 26675:26675
- 26675:26675/udp - 26675:26675/udp
- 31675:31675
- 31675:31675/udp
- 36675:36675
- 36675:36675/udp
expose: expose:
- 8545 - 8545
- 5555 - 5555
@@ -79,6 +83,8 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=31675
- --p2p.allowed-ports=36675
- --port=11675 - --port=11675
- --prune.mode=archive - --prune.mode=archive
- --rpc.evmtimeout=${ETHEREUM_MAINNET_ERIGON3_ARCHIVE_TRACE_EVMTIMEOUT:-5m0s} - --rpc.evmtimeout=${ETHEREUM_MAINNET_ERIGON3_ARCHIVE_TRACE_EVMTIMEOUT:-5m0s}
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-mainnet-erigon3-minimal: ethereum-mainnet-erigon3-minimal:
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.5.0} image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -53,6 +53,10 @@ services:
- 19614:19614/udp - 19614:19614/udp
- 29614:29614 - 29614:29614
- 29614:29614/udp - 29614:29614/udp
- 34614:34614
- 34614:34614/udp
- 39614:39614
- 39614:39614/udp
expose: expose:
- 8545 - 8545
- 5555 - 5555
@@ -78,6 +82,8 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=34614
- --p2p.allowed-ports=39614
- --persist.receipts=false - --persist.receipts=false
- --port=14614 - --port=14614
- --prune.mode=minimal - --prune.mode=minimal
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-mainnet-erigon3: ethereum-mainnet-erigon3:
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.5.0} image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_MAINNET_ERIGON3_VERSION:-v3.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -53,6 +53,10 @@ services:
- 19616:19616/udp - 19616:19616/udp
- 29616:29616 - 29616:29616
- 29616:29616/udp - 29616:29616/udp
- 34616:34616
- 34616:34616/udp
- 39616:39616
- 39616:39616/udp
expose: expose:
- 8545 - 8545
- 5555 - 5555
@@ -78,6 +82,8 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=34616
- --p2p.allowed-ports=39616
- --persist.receipts=false - --persist.receipts=false
- --port=14616 - --port=14616
- --prune.mode=full - --prune.mode=full
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-sepolia-erigon3-archive: ethereum-sepolia-erigon3-archive:
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_SEPOLIA_ERIGON3_VERSION:-v3.5.0} image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_SEPOLIA_ERIGON3_VERSION:-v3.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -53,6 +53,10 @@ services:
- 18317:18317/udp - 18317:18317/udp
- 28317:28317 - 28317:28317
- 28317:28317/udp - 28317:28317/udp
- 33317:33317
- 33317:33317/udp
- 38317:38317
- 38317:38317/udp
expose: expose:
- 8545 - 8545
- 5555 - 5555
@@ -79,6 +83,8 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=33317
- --p2p.allowed-ports=38317
- --port=13317 - --port=13317
- --prune.mode=archive - --prune.mode=archive
- --rpc.evmtimeout=${ETHEREUM_SEPOLIA_ERIGON3_ARCHIVE_TRACE_EVMTIMEOUT:-5m0s} - --rpc.evmtimeout=${ETHEREUM_SEPOLIA_ERIGON3_ARCHIVE_TRACE_EVMTIMEOUT:-5m0s}
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-sepolia-erigon3-minimal: ethereum-sepolia-erigon3-minimal:
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_SEPOLIA_ERIGON3_VERSION:-v3.5.0} image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_SEPOLIA_ERIGON3_VERSION:-v3.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -53,6 +53,10 @@ services:
- 16087:16087/udp - 16087:16087/udp
- 26087:26087 - 26087:26087
- 26087:26087/udp - 26087:26087/udp
- 31087:31087
- 31087:31087/udp
- 36087:36087
- 36087:36087/udp
expose: expose:
- 8545 - 8545
- 5555 - 5555
@@ -78,6 +82,8 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=31087
- --p2p.allowed-ports=36087
- --persist.receipts=false - --persist.receipts=false
- --port=11087 - --port=11087
- --prune.mode=minimal - --prune.mode=minimal
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-sepolia-erigon3: ethereum-sepolia-erigon3:
image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_SEPOLIA_ERIGON3_VERSION:-v3.5.0} image: ${ETHEREUM_ERIGON3_IMAGE:-erigontech/erigon}:${ETHEREUM_SEPOLIA_ERIGON3_VERSION:-v3.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -53,6 +53,10 @@ services:
- 16930:16930/udp - 16930:16930/udp
- 26930:26930 - 26930:26930
- 26930:26930/udp - 26930:26930/udp
- 31930:31930
- 31930:31930/udp
- 36930:36930
- 36930:36930/udp
expose: expose:
- 8545 - 8545
- 5555 - 5555
@@ -78,6 +82,8 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=31930
- --p2p.allowed-ports=36930
- --persist.receipts=false - --persist.receipts=false
- --port=11930 - --port=11930
- --prune.mode=full - --prune.mode=full
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
ethereum-hoodi-geth: ethereum-hoodi-geth:
image: ${ETHEREUM_GETH_IMAGE:-ethereum/client-go}:${ETHEREUM_HOODI_GETH_VERSION:-v1.17.4} image: ${ETHEREUM_GETH_IMAGE:-ethereum/client-go}:${ETHEREUM_HOODI_GETH_VERSION:-v1.17.3}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -103,7 +103,7 @@ services:
- traefik.http.routers.ethereum-hoodi-geth-pruned-pebble-path.middlewares=ethereum-hoodi-geth-pruned-pebble-path-stripprefix, ipallowlist - traefik.http.routers.ethereum-hoodi-geth-pruned-pebble-path.middlewares=ethereum-hoodi-geth-pruned-pebble-path-stripprefix, ipallowlist
ethereum-hoodi-geth-node: ethereum-hoodi-geth-node:
image: ${ETHEREUM_NIMBUS_IMAGE:-statusim/nimbus-eth2}:${ETHEREUM_HOODI_NIMBUS_VERSION:-multiarch-v26.6.2} image: ${ETHEREUM_NIMBUS_IMAGE:-statusim/nimbus-eth2}:${ETHEREUM_HOODI_NIMBUS_VERSION:-multiarch-v26.5.0}
user: root user: root
ports: ports:
- 16917:16917 - 16917:16917
@@ -126,9 +126,7 @@ services:
- --web3-url=http://ethereum-hoodi-geth:8551 - --web3-url=http://ethereum-hoodi-geth:8551
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
ethereum-hoodi-geth: - ethereum-hoodi-geth
condition: service_started
restart: true
networks: networks:
- chains - chains
volumes: volumes:

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