Run Chainstack Nodes on a Dedicated Server
Self-host a full or archive blockchain node on bare metal you don't share. Bring your own node to Chainstack (BYOC), keep root and IPMI from day one, and drop the rate limits that come with a managed endpoint.
What you can do with Chainstack on a dedicated server
Chainstack is managed blockchain infrastructure for 70+ chains. Run a dedicated server, and you handle the node yourself, while Chainstack's tooling manages it.
Run a full or archive node with no rate limits
Bring Your Own Cloud (BYOC)
Power a production dApp or RPC backend
Index at scale — every transaction, no sampling
Run a validator or staking node
Consolidate multi-chain nodes on one box
How to deploy a Chainstack node on a dedicated server
A full Ethereum node takes hours to days to sync and an archive node needs multiple terabytes. These steps take you from an empty box to a syncing node with a working RPC endpoint. Hardening, monitoring, and reverse-proxy setup are listed as next steps at the end.
Step 01 — Order the server and get access
Pick a config from the block above (a single-chain full node fits the smaller NVMe tier). After provisioning, you receive the IP, root credentials, and IPMI details by email. Connect over SSH:
ssh root@YOUR_SERVER_IPIPMI lets you reinstall or console in if the OS won't boot, without a support ticket.
Step 02 — Prepare the NVMe for chain data
Confirm the drives are present and mount the one that will hold chain state:
lsblkmkfs.ext4 /dev/nvme1n1mkdir -p /data/ethereummount /dev/nvme1n1 /data/ethereumecho '/dev/nvme1n1 /data/ethereum ext4 defaults 0 0' >> /etc/fstabKeep chain data on the dedicated NVMe, not the root disk.
Step 03 — Install the execution client
Install Geth from the official PPA:
add-apt-repository -y ppa:ethereum/ethereumapt update && apt install -y ethereumgeth versionStep 04 — Install a consensus client
Post-Merge Ethereum needs a consensus client alongside Geth. Install Lighthouse and generate the shared JWT secret the two clients authenticate with:
openssl rand -hex 32 | tr -d '\n' > /data/ethereum/jwt.hexPoint Lighthouse at Geth's engine API on port 8551.
Step 05 — Start Geth and expose the RPC endpoint
Run Geth against the NVMe path and enable the HTTP-RPC API:
geth --datadir /data/ethereum \ --authrpc.jwtsecret /data/ethereum/jwt.hex \ --http --http.api eth,net,web3 \ --http.addr 0.0.0.0 --http.port 8545Binding to 0.0.0.0 exposes the endpoint on all interfaces — fine while you verify, but lock it down before production.
Step 06 — Run as a service and confirm the sync
Wrap Geth in a systemd unit so it survives reboots and restarts on failure, then watch the sync begin:
systemctl enable --now gethgeth attach --exec 'eth.syncing'While syncing you'll see the block numbers rising:
{ currentBlock: 2148740, highestBlock: 21463991, ...}When eth.syncing returns false, the node is fully synced and the RPC endpoint is live.
Step 07 — Verify the endpoint answers
From your app server, confirm the node responds to a JSON-RPC call:
curl -s -X POST http://YOUR_SERVER_IP:8545 \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'A hex block number in the response means your self-hosted node is serving requests.
Next steps (do these before production): restrict the RPC port with UFW and a reverse proxy, add TLS, set up monitoring for peer count and disk usage, and — if you're using Chainstack BYOC — connect the node to your self-hosted Chainstack project so it appears in the console.
Common gotchas
Sync looks stuck at a low block for hours. That's usually normal for the state-download phase, not a fault. Check peer count with admin.peers.length in geth attach — if it's zero, your firewall is blocking the P2P port (30303). Open it and peers will come.
Disk fills up faster than expected. You deployed an archive node by accident. Full (“snap”) sync keeps recent state; archive keeps everything and needs multiple TB. Confirm which mode you started, and size the NVMe to the mode, not the other way around.
RPC endpoint refuses connections from your app. Geth binds to localhost unless told otherwise. Either it's not started with --http.addr 0.0.0.0, or a firewall rule is dropping 8545. Check both before assuming the node is broken.
is*hosting infrastructure is a solid base for Chainstack
Bare metal, not a slice of it
A high-core AMD EPYC platform, hundreds of gigabytes of RAM, no hypervisor in the path. Chain sync is I/O-bound, and nothing else competes for the disk. Root and IPMI from the first boot.
NVMe built for chain state
Archive nodes hammer storage with random reads that wear out consumer SSDs. Enterprise NVMe in multi-drive configurations, with soft-RAID set up at deployment, is built for that workload.
DDoS-protected, migration included
Free DDoS protection in the Netherlands, rated 95% effective, and free project migration if you're moving a node off another host. Our own hardware in Tier-3+ data centers across five locations, monitored 24/7.