How to Run Your Own Base Node
A Base node gives you a private, unmetered endpoint on chain ID 8453. Like every OP Stack chain it runs two services — an execution client and a rollup/consensus driver — plus one dependency people underestimate: a synced Ethereum L1 endpoint (execution and beacon) that your node reads constantly. This guide is the official Docker-based mainnet setup on Ubuntu.
Before you copy-paste an older tutorial: since the Azul upgrade (May 28, 2026), Base has dropped op-geth and nethermind entirely, and op-node is replaced by base-consensus. The supported stack is base-reth-node (Reth-based execution) + base-consensus, and env vars moved from OP_NODE_* to BASE_NODE_*. Guides written before mid-2026 describe a stack that no longer syncs — old op-geth data must be discarded.
Hardware requirements
| Resource | Requirement | Notes |
|---|---|---|
| CPU | 8+ modern cores | Good single-core performance matters. |
| RAM | 32 GB (64 GB recommended) | |
| Disk | Locally attached NVMe | Docs formula: 2 × current chain size + snapshot size + 20% buffer. With a full node at ~3.4 TB today, provision 8 TB. ext4 recommended for Reth; networked storage strongly discouraged. |
| L1 access | Ethereum RPC + beacon | A full (not archive) L1 node is sufficient. |
Step 1: clone the official repo and configure L1
Base ships its node as a docker-compose project (standalone binaries exist on the releases page if you prefer bare-metal, but the documented path is Docker):
git clone https://github.com/base/node.git base-node && cd base-node # .env.mainnet — set your L1 endpoints: BASE_NODE_L1_ETH_RPC=<your Ethereum execution RPC> BASE_NODE_L1_BEACON=<your Ethereum beacon endpoint>
The L1 endpoints are not a formality: your node reads L1 continuously to derive the Base chain, and the docs warn that initial sync “will consume a vast amount of your requests quota” on third-party L1 providers — a flat-rate Ethereum RPC endpoint (or your own Ethereum node) saves real money here. One security note: the committed .env.mainnet ships a default, publicly known JWT secret for the internal engine API — fine inside the compose network, but generate your own if you ever expose those ports.
Step 2: bootstrap from a snapshot
Don’t sync from genesis — the docs push snapshots hard, and downloads now go through the client CLI (the old tarball endpoints are being decommissioned). Pick your node type carefully — it cannot be changed after the initial sync:
| Type | Size today | What you get |
|---|---|---|
| Minimal | ~720 GB | Latest state + headers only. |
| Full | ~3.4 TB | Default prune settings (~31 days of history). |
| Archive | ~4 TB | All transactions, receipts, and historical state. See full vs archive. |
mkdir ./reth-data base-reth-node download --chain base --full --datadir ./reth-data --resumable
Step 3: start and verify
docker compose up --build -d
# latest block from the execution client:
curl -s -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":0,"method":"eth_getBlockByNumber","params":["latest",false]}' \
http://localhost:8545
# how far behind the chain tip (rollup RPC on 7545):
echo Behind by: $((($(date +%s)-$(curl -s -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":0,"method":"optimism_syncStatus"}' \
http://localhost:7545 | jq -r .result.unsafe_l2.timestamp))/60)) minutes
# right chain? 0x2105 = 8453
curl -s -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' http://localhost:8545Ports: execution RPC on 8545 (WS 8546), the rollup RPC on 7545 (not op-node’s old 9545), p2p ingress on 30303 and 9222 (TCP+UDP). Keep the RPC ports private. Note your node is a follower: it forwards transactions to Base’s sequencer and cannot build blocks itself — that’s the OP Stack trust model, not a misconfiguration.
What it really costs to run
- Mandatory upgrades on a monthly cadence. Mid-2026 alone: Azul (May 28 deadline), Beryl (June), and a required storage migration by mid-August. Each release names a date; miss it and your node stops following the chain.
- Storage migrations sometimes mean re-downloading. Base’s own guidance for the recent Reth storage change: a fresh snapshot is faster than migrating your existing data. Budget for multi-TB re-bootstraps as a recurring event, not a one-off.
- You’re running Ethereum infrastructure too. The L1 execution + beacon dependency means either a second server (your own Ethereum node) or a paid L1 endpoint whose quota your sync will chew through.
- The node-type decision is permanent. Archive ↔ full ↔ minimal conversions are unsupported — choose wrong and you re-sync from scratch.
- One node is a single point of failure. Production wants redundancy, health checks, and a freshness check — see Self-Hosted Node vs RPC Provider for the full math.
…or skip all of it
SwiftNodes runs load-balanced Base nodes for you — flat-rate pricing, HTTP + WebSocket, archive access on paid plans, no KYC — alongside 75+ other chains under one API key. No upgrade deadlines, no L1 quota math.
Grab a key at swiftnodes.io and point your app at https://rpc.swiftnodes.io/rpc/base?key=YOUR_API_KEY.