Setting up an Ethereum full node is a powerful step toward participating in the decentralized web. Whether you're a developer, validator, or blockchain enthusiast, running your own node gives you direct access to the Ethereum network—without relying on third-party services. This comprehensive guide walks you through the entire process of deploying a fully synchronized Ethereum execution client (Geth) and consensus client (Prysm) on a Linux server, optimized for performance and reliability.
Why Run an Ethereum Full Node?
Running a full node allows you to independently verify transactions, contribute to network security, and support decentralization. With both execution and consensus layers active, your node participates in block validation and helps maintain the integrity of the Ethereum blockchain.
This guide focuses on setting up a dual-client architecture, which has become standard since The Merge. We'll use:
- Geth as the execution client
- Prysm as the consensus (beacon chain) client
We’ll also ensure secure communication between them using JWT authentication.
Recommended Server Specifications
To run an Ethereum full node smoothly, especially during initial sync, your server must meet certain hardware and network requirements. Below are the minimum recommended specifications:
Operating System: Linux (Ubuntu 22.04 LTS preferred)
CPU: 16 cores (32 threads recommended)
RAM: 128 GB
Bandwidth: 1 Gbps symmetric (upload/download)
Storage: >4 TB SSD (NVMe preferred), dedicated data disk
Region: USA or low-latency geographic zone💡 The setup detailed here used Ubuntu 22.04, 32-core CPU with 64 threads, 128GB RAM, 4TB SSD, and 1Gbps symmetric bandwidth—ideal for fast synchronization and long-term stability.
👉 Discover how running a node enhances your blockchain experience and unlocks advanced tools.
Step 1: Prepare Your System Environment
Before installing any Ethereum clients, ensure your system is updated and equipped with essential development tools.
Update System Packages
sudo apt update && sudo apt upgrade -yInstall Git
sudo apt install git -yInstall Go (Golang)
Go is required to compile the Geth client from source. You need Go 1.19 or higher.
wget https://go.dev/dl/go1.19.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/binAdd Go to your shell profile (~/.bashrc or ~/.profile) to make it persistent:
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrcVerify installation:
go versionExpected output:
go version go1.19 linux/amd64🔧 If the above fails, manually compile and install the latest version from golang.org.
Install Screen (Session Manager)
Use screen to keep your node processes running in the background.
sudo apt install screen -yStep 2: Deploy Ethereum Clients
We'll now install both the consensus client (Prysm) and the execution client (Geth).
Create Directory Structure
cd /
sudo mkdir eth
cd eth
sudo mkdir consensus executionInstall Prysm (Consensus Client)
Navigate to the consensus directory and download Prysm:
cd /eth/consensus/prysm
curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.shGenerate JWT secret for secure communication between clients:
./prysm.sh beacon-chain generate-auth-secretThis creates a jwt.hex file at /eth/consensus/prysm/jwt.hex.
Install Geth (Execution Client)
Clone the official Go-Ethereum repository and build Geth from source:
cd /eth/execution
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make gethAfter compilation, the binary will be located at:
./build/bin/geth👉 Learn how self-hosted nodes empower true ownership of digital assets.
Step 3: Launch the Beacon Chain Client (Prysm)
Start Prysm’s beacon chain in a detached screen session:
screen -S prysm
./prysm.sh beacon-chain \
--execution-endpoint=http://localhost:8551 \
--jwt-secret=/eth/consensus/prysm/jwt.hexPress Ctrl+A, then D to detach from the session while keeping it running.
This connects Prysm to your local Geth instance via the execution endpoint and uses JWT for secure authentication.
Step 4: Launch the Execution Client (Geth)
Now start Geth with appropriate flags for performance and inter-client communication.
screen -S eth
./geth \
--cache 10240 \
--datadir ./node \
--ws \
--ws.port 8546 \
--ws.addr 0.0.0.0 \
--ws.origins '*' \
--authrpc.addr localhost \
--authrpc.port 8551 \
--authrpc.vhosts localhost \
--maxpeers=300 \
--authrpc.jwtsecret /eth/consensus/prysm/jwt.hex \
--state.scheme=pathParameter Explanation
--cache: Allocates memory for faster sync (10240 MB = ~10GB RAM)--datadir: Sets data storage path (default:./node)--ws.*: Enables WebSocket RPC access for dApps--authrpc.*: Secures authenticated RPC endpoint used by Prysm--maxpeers: Increases peer connections for better sync speed--state.scheme=path: Uses efficient state storage scheme introduced in recent Geth versions
Detach from screen with Ctrl+A, then D.
Step 5: Monitor Node Synchronization Status
Once both clients are running, monitor their sync progress.
Attach to Geth Console
./geth attach http://localhost:8545⚠️ If you changed the RPC port, adjust accordingly.
Check synchronization status:
> eth.syncingSample output:
{
currentBlock: 14290861,
highestBlock: 14297354,
knownStates: 297473485,
pulledStates: 297473485,
startingBlock: 14270385
}If eth.syncing returns false, your node is fully synced.
Additional useful commands:
> net.peerCount // View number of connected peers
> eth.blockNumber // Get current block heightCommon Issues & Troubleshooting
Node synchronization can take time—typically 48 to 72 hours under optimal conditions. Here are common issues and solutions:
Issue 1: Geth Stalls at a Specific Block
- ✅ Solution: Restart Geth with
--syncmode snapor reinitialize with a fresh datadir. - Ensure sufficient RAM and SSD I/O performance.
Issue 2: Prysm Waits Indefinitely for Execution Layer
- ✅ Cause: Misconfigured JWT secret or incorrect authrpc settings.
- ✅ Fix: Confirm both clients use the same
jwt.hexfile and correct ports (8551).
Issue 3: Slow Sync Speed
- Upgrade to NVMe SSD if using SATA SSD.
- Increase
--cachevalue (e.g., up to 16384). - Ensure stable, high-bandwidth network connection.
📌 Pro Tip: Use a geographically close VPS provider to reduce latency. Our setup in the USA reached full sync within ~72 hours.
Frequently Asked Questions (FAQ)
Q1: How long does it take to sync an Ethereum full node?
Initial sync typically takes 2–4 days with high-end hardware and fast storage. Factors like SSD type, RAM, and network speed significantly affect duration.
Q2: Can I run this setup on consumer hardware?
Yes, but syncing may take over a week on lower-spec machines. For reliable operation, stick to recommended specs.
Q3: What is the purpose of the JWT secret?
The JWT secret enables secure communication between Geth (execution) and Prysm (consensus), preventing unauthorized access to the authenticated RPC interface.
Q4: Do I need to open specific firewall ports?
Yes:
- 30303/TCP & UDP for Geth P2P traffic
- 13000/TCP & 12000/UDP for Prysm beacon chain
Configure your firewall accordingly:
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
sudo ufw allow 13000/tcp
sudo ufw allow 12000/udpQ5: Is this setup suitable for staking?
Yes! Once synced, you can connect a validator client to Prysm and begin staking ETH. Ensure your system runs 24/7 with stable power and internet.
Q6: Where can I verify my node's public status?
Use Etherscan's Node Tracker or similar tools to check if your node appears in the network.
Final Thoughts
Running an Ethereum full node is not just technical—it’s a commitment to decentralization. With proper configuration, your node becomes a trusted gateway to the blockchain, empowering you with privacy, control, and participation.
Whether you're building dApps, validating blocks, or simply exploring Web3, a self-hosted node puts you in full control.
👉 Explore next-generation crypto tools that work seamlessly with your full node setup.
Core Keywords: Ethereum full node setup, Geth node configuration, Prysm beacon chain, run Ethereum node, ETH consensus client, Ethereum execution client, Linux node deployment, blockchain synchronization