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"