As I am currently chilling in some basement in Lisbon recovering from a hair transplant surgery (it went well, thanks for asking – more on all that some other day), finally I have enough time on my hands without being constantly distracted by someone’s what they think are the most urgent things in the world at work. Ah, the smell of the end of Q2 and poor time management!
Next week I’m attending Berlin’s Web3 Summit for the first time, and I didn’t feel like going there empty-handed. While there is still so so much for me to learn after years of playing around with crypto and some NFTs, I figured that by now I have enough knowledge and skills to at least put something together.
So I thought – why not set up a server for receiving Bitcoin to my hardware wallets? Just to get the hang of it. I already use (not invest in – leave that to grifters) all kinds of coins quite often in my life, so it’s not like this experiment will go to waste.
Benefits of having my own BTC payment processor
Most of us know the benefits of crypto vs fiat currency when it comes to privacy, speed of settlement, and most importantly – sovereignty. I won’t be debating the duality of these qualities here as there’s enough of that online already. It is a dual-use technology – which means it can be used for good as well, and this will always be my intention.
Therefore the disclaimer: I intend to use this tech and share the guidance for educational purposes. I’m no expert on this. Don’t do anything stupid.
Here are the reasons why I wanted to have my own payment processing server for sending and receiving Bitcoin:
- Increased privacy – as opposed to just having a static BTC address posted somewhere on my page for donations that makes transactions easily traceable for all parties involved (though all transactions are still visible on the blockchain)
- Autonomous – I do not have to fire up my wallet app to generate a new wallet address every time someone wants to transfer me some amount in BTC
- Requires no third-party PSPs as intermediaries – potentially lower overhead costs depending on your server setup and revenue; more privacy
- Supports cold wallets – I use the server to receive the funds directly to my hardware wallet, meaning the private keys to my crypto stay offline, making it harder for hackers to penetrate my wallet’s security
These are the things I needed for my server stack:
- A Virtual Private Server (VPS)
- Web domain I had laying around that I could use for BTC payment links
- BTCPay Server Docker deployment, see minimum specs here
- A hardware wallet
- Ridiculous amounts of patience
Preparing the VPS
In order to not have my electricity bills go through the roof (maybe one day I can afford to build my own grid with renewables), I decided to go for a VPS hosted by Hostinger. They’re based in Lithuania and are very much Web3-friendly. I went for their KVM 2 solution with the following specs:
- 2 vCPU Core
- 8 GB RAM
- 100 GB NVMe Disk Space (my stack took up roughly 70 GB after the blockchain node sync)
- 8 TB Bandwidth
They have a very wide range of services, including vibe-coded online stores and hosted OpenClaw – though I’ve only been using them for web domains and hosting until now. Very happy with their services so far! Shameless referral link here.
Hostinger offers many apps and environments to be installed on the VPS out of the box. After hours of trying to deploy BTCPay using many different options that they have, I decided that less is more and went for a bare-bones Ubuntu 24.04. The rest was set up manually with some advice from AI because I’m stupid and every software engineer does it these days anyway.
Side note on AI use
The LLMs I use run locally on my 16GB M1 Pro Mac using LM Studio to avoid exposing sensitive data like crypto and server keys online. I also get to avoid Big Tech’s data centers taking energy and water from someone who needs those to survive in real life, just because I needed to find out why my nginx instance isn’t routing to a correct port.
Qwen3.5-9b and Ministral 3 3B in particular have been performing very well for such a low amount of memory, and I don’t get bored on flights. Will write more about my local AI setup as soon as I manage to get OpenClaw to work locally without it crashing my entire system even with smallest models every time. I probably need a new Mac with more memory already anyway.
Despite me crashing out about AI here and here, I do not have an issue with the technology itself. The problem to me is how the ultrarich and the corporations they own – Big Tech in particular, exploit it for their own malicious interests. I see great benefit in AI for the humankind and intend to use it as ethically as I can. Going forward I will be writing more on that.
Deploying the BTCPay Server to the VPS
Before starting the BTCPay Server deployment, I need to make sure I can access its admin panel online after successful installation. For that I need to add my subdomain (server hostname) A and AAAA DNS records to point at the VPS’ IPv4 and IPv6 respectively, because BTCPay server’s nginx instance requires IPv6 for SSL encryption:

After that I fire up the VPS’ terminal and install PostgreSQL, as it is required for the BTCPay Server deployment:
apt install postgresql
Once that is done, we’re safe to deploy the BTCPay Server build. After the setup is concluded, the config page should be accessible via the hostname URL.
At first after deployment I have been experiencing issues with BTCPay Server running properly – it would crash a few times after starting up, or wouldn’t launch after I needed to reboot my VPS. What helped me was cleaning up unused Docker containers on the VPS, and rebuilding the ones for BTCPay:
btcpay-down.sh
docker system prune -a --volumes
(use the above line only if there’s nothing else but BTCPay using Docker on your VPS as it basically wipes everything on its way that is not used; consider doing a dry run beforehand)
btcpay-up.sh
For me it was all smooth sailing after that.
Configuring BTCPay and linking the hardware wallet
After creating the Owner type account for the server, the config page will ask to install BTCPay Server Vault on your machine in order to connect the server to a hardware/cold wallet:

That is the setup I went for, using my Ledger Nano S for storing crypto private keys offline. It worked reliably for me for many years but I would advise to go for the Plus model as mine was recently discontinued. A great device for those starting out with crypto!
Of course there are other options for linking wallets – storing private keys on the server being one. But I decided to go for the safest option.
I left the server to run for a day so that it syncs with the blockchain. Things like customising your store are available during this process, just don’t expect to start receiving money right away. Once the sync is done, you can also run an internal Lightning node – that enables BTC transfers with lower transaction costs within the Lightning Network, but I haven’t tested it myself.
After that the server is ready to use! I set up my store and POS to only receive donations, but of course there are plugins to support integration with Shopify and other e-commerce services for making actual sales. I just don’t need that yet.
There is still some fleshing out I need to do with this server, but even now it already does what I needed it to do. I tested the donation flows end-to-end, as well as tried paying out from the wallet. The hardware wallet’s balance is visible to me from both the server and Ledger Wallet app, and the payouts worked as intended.
And since you’re reading this, why not try it out yourself? Your girl has been spending a lot of money on hormones lately, so every penny is more than welcome.