Установка
apt install borgbackup
Часть первая. Пример работы локально:
Архивировать будем каталог пользователей: /home На сервере бэкапов архивы будем хранить в каталоге: /mnt/backups/ Создадим структуру каталогов на сервере: mkdir /mnt/backups/ Создадим для каталога /home отдельный репозиторий, без шифрования данных: borg init --encryption=none /mnt/backups/Myrepo # Если все таки хочется шифрования: # borg init --encryption=repokey /media/backup/borgdemo borg info /mnt/backups/home/ - смотрим информацию об репозитории home borg create /mnt/backups/Myrepo::xxx /home - пробуем выполнить архивацию borg create /Куда/делаем/архив::Имя_архива /что/архивируем borg info /mnt/backups/Myrepo - смотрим информацию об репозитории home borg list /mnt/backups/Myrepo - смотрим какие у нас есть архивы Пример crontab: 0 1 * * * borg create /mnt/backups/Myrepo::xxx /home
Часть вторая. Пример работы по сети.
== Серверная часть == 0. На сервере создаем пользователя borg, без пароля, авторизация будет происходить по ключу adduser --home /mnt/backups --disabled-password borg 1. На сервере поправим две опции в конфиге ssh-сервера nano /etc/ssh/sshd_config ------------------------- ClientAliveInterval 10 ClientAliveCountMax 30 ------------------------- sudo systemctl restart sshd - перезапустим ssh-сервер 2. На сервере зайдем в сеанс пользователя borg для подготовки ssh sudo -i -u borg - зашли в сеанс mkdir .ssh - создали каталог touch .ssh/authorized_keys - создали файл chmod 700 .ssh - назначили права на каталог chmod 600 .ssh/authorized_keys - назначили права на файл borg init -e none testrepo - создадим тестовый репозиторий с именем testrepo == Клиентская часть == 0. На клиенте У пользователя, от имени которого будет запускаться скрипт, должен быть ssh-ключ. Если его нет, то генерируем его ssh-keygen - генерируем ключ 1. Теперь нужно настроить отправку файлов бекапа на сервер. borg занимается только хранением файлов - их подготовка ваша задача. Создадим скрипт backup.sh, который будет готовить данные и отправлять их в бекап. nano backup.sh -------------- #!/bin/bash # backup.foo - имя сервера для бэкапов (может быть и IP) # testrepo - репозиторий # `date +%Y%m%d_%H%M%S` - подстановка даты # /home - каталог который мы бэкапим borg create -C lz4 borg@backup.foo:testrepo::home_`date +%Y%m%d_%H%M%S` /home -------------- == Серверная часть == 0. Снова заходим в сеанс пользователя borg sudo -i -u borg 1. редактируем файл .ssh/authorized_keys, добавляем строку nano .ssh/authorized_keys ------------------------- command="/usr/bin/borg serve --restrict-to-repository /mnt/backups/testrepo --append-only",restrict------------------------- В файле: # --restrict-to-repository /mnt/backups/testrepo - репозиторий для удаленного пользователя # --append-only - разрешено только удаление # restrict - публичный ключ клиента # Дополнительные restrict,no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-x11-forwarding 
Примеры ручной очистки репозиториев
# Хранить 7 архивов на конец дня и 4 дополнительных архива на конец недели.
# Выполните пробный прогон(--dry-run), фактически ничего не удаляя.
$ borg prune -v --list --dry-run --keep-daily=7 --keep-weekly=4 /path/to/repo
# То же, что и выше, но применяется только к именам архивов, начинающимся с имени хоста
# машины, за которой следует символ "-":
$ borg prune -v --list --keep-daily=7 --keep-weekly=4 --prefix='{hostname}-' /path/to/repo
# Хранить 7 архивов на конец дня, 4 дополнительных архива на конец недели,
# и архив на конец месяца для каждого месяца:
$ borg prune -v --list --keep-daily=7 --keep-weekly=4 --keep-monthly=-1 /path/to/repo
# Хранить все резервные копии за последние 10 дней, 4 дополнительных архива на конец недели,
# и архив на конец месяца для каждого месяца:
$ borg prune -v --list --keep-within=10d --keep-weekly=4 --keep-monthly=-1 /path/to/repo
--keep-within INTERVAL	храним все архивы в течение указанного промежутка времени
--keep-last, --keep-secondly 	сколько последних копий хранить
--keep-minutely 	сколько поминутных архивов хранить
-H, --keep-hourly 	сколько почасовых архивов хранить
-d, --keep-daily 	сколько ежедневны архивов хранить
-w, --keep-weekly 	сколько еженедельных архивов хранить
-m, --keep-monthly 	сколько ежемесячных архивов хранить
-y, --keep-yearly 	сколько ежегодных архивов хранить
# Хранить последние 14 копий с интервалом в день, 8 копий с интервалом в неделю и 12 копий с интервалом в месяц
borg prune -v --list --keep-daily 14 --keep-weekly 8 --keep-monthly 12 /path/to/repo
# пример в crond
cat /etc/cron.d/borgprune 
# prune backup
0 4 * * * borg /usr/bin/borg prune --force -v --list --keep-daily 10 --keep-weekly 5 --keep-monthly 8 /mnt/backups/eyh
Авто очистка сервера borg
В разработке.
Откат команд удаления, удалённых в режиме —append-only
Список транзакций находится в файле transactions, в каталоге репозитория.
Например если мы видим вот такой лог
   transaction 1, UTC time 2016-03-31T15:53:27.383532
   transaction 5, UTC time 2016-03-31T15:53:52.588922
   transaction 11, UTC time 2016-03-31T15:54:23.887256
   transaction 12, UTC time 2016-03-31T15:55:54.022540
   transaction 13, UTC time 2016-03-31T15:55:55.472564
И выяснили, что последняя легитимная транзакция имеет номер 5, то нужно удалить все транзакции после 5.
Для этого в каталоге с репозиторием выполняем
   rm data/**/{6..13}
   borg delete --cache-only <имя репозитория>
Это действие вызовет предупреждение со стороны клиентов borg 
при следующем обращении к репозиторию и просьбу подтвердить продолжение.
Поэтому, если предполагается продолжить использование этого репозитория настроенными на него клиентами, 
то на всех нужно выполнить list репозитория и согласится использовать репозиторий. 
Либо на клиентах удалить файл (manifest-timestamp)
rm ~/.config/borg/security/REPOID/manifest-timestamp
Извлечение и монтирование бекапов
Вы можете добавить добавить свой ssh-ключ для пользователя borg без опций --restrict-to-repository и --append-only, для управления репозиториями со своего рабочего места. borg list borg@backup.foo:<репозиторий> - получить список бекапов в репозитории borg list borg@backup.foo:<репозиторий>::<имя бекапа> - получить список файлов в бекапе borg extract borg@backup.foo:<репозиторий>::<имя бекапа> [что извлекаем] - извлекаем весь бекап или его часть в текущий каталог !!! самое интересное в borg borg mount -o users borg@backup.foo:<репозиторий>::<имя бекапа> <точка монтирования> - монтируем бекап с помощью механизма FUSE borg umount <точка монтирования> - отмонтируем командой borg mount /path/to/repo /tmp/mymountpoint borg umount /tmp/mymountpoint borg mount /path/to/repo::root-2016-02-15 /tmp/mymountpoint borg umount /tmp/mymountpoint При монтировании могут возникнуть проблемы с правами доступа к файлам. В этомслучае можно смонтировать через sudo, переопределив команду ssh. В этом случае ходить по смонтированному бекапу также придется с помощью sudo sudo borg mount -o users --rsh "ssh -i <ваш ключ>" borg@backup.foo:<репозиторий>::<имя бекапа> <точка монтирования> При извлечении и монтировании можно исключить файлы по шаблону ключом --exclude --exclude '/home/*/.cache/* --exclude '/home/*/.tmp/*' borg mount /path/to/repo /tmp/mymountpoint only/that/path borg mount --exclude '...' /path/to/repo /tmp/mymountpoint
Официальный скрипт для borgbackup
###!!! https://borgbackup.readthedocs.io/en/stable/quickstart.html#a-step-by-step-example
#!/bin/sh
# Setting this, so the repo does not need to be given on the commandline:
export BORG_REPO=ssh://username@example.com:2022/~/backup/main
# See the section "Passphrase notes" for more infos.
export BORG_PASSPHRASE='XYZl0ngandsecurepa_55_phrasea&&123'
# some helpers and error handling:
info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM
info "Starting backup"
# Backup the most important directories into an archive named after
# the machine this script is currently running on:
borg create                         \
    --verbose                       \
    --filter AME                    \
    --list                          \
    --stats                         \
    --show-rc                       \
    --compression lz4               \
    --exclude-caches                \
    --exclude '/home/*/.cache/*'    \
    --exclude '/var/tmp/*'          \
                                    \
    ::'{hostname}-{now}'            \
    /etc                            \
    /home                           \
    /root                           \
    /var                            \
backup_exit=$?
info "Pruning repository"
# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
# archives of THIS machine. The '{hostname}-' prefix is very important to
# limit prune's operation to this machine's archives and not apply to
# other machines' archives also:
borg prune                          \
    --list                          \
    --prefix '{hostname}-'          \
    --show-rc                       \
    --keep-daily    7               \
    --keep-weekly   4               \
    --keep-monthly  6               \
prune_exit=$?
# use highest exit code as global exit code
global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))
if [ ${global_exit} -eq 0 ]; then
    info "Backup and Prune finished successfully"
elif [ ${global_exit} -eq 1 ]; then
    info "Backup and/or Prune finished with warnings"
else
    info "Backup and/or Prune finished with errors"
fi
exit ${global_exit}
Пример самапала
cat backupborg_norm.sh
#!/usr/bin/env bash
## если используется нестандартный SSH-ключ,
## то его надо явно указать:
# export BORG_RSH="ssh -i /home/userXY/.ssh/id_ed25519"
## пароль репозитория Borg можно указать в переменной
## окружения, чтобы не вводить его при каждом запуске
# export BORG_PASSPHRASE="top_secret_passphrase"
##
## Задание переменных окружения
##
## вот так выглядит без переменных
## borg create -C lz4 borg@10.3.1.183:piraspberry::etc_`date +%Y%m%d_%H%M%S` /etc
DATESTAMP=`date +%Y%m%d_%H%M%S`
LOG="backup.log"
BACKUP_USER="borg"
BACKUP_SERVER="10.3.1.183"
REPOSITORY="piraspberry"
NAME_BACKUP="full"
BACKUP_REP="${BACKUP_USER}@${BACKUP_SERVER}:${REPOSITORY}::${NAME_BACKUP}_${DATESTAMP}"
## Исключаем не нужное
##
export BACKUP_EXCLUDE="\
--exclude '/home/*/.cache/*' \
--exclude '/home/*/.tmp/*' \
--exclude /dev \
--exclude /proc \
--exclude /sys \
--exclude /var/run \
--exclude /run \
--exclude /lost+found \
--exclude /mnt"
##
## Будем бэкапить следующие
##
export BACKUP_LIST="\
/etc \
/home \
/root \
/var/log \
/var/spool \
/usr/local \
/opt \
/srv"
#/var/www
#/var/tmp/backup
##
## Вывод в файл журнала
##
exec > >(tee -i ${LOG})
exec 2>&1
echo "======= Backup started: $(date) ========"
## Здесь можно выполнить дополнительные действия
## перед созданием резервной копии, например:
## - сделать дамп базы данных
## - заархивировать /var/www
####[Create and changes directory]
#mkdir /root/backup-tmp
#cd /root/backup-tmp
##[Stamps the file name with a date]
#TIMESTAMP=`date +%m-%d-%y-%H%M`
####[DB Backup Scripts]
#HOST=localhost
#DBNAME="basename"
#USER="username"
#PASSWORD="password"
#DUMP_PATH=/root/backup-tmp/sql
#BACK_PATH=/root/backup-tmp/www/
#BACK_PATH3=/root/backup-tmp/etc/
####[DB Backups]
#mysqldump --opt -c -e -Q -h$HOST -u$USER -p$PASSWORD $DBNAME > $DBNAME.sql
#tar czpf $DUMP_PATH/$DBNAME.$TIMESTAMP.tar.gz $DBNAME.sql
#rm -f $DBNAME.sql
###[Backing files /var/www /etc]
#tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz --same-owner  --exclude=/var/www/site/gruzims/* /var/www
#tar cvzpf $BACK_PATH3/etc.$TIMESTAMP.tar.gz /etc
##
## Передача файлов в репозиторий.
##
echo "Transfer files ..."
##
## Вот так выглядит бэкап в консоле одного каталога etc
# borg create -C lz4 borg@10.3.1.183:piraspberry::etc_`date +%Y%m%d_%H%M%S` /etc
##
##
## Выполняем архив
##
borg create -C lz4 \
        ${BACKUP_EXCLUDE} \
        ${BACKUP_REP} \
        ${BACKUP_LIST}
###
### Действия после всех действий
## - Например удалить каталог сделанный скриптом в примере выше
## rm -rf /root/backup-tmp
## - Или выполнять его очистку, удалять файлы старше 5 дней
## find /var/backup-tmp/mysql -name "*.tar.gz" -mtime +5 |xargs /bin/rm -f {};
## find /var/backup-tmp/www -name "*.tar.gz" -mtime +5 |xargs /bin/rm -f {};
echo "======== Backup ended: $(date) =========="
Установка графического интерфейса (GUI) для Borg
!!! не очень надо, так для общего развития !!! интерфейс называется vorta !!! для установки требует python 3.6+ !!! работает X pip3 install vorta
ссылки
https://borgbackup.readthedocs.io/en/stable/ https://borgbackup.readthedocs.io/en/stable/usage/notes.html#append-only-mode https://borgbackup.readthedocs.io/en/stable/usage/create.html https://borgbackup.readthedocs.io/en/stable/quickstart.html#a-step-by-step-example https://borgbackup.readthedocs.io/en/stable/usage/extract.html https://borgbackup.readthedocs.io/en/stable/usage/rename.html https://borgbackup.readthedocs.io/en/stable/usage/prune.html https://borgbackup.readthedocs.io/en/stable/deployment/central-backup-server.html https://b.tinyops.ru/linux-backup-with-borg/ http://www.opennet.ru/tips/3180_borg_backup.shtml