btcpayserver-docker
btcpayserver-docker copied to clipboard
add BACKUP_TIMESTAMP to btcpay-backup.sh
I migrated the BACKUP_TIMESTAMP functionality to save the backup with datetime as part of the file name from the old backup.sh.
If my change is accepted, I plan to update the documentation to include information on the newly added environment variable.
I remember we discussed adding those options, but went for the simplest approach which can then be extended with custom wrapper scripts. Free to open it up for dicussion again though.
I understand and like the importance of maintaining simplicity and consistency in the repository. The BACKUP_TIMESTAMP could provide a more convenient and automated approach to backup management, without the need for custom wrapper scripts (I personally don't like custom scripts in Docker-related processes).
As said, I'm not opposing oppening it up for discussing — especially since I also use that functionality. Meanwhile, here's my wrapper script:
#!/bin/bash
BACKUP_FILE=/var/lib/docker/volumes/backup_datadir/_data/backup.tar.gz
BACKUP_DIR=/root/backups
cd /root/btcpayserver-docker
./btcpay-backup.sh
file=btcpay-$(date "+%Y%m%d-%H%M%S").tar.gz
cp $BACKUP_FILE $BACKUP_DIR/$file
rm $BACKUP_FILE
find $BACKUP_DIR/btcpay-* -mtime +14 -delete
#!/bin/bash -e
set -o pipefail -o errexit
Please be aware of these important issues:
- Old channel state is toxic and you can loose all your funds, if you or someone
else closes a channel based on the backup with old state - and the state changes
often! If you publish an old state (say from yesterday's backup) on chain, you
WILL LOSE ALL YOUR FUNDS IN A CHANNEL, because the counterparty will publish a
revocation key!
if [ "$(id -u)" != "0" ]; then printf "\n🚨 This script must be run as root.\n" printf "➡️ Use the command 'sudo su -' (include the trailing hypen) and try again.\n\n" exit 1 fi
preparation
if [[ "$OSTYPE" == "darwin"* ]]; then # Mac OS BASH_PROFILE_SCRIPT="$HOME/btcpay-env.sh" else # Linux BASH_PROFILE_SCRIPT="/etc/profile.d/btcpay-env.sh" fi
. "$BASH_PROFILE_SCRIPT"
docker_dir=$(docker volume inspect generated_btcpay_datadir --format="{{.Mountpoint}}" | sed -e "s%/volumes/.*%%g") postgres_dump_name=postgres.sql.gz btcpay_dir="$BTCPAY_BASE_DIRECTORY/btcpayserver-docker" backup_dir="$docker_dir/volumes/backup_datadir/_data" postgres_dump_path="$docker_dir/$postgres_dump_name" backup_path="$backup_dir/backup.tar.gz"
ensure backup dir exists
if [ ! -d "$backup_dir" ]; then mkdir -p $backup_dir fi
cd $btcpay_dir . helpers.sh
Postgres database
postgres_container=$(docker ps -a -q -f "name=postgres_1") if [ -z "$postgres_container" ]; then printf "\n" echo "ℹ️ Postgres container is not up and running. Starting BTCPay Server …" docker volume create generated_postgres_datadir docker-compose -f $BTCPAY_DOCKER_COMPOSE up -d postgres
printf "\n" postgres_container=$(docker ps -a -q -f "name=postgres_1") if [ -z "$postgres_container" ]; then echo "🚨 Postgres container could not be started or found." exit 1 fi fi
printf "\n" echo "ℹ️ Dumping Postgres database …" { docker exec $postgres_container pg_dumpall -c -U postgres | gzip > $postgres_dump_path echo "✅ Postgres database dump done." } || { echo "🚨 Dumping Postgres database failed. Please check the error message above." exit 1 }
Optional: MariaDB database
mariadb_container=$(docker ps -a -q -f "name=mariadb_1") if [ ! -z "$mariadb_container" ]; then mariadb_dump_name=mariadb.sql.gz mariadb_dump_path="$docker_dir/$mariadb_dump_name"
MariaDB container exists and is running - dump it
printf "\n" echo "ℹ️ Dumping MariaDB database …" { docker exec $mariadb_container mysqldump -u root -pwordpressdb -A --add-drop-database | gzip > $mariadb_dump_path echo "✅ MariaDB database dump done." } || { echo "🚨 Dumping MariaDB database failed. Please check the error message above." exit 1 } fi
BTCPay Server backup
printf "\nℹ️ Stopping BTCPay Server …\n\n" btcpay_down
printf "\n" cd $docker_dir echo "ℹ️ Archiving files in $(pwd)…"
{
tar
--exclude="volumes/backup_datadir"
--exclude="volumes/generated_btcpay_datadir/data/host"
--exclude="volumes/generated_bitcoin_datadir/_data"
--exclude="volumes/generated_litecoin_datadir/_data"
--exclude="volumes/generated_elements_datadir/_data"
--exclude="volumes/generated_xmr_data/_data"
--exclude="volumes/generated_dogecoin_datadir/_data/blocks"
--exclude="volumes/generated_dogecoin_datadir/_data/chainstate"
--exclude="volumes/generated_dash_datadir/_data/blocks"
--exclude="volumes/generated_dash_datadir/_data/chainstate"
--exclude="volumes/generated_dash_datadir/_data/indexes"
--exclude="volumes/generated_dash_datadir/_data/debug.log"
--exclude="volumes/generated_mariadb_datadir"
--exclude="volumes/generated_postgres_datadir"
--exclude="volumes/generated_electrumx_datadir"
--exclude="volumes/generated_lnd_bitcoin_datadir/_data/data/graph"
--exclude="volumes/generated_clightning_bitcoin_datadir/_data/lightning-rpc"
--exclude="**/logs/"
-cvzf $backup_path $postgres_dump_name $mariadb_dump_name volumes/generated_*
echo "✅ Archive done."
if [ ! -z "$BTCPAY_BACKUP_PASSPHRASE" ]; then printf "\n" echo "🔐 BTCPAY_BACKUP_PASSPHRASE is set, the backup will be encrypted." { gpg -o "$backup_path.gpg" --batch --yes -c --passphrase "$BTCPAY_BACKUP_PASSPHRASE" $backup_path rm $backup_path backup_path="$backup_path.gpg" echo "✅ Encryption done." } || { echo "🚨 Encrypting failed. Please check the error message above." printf "\nℹ️ Restarting BTCPay Server …\n\n" cd $btcpay_dir btcpay_up exit 1 } fi } || { echo "🚨 Archiving failed. Please check the error message above." printf "\nℹ️ Restarting BTCPay Server …\n\n" cd $btcpay_dir btcpay_up exit 1 }
printf "\nℹ️ Restarting BTCPay Server …\n\n" cd $btcpay_dir btcpay_up
printf "\nℹ️ Cleaning up …\n\n" rm $postgres_dump_path
printf "✅ Backup done => $backup_path\n\n"