Backup m.b.v. rsync

Ik wilde al langer een offsite backup oplossing waarvan ik zeker kon zijn dat deze altijd zijn werk deed. Zelfs al zou er een ip adres wijzigen of de verbinding wegvallen tijdens het maken van de backup.

Op een gegeven moment vond ik BitTorrent Sync wat bijna precies deed wat ik wilde. BTSync is een volledig decentrale synchronisatie dienst. Je kan data dus zonder problemen naar verschillende devices toe synchroniseren. Het is alleen nog steeds geen echte backup oplossing omdat bestanden gewoon overschreven kunnen worden door een nieuwe versie.

Om dit toch voor elkaar te krijgen heb ik een simpel bash script gemaakt. Dit script moet twee argumenten meekrijgen. De eerste is de naam van het interval (hour, day, week, month, …) en de ander het maximum aantal kopieën die bewaard moeten blijven van dat interval. Het script word uitgevoerd via crontab en stuurt je een e-mail met de resultaten.

#!/bin/sh

# stuff to add to crontab:
# 1 1     * * 1   root    /etc/rsyncbak/rsyncbak.sh weekly 15
# 1 8     1 * *   root    /etc/rsyncbak/rsyncbak.sh monthly 24
# 1 16    2 1 *   root    /etc/rsyncbak/rsyncbak.sh yearly 100

# directory settings
BTSYNC_DIR='/mnt/backup/btsync/'
BACKUP_DIR='/mnt/backup/backups/'
PREV_LINK='/mnt/backup/backups/previous'
EXCLUDE_FILE='/etc/rsyncbak/exclude.txt'
EMAIL='youremail@domain.com'

# create vars for backup
NOW=$(date +'%Y-%m-%d_%H-%M-%S')
INTERVAL=$1
KEEP_X_COPIES=$(($2+1))
FOLDER="${BACKUP_DIR}${INTERVAL}_${NOW}"

# create backup using rsync
RSYNC_OUT=$(rsync -av --delete --link-dest="$PREV_LINK" "$BTSYNC_DIR" "$FOLDER/" --exclude-from="$EXCLUDE_FILE")
RSYNC_EC=$?

# create a new symlink
if [ -L "$PREV_LINK" ]; then
    rm "$PREV_LINK"
fi
ln -s "$FOLDER" "$PREV_LINK"

# remove obsolete backups
TO_REMOVE=$(ls -rd "${BACKUP_DIR}${INTERVAL}"_* | tail -n +"${KEEP_X_COPIES}")
for dir in $TO_REMOVE; do
    rm -rf "$dir"
done

printf "rsyncbak completed, exit code: %s\n\n%s" "$RSYNC_EC" "$RSYNC_OUT" | mail -s "rsyncbak completed" "$EMAIL"

Leave a Reply

Your email address will not be published. Required fields are marked *