Home / Guides / How to run a Bitcoin full node on a VPS or dedicated server
How-to

How to run a Bitcoin full node on a VPS or dedicated server

Install Bitcoin Core from the official download, keep chainstate on local NVMe, and open 8333 if you want inbound peers.

BitCloudVPS Bitcoin node abstract: lattice and local NVMe slabs
Short answer

Install Bitcoin Core from the official download, put chainstate on local NVMe, and open 8333 if you want inbound peers. Prune if you do not need the full archive.

Why people do this

A full node lets you verify blocks yourself instead of trusting a remote API. Bitcoin Core is the reference client. Bitcoin Core: running a full node is the operator checklist: disk, prune vs archival, inbound peers, and time to initial sync. Hosting the node on a VPS is normal; paying that VPS with Bitcoin is optional poetry, not a requirement.

Business $24/mo (6 vCPU / 16 GB DDR5) is the production size. Crypto invoice, no KYC.

Launch now

What you do

Playbook
  1. Pruned node: Plus. Archival or heavy dbcache: Pro / Max or Dedicated.
  2. Install from Bitcoin Core. Put blocks/chainstate on NVMe. Do not IBD on a network share.
  3. Open 8333 if you want inbound peers. Optional Tor onion for P2P.
  4. Romania or Iceland are common; Amsterdam if most peers are at EU exchanges.

Limits

Assumevalid and prune are your flags. You run bitcoind on the VPS; BitCloudVPS does not operate the node for you.

Sizing the box: pruned, full archive, and what the disk really holds

The direct answer: a validating Bitcoin node today fits comfortably on a pruned volume of a few hundred gigabytes, and the constraint that actually shapes your VPS choice is sustained disk write throughput during initial block download (IBD), not capacity. Decide pruned versus archive first, then size the plan around I/O.

Pruned mode keeps the full validation data for recent blocks and discards older raw block files once they are verified, storing only the chain of headers and the UTXO set. You still validate every block from genesis — pruning changes what you keep, not what you check. Set it with prune=550 in bitcoin.conf (the value is the target in megabytes; 550 is the practical minimum) and the on-disk footprint stays in the low hundreds of gigabytes, dominated by the UTXO set, the chainstate database, and recent blocks. Archive mode keeps every raw block forever and needs well over half a terabyte and growing — choose it only if you serve blocks to other software, like an indexer or a block explorer, that needs historical data on demand.

RAM matters less than people assume: the chainstate cache is tunable via dbcache, and a node runs fine in 2 GB with default settings, just with slower IBD because fewer blocks are cached between disk flushes. Bumping dbcache to 2048 or 4096 on a 4-8 GB box noticeably shortens IBD by letting bitcoind batch chainstate writes. CPU is nearly irrelevant at rest; during IBD, script validation for blocks with heavy signature load (the historically expensive ones) will pin a core for seconds at a time, and any modern VPS vCPU handles it.

The network line matters for a different reason: IBD downloads roughly the size of the chain plus overhead — hundreds of gigabytes — and a running node then relays traffic to peers continuously, often tens of gigabytes per month serving others. An unmetered port removes the second-guessing entirely; you never have to choose between being a good peer and rationing your uplink. NVMe storage is the one non-negotiable: IBD is a random-write-heavy workload, and spinning disks or network-backed storage turn a two-day sync into a week.

Install and IBD walkthrough on a fresh VPS

The direct answer: the whole setup is five commands and one config file — get the signed binary, verify it, write a minimal bitcoin.conf, start bitcoind, and let IBD run. Do the verification step; it is the one part of this guide you must not skip.

  1. Create a dedicated user: adduser bitcoin --disabled-password. Running the node as a service user keeps the wallet and RPC credentials off the root account.
  2. Download the release binaries and the signed checksums file from bitcoincore.org, then verify the checksum signature against a published signing key fingerprint — sha256sum --ignore-missing --check SHA256SUMS.asc.sig.decoded or, better, verify the git tag for the reproducible build. A node that validates everyone else's transactions but runs unverified code has missed the point.
  3. Unpack to /home/bitcoin/bin and write /home/bitcoin/.bitcoin/bitcoin.conf: server=1, prune=550 (if pruning), dbcache=2048, rpcbind=127.0.0.1, rpcallowip=127.0.0.1, and an rpcuser/rpcpassword pair generated with openssl rand -hex 16. Do not open the RPC port to the world — ever.
  4. Start it: bitcoind -daemon as the bitcoin user, or better, install a systemd unit with Restart=on-failure so a crash or an OOM during IBD self-heals.
  5. Watch it work: bitcoin-cli getblockchaininfo shows headers racing ahead of blocks; verificationprogress climbs toward 0.9999. Expect one to three days depending on disk and dbcache. Rebooting mid-IBD is safe — bitcoind resumes from its last flushed state.

While it syncs, resist adding sidecars — Lightning, indexers, wallets. Every competing process steals IOPS from IBD. Bolt things on after getblockchaininfo reports fully validated.

How to verify your node is doing validation, not just syncing

The direct answer: a node is trustworthy exactly when it validates independently, so run four checks — sync status, peer quality, self-validation of a known block, and a banner comparison against a second source. Each catches a different class of silent failure.

First, confirm you are caught up and honest: bitcoin-cli getblockchaininfo — headers and blocks equal, verificationprogress near 1, and initialblockdownload false. Second, check your peer set: bitcoin-cli getpeerinfo | jq '.[].services' — you want a mix of full-node peers advertising full block service, and bitcoin-cli getconnectioncount in the double digits. A node stuck to a handful of light peers is trusting their view of the chain tip more than it should.

Third, the trust check that matters: fetch a recent block header through your own node and compare it against an independent source. bitcoin-cli getblockstats $(bitcoin-cli getblockcount) or bitcoin-cli getblock $(bitcoin-cli getbestblockhash) — then confirm the hash matches what the rest of the network reports. If your node's best block diverges from consensus, that is exactly the scenario the node exists to catch, and you want to know your alerting works. Bitcoin Core shows a warning banner when the chain disagrees with its checkpoints; on a headless server, watch for warnings in getblockchaininfo instead.

Fourth, prove the wallet-free path is clean. If you run the node for verification only, keep disablewallet=1 in the config — fewer attack surfaces, no key material on a rented box, smaller memory footprint. Then your wallet lives elsewhere (hardware device, your own machine) and points at this node as its data source. That architecture — private keys local, block data remote but independently validated — is the whole reason people run their own nodes, and it is worth writing down as your acceptance test: no key material on the VPS, full validation on the VPS, RPC bound to localhost.

Privacy: listening, Tor, and keeping your IP out of the P2P graph

The direct answer: by default a listening node broadcasts its IP address across the peer-to-peer network — every peer you connect to sees you, and address propagation spreads your node across the network's gossip. On a no-KYC VPS this is a decision about linking, not identity: the IP is anonymous at signup, but everything that IP does on-chain-adjacent networks is public. Decide what the node's IP should be allowed to reveal.

The strongest setting is to not listen at all and tunnel everything through Tor. In bitcoin.conf: listen=0 (do not accept inbound connections on the public IP), proxy=127.0.0.1:9050 with a Tor daemon installed locally, and optionally onlynet=onion to force all P2P traffic through it. Your node then participates fully — validation, sync, and even inbound connections via a Tor hidden service — while its real IP never touches the gossip network. The cost is a modest bandwidth overhead and slightly slower peer discovery. For a validation-only node, that trade is almost always worth it.

The middle setting is a listening node on the plain internet: listen=1, port 8333 open, upnp=0. This makes you a useful peer and is fine when the IP being public is acceptable — which on an anonymously-rented server it often is. What you should not do is mix: running a personal wallet's traffic from your home IP to a node whose listening IP is known to peers you also interact with elsewhere builds a correlation table someone else owns. Pick one identity per node and keep its traffic inside it.

One more leak class: RPC and administration. Bind RPC to localhost, never forward it through the public interface, and administer the box over SSH with key auth only. The P2P privacy hygiene is worth little if the management plane is wide open — scanners find exposed RPC ports within hours, and your node becomes someone else's compute.

Troubleshooting the usual IBD, peer, and RPC failures

The direct answer: five failure patterns cover almost everything you will hit in the first month — slow IBD, stuck sync, peer starvation, disk exhaustion, and RPC lockouts — and each has a symptom you can see in the logs or in bitcoin-cli output before it becomes an outage.

Symptom: IBD crawls at a few blocks per second through historical years. Cause: insufficient dbcache forcing constant chainstate flushes, or slow storage. Fix: raise dbcache within your RAM budget, confirm the disk is NVMe (fio --name=test --rw=randwrite --bs=4k --size=1g — a few hundred MB/s class writes is what IBD wants), and reduce competing processes. Symptom: sync stuck at the same height for an hour. Cause: peer set degraded or a chain fork detection. Fix: check getpeerinfo for stale peers, bitcoin-cli clearbanned if you banned in frustration, restart if the log shows pipetable warnings; the node self-heals from disk.

Symptom: getconnectioncount near zero and inbound attempts absent. Cause: with listen=1, a firewall or the provider's edge filtering port 8333; with Tor, a dead Tor daemon. Fix: verify the port is reachable from outside (nc -zv your-ip 8333 from another machine), restart tor.service if you run onion-only. Symptom: bitcoind dies overnight with log entries about LevelDB write errors or the OOM killer in dmesg. Cause: disk full from a too-small prune target, or RAM overcommitted by a sidecar. Fix: raise prune, delete nothing by hand — pruning is bitcoind's job — and add a systemd MemoryMax so the node degrades instead of the box dying.

Symptom: bitcoin-cli answers "authorization failed" after a reinstall. Cause: a stale .cookie or a config with an old RPC password. Fix: regenerate the cookie path ownership for the service user, or rewrite the rpcuser/rpcpassword pair and restart. And re-check the lesson from install day: the RPC port must never listen on a public address.

What a small plan handles month after month, and when to step up

The direct answer: a validating node is a light tenant once synced — the day-to-day load is a few gigabytes of block relay, a modest CPU idle, and whatever you add on top — so the entry tier of any serious VPS line carries it, and you step up only when you bolt on services that read the chain heavily.

The base case: bitcoind validating and relaying. Steady-state network traffic scales with how many peers you serve; a listening node relaying to eight inbound peers pushes tens of gigabytes monthly, which is why an unmetered port changes the psychology — you stop monitoring transfer counters and let the node be a good citizen. Disk grows slowly in pruned mode; the fixed items are the chainstate, the headers, and logs, which you cap with shrinkdebugfile or log rotation. RAM at default dbcache sits under a gigabyte at rest, spiking only during reindex operations.

Step up the plan when one of these lands on the same box. A Lightning node: channel management adds a database with strict fsync requirements — give it its own NVMe headroom and more RAM for the graph. An Electrum-style indexer: it re-reads every block and serves address queries, which converts your node from a light tenant into an I/O-heavy one, and it needs unpruned blocks — this is the workload that actually requires archive storage and a bigger disk. Wallet services with many users: RPC concurrency becomes the limit; more vCPU and a tuned rpcthreads apply. Each of these is a scaling decision you can make later, from the same account, without re-buying the foundation.

The practical shape: start pruned and small, validate that the sync completes and stays healthy for a week, then decide with real numbers — iostat, free -m, peer counts — instead of guessing sizes upfront. The node itself is the cheapest honest infrastructure you will ever run.

BitCloudVPS Starter · 2 vCPU, 4 GB ECC, 60 GB NVMe · unmetered port

Deploy a node host in 60 seconds

Connecting wallets and apps to your node without leaking anything

The direct answer: the point of running your own node is that your wallet stops asking someone else's server for balances and history — but a badly wired connection re-creates the leak you were escaping. The rule is simple: the node validates, the keys stay with you, and the channel between them never exposes more than it must.

Local machine to VPS node is the common topology, and the safe pattern is an SSH tunnel, not an open RPC port: ssh -L 8332:127.0.0.1:8332 user@node-host, then the wallet's RPC settings point at 127.0.0.1:8332 as if the node were local. No port is exposed to the internet, the traffic is encrypted end to end, and authentication is your SSH key — not an RPC password riding plaintext. Wallets that speak directly to full nodes over RPC (Sparrow, Specter, and similar) all support this; some also support connecting over Tor to a hidden service, which removes even the need to trust the tunnel's endpoint visibility.

What your node sees when a wallet connects: the addresses and xpubs you query, which is exactly the linkage data a third-party node provider would have collected. This is the upgrade — you traded "a company logs my addresses" for "my own server knows my addresses," which is no leak at all as long as the server stays yours: administered only by you, backed up, and acquired through the same anonymous rails as everything else in the stack. A node you share with a group splits that property: every member's wallet queries touch the same box, so a shared node is a shared trust decision, worth making explicitly.

Two hygiene items close the section. Keep disablewallet=1 unless this node specifically signs transactions — most VPS nodes should never hold keys. And when an app asks for RPC access, give it a dedicated rpcuser/rpcpassword pair, not the admin one, so a compromised app is a revocable credential rather than full node control. The acceptance test from earlier still governs: no key material on the VPS, RPC bound to localhost, full validation on the box.

Log rotation, disk hygiene, and the monthly maintenance pass

The direct answer: a healthy node needs about fifteen minutes a month — rotate logs, check disk headroom against the prune target, review peer counts and warnings, and confirm the systemd unit survived reboots. Skip the pass and the failure modes are boring but real: a log file eating the disk, a prune target overtaken by growth, a node quietly running stale software.

Logs: debug.log grows continuously, faster with debug=* categories enabled. Set shrinkdebugfile=1 in the config — bitcoind truncates it at startup — and add logrotate for the systemd journal if you run verbose units. Disk: pruned nodes hold a roughly fixed footprint, but the chainstate grows slowly with UTXO set size, and sidecars (Lightning, indexers) grow faster; df -h monthly with a standing rule to act at 80% is cheaper than an emergency resize. If you do raise the prune target, know that bitcoind reclaims space lazily — deleting old block files on its own schedule — so a raise followed by an immediate disk check reads confusingly.

Health review: getblockchaininfo for warnings (any text here deserves a read — it is how Core tells you the chain disagrees or your clock drifted), getconnectioncount for peer health, getnettotals for traffic sanity, and bitcoin-cli -netinfo for a one-screen summary of everything at once. Updates: check the release channel monthly, read the notes, apply with the package manager, restart, and re-run the verification checks from earlier — the same four commands every time, which is what makes them a habit rather than a document.

The last item is the one people skip until it hurts: rehearse recovery. Restore the config directory and signing-adjacent state to a spare box once a year, start bitcoind against it, and watch it sync — proving that your runbook, not just your backups, still works. A node is the rare service where full reconstruction from scratch is always possible; the maintenance pass is what keeps that property true.

Operating the node after the sync: the honest maintenance list

Once a Bitcoin full node has synced — the initial block download is the big event, sized on this network by the storage line's 1–5 TB NVMe tiers at $24–$56/mo — the operating reality is smaller than the setup: incremental validation of new blocks, mempool upkeep, and version upgrades a few times a year. The maintenance list that keeps a node a good citizen: leave inbound port 8333 open so the node serves peers rather than only consuming them; watch disk headroom against chainstate growth and prune deliberately if the tier demands it (a pruned node on the Business tier's 240 GB NVMe is a legitimate configuration; an archive node wants the 2 TB class or above); and schedule restarts for version upgrades rather than letting uptime anxiety delay them — consensus rules move, and a stale node validates against a network that has moved on.

The hosting-specific notes are where this sheet differs from a home node. Bandwidth is the headline: serving blocks to peers is the node's purpose, and unmetered 1–10 Gbps ports mean it is never throttled or billed — on DE-CIX-class peering (DE-FRA at ~8 ms to AMS, 100 Gbps uplink) the node is a fast peer, which genuinely helps the network. ECC memory across every tier protects against the bit-flips that corrupt validation state, the failure mode home hardware pretends away. And the checkout's posture — token signup, optional email, 19 crypto assets, Harborline Node Ltd. of Saint Kitts and Nevis — matches the institution the node supports: consensus participation is strongest when its participants are ordinary and unremarkable, not registered and billable. Payment in BTC from long-held coins, or in XMR where the payment graph should stay private, both settle the same invoice. Year one of a pruned Business node runs near $288 on the annual term; the network asks little more than that.

Where the limits are (October 2026)

Keep the threat model precise. Anonymous-adjacent hosting removes the host-side identity trail: token-only signup, optional email, no KYC review, crypto invoices that record a txid rather than a name. It does not blind the host to traffic it must carry, it does not make a logged-in panel session anonymous, and it does not protect workloads that identify themselves — an admin login from your home IP defeats the whole design. Exact limits of no-KYC anonymity. OPSEC guide. Full checklist. Payment-side note: chain analysis happens on public blockchains, not at the host. Coin choice and network choice are your OPSEC knobs, and the checkout keeps 19 of them open.

Pruned enough?

For your own wallet, usually yes. Archival is disk and time.

Lightning on the same box?

Yes. See the Lightning workload page. Hosting invoices stay on-chain, not Lightning.

Does a pruned node still fully verify the chain?

<p>Yes. Pruning changes what is stored, not what is validated: a pruned node downloads and checks every block from genesis against the consensus rules and keeps only the chainstate plus recent raw blocks. The one functional loss is serving historical blocks to other peers or to indexers that need old block data — for pure validation and wallet use, pruned is complete. Set <code>prune=550</code> or higher in bitcoin.conf and the disk footprint stays fixed while validation stays whole.</p>

Does a Bitcoin node need unmetered bandwidth?

<p>Not strictly — a wallet-only node relaying modestly can live with a transfer allowance — but a listening node that serves inbound peers moves tens of gigabytes a month, and IBD alone is hundreds of gigabytes on first sync. An unmetered 1-10 Gbps port means you never throttle the node's contribution to the network or delay a re-sync out of transfer anxiety. For infrastructure you run continuously and forget, flat bandwidth removes the one bill surprise a node can produce.</p>

What does the host actually know about me?

Whatever you hand over: a signup token, an optional email address, the invoice you paid and the service traffic. No ID documents, no phone number, no KYC step exists to hand anything else over.

What won't an anonymous VPS protect against?

Self-inflicted links: personal logins from a home IP, leaked cookies, services that publish your address, and on-chain patterns that tie wallets together. The server removes one identifier; it does not fix operational mistakes.

Primary sources

Ready to launch?

Configure a VPS or dedicated server, set a password, then pay the invoice.

Network

Edge RTT

Uptime · 36h

Complaints · 36h

Pick a city