[Geek] C'est bien, c'est beau, c'est BORG.
@ Nicolas | Friday, Oct 1, 2021 | 6 minutes de lecture | Mise à jour le Friday, Oct 1, 2021

J’avoue, le titre est nul. Mais bon…

BORG est un logiciel de sauvegarde qui mérite d’être testé, et adopté !

Introduction

BorgBackup, ou son petit nom ‘Borg’, est un logiciel de sauvegarde simple qui fait de la déduplication. Cerise sur le gateau, il peut aussi compresser et chiffrer. Le tout avec authentification :)

Pourquoi BORG ?

Après avoir utilisé rsnapshot pendant des années, mes besoins ont évolué et il me fallait quelque chose de plus poussé… J’ai donc pris 2 minutes pour me faire un cahier des charges plutôt simple.

  • Pouvoir pousser la sauvegarde sur un serveur distant, pour faire du PRA (plutôt qu’aller la chercher)
  • Utiliser un flux SSH pour éviter les ouvertures de flux
  • Garder plusieurs versions de mes fichiers.
  • Ne pas stocker les fichiers identiques plusieurs fois, puisque la volumétrie peut vite grimper.
  • Chiffrer les sauvegardes, pour ne pas les laisser à distance dans un endroit qui peut être “non-safe”

Le besoin parait simple, mais trouver une solution qui y répond entièrement n’est pas si évident. J’ai par le passé utilisé pas mal d’outils, mais aucun ne savait tout faire sans ‘bricoler/scripter’.

En fouinant je suis rapidement tombé sur Borg.

Quelles sont ses fonctionnalités ?

En reprenant le site officiel, voici un petit résumé :)

  • Déduplication : Les fichiers sont découpés en “chunks” de tailles variables, ainsi, si un chunk déjà existant se présente, il ne sera pas ajouté au dépot (peut importe son client d’origine, tant qu’il tombe dans le même dépôt). Les avantages :

    • la déduplication ne se base pas bêtement sur les noms de fichiers, ou sur un checksum global du fichier.
    • si un gros fichier est modifié sur une petite partie, seule cette partie sera sauvegardée (parfait pour les fichiers raw/VM…)
    • si un bout de fichier est déplacé dans ce même fichier, il sera tout de même dédupliqué car déjà présent
  • Rapidité :

    • le code le plus “critique” est en C/Cython.
    • il y a du cache local dans le dépôt, qui contient un index des données
    • la détection des fichiers non modifiés est très efficace
  • Chiffrement : les données peuvent être chiffrées en AES256, et l’integrité et l’authenticité des données est vérifiée via HMAC-SHA256. Et bien évidemment : les données sont chiffrées par le client et transmises chiffrées.

  • Compression : Plusieurs formats sont proposés (lz4, zstd, zlib, lzma).

  • Externalisation : la sauvegarde peut être envoyée à distance via SSH.

  • Accès aux sauvegardes : il est possible de monter les sauvegardes comme filesystem et les parcourir/restaurer facilement.

  • OS supportés : Linux, MacOS X, FreeBSD, OpensBSD, NetBSD.

Et la pratique ?

nerd

C’est beau mais on veut du shell et de la pratique…

Tout commence par un repos

Bien évidement, vous avez installé le paquet Borg avec votre distribution préférée… Et votre ceinture est bouclée. On considèrera que toutes les commandes suivantes sont lancées sur le “client” que vous souhaitez sauvegarder.

Il suffit de créer le dépôt (on part sur le principe qu’on veut le chiffrer) :

# borg init -e repokey /mondepot

On peut aussi lui dire que c’est par là bas que ça se passe (prévoyez d’installer borg sur la machine distante) :

# borg init -e repokey ssh://odile@deray-srv/BACKUP/mondepot

La passphrase de chiffrement vous sera demandée… On la note sur un bon gros post’it sur le frigo hein (sous le clavier c’est pas mal aussi) !

joke

Et une sauvegarde

Pour créer une sauvegarde du dossier unicorns c’est facile :

# borg create ssh://odile@deray-srv/BACKUP/mondepot unicorns

Et zou !

Si vous rajoutez des fichiers dans le dossier et relancez la sauvegarde, vous allez voir la magie de la déduplication opérer dans les statistiques de la sauvegarde.

La rétention

Borg permet de faire du nettoyage dans le dépôt pour conserver un nombre de sauvegardes quotidiennes, hebdo et mensuelles. Tout cela passe par la fonctionnalité de “prune”.

Par exemple :

# borg prune -v --list --keep-daily=7 --keep-weekly=4 --keep-monthly=2 ssh://odile@deray-srv/BACKUP/mondepot unicorns

Automatiquement les chunks non utiles sont supprimés.

Afficher les sauvegardes

Pour cela il suffit de lister :

# borg list ssh://odile@deray-srv/BACKUP/mondepot

Chaque sauvegarde prendra le nom serveur-date-time.

Infos sur le dépôt

# borg info ssh://odile@deray-srv/BACKUP/mondepot

Si je prends un exemple de mon cas :

------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
All archives:               16.30 TB             16.21 TB              1.24 TB

                       Unique chunks         Total chunks
Chunk index:                  525852              6871349

Ouais, ça fait plaisir (et non c’est pas 16To de licornes). La compression n’est pas énorme car j’utilise le mode rapide.

Sauvegarder la clé

Si on perd la clé de chiffrement, c’est la fin des haricots, mais borg a pensé à tout. On peut facilement extraire la clé, dans un fichier, sous forme de papier à imprimer ou même un qr code (parfait pour le frigo) :)

# borg key export ssh://odile@deray-srv/BACKUP/mondepot chemindufichierdesortie

Restaurer

Il y a plusieurs possibilités. On peut monter l’archive et se balader dedans, et faire nos copier/coller habituels. Ou on peut utiliser l’extracteur.

Montage

# borg mount ssh://odile@deray-srv/BACKUP/mondepot /monpointdemontage

Attention, cela n’est pas forcement très rapide, surtout si le montage est over ssh.

Bien sûr il faudra démonter le dépôt via

# borg umount /monpointdemontage

Extract

Pour cela il faut déjà lister comme indiqué précédemment, les sauvegardes pour choisir celle qui vous interesse.

On pourrait l’extraire entièrement :

# borg extract ssh://odile@deray-srv/BACKUP/mondepot::masauvegarde

Ou lister les fichiers de la sauvegarde pour extraire ce qui nous intéresse.

# borg list ssh://odile@deray-srv/BACKUP/mondepot::masauvegarde
# borg extract ssh://odile@deray-srv/BACKUP/mondepot::masauvegarde cedossierspecifique/

Il y a pas mal d’options possibles (–dry-run, —exclude …).

Automatisation

Dans mon cas j’ai modifé un script bash proposé par Borg, que j’ai templatisé en jinja2 et mis dans ma conf ansible pour simplifier le déploiement sur mes machines.

Il est ensuite appelé par crontab et en avant la musique.

#!/bin/sh

export BORG_REPO=ssh://{{ borg_backup_server_user }}@{{ borg_backup_server }}:{{ borg_backup_server_port }}/\
   {{ borg_backup_server_folder }}/{{ ansible_hostname }}

export BORG_PASSPHRASE={{ borg_backup_passphrase }}

info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) [{{ ansible_hostname }}] Backup interrupted >&2; exit 2' INT TERM

info "[{{ ansible_hostname }}] Starting backup"

borg create                         \
    --verbose                       \
    --filter AME                    \
    --list                          \
    --stats                         \
    --show-rc                       \
    --compression zstd,10           \
    --exclude-caches                \
{% for items in borg_backup_exclude %}
    --exclude '{{ items }}'           \
{% endfor %}
                                    \
    ::'{hostname}-{now}'            \
{% for items in borg_backup_folders %}
    {{ items }}	\
{% endfor %}

backup_exit=$?

info "Pruning repository"

borg prune                          \
    --list                          \
    --prefix '{hostname}-'          \
    --show-rc                       \
    --keep-daily    {{ borg_backup_pra_daily }}               \
    --keep-weekly   {{ borg_backup_pra_weekly }}               \
    --keep-monthly  {{ borg_backup_pra_monthly }}               \

prune_exit=$?

global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))

if [ ${global_exit} -eq 0 ]; then
    info "Backup and Prune finished successfully"
elif [ ${global_exit} -eq 1 ]; then
    info "Backup and/or Prune finished with warnings"
else
    info "Backup and/or Prune finished with errors"
fi

exit ${global_exit}

On peut ensuite utiliser ces variables dans le host_vars du client :

borg_backup_server: deray-srv
borg_backup_server_user: odile
borg_backup_server_port: 22
borg_backup_server_folder: '/BACKUP/mondepot'

borg_backup_daily: 7
borg_backup_weekly: 4
borg_backup_monthly: 2

borg_backup_passphrase: 'une super passphrase vaultée`

borg_backup_folders:
  - /etc
  - /Unicorns
  - /home
borg_backup_exclude:
  - '*temp*'

Version Web

Il y a une possibilité d’avoir une interface web, qui s’appelle BorgWeb, mais que je n’ai pas testé actuellement. Vous trouverez plus d’info par ici : https://borgweb.readthedocs.io/en/stable/

Conclusion

Vraiment Borg est une super trouvaille, et est vraiment très simple à mettre en place. J’ai déjà eu l’occasion de faire appel à de la restauration et c’est super rapide.

Si vous aimez ce projet pensez à contribuer au projet ! De mon côté je vais suivre ce projet avec attention ;)

Liens

Le site officiel : https://borgbackup.readthedocs.io/

La doc complète pour les curieux : https://borgbackup.readthedocs.io/en/stable/usage/general.html

© 2017 - 2021 Some stuff...

Powered by Hugo with theme Dream.