Планирование резервного копирования с использованием backupninja
Содержание

Эта заметка - перепечатка своего ответа на вопрос в сервисе toster.ru

Искал решение для планирование резервных копий различными утилитами на различные хранилища и остановился на backupninja

Умеет по расписанию бэкапить БД и файлы и отправлять их на сторонний сервер разными способами, включая rsync, rdiff, duplicity

В /etc/backup.d/ создаёте конфиги вида 10-db.mysql , 50-ftp.dup

Числа в начале файла описывают очерёдность выполнения в случае одновременного запуска (сначала сдампить базу, а затем заливать из папки с архивом на ftp).

Расширение файла указывает на тип задачи (.mysql - бэкап mysql, .dup - используем duplicity)

Время выполнение бэкапов по-умолчанию задаётся в /etc/backupninja.conf

...
when = everyday at 01:00
...

Его можно переопределить для каждого отдельного бэкапа в начале его конфига

when = sundays at 02:00
when = 30th at 22
when = 30 at 22:00
when = everyday at 01            # the default
when = Tuesday at 05:00
when = hourly

Подробнее о конфигах backupninja здесь

Сам duplicity, которым я, например, делаю бэкапы, поддерживает кучу протоколов, в том числе и передачу по ftp. Также поддерживает ротацию бэкапов

Конфиг для duplicity выглядит примерно так:

## Переопределяем время выполнения
when = sundays at 02:00
## Параметры, передаваемые напрямую duplicity при запуске бэкапа
## --no-encryption позволяет отключить шифрование архивов с бэкапом и получить обычный .tar.gz
#options = --no-encryption

testconnect = no
tmpdir = /tmp

[source]
include = /var/backups/mysql
include = /home/user/projects/site1
exclude = /home/user/projects/.git

[gpg]
## Ключ для симметричного шифрования. Duplicity шифрует бэкапы с помощью gpg. Должен быть указан, даже если стоит --no-encryption, хоть и не будет использоваться
password = 123

[dest]
## perform incremental backups
incremental = yes

## days of incremental backups before doing full backup again
increments = 7

## how many days of data to keep
keep = 14

## for how many full backups do we keep their later increments
keepincroffulls = all

desturl = ftp://backup_user@your_backup_server/
ftp_password = backup_user_password

В бэкапах получаются на первый взгляд не очень понятные файлы, типа

duplicity-full-signatures.20130510T160711Z.sigtar.gpg

duplicity-full.20130510T160711Z.manifest.gpg

duplicity-full.20130510T160711Z.vol1.difftar.gpg

Тут можно чуть поподробнее прочитать про них

С бэкапами лучше работать самой утилитой duplicity, но можно и вручную их вытащить. Вручную минус в том, что инкрементальные бэкапы придётся вручную накатывать на полные, когда duplicity сделает это автоматом при указании даты восстановления.

duplicity collection-status _src _выдаст что-то типа этого

Total number of contained volumes: 3
Type of backup set:                        Time:                        Num volumes:
Full                            Mon Apr 17 00:24:46 2017                 1
Incremental                     Mon Apr 17 01:00:03 2017                 1
Incremental                     Mon Apr 17 09:53:38 2017                 1

после чего можно прочитать содержимое архива на определённую дату

duplicity list-current-files -time 2017-04-17T05:00:00 _src _(покажет бэкап Mon Apr 17 01:00:03 2017, т.е. ближайший ДО указанного времени)

и восстановить

duplicity restore -time 2017-04-17T05:00:00 src dst

src - это то, где ваши бэкапы хранятся.

Это может быть и локальная директория file:///var/backups//

И ftp ftp://user:password@backup_server//var/backups

Сами файлы хранятся в vol#.difftar.[tar.gz|gpg], если надо вручную вытащить Если шифровали, то сначала расшифровать .gpg, чтобы получить .tar.gz

Шифрование можно отключить, в примере конфига выше есть информация

В самом начале задания на бэкап ставите

options = --no-encryption

options передаёт любые параметры запуска для duplicity

Но всё равно обязательно должна быть секции [gpg] и password

[gpg]
## Ключ для симметричного шифрования. Duplicity шифрует бэкапы с помощью gpg. 
## Должен быть указан, даже если стоит --no-encryption, хоть и не будет использоваться
password = 123