---
title: Backup con Borg
date: 2024-10-13
description: Come eseguire il backup e il restore con Borg
tags: 
    - backup
    - restore
    - snapshot
---

## Borgbackup

In Debian e derivate, installare il pacchetto col comando:

```bash
apt install borgbackup -y
```

### Inizializzazione del repository

Per inizializzare il repository, criptato tramite una password:

```bash
borg init --encryption=keyfile /path/to/repo
```

### Backup

Per eseguire un backup manualmente

```bash
borg create --stats --list --progress /path/to/repo::25-11-2023 /path/to/source/
```

dove `--stats` permette di stampare statistiche aggiuntive sull'archivio, mentre l'opzione `--list` di visualizzare la lista degli oggetti inseriti nell'archivio.

Col flag `--compression` è possibile impostare anche il livello di compressione. Vedere: [Backup compression](https://borgbackup.readthedocs.io/en/stable/quickstart.html#backup-compression)

È possibile anche visualizzare la lista dei backup:

```bash
borg list /path/to/repo
```

### Montare l'archivio

```bash
mkdir /tmp/borg/

borg mount /path/to/repo /tmp/borg/

ls -l /tmp/borg/
```

### Retention

Col comando `borg prune` è possibile stabilire una politica di conservazione dei backup ([https://borgbackup.readthedocs.io/en/stable/usage/prune.html](https://borgbackup.readthedocs.io/en/stable/usage/prune.html))

Ad esempio:

```bash
# Keep 7 end of day, 4 additional end of week archives, and an end of month archive for every month:
borg prune --list --stats --force --keep-daily=7 --keep-weekly=4 --keep-monthly=-1 /path/to/repo

borg prune -v /path/to/repo --stats \
    --keep-hourly=12 --keep-daily=60 --keep-weekly=12 --keep-monthly=24
```

### Script

Ecco un semplice esempio:

```bash
#!/bin/bash

# Percorsi
REPO_PATH=/media/user/Backup/Snapshot/
DATA_PATH=~/
LOG_FILE=~/logs/borg_backup.log

export BORG_PASSPHRASE='*****************************************************'

# Inizializzazione di Borg
borg init --encryption=keyfile /media/user/Backup/Snapshot/

# Creazione del backup con Borg
if borg create --stats --list --progress --compression lz4      \
    --exclude-caches                                            \
    $REPO_PATH::{now:'%H:%M_%d-%m-%Y'} $DATA_PATH; then
    echo "$(date '+%H:%M:%S %d %b %Y'): Backup con Borg completato con SUCCESSO." >> $LOG_FILE 
else
    echo "$(date '+%H:%M:%S %d %b %Y'): ERRORE durante la creazione del backup con Borg." >> $LOG_FILE
    exit 1
fi

# This command frees repository space by compacting segments
borg compact $REPO_PATH

# Pulizia del repository
# Keep 7 end of day, 4 additional end of week archives, and an end of month archive for every month:
borg prune --list --stats --force \
    --keep-daily=7 --keep-weekly=4 --keep-monthly=-1 $REPO_PATH && borg list $REPO_PATH >> $LOG_FILE

exit 0;
```

### Restore

Per ripristinare un intero backup nella cartella corrente:

```bash
borg extract -v --list /path/to/repo/::25-11-2023
```

Se invece volessimo estrarre solo alcuni file o cartelle, innanzitutto creiamo una cartella temporanea dove verrà montato il repository:

```bash
mkdir /tmp/borg/
```

Montare quindi il repository, che puo' essere anche remoto:

```bash
borg mount ssh_host:borg/snapshot/ /tmp/borg/
```

Listare il contenuto col comando:

```bash
borg list ssh_host:borg/snapshot/::"08:00_06-10-2024"
```

Estrarre il contenuto, in modo da ripristinare i file:

```bash
borg extract sh_host:borg/snapshot/::"08:00_06-10-2024" /mnt/
```

dove `/mnt/` indica la cartella (o il file) da estrarre. L'opzione `--dry-run` permette di vedere cosa verrebbe estratto, ma senza che sia veramente estratto.

> Nota
> Attualmente, *extract* scrive sempre nella directory di lavoro corrente (“.”), quindi assicuratevi di essere nel posto giusto prima di eseguire borg extract

Ulteriori esempi:

```bash
# Extract entire archive
borg extract /path/to/repo::my-files

# Extract entire archive and list files while processing
borg extract --list /path/to/repo::my-files

# Verify whether an archive could be successfully extracted, but do not write files to disk
borg extract --dry-run /path/to/repo::my-files

# Extract the "src" directory
borg extract /path/to/repo::my-files home/USERNAME/src

# Extract the "src" directory but exclude object files
borg extract /path/to/repo::my-files home/USERNAME/src --exclude '*.o'
```

## Riferimenti

- [https://borgbackup.readthedocs.io/en/stable/quickstart.html#automating-backups](https://borgbackup.readthedocs.io/en/stable/quickstart.html#automating-backups)
- [https://ostechnix.com/backup-restore-files-borg-linux/](https://ostechnix.com/backup-restore-files-borg-linux/)
- [https://wiki.archlinux.org/title/Borg_backup](https://wiki.archlinux.org/title/Borg_backup)