diff --git a/home.admin/config.scripts/bonus.lnbits.sh b/home.admin/config.scripts/bonus.lnbits.sh index 9b93998aa..8873174ea 100644 --- a/home.admin/config.scripts/bonus.lnbits.sh +++ b/home.admin/config.scripts/bonus.lnbits.sh @@ -19,6 +19,8 @@ if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then echo "bonus.lnbits.sh prestart" echo "bonus.lnbits.sh repo [githubuser] [branch]" echo "bonus.lnbits.sh sync" + echo "bonus.lnbits.sh backup" + echo "bonus.lnbits.sh restore [?FILE]" echo "bonus.lnbits.sh migrate" exit 1 fi @@ -209,6 +211,12 @@ Consider adding a IP2TOR Bridge under OPTIONS." OPTIONS+=(SWITCH-LND "Switch: Use LND as funding source") fi + # Backup database + OPTIONS+=(BACKUP "Backup database") + if [ -d /mnt/hdd/app-data/backup ]; then + OPTIONS+=(RESTORE "Restore database") + fi + # Migrate SQLite to PostgreSQL if [ -e /mnt/hdd/app-data/LNBits/database.sqlite3 ]; then OPTIONS+=(MIGRATE-DB "Migrate SQLite to PostgreSQL database") @@ -265,6 +273,66 @@ Consider adding a IP2TOR Bridge under OPTIONS." read key exit 0 ;; + BACKUP) + clear + /home/admin/config.scripts/bonus.lnbits.sh backup + echo + echo "Backup done" + echo "PRESS ENTER to continue" + read key + exit 0 + ;; + RESTORE) + clear + # check if backup exist + source <(/home/admin/_cache.sh get LNBitsDB) + if [ "${LNBitsDB}" == "PostgreSQL" ]; then + backup_target="/mnt/hdd/app-data/backup/lnbits_db" + backup_file=$(ls -t $backup_target/*.sql | head -n1) + else + backup_target="/mnt/hdd/app-data/backup/lnbits_sqlite" + backup_file=$(ls -t $backup_target/*.tar | head -n1) + fi + if [ "$backup_file" = "" ]; then + echo "ABORT - No Backup found to restore from" + exit 1 + else + # build dialog to choose backup file from menu + OPTIONS_RESTORE=() + + counter=0 + cd $backup_target + for f in `find *.* -maxdepth 1 -type f`; do + [[ -f "$f" ]] || continue + counter=$(($counter+1)) + OPTIONS_RESTORE+=($counter "$f") + done + + WIDTH_RESTORE=66 + CHOICE_HEIGHT_RESTORE=$(("${#OPTIONS_RESTORE[@]}/2+1")) + HEIGHT_RESTORE=$((CHOICE_HEIGHT_RESTORE+7)) + CHOICE_RESTORE=$(dialog --clear \ + --title " LNbits - Backup restore" \ + --ok-label "Select" \ + --cancel-label "Back" \ + --menu "Choose one of the following backups:" \ + $HEIGHT_RESTORE $WIDTH_RESTORE $CHOICE_HEIGHT_RESTORE \ + "${OPTIONS_RESTORE[@]}" \ + 2>&1 >/dev/tty) + + # start restore with selected backup + clear + if [ "$CHOICE_RESTORE" != "" ]; then + backup_file=${backup_target}/${OPTIONS_RESTORE[$(($CHOICE_RESTORE*2-1))]} + /home/admin/config.scripts/bonus.lnbits.sh restore "${backup_file}" + echo + echo "Restore done" + echo "PRESS ENTER to continue" + read key + fi + exit 0 + fi + ;; MIGRATE-DB) clear dialog --title "MIGRATE LNBITS" --yesno " @@ -285,7 +353,7 @@ This can fail for unknown circumstances. Revert of this process is possible afte read key fi exit 0 - ;; + ;; *) clear exit 0 @@ -965,12 +1033,97 @@ if [ "$1" = "0" ] || [ "$1" = "off" ]; then exit 0 fi +# backup +if [ "$1" = "backup" ]; then + source <(/home/admin/_cache.sh get LNBitsDB) + echo "# Start Backup LNBits ${LNBitsDB} database" + if [ "${LNBitsDB}" == "PostgreSQL" ]; then + # postgresql backup + sudo /home/admin/config.scripts/bonus.postgresql.sh backup lnbits_db + else + # sqlite backup + backup_target="/mnt/hdd/app-data/backup/lnbits_sqlite" + backup_file="lnbits_sqlite_`date +%d`-`date +%m`-`date +%Y`_`date +%H`-`date +%M`_fs.tar" + if [ ! -d $backup_target ]; then + sudo mkdir -p $backup_target 1>&2 + fi + # Delete old backups (keep last 3 backups) + sudo chown -R admin:admin $backup_target + ls -tp $backup_target/*.tar | grep -v '/$' | tail -n +4 | tr '\n' '\0' | xargs -0 rm -- 2>/dev/null + + cd $backup_target + sudo tar -cf $backup_file -C "/mnt/hdd/app-data" LNBits/ + echo "OK - Backup finished, file saved as ${backup_target}/${backup_file}" + fi + sudo systemctl start lnbits + exit 0 +fi + +# restore +if [ "$1" = "restore" ]; then + source <(/home/admin/_cache.sh get LNBitsDB) + if [ "${LNBitsDB}" == "PostgreSQL" ]; then + echo "# Restore PostgreSQL database" + if [ "$2" != "" ]; then + backup_file=$2 + sudo /home/admin/config.scripts/bonus.postgresql.sh restore lnbits_db lnbits_user raspiblitz "${backup_file}" + else + sudo /home/admin/config.scripts/bonus.postgresql.sh restore lnbits_db lnbits_user raspiblitz + fi + else + backup_target="/mnt/hdd/app-data/backup/lnbits_sqlite" + if [ ! -d $backup_target ]; then + echo "# ABORT - No backups found" + exit 1 + else + echo "# Restore SQLite database" + cd $backup_target + + if [ "$2" != "" ]; then + if [ -e $2 ]; then + backup_file=$2 + else + echo "ABORT - File not found (${2})" + exit 1 + fi + else + # find recent backup + backup_file=$(ls -t $backup_target/*.tar | head -n1) + fi + + echo "Start restore from backup ${backup_file}" + + # unpack backup file + sudo tar -xf $backup_file || exit 1 + echo "Unpack backup successful, backup current db now ..." + + # backup current db + /home/admin/config.scripts/bonus.lnbits.sh backup + + # apply backup data + sudo rm -R /mnt/hdd/app-data/LNBits/ + sudo chown -R lnbits:lnbits LNBits/ + sudo mv LNBits/ /mnt/hdd/app-data/ + + echo "Remove restored backup file" + sudo rm -f $backup_file + + echo "OK - Apply backup data successful" + fi + fi + + sudo systemctl start lnbits + exit 0 +fi + +# revert migrate to postgresql if [ "$1" = "migrate" ] && [ "$2" = "revert" ]; then /home/admin/config.scripts/blitz.conf.sh set LNBitsMigrate "on" revertMigration exit 0 fi +# migrate if [ "$1" = "migrate" ]; then if [ -e /mnt/hdd/app-data/LNBits/database.sqlite3 ]; then @@ -997,7 +1150,7 @@ if [ "$1" = "migrate" ]; then sudo bash -c "echo 'LNBITS_DATA_FOLDER=/mnt/hdd/app-data/LNBits' >> /home/lnbits/lnbits/.env" #sudo -u lnbits git checkout ${tag} - sudo -u lnbits git reset --hard f3b720b690c533b4b28793209f5a71fd01b9af6e # good tested after BIGINT fix (#1030) + sudo -u lnbits git reset --hard 4f05c6c12e284d4a322a9041d19f66d01afa205b # good tested after BIGINT fix (#1135) /home/admin/config.scripts/bonus.lnbits.sh sync || exit 1 # stop after sync was done sudo systemctl stop lnbits @@ -1041,7 +1194,7 @@ if [ "$1" = "migrate" ]; then revertMigration exit 1 else - echo "# Convert successful" + echo "# OK - Convert successful" fi # cleanup old sqlite data directory @@ -1058,9 +1211,9 @@ if [ "$1" = "migrate" ]; then # setting value in raspi blitz config /home/admin/config.scripts/blitz.conf.sh set LNBitsMigrate "off" - echo "# OK migration done" + echo "# OK - migration done" else - echo "# No SQLite data found to migrate from" + echo "# ABORT - No SQLite data found to migrate from" fi sudo systemctl start lnbits @@ -1068,4 +1221,4 @@ if [ "$1" = "migrate" ]; then fi echo "FAIL - Unknown Parameter $1" -exit 1 +exit 1 \ No newline at end of file diff --git a/home.admin/config.scripts/bonus.postgresql.sh b/home.admin/config.scripts/bonus.postgresql.sh old mode 100755 new mode 100644 index 45e3e13ea..1a085abfb --- a/home.admin/config.scripts/bonus.postgresql.sh +++ b/home.admin/config.scripts/bonus.postgresql.sh @@ -4,11 +4,20 @@ if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then echo "config script to install PostgreSQL" echo "bonus.postgresql.sh [on|off]" + echo "bonus.postgresql.sh [backup] [database]" + echo "bonus.postgresql.sh [restore] [database] [user] [password]" + echo "bonus.postgresql.sh [info]" exit 1 fi +command=$1 +db_name=$2 +db_user=$3 +db_user_pw=$4 +db_backupfile=$5 + # switch on -if [ "$1" = "1" ] || [ "$1" = "on" ]; then +if [ "$command" = "1" ] || [ "$command" = "on" ]; then # https://github.com/rootzoll/raspiblitz/issues/3218 echo "# Install PostgreSQL" @@ -80,15 +89,91 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then fi # switch off -if [ "$1" = "0" ] || [ "$1" = "off" ]; then +if [ "$command" = "0" ] || [ "$command" = "off" ]; then + # setting value in raspiblitz config echo "*** REMOVING POSTGRESQL ***" sudo apt remove -y postgresql - sudo systemctl stop postgresql 2>/dev/null + sudo systemctl stop postgresql sudo systemctl disable postgresql echo "OK PostgreSQL removed." exit 0 + fi -echo "FAIL - Unknown Parameter $1" -exit 1 +# backup +backup_target="/mnt/hdd/app-data/backup/$db_name" +backup_file="${db_name}_`date +%d`-`date +%m`-`date +%Y`_`date +%H`-`date +%M`_dump" +if [ ! -d $backup_target ]; then + sudo mkdir -p $backup_target 1>&2 +fi + +# https://www.postgresql.org/docs/current/backup-dump.html +if [ "$command" = "backup" ] && [ "$db_name" != "" ]; then + + echo "*** BACKUP POSTGRESQL $db_name ***" + sudo -u postgres pg_dump $db_name > $backup_target/${backup_file}.sql || exit 1 + # Delete old backups (keep last 3 backups) + sudo chown -R admin:admin $backup_target + ls -tp $backup_target/*.sql | grep -v '/$' | tail -n +4 | tr '\n' '\0' | xargs -0 rm -- 2>/dev/null + echo "OK - backup finished, file saved as $backup_target/${backup_file}.sql" + exit 0 + +fi + +# restore +if [ "$command" = "restore" ] && [ "$db_name" != "" ] && [ "$db_user" != "" ] && [ "$db_user_pw" != "" ]; then + + echo "*** RESTORE POSTGRESQL $db_name ***" + # find recent backup + if [ "$db_backupfile" != "" ]; then + backup_file=$db_backupfile + else + backup_file=$(ls -t $backup_target/*.sql | head -n1) + fi + + if [ ! -e $backup_file ]; then + echo "FAIL - sql file to restore not found in ${backup_target}" + exit 1 + else + echo "Start restore from backup ${backup_file}" + fi + + # clean up + echo "# Clean up old database" + sudo -u postgres psql -c "drop database $db_name;" || exit 1 + sudo -u postgres psql -c "drop user $db_user;" + + # create database and user + echo "# Create fresh database" + sudo -u postgres psql -c "create database $db_name;" + sudo -u postgres psql -c "create user $db_user with encrypted password '$db_user_pw';" + sudo -u postgres psql -c "grant all privileges on database $db_name to $db_user;" + + # restore dump + echo "# Import SQL Dump" + sudo mkdir -p $backup_target/logs 1>&2 + sudo chown -R postgres:postgres $backup_file + sudo -u postgres psql $db_name < ${backup_file} > $backup_target/logs/sql_import.log || exit 1 + echo "$backup_target/sql_import.log written" + echo "OK - database $db_name restored from ${backup_file}" + exit 0 + +fi + +if [ "$command" = "info" ]; then + + check=$(sudo -u postgres psql -c "show data_directory;" | grep data_directory) + if [ "$check" = "" ]; then + echo "show data_directory failed, PostgreSQL not installed?!" + exit 1 + else + sudo -u postgres psql -c "show data_directory;" + sudo -u postgres psql -c "SELECT datname FROM pg_database;" + fi + exit 0 + +fi + +echo "FAIL - Unknown Parameter $command" +exit 1 \ No newline at end of file