Command to automate execution of various rsync commands based on profiles defined on a YAML configuration file.
-
Instead of doing:
rsync -avySH --delete --backup --backup-dir=../deleted/$timestamp/ "/media/Media/Photos" "[email protected]:/media/backup/filesets/$hostname.photos"
Just do:
autorsync -p photos
-
Instead of doing:
rsync -avySH --delete --backup --backup-dir=../deleted/$timestamp/ "/media/Media/Photos" "[email protected]:/media/backup/filesets/$hostname.photos" rsync -avySH --delete --backup --backup-dir=../deleted/$timestamp/ "/media/Media/Books" "[email protected]:/media/backup/filesets/$hostname.books" rsync -avySH --delete --backup --backup-dir=../deleted/$timestamp/ "/media/Media/Music" "[email protected]:/media/backup/filesets/$hostname.music"
Just do:
autorsync
Or, in more general terms, instead of doing long rsync commands for your
everyday backups, or putting them in adhoc scripts, write the clear
~/autorsync.yaml
file and let autorsync
do the work for you.
pip3 install auto-remote-sync --user
(Sorry for the long package name, ideally this would be simply autorsync,
but name autosync
was already taken and PyPi would not allow similar names).
Check PyPi and GitHub for autorsync.
Here is an example with some defaults and a few profiles:
DEFAULTS:
source_part1: '{{home}}/Media'
target_part1: [email protected]:/media/backup/filesets
delete: True
backup: True
backup_dir: ../deleted/{{time.strftime('%Y.%m.%d-%H.%M.%S')}}/
background: False
extra_part1: --rsh "ssh -i ~/.ssh/id_operator" --no-atimes
profiles:
- name: books
source_part2: Books/
target_part2: '{{hostname}}.books/files'
background: True
extra: --copy-links
- name: nextcloud.data
source: /var/lib/nextcloud/data
target_part2: '{{hostname}}.nextcloud_files'
extra_part2: --copy-links --itemize-changes
Notes about this configuration
- All profiles inherit parameters from
DEFAULTS
. If parameter isn’t set in the profile, the value defined inDEFAULTS
will be used. - For each profile, the Source is defined by
source
parameter, or, if not defined, bysource_part1/source_part2
- Target follows same logic:
target
ortarget_part1/target_part2
delete
makes rsync delete files in target that are absent in sourcebackup
andbackup_dir
makes rsync save backups on target of deleted or modified files on source. Value onbackup_dir
is a path relative to target folderextra
lets you add extra rsync switches and can be used in theDEFAULTS
section (to affect all profiles) or just into a specific profile. You can also useextra_part1
andextra_part2
between profiles andDEFAULTS
, which will cause your switches to be concatenated.- You can use Jinja logic in
source*
,target*
andextra*
parts, surrounded by{{}}
. Currently these are the available variables:time
, a Pythondatetime.datetime
object which includes local timezonehostname
, such as “rocket”Hostname
, such as “rocket.mydomain.com” (FQDN)username
, UNIX user name as “joanbaez”home
, user’s home folder as “/home/joanbaez”userid
, user ID as “504”gecos
, user long name as “Joan Baez”
Se my real /root/autorsync.yaml
file
that is used everyday to run my incremental offsite backup via cron.
By the way, this is my root user crontab:
# Several backups everyday 4:15 AM
15 4 * * * $HOME/.local/bin/autorsync
As simple as that.
-
Show all profiles:
autorsync -l
-
Run rsync for all profiles:
autorsync
-
Run rsync only for profile
books
autorsync -p books
-
Simulate rsync only for profile
books
(force rsync’s--dry-run
)autorsync -n -p books
or
autorsync --dry-run -p books
-
Run rsync for 2 profiles from a non-default configuration file:
autorsync -c /etc/autorsync.yaml -p "books, photos"