#!/bin/bash if [ ! -e /backups/config ]; then echo "Config not found!" exit 1 fi set -a source /backups/config 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!" exit 1 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!"