Analphabet for(;;) rand();

Sauvgarde avec Borg et SSH

chiffrement sécurité backup

les backups sont probablement la première chose a mettre en place sur un serveur, NAS, ou PC. C'est une fonction qui passe inaperçu, mais très utile en cas de problème.

Fonctionnalités nécessaires

Alors de quoi a ton vraiment besoin ?

Au final SSH et Borg remplisses tout ces conditions. ZFS, zfs-auto-snapshot avec SSH ai une solution plus performante mais je n'ai parlerais pas aujourd'hui

let's rock du patté

installation sur le client

sudo apt update && sudo apt upgarde
sudo apt install borgbackup openssh-client
sudo ssh-keygen -t ed25519 /root/.ssh/id_ed25519

ne mettez pas de mot de passe a votre clé ssh ! Ça rendrais difficile l'automatisation de la sauvegarde

installation sur le serveur

sudo apt install borgbackup openssh-server

préparation du serveur

sudo mkdir -pv /srv/backups/.ssh
sudo mkdir -pv /srv/backups/monpc
sudo chown -R backups:backups /srv/backups
sudo adduser --disabled-login --home /srv/backups/ --no-create-home backups
cat > /srv/backups/.ssh/authorized_keys
command="cd /srv/backups/monpc; borg serve --restrict-to-path /srv/backups/monpc",no-port-forwarding,no-x11-forwarding,no-agent-forwarding,no-pty,no-user-rc {{ la clé publique ssh de votre pc }}
^D

création du répertoire

BORG_NEW_PASSPHRASE=$(pass generate backup) borg init --encryption=repokey backups@monserveur:/srv/backups/monpc

Création du scripts de backup

cat > /tmp/backups.sh
#!/bin/bash

REPO='backups@monserveur:monpc'
export BORG_PASSCOMMAND='pass show backup'

borg create -v --stats --progress --compression lz4 \
    --exclude-caches                 \
    --exclude-if-present ".nobackup" \
    --exclude '/home/*/.cache/*'    \
    --exclude '/var/cache/*'        \
    --exclude '/var/tmp/*'          \
    --exclude '*.pyc'               \
    --exclude '*.o'                 \
    /etc                            \
    /home                           \
    /root                           \
    /var                            \
    ${REPO}::'{hostname}-{now:%Y-%m-%d}' \

backup_exit=$?

borg prune -v --list $REPO --prefix '{hostname}-' \
    --keep-daily=7 --keep-weekly=4 --keep-monthly=6

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}
^D

cat > /tmp/check.sh
#!/bin/bash

REPO='backups@monserveur:monpc'
export BORG_PASSCOMMAND='pass show backup'

borg check $REPO \
    --prefix '{hostname}-' \
    --verify-data \
^D

chmod +x /tmp/backups.sh
chmod +x /tmp/check.sh
sudo chown root:root /tmp/backups.sh
sudo chown root:root /tmp/check.sh
sudo mv /tmp/backups.sh /etc/cron.daily/
sudo mv /tmp/check.sh /etc/cron.weekly/

Libre à vous de modifié ce script pour sauvegardé d'autre chose, ou lancé le script a l'alignement de certaine planète. Le script est aussi fait pour ne pas sauvegardé les dossiers contenant un fichier .nobackup, ça est très utile pour ne pas sauvegardé les dossier inule comme les dossiers d'environnements virtuel, les dossier de build, etc.. dans le but de réduire l'espace utilisé et la vitesse de sauvegarde.

Performance

Sur mon serveur perso, 125Go d'espace disque sont utilisé, et les sauvegardes font 4,7Go. Plutôt efficace non ? Par contre sur mon PC perso, j'utilise 200Go d'espace disque et les sauvegarde font environ 100Go.. Ce qui est assez logique car les mails sont très compressible contrairement au images (sauf bitmap), les vidéos, les fichiers audio, etc..