DATE
Mirrored from my phlog. Source URI: see appendix.

Actually own your BTC by running bitcoind on your (Debian, Linux) server.

This is in preperation for another project I’m working on, too.

I like to use the prune

Installing Bitcoin Core on Debian

Install the depends:

sudo apt update
sudo apt install software-properties-common
sudo apt install wget gpg

Download from the official Bitcoin Core website: https://bitcoincore.org/en/download/

Verify the download using GPG to ensure it wasn’t tampered with.

export VERSION="28.0"
wget "https://bitcoincore.org/bin/bitcoin-core-${VERSION}/SHA256SUMS"
wget "https://bitcoincore.org/bin/bitcoin-core-${VERSION}/SHA256SUMS.asc"
wget "https://bitcoincore.org/bin/bitcoin-core-${VERSION}/bitcoin-${VERSION}-x86_64-linux-gnu.tar.gz"
sha256sum --ignore-missing --check SHA256SUMS

To go further with verification, namely to find an author to trust and verify the GPG signature, read the instructions on the Bitcoin Core website.

https://bitcoincore.org/en/download/

tar -xvf "bitcoin-${VERSION}-x86_64-linux-gnu.tar.gz"
cd "bitcoin-${VERSION}"

Copy binaries:

sudo install -m 0755 -o root -g root -t /usr/local/bin bin/*

Create the data dir:

mkdir -p ~/.bitcoin

Configuring

Edit ~/.bitcoin/bitcoin.conf:

# Run as a server
server=1

# Enable pruning (size in MB)
prune=550

# RPC username and password (set these to something secure)
rpcuser=yourusername
rpcpassword=yoursecurepassword

# Reduce disk space and bandwidth usage
maxconnections=20

# Optionally, run only on Tor for enhanced privacy
onlynet=onion
proxy=127.0.0.1:9050

# Enable logging (optional)
debug=1

First run

Run as background daemon:

bitcoind -daemon

Monitor sync process:

bitcoin-cli getblockchaininfo

Autostart with systemd

Create systemd service file:

sudo vi /etc/systemd/system/bitcoind.service

Service file contents (use YOUR username):

# Install this in /etc/systemd/system/
# See below for more details and options
# https://raw.githubusercontent.com-/bitcoin/bitcoin/76deb30550b2492f9c8d9f0302da32025166e0c5/contrib/init/bitcoind.service
# Then run following to always start:
# systemctl enable bitcoind
#
# and the following to start immediately:
# systemctl start bitcoind

[Unit]
Description=Bitcoin daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/bitcoind-start.sh
TimeoutStartSec=600

# Process management
####################

Type=forking
PIDFile=/home/baudrillard/.bitcoin/bitcoind.pid
Restart=on-failure

# Directory creation and permissions
####################################

# Run as bitcoin:bitcoin or <youruser>
User=youruser
Group=youruser

# Hardening measures
####################

# Provide a private /tmp and /var/tmp.
PrivateTmp=true

# Use a new /dev namespace only populated with API pseudo devices
# such as /dev/null, /dev/zero and /dev/random.
PrivateDevices=true

# Deny the creation of writable and executable memory mappings.
MemoryDenyWriteExecute=true

[Install]
WantedBy=multi-user.target

Create script and set the permissions:

sudo vi /usr/local/bin/bitcoind-start.sh

The file:

#!/bin/bash

# Just a simple wrapper to start bitcoind.
#
# If using systemd, simply create a file (e.g. /etc/systemd/system/bitcoind.service)
# from example file below and add this script in ExecStart.
# https://raw.githubusercontent.com-/bitcoin/bitcoin/76deb30550b2492f9c8d9f0302da32025166e0c5/contrib/init/bitcoind.service
#
# Then run following to always start:
# systemctl enable bitcoind
#
# and the following to start immediately:
# systemctl start bitcoind

# If you are mounting a secondary disk, find the UUID of your
# disk and a line entry in /etc/fstab e.g.
#
# UUID=foo-bar-1234 /path-to-dir/.bitcoin ext4 defaults 0 0

set -e

# Let's wait for 30 seconds in case other processes need to come up first.
sleep 30

echo "Starting bitcoind..."

bitcoind --daemon --server -pid=/home/baudrillard/.bitcoin/bitcoind.pid -conf=/home/baudrillard/.bitcoin/bitcoin.conf

echo "Done!"
sudo chmod +x /usr/local/bin/bitcoind-start.sh

Enable:

sudo systemctl enable bitcoind
sudo systemctl start bitcoind
sudo systemctl status bitcoind

Check logs too:

sudo journalctl -u bitcoind.service 

Wallet setup

See which wallets are available:

% bitcoin-cli listwallets      
[
]

I have none, so I’ll create one and encrypt it:

bitcoin-cli createwallet "main_2024-11-23" false false "your-strong-passphrase" false true true false

Check new wallet status:

bitcoin-cli -rpcwallet="main_2024-11-23" getwalletinfo

Ensure it’s added to startup in ~/.bitcoin/bitcoin.conf:

wallet=main_2024-11-23

To ensure the wallet starts on startup:

sudo systemctl restart bitcoind
bitcoin-cli listwallets

Also check to make sure the wallet is actually encrypted, with a bogus password:

bitcoin-cli -rpcwallet="main_2024-11-23" walletpassphrase "asdf" 10

Backup your wallet

Create /home/baudrillard/.bitcoin/backups.

Let’s create this backup script below ~/.bitcoin/backup_script.sh:

#!/bin/bash
# Backup bitcoin 
timestamp=$(date +"%Y-%m-%d_%H-%M-%S")
backup_dir="/home/baudrillard/.bitcoin/backups"
wallet_name="main_2024-11-23"
backup_file="${backup_dir}/${wallet_name}_backup_${timestamp}.dat"
mkdir -p "${backup_dir}" && bitcoin-cli -rpcwallet="${wallet_name}" backupwallet "${backup_file}"
find "${backup_dir}" -name "${wallet_name}_backup_*.dat" -type f | sort | head -n -5 | xargs -r rm -f

Mark as executable chmod +x ~/.bitcoin/backup_script.sh and also add to user cron weekly backup (crontab -e):

0 2 * * 0 /home/baudrillard/.bitcoin/backup_script.sh

Be sure to actually try running this backup script and test if the backup is valid:

bitcoind -datadir=/tmp/bitcoin-test -daemon && sleep 5 && bitcoin-cli -datadir=/tmp/bitcoin-test loadwallet "/path/to/backup/wallet.dat" && bitcoin-cli -datadir=/tmp/bitcoin-test getwalletinfo && bitcoin-cli -datadir=/tmp/bitcoin-test stop

Basic usage

Mining

Original content in gopherspace: gopher://gopher.someodd.zip:70/0/phlog/bitcoin-server.gopher.txt