-
-
Save jaredmales/2f732254bb10002fc0549fa9aa0abdd7 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
############################################################################## | |
# An rclone backup script by Jared Males ([email protected]) | |
# | |
# Copyright (C) 2018 Jared Males <[email protected]> | |
# | |
# This script is licensed under the terms of the MIT license. | |
# https://opensource.org/licenses/MIT | |
# | |
# Runs the 'rclone sync' command. Designed to be used as a cron job. | |
# | |
# 1) Backup Source | |
# Edit the SRC variable below to point to the directory you want to backup. | |
# | |
# 2) Backup Destination | |
# Edit the DEST variable to point to the remote and location (see rclone docs). | |
# | |
# 3) Excluding files and directories | |
# Edit the EXCLUDEFILE variable below to point to a file listing files and directories to exclude. | |
# See the rclone docs for the format. | |
# | |
# Also, any directory can be excluded by adding an '.rclone-ignore' file to it without editing the exclude file. | |
# This file can be empty. You can edit the name of this file with EXIFPRESENT below. | |
# | |
# 4) You can change the bandwidth limits by editing BWLIMT, which includes a timetable facility. | |
# See rclone docs for more info. | |
# | |
# 5) Logs: | |
# -- The output of rclone is written to the location specified by LOGFILE. This is rotated with savelog. | |
# The details of synclog can be edited. | |
# -- The log rotation, and start and stop times of this script, are written to the location specified by CRONLOG. | |
# This isn't yet rotated, probably should be based on size. | |
# | |
############################################################################## | |
#### rclone sync options | |
SRC=/home/jrmales | |
#---- Edit this to the desired destination | |
DEST=b2:backup-mx9 | |
#---- This is the path to a file with a list of exclude rules | |
EXCLUDEFILE=$SRC/.rclone/excludes | |
#---- Name of exclude file | |
# NOTE: you need "v1.39-036-g2030dc13β" or later for this to work. | |
EXIFPRESENT=.rclone-ignore | |
#---- The bandwidth time table | |
BWLIMIT="08:00,512 00:00,off" | |
#---- Don't sync brand new stuff, possible partials, etc. | |
MINAGE=15m | |
#---- [B2 Specific] number of transfers to do in parallel. rclone docs say 32 is recommended for B2. | |
TRANSFERS=32 | |
#---- Location of sync log [will be rotated with savelog] | |
LOGFILE=$SRC/.rclone/rclone-sync.log | |
LOGS='-vv --log-file='$LOGFILE | |
#---- Location of cron log | |
CRONLOG=$SRC/.rclone/rclone-cron.log | |
################################################### | |
## Locking Boilerplate from https://gist.github.com/przemoc/571091 | |
## Included under MIT License: | |
################################################### | |
## Copyright (C) 2009 Przemyslaw Pawelczyk <[email protected]> | |
## | |
## This script is licensed under the terms of the MIT license. | |
## https://opensource.org/licenses/MIT | |
# | |
# Lockable script boilerplate | |
### HEADER ### | |
LOCKFILE="/tmp/`basename $0`" | |
LOCKFD=99 | |
# PRIVATE | |
_lock() { flock -$1 $LOCKFD; } | |
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; } | |
_prepare_locking() { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; } | |
# ON START | |
_prepare_locking | |
# PUBLIC | |
exlock_now() { _lock xn; } # obtain an exclusive lock immediately or fail | |
exlock() { _lock x; } # obtain an exclusive lock | |
shlock() { _lock s; } # obtain a shared lock | |
unlock() { _lock u; } # drop a lock | |
################################################### | |
# End of locking code from Pawelczyk | |
################################################### | |
#make a log entry if we exit because locked | |
exit_on_lock() { echo $(date -u)' | rclone-cron.sh already running.' >> $CRONLOG; exit 1; } | |
#Now check for lock | |
exlock_now || exit_on_lock | |
#We now have the lock. | |
#Rotate logs. | |
savelog -n -c 7 $LOGFILE >> $CRONLOG | |
#Log startup | |
echo $(date -u)' | starting rclone-cron.sh . . .' >> $CRONLOG | |
#Now do the sync! | |
rclone sync $SRC $DEST --transfers $TRANSFERS --bwlimit "$BWLIMIT" --min-age $MINAGE --exclude-from $EXCLUDEFILE --exclude-if-present $EXIFPRESENT --delete-excluded $LOGS | |
#log success | |
echo $(date -u)' | completed rclone-cron.sh.' >> $CRONLOG | |
#release the lock | |
unlock | |
exit | |
Thanks for sharing this useful script Jared.
Perhaps you can add an 'OPTIONS' variable for adding additional options (command line switches to rclone) and/or add --fast-list to it to speed up the sync and lower cost (due to much less Class C transactions on backblaze)
https://rclone.org/docs/#fast-list
https://forum.rclone.org/t/syncing-to-backlaze-b2-extremely-slow-unless-i-enable-fast-list/17222
Can you add multiple sources to same destination? Like "src1","src2" or "src1""src2" or something similar?
@CPC-STaylor a quick read of rclone docs says no, not without adding a lot to this code. rclone sync
appears to only take a single path at a time. It might be simplest to make SRC an argument and call this from a separate script.
Just created an account to say thank you for this script. I was looking around for something that was a bit more than a single line, but didn't need the complexity of rclone jobber. Modified it to utilize copy instead of sync and it does exactly what I needed.
Thanks @raystrach