Установка
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