Рубрики
backup

borg / borgbackup / localdisk / systemd / service / timer

Ссылки:

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}/