Rsnapshot - классная утилита которая умеет:

  1. Делать бекапы папок по пути в локальной системе и складывать их в бекап хранилище (специально отведённая папка тут же где-то)
  2. Выполнять скрипты которые делают бекапы, ложат рядом с собой, а rsnapshot берёт эти данные и складывает в то же хранилище-папку
  3. Может закинуть бекапы по sftp куда-то
  4. Хранит только diff-ы между бекапами, что экономит место

Retantion

У rsnapshot есть Retantion Policies (могу не точно называть), они в конфигурации начинаются с retain. Это описание абстрактных планов по поводу того, сколько последних копий бэкапов хранить. Я долго мучался пока не понял, что их названия ни на что не влияют. То есть, если план называется daily rsnapshot каждый день его запускать не будет, можете его в cron-е хоть раз в месяц запускать. Мне удобнее использовать для конфигурации (чтения, сопровождения) daily, weekly, monthly и т. д.
Те retention, которые в конфиге записаны ниже, считаються теми, что должны делаться реже верхних, то есть цифра у них должна быть меньше. Rsnapshot для каждого retention i+1 берёт содержимое со старшего сделанного для retention i. Пример:

+ date  
Tue May 12 05:58:33 UTC 2020  
+ rsnapshot daily  
+ ls -la /data/backups  
total 48  
drwxrwxr-x. 11 y.vlasov y.vlasov 4096 May 12 05:57 .  
drwxrwxr-x+  6 root     root     4096 Apr 27 09:43 ..  
drwxr-xr-x.  6 root     root     4096 May 12 05:57 daily.0  
drwxr-xr-x.  6 root     root     4096 May 12 00:00 daily.1  
drwxr-xr-x.  6 root     root     4096 May 11 00:00 daily.2  
drwxr-xr-x.  6 root     root     4096 May 10 00:00 daily.3  
drwxr-xr-x.  6 root     root     4096 May  9 00:00 daily.4  
drwxr-xr-x.  6 root     root     4096 May  8 00:00 daily.5  
drwxr-xr-x.  6 root     root     4096 May  7 00:00 daily.6  
drwxr-xr-x.  6 root     root     4096 May  4 00:00 weekly.0  
drwxr-xr-x.  6 root     root     4096 May  2 00:00 weekly.1  
+ rsnapshot weekly  
+ ls -la /data/backups  
total 48  
drwxrwxr-x. 11 y.vlasov y.vlasov 4096 May 12 05:57 .  
drwxrwxr-x+  6 root     root     4096 Apr 27 09:43 ..  
drwxr-xr-x.  6 root     root     4096 May 12 05:57 daily.0  
drwxr-xr-x.  6 root     root     4096 May 12 00:00 daily.1  
drwxr-xr-x.  6 root     root     4096 May 11 00:00 daily.2  
drwxr-xr-x.  6 root     root     4096 May 10 00:00 daily.3  
drwxr-xr-x.  6 root     root     4096 May  9 00:00 daily.4  
drwxr-xr-x.  6 root     root     4096 May  8 00:00 daily.5  
drwxr-xr-x.  6 root     root     4096 May  7 00:00 weekly.0  
drwxr-xr-x.  6 root     root     4096 May  4 00:00 weekly.1  
drwxr-xr-x.  6 root     root     4096 May  2 00:00 weekly.2  

Backup, backup_script

Как собственно он делает бекап? Rsnapshot делает бекапы по всем шагам, которые есть в конфигурации при каждом вызове.

  • backup - указываешь путь к папке, которую нужно сохранять и он её полностью к себе копирует в хранилище;
  • backup_script - указываешь путь к Shell скрипту, которые делает бекап сам и складывает результирующие файлы\папки рядом с собой, rsnapshot их перемещает в хранилище;
  • другие варианты - man rsnapshot.

План

  1. Создать папку по пути snapshot_root.
  2. Написать rsnapshot.conf файл (по умолчанию берётся /etc/rsnapshot.conf).
  3. Добавить вызов rsnapshot в планировщик - cron.

Пример

Создадим папку snapshot_root: mkdir -p /data/backups.

Содержимое /etc/rsnapshot.conf

## Заметка 1: Вы обязаны использовать табы для разделения аргументов в одной строке  
config_version	1.2  
snapshot_root	/data/backups  
no_create_root	1  
## Заметка 2: Пути могут вариироваться от ОСи к ОСи  
cmd_rm		/usr/bin/rm  
cmd_rsync	/usr/bin/rsync  
cmd_logger	/usr/bin/logger  
## Конфигурация планов сохранения  
retain	daily	7  
retain	weekly	4  
## Настройки логгирования  
verbose		2  
loglevel	3  
lockfile	/var/run/rsnapshot.pid  
  
## Собственно описание совершаемых действий  
backup	/data/ghost	ghost/  
backup_script	/srv/my_soft/backup.sh	my_soft/  

Содержимое crontab

0 0 * * * /usr/bin/rsnapshot daily 2>&1 | systemd-cat -t rsnapshot-daily  
10 0 * * 0 /usr/bin/rsnapshot weekly 2>&1 | systemd-cat -t rsnapshot-weekly  

Содержимое /srv/my_soft/backup.sh

#!/usr/bin/env sh  
set -e  
docker exec \  
    -w /tmp \  
    my_soft.postgres \  
    /bin/sh -c 'rm -rf backup; pg_basebackup -U my_user -X stream -F plain -D backup 1>/dev/null 2>&1 && tar -C backup -czf - $(ls backup)' 1>pg_basebackup.tgz  

Содержимое daily.0

/data/backups/daily.0  
├── ghost  
│   └── data  
├── my_soft  
│   └── pg_basebackup.tgz  
├── proxy  
│   ├── certificates.tgz  
│   └── haproxy.tgz  
└── another_one  
    └── another_backup_from_backup_script.tgz  
  
5 directories, 4 files