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