Update
I don’t use this system anymore. Learn about my new backup system instead.
At UC Berkeley, Dropbox has become the de-facto standard for cloud sync and live backups, especially for team projects that don’t particularly fit the game of traditional version control. (It is nice to keep local copies of git repositories on Dropbox anyway.) Despite this, it’s bad practice to just leave the safety of your data up to a third party. You might, for instance, accidentally trigger the deletion of all your data and unsuspectingly propagate the change to everywhere you have your Dropbox cached, which is why I proposed keeping an off-site copy. It’s like backing up your backup, and I’ve been doing it for months now.
Before I get started, here’s the structure of a backup server I have stationed at my home in SoCal:
/dev/sda1
..
backup/
archives/
dropbox/
media/
public/
..
/dev/sdb1
backup/
archives/
dropbox/
A cron script runs every so often that syncs the first backup directory to the second. It’s essentially a hacky equivalent of RAID 1 that provides the added bonus of bad-sector checking every time the script runs.
#!/bin/bash
DIR=$HOME/Dropbox
read -p "The target directory is: $DIR. Correct? [yn] " -n 1
if [[ $REPLY =~ ^[Yy]$ ]];then
if [ -d $DIR ];then
echo -e "\n"
rsync -vauzh --progress --exclude '.dropbox*' --delete $DIR home:~/backup/dropbox
echo "Complete."
exit 0
else
echo "Could not find directory. Exiting."
exit 1
fi
else
echo "Exiting."
exit 1
fi
I’ll explain what I did in more detail. Read is a nifty command for reading from standard input to a bash variable, $REPLY. The -p flag specifies a prompt to ask the user, and the -n flag specifies that you want 1 character.
The [[ ... =~ ... ]] format tests a variable against a regular expression, which are exceedingly common in everyday server administration. They are a more complex system of simple wildcard expressions like *.sh or IMG_0??.jpg. In this case, the [Yy] block specifies a set of characters that are acceptable as input (lower and uppercase Y for yes), and the ^...$ instructs the computer to pass the match only if a Y or y character is the entire variable.
rsync -vauzh --progress --exclude '.dropbox*' --delete $DIR home:~/backup/dropbox
My ~/.ssh/config contains a block for a home alias that stores all the information needed to connect to my server at home. The last two arguments of this rsync command are familiar if you’ve ever used scp. Here are the flags I’ve set:
-vfor verbosity, because why not?-afor archive, which preserves things like file permissions and ownership-ufor update, so only files with more recentmtimes are copied-zfor gZip compression, since most of my files are plain-text and highly compressible-hfor human-readable information, which prints out super-readable messages about the sync operation’s progress--progressfor progress display--exclude '.dropbox*'to exclude copying Dropbox’s local cache and configuration files--deleteto delete files that have since disappeared on my local copy
And voila! Run the script periodically, and know that you’ve got a backup plan in case your Dropbox ever becomes inaccessible.