Borg est un outil de sauvegarde incrémentielle en ligne de commande écrit en Python. C’est un fork d’Attic mais un peu plus en avance puisqu’il corrige pas mal de bug d’Attic et propose des fonctionnalités supplémentaires (choix de la compression, par exemple).En outre le projet est très actif et en constante évolution. Nous allons voir comment héberger un serveur BorgBackup afin d’être autonome sur la destination de vos sauvegardes.

borgbackup-server-self-hosted

BorgBackup la solution efficace pour vos sauvegardes

Une des particularités de Borg est qu’il supporte la déduplication, c’est-à-dire que les fichiers sauvegardés sont découpés en une multitude de tronçons, et Borg ne sauvegarde que les tronçons qui ont été modifiés depuis la dernière sauvegarde, d’où une économie substantielle en termes d’espace disque et un gain lors de transfert des sauvegardes distantes. De plus Borg gère différents types de compression permettant de diminuer encore la taille des sauvegardes ainsi que le chiffrement en AES 256-bit.

Une fois compris le principe des sauvegardes de Borg, celui-ci est très simple d’utilisation au quotidien, pas de base de données à gérer, les commandes sont simples et logiques et l’aide est très bien faite.

Pour ceux que la ligne de commande rebute, il est possible d’installer une interface graphique en complément. Celle-ci est indépendante de Borg mais est pleinement fonctionnelle, même si elle n’utilise pas toutes les fonctionnalités que l’on retrouve avec la ligne de commande

Voici en quelques lignes ses grands atouts :

  • Optimisation de l’espace disque : la déduplication, basée sur une segmentation du contenu, est utilisée pour réduire le nombre d’octets stockés
  • Vitesse : Le code critique (chunking, compression, chiffrement) est implémenté en C / Python et Borg gère la mise en cache locale des fichiers / données d’index des morceaux ainsi que la détection rapide des fichiers non modifiés.
  • Chiffrement des données : Toutes les données peuvent être protégées en utilisant la méthode de chiffrement AES 256-bit, l’intégrité des données et l’authenticité sont vérifiées en utilisant HMAC-SHA256. Les données sont chiffrées côté client.
  • Compression : Toutes les données peuvent être compressées au choix par LZ4 (super rapide, faible compression), zlib (vitesse et compression moyenne) ou lzma (basse vitesse, compression élevée). À noter que plus la compression est forte, plus le processeur est sollicité.
  • Sauvegardes hors site : Borg peut stocker des données sur un hôte distant accessible via SSH. Si Borg est installé sur l’hôte distant, des gains importants de performance peuvent être atteints par rapport à un système de fichiers réseau (sshfs, nfs, …).
  • Sauvegardes montables comme un simple système de fichier : Les archives de sauvegarde peuvent être montées comme des systèmes de fichiers dans l’espace utilisateur pour un examen interactif, rapide et faciles des sauvegardes, la restauration se faisant alors par une simple copie de fichier.

Comment décentraliser ses sauvegardes Borg

Faire des sauvegardes c’est bien, mais les réaliser sur le même support de stockage que l’origine, c’est moins futé ! C’est pourquoi il est indispensable de décentraliser ses sauvegarde (à minima) dans un datacenter différent de celui de la source. Pour cela, plusieurs solutions payantes existent comme :

Si vous préférez gérer cette destination, en avoir l’accès et la gestion totale, le plus simple est d’héberger son serveur borgbackup. Celui qui hébergera les repos de chacune de vos sauvegardes.

Que l’infrastructure de sauvegarde soit chez vous, ou sur un serveur dédié / VPS, la méthode sera la même. Voici un schéma simplifié d’une infrastructure de backup basée sur l’utilisation d’un serveur borgbackup :

CleanShot-2023-10-03-at-13.57.02

Déployer un serveur BorgBackup avec Docker

Pour ce tutoriel, vous aurez besoin :

  • D’une machine sur laquelle borgbackup et borgmatic sont installés (le client)
  • D’une machine sur laquelle docker et docker-compose sont installés (le serveur)

Installation de borgbackup et borgmatic avec Pipx

apt update && apt install -y git python3 python3-venv python3-dev libacl1-dev build-essential gcc libssl-dev python3-setuptools python3-openssl python3-venv python3-llfuse net-tools libfuse-dev fuse pkg-config python3-pkgconfig
wget https://bootstrap.pypa.io/get-pip.py && python3 get-pip.py
python3 -m pip install pipx && python3 -m pipx ensurepath

pipx install borgmatic
pipx install borgbackup

mkdir -p ~/.config/borgmatic
touch ~/.config/borgmatic/config.yaml

ssh-keygen -t rsa ~/.ssh/id_rsa -C "mon-client"
❯ borg --version
borg 1.2.6
❯ borgmatic --version
1.8.2

A ce stade, notre client est prêt à réaliser ses premières sauvegardes.

Déploiement de notre serveur Borgbackup sous Docker

Retrouvez toutes les informations sur le fonctionnement de l’image Docker sur le Hub.

Connectez-vous à votre serveur distant qui hébergera les repo et le serveur borgbackup et lancez les commandes suivantes :

mkdir -p /opt/dockers/borgbackup-server/{backup,sshkeys}
mkdir -p /opt/dockers/borgbackup-server/sshkeys/clients

## Créez le fichier suivant et collez-y la clé SSH publique de votre client
touch /opt/dockers/borgbackup-server/sshkeys/clients/mon-client

Enfin, lancez le Docker avec la commande suivante :

docker run -d --name=borgbackup-server -e TZ="Europe/Paris" \
-e BORG_SERVE_ARGS='' -e BORG_APPEND_ONLY=no -e BORG_ADMIN='' \
-v /opt/dockers/borgbackup-server/backup:/backup:rw \
-v /opt/dockers/borgbackup-server/sshkeys:/sshkeys:rw \
-p 2277:22 martinbouillaud/borgbackup-server:latest

Lors du démarrage du Docker, celui-ci va :

  • tester les différents répertoires
  • leurs droits en écriture
  • lancer l’import des clés SSH présentes dans le répertoire sshkeys
  • créer un repo par clé SSH qui portera le nom du fichier de la clé déposé
  • vous afficher un exemple de fichier de configuration Borgmatic

La connexion à votre repo Borg sur la machine distance s’effectue avec l’utilisateur borg sur le port 2277.

Initialisation du repo Borg

Afin de simplifier la connexion à notre serveur Borg, voici une config SSH d’exemple :

Host borgrepo
    Hostname MON_SERVEUR_BORG
    User borg
    IdentityFile ~/.ssh/id_rsa
    Port 2277

Sur votre machine cliente, lancez la commande suivante pour initialiser le repo Borg. Il vous sera demandé une clé de chiffrement, qu’il est possible de générer facilement avec la commande suivante :

❯ pwgen 26 1
aibae3iefaisiexeH5Eirunoh2 ## Gardez cette clé de côté, elle sera nécessaire dans la configuration Borgmatic

❯ borg init --encryption=repokey borgrepo:/backup/mon-client

Création du fichier de configuration Borgmatic

Voici un exemple de fichier de configuration Borgmatic, vous permettant de sauvegarde votre /home :

constants:
  hostname: mon-client
  homedir: /home/monuser

source_directories:
    - {homedir}

repositories:
    - path: ssh://borgrepo/backup/{hostname}/
      label: monserveurborg

local_path: ~/.local/bin/borg

one_file_system: true
read_special: false

exclude_patterns:
    - '*.pyc'
    - '*/.cache'
    - '*/.vim*.tmp'

exclude_caches: true
exclude_if_present:
    - .nobackup

exclude_nodump: true

encryption_passphrase: "aibae3iefaisiexeH5Eirunoh2"

compression: lz4
retries: 3
retry_wait: 10

ssh_command: ssh -i {homedir}/.ssh/id_rsa -p 2277

borg_config_directory: '{homedir}/.config/borgmatic'
borg_keys_directory: '{homedir}/.config/borgmatic/keys'

archive_name_format: '{hostname}-{now:%Y-%m-%d_%H:%M:%S}'

keep_hourly: 24
keep_daily: 7
keep_weekly: 4
keep_monthly: 6
keep_yearly: 1

checks:
    - name: repository
      frequency: 2 weeks
check_repositories:
    - 'ssh://borgrepo/backup/{hostname}/'
check_last: 2

color: true

Enfin, lancez votre première backup :

borgmatic -c ~/.config/borgmatic/config.yaml --log-file /var/log/borgmatic.log --syslog-verbosity 1 --log-file-verbosity 1 --stats

Conclusion

Si vous avez des questions sur le fonctionnement de l’image, ou des repos Borg, n’hésitez pas à nous contacter. Nous proposons également des hébergements de repo Borg.