Files
server-config/backup.sh
T
2026-08-22 18:32:43 +00:00

117 lines
3.4 KiB
Bash
Executable File

#!/bin/bash
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 \
diun/compose.yaml \
wireguard \
"${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 "${BACKUP_REMOTE}" --min-age 60d --rmdirs --log-file="$HOME/backup.log"
echo "Backup Complete"
#todo make something to test bakcups
#gpg --batch -d --passphrase "password_here" full_backup_2026-08-19_01-00.tar.xz.gpg | xz -d -T0 | tar xf -