From 983efdbfcc0f5d0abe637974ab5a4026dcaf680e Mon Sep 17 00:00:00 2001 From: Nico Date: Mon, 19 Jan 2026 19:11:46 +1100 Subject: [PATCH] chore: add backup script --- backup.sh | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100755 backup.sh diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..09c7668 --- /dev/null +++ b/backup.sh @@ -0,0 +1,116 @@ +# stops the script immediately if any error is encountered +set -e + +PINK="\033[35m" +RESET="\033[0m" + +backup_dir() { + # $1 = directory to (relative to backup folder) + # $2 = location of files + + echo -e "$PINK $1: backing up directory $2$RESET" + OUT="$BACKUP_DIR"/"$1" + rsync -avP --no-perms --no-owner --no-group "$2/" "$OUT/" +} + +systemd_stop_and_backup_dir() { + # $1 = service name + # $2 = directory to backup + + echo -e "$PINK $1: stopping service$RESET" + systemctl stop "$1" + + backup_dir "$1" "$2" + + echo -e "$PINK $1: starting service$RESET" + systemctl start "$1" + + echo -e "$PINK $1: DONE$RESET" +} + +systemd_stop_and_backup_dir_arr() { + # excludes a couple not-needed large directories + # present in arr applications + # $1 = service name + # $2 = directory to backup + + echo -e "$PINK $1: stopping service$RESET" + systemctl stop "$1" + + echo -e "$PINK $1: backing up directory $2$RESET" + OUT="$BACKUP_DIR"/"$1" + mkdir --parents "$OUT" + rsync -avP --no-perms --no-owner --no-group --exclude Backups --exclude logs "$2/" "$OUT/" + + echo -e "$PINK $1: starting service$RESET" + systemctl start "$1" + + echo -e "$PINK $1: DONE$RESET" +} + +kanidm_backup() { + echo -e "$PINK kanidm: backing up database to temp file$RESET" + DATABASE_DUMP_PATH=$(mktemp) + chown kanidm:kanidm "$DATABASE_DUMP_PATH" + run0 -u kanidm --unit=kanidmd sh -c "kanidmd database backup \"$DATABASE_DUMP_PATH\"" + + echo -e "$PINK kanidm: copying over to backup location$RESET" + OUT="$BACKUP_DIR/kanidm" + rsync -avP --no-perms --no-owner --no-group "$DATABASE_DUMP_PATH" "$OUT" + rm "$DATABASE_DUMP_PATH" + + echo -e "$PINK kanidm: DONE$RESET" +} + +postgres_backup() { + echo -e "$PINK postgres($1): backing up database $1 to temp file$RESET" + DATABASE_DUMP_PATH=$(mktemp) + chown postgres:postgres "$DATABASE_DUMP_PATH" + run0 -u postgres pg_dump --dbname="$1" --file="$DATABASE_DUMP_PATH" + + echo -e "$PINK postgres($1): copying over to backup location$RESET" + OUT="$BACKUP_DIR/$1" + rsync -avP --no-perms --no-owner --no-group "$DATABASE_DUMP_PATH" "$OUT" + rm "$DATABASE_DUMP_PATH" + + echo -e "$PINK postgres($1): DONE$RESET" +} + +forgejo_backup() { + echo -e "$PINK forgejo: backing up$RESET" + OUT="$BACKUP_DIR"/"forgejo" + + # gets binary name from the systemd service, this works + # with multiple derivations in the nix store and grabs + # the binary of the latest package. + FORGEJO_PATH=$(cat /etc/systemd/system/forgejo.service | grep ExecStart= | sed 's/ExecStart=//' | awk '{print $1;}') + run0 -u forgejo "$FORGEJO_PATH" dump --config /media/git/custom/conf/app.ini -f - > "$OUT" + + echo -e "$PINK forgejo: DONE$RESET" +} + +if [ "$1" = "" ]; then + echo "$0: [BACKUP_DIR]" + exit 1 +fi + +BACKUP_DIR="$1" +echo -e "$PINK using folder $BACKUP_DIR$RESET" +mkdir --parents "$BACKUP_DIR" + +systemd_stop_and_backup_dir_arr radarr /var/lib/radarr +systemd_stop_and_backup_dir_arr sonarr /var/lib/sonarr +systemd_stop_and_backup_dir_arr prowlarr /var/lib/prowlarr +systemd_stop_and_backup_dir uptime-kuma /var/lib/uptime-kuma +backup_dir deluge /media/torrents/files + +# karakeep has multiple services so stop all of them +systemctl stop karakeep-web karakeep-browser karakeep-workers +systemd_stop_and_backup_dir karakeep-web /var/lib/karakeep +systemctl start karakeep-web karakeep-browser karakeep-workers + +kanidm_backup +forgejo_backup +postgres_backup miniflux + +echo -e "\n\nBACKUP COMPLETED!"