Рубрики
backup backup \ crontab \ tar \ zip \ архивация \ архиваторы

borgbackup / backup / borg debian 10 / без шифрования репозитория

Установка

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