Skip to content

Personal

Bitcoin Full Node in Docker

A Bitcoin full node that reaches the network only over Tor and keeps the full transaction index, configured for asking questions about the chain rather than for validating one wallet.

Oct 2025BitcoinInfrastructure

A Compose stack that brings up a Bitcoin full node, a Tor proxy, a Mempool dashboard, a block explorer, and a small Python client for talking to the node from a script.

Stack
Bitcoin Core v27 · Tor · Mempool · BTC RPC Explorer
Networking
onlynet=onion, no clearnet peers
Index
txindex=1, prune=0 · roughly 600 GB
Repository
VincenzoImp/bitcoin-fullnode-docker
VincenzoImp/bitcoin-fullnode-dockerDocker setup for a private Bitcoin full node with Tor, a Mempool dashboard and a Python RPC client.Python

The problem

Analysis over Bitcoin usually starts by calling somebody’s API, and that has two costs that only show up later. The provider sees every query, which for chain analysis means telling a third party exactly which addresses you are interested in. And the answers arrive already shaped: whatever the endpoint chose to expose, at whatever granularity.

What I built

Five containers on one network. The node’s configuration is where the decisions are.

onlynet=onion with the Tor proxy means the node connects to peers only through Tor. There is no clearnet fallback: the node’s network activity does not associate an IP address with the fact that it is running, and queries do not leave the machine at all.

txindex=1 with prune=0 keeps a complete index of every transaction, which is what makes the node answer arbitrary lookups rather than only questions about its own wallet. The Python client wraps the RPC interface in about ten methods – blocks, transactions, mempool, peers, fee estimates, address balances – so a notebook can query the chain directly.

Hard parts

Tor-only costs you the initial sync. Downloading several hundred gigabytes through onion circuits is materially slower than over clearnet, and it makes the node’s availability depend on Tor’s. That is the price of not announcing an IP, and it is paid once, at the worst possible moment: the beginning.

The full index is most of the disk. Six hundred gigabytes buys the ability to ask about any transaction ever made. A pruned node would fit in a fraction of that and answer almost nothing useful for analysis, so the storage is not overhead here: it is the feature.