reworked backup.sh

This commit is contained in:
Kamil118 committed 2026-08-01 14:36:18 +00:00
1 parent 1be601c95e
commit a4aab5dc4a
1 file changed
+113 -14
Regular → Executable
+113 -14
View File
@@ -1,15 +1,114 @@
#!/bin/bash #!/bin/bash
sudo tar -cvpzf /home-backup.tar.gz \
--exclude='home/debian/jellyfin/jellyfin-media-remote' \ exec 9> /home/debian/backup.lock
--exclude='home/debian/jellyfin/media' \ flock -n 9 || exit 1
--exclude='home/debian/jellyfin/media_mount' \
--exclude='home/debian/jellyfin/media_disk.img' \ set -e
--exclude='home/debian/.dotnet' \
--exclude='home/debian/.vscode-server' \ # List all required tools
--exclude='*data/appdata_*/preview*' \ REQUIRED_TOOLS=("xz" "gpg" "rsync" "rclone" "tar" "sed" "cut" "xargs")
--exclude='home/debian/.docker' \
--exclude='home/debian/.acme.sh' \ # Loop through and check each tool
--exclude='home/debian/palworld/palworld/Pal/Binaries' \ for tool in "${REQUIRED_TOOLS[@]}"; do
--exclude='home/debian/palworld/palworld/Engine' \ if ! command -v "$tool" &> /dev/null; then
--exclude='home/debian/palworld/palworld/Pal/Content' \ echo "$tool is not installed. Please install it first."
/home/debian 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