reworked backup.sh
This commit is contained in:
1 parent
1be601c95e
commit
a4aab5dc4a
1 file changed
+113
-14
@@ -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
|
||||||
Reference in new issue
Block a user