Ссылки:
https://borgbackup.readthedocs.io/en/stable/deployment/automated-local.html
Начало:
Ставим: Если Debian: apt install borg или если Arch: pacman -Sy borg Создадим структуру каталогов на сервере: !!! Нужный диск уже должен быть при монтирован mkdir /mnt/backups/ Создаем репозиторий: borg init --encryption=repokey /mnt/backup/borgbackup Тыкаемся в репозиторий: 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 - смотрим какие у нас есть архивы borg mount -o users borg@backup.foo:<репозиторий>::<имя бекапа> <точка монтирования> - монтируем бекап с помощью механизма FUSE borg umount <точка монтирования> - отмонтируем командой
Дефолтный скрипт для бэкапа и монтирования диска и очистки:
0. Узнаем UUID диска например так blkid 1. Записываем его сюда: cat UUID > /root/backup.disks 2. Создаем скрипт для бэкапа cat > /root/backup.borg.sh << "EOF" #!/bin/bash -ue sleep 5 # Config MOUNTPOINT=/mnt/backup TARGET=$MOUNTPOINT/borgbackup DATE=$(date --iso-8601)-$(hostname) DISKS=/root/backup.disks # Find whether the connected block device is a backup drive for uuid in $(lsblk --noheadings --list --output uuid) do if grep --quiet --fixed-strings $uuid $DISKS; then break fi uuid= done if [ ! $uuid ]; then echo "No backup disk found, exiting" exit 0 fi echo "Disk $uuid is a backup disk" partition_path=/dev/disk/by-uuid/$uuid # Mount file system if not already done. This assumes that if something is already # mounted at $MOUNTPOINT, it is the backup drive. It won't find the drive if # it was mounted somewhere else. (mount | grep $MOUNTPOINT) || mount $partition_path $MOUNTPOINT drive=$(lsblk --inverse --noheadings --list --paths --output name $partition_path | head --lines 1) echo "Drive path: $drive" # # Create backups # # Options for borg create BORG_OPTS="--stats --one-file-system --compression lz4 --checkpoint-interval 86400" export BORG_PASSPHRASE=ВАШ_ПАРОЛЬ_ОТ_РЕПЫ_СЮДА export BORG_RELOCATED_REPO_ACCESS_IS_OK=no export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=no # Log Borg version borg --version echo "Starting backup for $DATE" borg create $BORG_OPTS --exclude root/.cache --exclude var/lib/docker/devicemapper --exclude '/home/*/.cache/*' --exclude '/var/tmp/*' $TARGET::$DATE-$$-system /etc /home /root /var /boot echo "Completed backup for $DATE" # Just to be completely paranoid sync if [ -f /etc/backups/autoeject ]; then umount $MOUNTPOINT hdparm -Y $drive fi if [ -f /etc/backups/backup-suspend ]; then systemctl suspend fi # Cleaner borg prune --force -v --list --keep-daily 10 --keep-weekly 4 --keep-monthly 1 ${TARGET} borg compact ${TARGET} EOF
Systemd service and timer
cat > /etc/systemd/system/backupborg.service << EOF [Unit] Description=backupborg [Service] Type=oneshot ExecStart=/root/backup.borg.sh Restart=on-failure [Install] WantedBy=multi-user.target EOF cat > /etc/systemd/system/backupborg.timer << "EOF" [Unit] Description=backupborg [Timer] OnCalendar=02:00:00 [Install] WantedBy=timers.target EOF systemctl daemon-reload systemctl enable backupborg.service systemctl enable backupborg.timer
Пример проверки точки монтирования
#!/bin/bash #!/bin/bash set -x # Остановить выполнение при ошибке # Метка диска DISK_LABEL="store-rsync" MOUNT_POINT="/mnt/$DISK_LABEL" FROM_SYNC="/mnt/backup/" # Проверяем, смонтирован ли диск if findmnt -rno TARGET "LABEL=$DISK_LABEL" | grep -q "$MOUNT_POINT"; then echo "Диск $DISK_LABEL уже смонтирован в $MOUNT_POINT" else echo "Диск $DISK_LABEL не найден! Пробуем примонтировать..." # Создаём точку монтирования, если её нет mkdir -p "$MOUNT_POINT" # Пробуем смонтировать диск mount LABEL="$DISK_LABEL" "$MOUNT_POINT" # Проверяем, успешно ли смонтировался диск if findmnt -rno TARGET "LABEL=$DISK_LABEL" | grep -q "$MOUNT_POINT"; then echo "Диск $DISK_LABEL успешно смонтирован в $MOUNT_POINT" else echo "Ошибка: Не удалось примонтировать диск $DISK_LABEL" exit 1 fi fi # Если диск доступен, продолжаем выполнение скрипта echo "Диск доступен, продолжаем выполнение rsync..." /usr/bin/rsync -avz --delete ${FROM_SYNC} /mnt/${DISK_LABEL}/