Установка
1 |
apt install borgbackup |
Часть первая. Пример работы локально:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Архивировать будем каталог пользователей: /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 |
Часть вторая. Пример работы по сети.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
== Серверная часть == 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 <user key> ------------------------- В файле: # --restrict-to-repository /mnt/backups/testrepo - репозиторий для удаленного пользователя # --append-only - разрешено только удаление # restrict <user key> - публичный ключ клиента # Дополнительные restrict,no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-x11-forwarding |
Примеры ручной очистки репозиториев
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# Хранить 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
1 |
В разработке. |
Откат команд удаления, удалённых в режиме —append-only
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Список транзакций находится в файле 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 |
Извлечение и монтирование бекапов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Вы можете добавить добавить свой 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
###!!! 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} |
Пример самапала
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
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
1 2 3 4 5 6 |
!!! не очень надо, так для общего развития !!! интерфейс называется vorta !!! для установки требует python 3.6+ !!! работает X pip3 install vorta |
ссылки
1 2 3 4 5 6 7 8 9 10 |
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 |