From a4aab5dc4a0687a72a1a1b888b909d762f0fcc84 Mon Sep 17 00:00:00 2001 From: Kamil118 Date: Sat, 1 Aug 2026 14:36:18 +0000 Subject: [PATCH] reworked backup.sh --- backup.sh | 127 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 113 insertions(+), 14 deletions(-) mode change 100644 => 100755 backup.sh diff --git a/backup.sh b/backup.sh old mode 100644 new mode 100755 index 3f08f37..3a23917 --- a/backup.sh +++ b/backup.sh @@ -1,15 +1,114 @@ #!/bin/bash -sudo tar -cvpzf /home-backup.tar.gz \ - --exclude='home/debian/jellyfin/jellyfin-media-remote' \ - --exclude='home/debian/jellyfin/media' \ - --exclude='home/debian/jellyfin/media_mount' \ - --exclude='home/debian/jellyfin/media_disk.img' \ - --exclude='home/debian/.dotnet' \ - --exclude='home/debian/.vscode-server' \ - --exclude='*data/appdata_*/preview*' \ - --exclude='home/debian/.docker' \ - --exclude='home/debian/.acme.sh' \ - --exclude='home/debian/palworld/palworld/Pal/Binaries' \ - --exclude='home/debian/palworld/palworld/Engine' \ - --exclude='home/debian/palworld/palworld/Pal/Content' \ - /home/debian + +exec 9> /home/debian/backup.lock +flock -n 9 || exit 1 + +set -e + +# List all required tools +REQUIRED_TOOLS=("xz" "gpg" "rsync" "rclone" "tar" "sed" "cut" "xargs") + +# Loop through and check each tool +for tool in "${REQUIRED_TOOLS[@]}"; do + if ! command -v "$tool" &> /dev/null; then + echo "$tool is not installed. Please install it first." + exit 1 + fi +done + +mkdir -p postgres_backup + +cleanup_services() { + echo "Resuming normal operations..." + # Disable Nextcloud maintenance mode + docker exec -u www-data nextcloud_app php occ maintenance:mode --off || true + # Start all services back up (using start instead of stop) + docker start gitea jellyfin synapse-foxgirls || true + + rm -rf postgres_backup +} + +trap cleanup_services EXIT INT TERM + +echo "Pausing services..." +docker exec -u www-data nextcloud_app php occ maintenance:mode --on || true +docker stop gitea jellyfin synapse-foxgirls || true + + +( + source docker/synapse/.env + docker exec postgres pg_dumpall -U "$PSQL_NAME" --globals-only > postgres_backup/globals.sql + docker exec postgres pg_dump -U "$PSQL_NAME" -d "$PSQL_DB_NAME" > postgres_backup/synapse.sql +) + +( + source gitea/.env + docker exec postgres pg_dump -U "$DB_UNAME" -d "$DB_NAME" > postgres_backup/gitea.sql +) + +( + source nextcloud/.env + docker exec postgres pg_dump -U "$DB_UNAME" -d "$DB_NAME" > postgres_backup/nextcloud.sql +) + +BACKUP_FOLDER="/backups" +BACKUP_DATE=$(date +"%Y-%m-%d_%H-%M") +BASE_NAME="${BACKUP_FOLDER}/full_backup_${BACKUP_DATE}" + +mkdir "${BASE_NAME}_tmp" + +sudo rsync -avR --numeric-ids palworld/{compose.yaml,.env,palworld/Pal/Saved/SaveGames,adminPage} \ + synapse-data2/{homeserver.yaml,homeserver.db,foxgirls.date.log.config,foxgirls.date.signing.key,media_store/local_content,media_store/local_thumbnails} \ + docker/synapse/{.env,compose.yaml} \ + uptime-kuma \ + reverse_proxy \ + nextcloud/{compose.yaml,Dockerfile,.env,nextcloud_data/config} \ + jellyfin/{compose.yaml,mount.sh,cache,config} \ + homepage \ + gitea \ + postgres_backup \ + "${BASE_NAME}_tmp/" + +#backup has been created, remove the cleanup trap, restore services before uploading backup +cleanup_services + +cleanup_files() +{ + if [[ -d "${BASE_NAME}_tmp" ]]; then + sudo rm -rf "${BASE_NAME}_tmp" + fi + +} +trap cleanup_files EXIT INT TERM + +#compress, encrypt, and send the backup to b2 here +source .env #BACKUP_PASS, BACKUP_REMOTE + +echo "Compressing and encrypting backup..." +sudo tar -C "${BACKUP_FOLDER}" -cf - "full_backup_${BACKUP_DATE}_tmp" | \ + xz -T0 | \ + gpg --batch --yes --passphrase "$BACKUP_PASS" --pinentry-mode loopback -c -o "${BASE_NAME}.tar.xz.gpg" +echo "Backup Created! ${BASE_NAME}.tar.xz.gpg" + +echo "Uploading backup..." +rclone copy "${BASE_NAME}.tar.xz.gpg" "${BACKUP_REMOTE}" \ + --log-file="$HOME/backup.log" \ + --retries 3 +echo "Backup uploaded!" + +#remove local backups once there are more then 10 +echo "Evaluating local retention..." +cd "$BACKUP_FOLDER" +find . -maxdepth 1 -type f -name "full_backup_*.tar.xz.gpg" -printf '%T@ %p\n' | \ + sort -rn | \ + sed '1,10d' | \ + cut -d' ' -f2- | \ + xargs -I {} sudo rm -f {} + +#cleanup B2 +echo "Evaluating remote retention..." +rclone delete "${B2_REMOTE}" --min-age 60d --rmdirs --log-file="$HOME/backup.log" + +echo "Backup Complete" + +#todo make something to test bakcups \ No newline at end of file