Blog

Rclone: Simple two-way dropbox sync

This a simple strategy I use to implement two-way syncing with dropbox using Rclone. It's not perfect but thanks to the revision history feature in dropbox and the --backup-dir in Rclone it works well enough for me.

Here is a simplified version of my sync.sh script with some comments

# An exclude file I use to mainly ignore temporary files such as vim's *.swp,
# libre offices .~lock.* files, etc.
EXCLUDE_FILE=/path/to/exclude

# Sync location for my dropbox account
DROPBOX=/path/to/dropbox

# A local backup location. I use the --backup-dir flag when syncing down from
# dropbox. If rclone is going to overwrite any of my local files it will make a
# copy to this folder before so. This is handy as it means that I won't lose 
# data in the event that both the remote and my local file changes.
DROPBOX_BACKUP=/path/to/dropbox-backup

# I sync from dropbox pulling any changes as long as they are newer in dropbox
# (-u). If rclone is overwriting any files it will put them into the backup
# folder and add the current datetime as a suffix (poor man's revision history!).
rclone copy -u -v rednim-dropbox: $DROPBOX \
    --backup-dir $DROPBOX_BACKUP \
    --suffix .$(date +"%Y-%m-%d-%H-%M-%S")

# I then sync up dropbox with my local changes excluding any garbage files
rclone sync -v $DROPBOX dropbox: --exclude-from $EXCLUDE_FILE

Overall this is a decent strategy. My local changes will only get updated if they are newer in dropbox. I backup the files in the event that my local is changed but the dropbox is still newer (conflict). I just recover the files from my backup and resolve the conflict manually. The reverse can happen in dropbox when I sync back my changes but dropbox generously provides a version history on their site which allows me to recover files in that scenario.

With the copy down, sync up strategy it requires a little more effort when deleting. Since copying down won't delete any files from my local I have to make sure I delete them locally when they are deleted on the remote.

Why?

This works for me as I have several dropbox accounts and the default client only supports 2 (personal & business). There is currently a work-around where you can run different instances of the dropbox client with a different $HOME variable but I prefer this approach, I don't need to run multiple dropbox clients and have them continuously syncing (and breaking). I also like that with Rclone I can control where to sync my dropbox data.

The only downside is that syncing is not automatic. I have to manually run the script or put it on a timer but my interaction with dropbox is limited so it is an acceptable trade-off for me.