Ссылки:
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}/