How to Set Up BTCPay for Self-Hosted Crypto Payment Processing

Learn how to take control over your own crypto payment processing with BTCPay.

Publish date: 3/1/2025

If you want to accept Bitcoin (and many more kinds of crypto, such as Ethereum, Litecoin, or Monero) payments without depending on third parties, BTCPay is your answer.

The challenge, though? A full Bitcoin node consumes over 600GB of storage at the time of writing — which can be a significant expense when paying for hosting (and this is only Bitcoin). The solution? Running a pruned node, which gives you the same validation benefits while using as little as 60GB of space, depending on what crypto currencies you want to support. Quite a bit less space to say the least.

That said, in this guide, I'll walk you through how to set up a pruned BTCPay server. Let's dive in.

What is BTCPay and why use pruning?

BTCPay Server is an open-source, self-hosted payment processor that lets you accept Bitcoin and other cryptocurrencies directly, without intermediaries taking fees or controlling your funds. When you run BTCPay Server, payments go straight to your wallet—no middlemen, no permission needed.

By default, Bitcoin nodes download the entire blockchain history (over 600GB and growing). Pruning is a Bitcoin Core feature that discards older transaction data after verification, keeping only recent blocks and the UTXO set (unspent transaction outputs). This dramatically reduces storage requirements.

First things first

For a pruned BTCPay server, you'll need a server or VPS with:

  • 2+ CPU cores
  • 2GB RAM minimum (4GB+ suggested)
  • 80GB+ storage (room for OS, a pruned blockchain, and BTCPay configuration files)
  • Docker support

xTom's V.PS platform is perfect for this. You can grab a plan here, such as our "Premium" package that'll work perfectly for self-hosting a BTCPay server. Otherwise, make sure you have a server with the minimum specs above.

Also:

  • A domain name for your BTCPay server
  • Basic command line familiarity
  • SSH client (built into macOS/Linux, PuTTY for Windows)

Now let's set up your BTCPay server.

Step 1: Secure and prepare your server

For my server, I've picked Ubuntu 22.04 LTS, as it's currently the officially recommended Linux distribution by BTCPay, but anything that supports Docker should work.

If you’re using another distribution, you’ll need to adjust certain commands (like changing apt to dnf/yum etc.). There may be minor differences for Debian as well.

Connect to your server using SSH as root:

ssh root@your_server_ip

Update the system

apt update && apt upgrade -y

Install essential packages

apt install -y apt-transport-https ca-certificates curl gnupg software-properties-common ufw

Set up basic firewall rules

ufw allow ssh
ufw allow http
ufw allow https
ufw enable

Step 2: Install Docker and Docker Compose

BTCPay uses Docker for easy deployment.

On Ubuntu, you can install Docker with:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update
apt install -y docker-ce docker-compose
systemctl enable --now docker

For Debian 12, we have a guide here. Other distributions are similar but may require different commands.

Step 3: Install BTCPay with pruning enabled

Still as root, do the following:

mkdir -p ~/btcpay
cd ~/btcpay
git clone https://github.com/btcpayserver/btcpayserver-docker
cd btcpayserver-docker

Run your BTCPay setup parameters

export BTCPAY_HOST="btcpay.EXAMPLE.com"
export NBITCOIN_NETWORK="mainnet"
export BTCPAYGEN_CRYPTO1="btc"
export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage-s"
export BTCPAYGEN_REVERSEPROXY="nginx"
export BTCPAYGEN_LIGHTNING="clightning"
export BTCPAY_ENABLE_SSH=true

Note: The opt-save-storage-s fragment enables pruning, using about 60GB for Bitcoin’s blockchain data. For additional BTCPay settings available, such as enabling additional crypto currencies, view their documentation here.

Configure your BTCPay domain

In your domain registrar or DNS provider, create an A record pointing to your server’s IP:

Type: A
Host: btcpay (or any subdomain you like)
Value: Your_Server_IP
TTL: 3600

After DNS propagation (1-24 hours), BTCPay will automatically configure SSL using Let’s Encrypt when you access your domain.

Run the BTCPay Server setup script

The setup script must be sourced (not simply executed) so that its environment exports persist in your current shell.

Run:

. ./btcpay-setup.sh -i

(The leading . is crucial—it means "source this script.")

This process will take some time as it downloads Docker images, configures containers, and starts synchronizing the Bitcoin blockchain in pruned mode.

Step 4: Access and set up your BTCPay server

Once installation is complete and DNS has propagated:

  1. Open your browser and navigate to https://your-domain.com
  2. Create an administrator account
  3. Set up your first store
  4. Configure your Bitcoin wallet

How to manage your pruned node

To verify your node is pruned:

cd ~/btcpay/btcpayserver-docker
./bitcoin-cli.sh getblockchaininfo

Look for:

  • "pruned": true — Confirms pruning is enabled
  • "pruneheight" — Oldest block stored
  • "size_on_disk" — Current blockchain data usage

Check BTCPay services:

./btcpay-status.sh

Update BTCPay:

./btcpay-update.sh

Backup best practices

Even with a pruned node, regular backups are essential.

Create backups of:

  1. Your BTCPay Server configuration:
cp ~/btcpay/btcpayserver-docker/.env ~/backups/env-$(date +%Y%m%d).backup
  1. Your Bitcoin wallet file:
cd ~/btcpay/btcpayserver-docker
./bitcoin-cli.sh backupwallet ~/backups/wallet-$(date +%Y%m%d).backup

Troubleshooting common issues

Synchronization seems stuck

Bitcoin initial synchronization can take days.

To check progress:

./bitcoin-cli.sh getblockchaininfo

Compare "blocks" with "headers" to see how far along you are.

Out of disk space

If you run out of space despite pruning:

  1. Check your pruning configuration:
grep BITCOIN_PRUNE ~/btcpay/btcpayserver-docker/.env
  1. Consider increasing your storage

Connection issues

If you can't connect to your BTCPay Server:

  1. Verify your firewall allows HTTP/HTTPS traffic (the following is for UFW):
sudo ufw status
  1. Check if your containers are running:
cd ~/btcpay/btcpayserver-docker
docker-compose ps

Conclusion

Setting up a pruned BTCPay server gives you the perfect balance of sovereignty and efficiency. You maintain full control over your payment processing, it's easy to setup, and just works. What more is there to want out of a payment processor?

As mentioned above our VPS line will work great for a BTCPay server, but if you're looking to expand beyond a VPS, xTom offers a full range of solutions to support your growth, from dedicated servers with abundant storage for full nodes to colocation services for your own hardware. Check out xTom's services page to explore all options.

Thanks for reading, and here's to control over your own payment processing! ;-)

Frequently asked questions about BTCPay

What is the difference between a pruned and full Bitcoin node?

A full Bitcoin node stores the entire blockchain history (over 600GB), while a pruned node only keeps recent blocks and the UTXO set after validating the entire chain. Pruned nodes provide the same security benefits while using significantly less storage.

How much storage does a pruned BTCPay server need?

A pruned BTCPay Server can run comfortably on a 80GB NVMe VPS from xTom's V.PS platform. The Bitcoin blockchain data will use approximately 60GB (depending on your pruning settings), with the rest available for the BTCPay Server application, database, and future growth.

Will a pruned node affect my ability to accept Bitcoin payments?

No. A pruned BTCPay Server can process payments just as effectively as one running on a full node. The pruning process only removes historical data after validation, not information about current unspent outputs needed for payment processing.

How long does initial synchronization take on xTom's infrastructure?

With xTom's high-performance NVMe storage and reliable network, initial Bitcoin synchronization typically takes less than one day with pruning enabled. This varies based on network conditions, and your chosen VPS specifications. Higher-tier V.PS plans with more CPU cores will synchronize faster.

Can I upgrade from a pruned to a full node later?

Yes, but you'll need to start synchronization from scratch. If you anticipate needing a full node in the future, consider xTom's dedicated servers with larger storage capacities instead of a VPS solution.

Is a pruned BTCPay server secure for business transactions?

Absolutely. A pruned node validates the entire blockchain just like a full node — it simply discards older blocks after verification. Your pruned BTCPay server maintains the same security properties as a full node for current transactions.

Do I need technical knowledge to maintain a BTCPay server?

Basic Linux command line skills are helpful for maintenance and troubleshooting. However, once set up, a BTCPay server requires minimal intervention, mostly consisting of occasional updates.