backups/backup.sh

97 lines
2.4 KiB
Bash
Raw Normal View History

2025-01-09 16:16:08 +00:00
#!/bin/bash
2025-01-09 18:18:52 +00:00
if [ ! -e /backups/config ]; then
echo "Config not found!"
exit 1
fi
2025-01-09 16:16:08 +00:00
set -a
2025-01-09 18:18:52 +00:00
source /backups/config
2025-01-09 16:16:08 +00:00
set +a
set -e
if [ "$DEBUGGING" -eq 1 ]; then
set -x
fi
# Remove lock:
remove_lock() {
rm /tmp/backup.lock
}
# Error Handling:
error_handling() {
echo "$(date) -> An error occurred!" >&2
if [ "$ENABLE_EMAILS" -eq 1 ]; then
subject="Backup Error -- $SERVER_NAME"
body="An error occurred during backup of $SERVER_NAME!\nThe current time is $(date).\nPlease check server logs!"
if [ "$DEBUGGING" -eq 1 ]; then
sendemail -f $SMTP_FROM -t $SMTP_RECIPIENT -u "$subject" -s $SMTP_SERVER -m "$body" -xu $SMTP_USER -xp $SMTP_PASSWORD -v -o message-charset=$CHARSET
else
sendemail -f $SMTP_FROM -t $SMTP_RECIPIENT -u "$subject" -s $SMTP_SERVER -m "$body" -xu $SMTP_USER -xp $SMTP_PASSWORD -q -o message-charset=$CHARSET
fi
echo "$(date) -> Email sent!"
fi
remove_lock
exit 1
}
trap "error_handling" ERR
trap "remove_lock" SIGINT
if [ "$TEST_ERROR_HANDLING" -eq 1 ]; then
error_handling
exit 1
fi
# Test, then create Lockfile
if [ -e /tmp/backup.lock ]; then
echo "Backups are already running! If in error, manually remove the lockfile!"
2025-01-09 18:18:52 +00:00
exit 1
2025-01-09 16:16:08 +00:00
fi
touch /tmp/backup.lock
# Backups:
if [ ! -z "$DATABASES" ]; then
mkdir -p /backups/databases/
touch /backups/databases/delete
rm /backups/databases/*
echo "$(date) -> Dumping databases..."
for database in "${DATABASES[@]}"; do
echo "$(date) -> $database"
sudo -u postgres pg_dump -d "$database" -f /home/tmp/"$database".pgdump
md5sum /home/tmp/"$database".pgdump > /backups/databases/md5sums
zstd /home/tmp/"$database".pgdump -o /backups/databases/"$database".pgdump.zst
rm /home/tmp/"$database".pgdump
done
echo "$(date) -> Dumped!"
else
echo "No databases selected! Skipping DB export!"
fi
echo "$(date) -> Uploading..."
if [ ! -z "$BACKUP_EXCLUDE" ]; then
for exclude in "${BACKUP_EXCLUDE[@]}"; do
exclude_parsed=$exclude_parsed' -e '$exclude
done
fi
if [ ! "$MAX_SPEED_KILOBYTES_SECOND" -eq 0 ]; then
speed_parsed='--limit-upload '$(echo $MAX_SPEED_KILOBYTES_SECOND)
fi
restic -r "$S3_BUCKET" backup $BACKUP_LIST $exclude_parsed $speed_parsed
echo "$(date) -> Pruning old backups..."
restic -r "$S3_BUCKET" forget --keep-hourly $HOURLY --keep-daily $DAILY --keep-monthly $MONTHLY --keep-yearly $YEARLY
restic -r "$S3_BUCKET" prune
restic -r "$S3_BUCKET" unlock
remove_lock
echo "$(date) -> Done!"