Sauvegarder

Passer en root par su ou sudo

Contexte

On veut sauvegarder le serveur de Camille sur celui de Sam

Camille : lachenille.tld
Sam: thedriver.tld

Vous devez configurer borg à partir de backport et initialiser un repo.

Créer une clé privée sur le serveur de Camille

Camille crée une clé privée et une clé publique :

ssh-keygen -t ed25519 # Ne spécifiez pas de mot de passe
Entrez une phrase de chiffrement (vide pour aucune phrase de chiffrement) : 
Saisissez à nouveau la même phrase de chiffrement : 
Votre identification a été enregistrée dans /home/root/.ssh/id_ed25519.
Votre clé publique a été enregistrée dans /home/root/.ssh/id_ed25519.pub.
L'empreinte de la clé est :
SHA256:RDaEw3tNAKBGMJ2S4wmN+6P3yDYIE+v90Hfzz/0r73M root@lachenille.tld root@lachenille.tld
L'image aléatoire de la clé est :
+--[ED25519 256]--+
|o*...o.+*.       |
|*o+.  +o ..      |
|o+++ o.o |
|o+ ... .      |
| + .S |
|+ o .            |
|o+.o.o.o.o.o |
|oo+oo+o. . o......E|
| oooo. ..o++=*|
+----[SHA256]-----++

Camille envoie la clé publique à Sam. Par exemple par email

cat /root/.ssh/id_ed25519.pub | mail sam@thedriver.tld

Préparer le chemin pour le dépôt à distance sur le serveur de Sam

Sam crée un utilisateur spécifique pour Camille

adduser camille

Sam ajoute la clé publique de Camille avec limitation de borg

echo "command=\"borg serve --restrict-to-path /home/camille/backup\",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh-ed25519 AAAAC3NzaC1l[...]YRPujWoRyeVhhFZ0M root@lachenille.tld" >> /home/camille/.ssh/authorized_keys

Puis Sam installe borg-backup

apt-get install python3-pip python3-dev libacl1-dev libssl-dev liblz4-dev
pip3 install setuptools --upgrade
pip3 install borgbackup

Si le serveur de Sam est un YunoHost, vous devez éviter de sauvegarder les données sauvegardées de Camille. C’est très important si le serveur de Sam est sauvegardé sur celui de Camille.

touch /home/camille/.nobackup
mkdir -p /etc/yunohost/hooks.d/backup
cat > /etc/yunohost/hooks.d/backup/17-data_home <<EOF
#!/bin/bash

# Exit hook on subcommand error or unset variable
set -eu

# Source YNH helpers
source /usr/share/yunohost/helpers.d/filesystem

# Backup destination
backup_dir="\${1}/data/home"

# Backup user home
for f in \$(find /home/* -type d -prune | awk -F/ '{print \$NF}'); do
    if [[ ! "\$f" =~ ^yunohost|lost\+found ]]; then
        if [ ! -e "/home/\$f/.nobackup" ]; then
            ynh_backup "/home/\$f" "${backup_dir}/\$f" 1
        fi
    fi
done
EOF

Installation de Borg sur le serveur de Camille

apt-get install python3-pip python3-dev libacl1-dev libssl-dev liblz4-dev
pip3 install borgbackup

Créer le référentiel à distance à partir du serveur de Camille

borg init -e repokey camille@lachenille.tld:backup

Vous devez conserver la phrase de chiffrement que vous avez définie

Patcher le serveur Yunohost de Camille

cette étape n’est pas nécessaire avec Yunohost >= 2.7.x)

Actuellement, vous avez besoin d’un correctif pour prendre en charge les méthodes de sauvegarde personnalisées

cd /usr/lib/moulinette/yunohost
rm backup.py
wget https://raw.githubusercontent.com/YunoHost/yunohost/ead685c455939c1c830a426e171f3e9c6266b5ad/src/yunohost/backup.py
cd /usr/share/moulinette/actionsmap/
rm yunohost.yml
wget https://raw.githubusercontent.com/YunoHost/yunohost/ead685c455939c1c830a426e171f3e9c6266b5ad/data/actionsmap/yunohost.yml

puis

mkdir -p /etc/yunohost/hooks.d/méthode_de_backup
mkdir -p /usr/share/yunohost/méthode_de_sauvegarde

Ajouter les crochets (“hooks”) myborg sur le serveur de Camille

Ce crochet (hook) est une méthode de sauvegarde personnalisée. N’oubliez pas de remplacer repo et BORG_PASSPHRASE. Si la phrase de chiffrement contient des guillemets doubles ou des dollars, n’oubliez pas d’échapper à ces caractères avec \

/etc/yunohost/hooks.d/backup_method/05-myborg
#!/bin/bash

set -e

BORG_PASSPHRASE="XXXXXXXX"
repo=camille@thedriver.tld:backup   #$4

do_need_mount() {
    true
}

do_backup() {
    
    export BORG_PASSPHRASE
    work_dir=$1
    name=$2
    repo=$3
    size=$4
    description=$5
    LOGFILE=/var/log/backup_borg.log
    ERRFILE=/var/log/backup_borg.err
    current_date=$(date +"%d_%m_%y_%H:%M")
    pushd $work_dir
    borg create $repo::${name}_${current_date} ./ >> $LOGFILE 2>> $ERRFILE
    popd

    borg prune $repo -P ${name} --keep-daily=7 --keep-weekly=8 --keep-monthly=12 >> $LOGFILE 2>> $ERRFILE
}

do_mount() {
    export BORG_PASSPHRASE
    work_dir=$1
    name=$2
    repo=$3
    size=$4
    description=$5
    LOGFILE=/var/log/backup_borg.log
    ERRFILE=/var/log/backup_borg.err
    borg mount $repo::$name $work_dir >> $LOGFILE 2>> $ERRFILE
}

work_dir=$2
name=$3

size=$5
description=$6

case "$1" in
  need_mount)
    do_need_mount $work_dir $name $repo $size $description
    ;;
  backup)
    do_backup $work_dir $name $repo $size $description
    ;;
  mount)
    do_mount
    ;;
  *)
    echo "hook called with unknown argument \`$1'" >&2
    exit 1
    ;;
esac

exit 0

Test

yunohost backup create --ignore-apps --system conf_ldap -n test --methods myborg --debug --verbose

Exécutez la sauvegarde chaque nuit

Si c’est ok, vous pouvez créer un cron pour exécuter la commande chaque nuit

/etc/cron.daily/yunohost-99-backup
#!/bin/bash

if yunohost -v | grep "version: 2." > /dev/null; then
    ignore_apps="--ignore-apps"
    ignore_system="--ignore-system"
else
    ignore_apps=""
    ignore_system=""
fi
filter_hooks() {
    ls /usr/share/yunohost/hooks/backup/ /etc/yunohost/hooks.d/backup/ | grep "\-$1_" | cut -d"-" -f2 | uniq
}

# Backup system part conf
yunohost backup create $ignore_apps -n auto_conf --methods myborg --system $(filter_hooks conf)

# Backup system data
yunohost backup create $ignore_apps -n auto_data --methods myborg --system $(filter_hooks data)

# Backup all apps independently
for app in $(yunohost app list --installed -b | grep id: | cut -d: -f2); do
    backup_methods=$(yunohost app setting $app backup_methods)

    if [ -z "$backup_methods" ]; then
        backup_methods=myborg
    fi

    if [ "$backup_methods" != "none" ]; then
        yunohost backup create $ignore_system -n auto_$app --methods $backup_methods --apps $app
    fi
done

N’oubliez pas de donner les droits d’exécution !

chmod a+x /etc/cron.daily/yunohost-99-backup

Désactiver la sauvegarde d’une application particulière

yunohost app setting strut backup_methods -v none

Sauvegarder une application particulière avec d’autres méthodes

Créez vos méthodes spécifiques

cp /etc/yunohost/hooks.d/backup_method/05-myborg /etc/yunohost/hooks.d/backup_method/15-mynextcloudborg
nano /etc/yunohost/hooks.d/backup_method/10-mynextcloudborg

Spécifiez la méthode à utiliser pour l’application ciblée

yunohost app setting nextcloud backup_methods -v mynextcloudborg

LIMITATIONS
Ce tuto fonctionne si vous pouvez transférer vos données initiales dans un délai maximum de 24 heures.
Donc, si vous avez un ADSL et plus de 20G à transférer (à la première fois), vous devez être prudent.

Restaurer

Sur un nouveau serveur

Si vous n’êtes pas sur la même instance yunohost, vous devez copier la clé privée pour accéder au serveur camille ou recréer une clé privée et demander à camille de mettre la nouvelle.

Suivant, faites :

borg list camille@lachenille.tld:backup

Vous devez identifier les sauvegardes récentes. Conf, données et applications ont leurs propres archives de sauvegarde.

Commencez par restaurer conf

borg export-tar camille@lachenille.tld:backup::auto_confXXXX /home/yunohost.backup/archives/auto_confXXXX.tar.gz
yunohost backup restore auto_confXXXX

Ensuite, restaurez les données et chaque application avec la même méthode.

Sur le même serveur

faire :

borg list camille@lachenille.tld:backup

Vous devez identifier les sauvegardes récentes. Conf, données et applications ont leurs propres archives de sauvegarde.
Éventuellement, supprimez l’application que vous voulez restaurer.

borg export-tar camille@lachenille.tld:backup::autoXXXX /home/yunohost.backup/archives/autoXXXX.tar.gz
yunohost backup restore autoXXXX

Optionnel Sauvegarde sur 2 serveurs (avec un grand espace de sauvegarde à distance et un petit)

Ajouter une nouvelle méthode de sauvegarde et modifier la phrase de passe et la destination du repo

cp /etc/yunohost/hooks.d/backup_method/05-myborg /etc/yunohost/hooks.d/backup_method/10-mysmallerborg
nano /etc/yunohost/hooks.d/backup_method/10-mysmallerborg

Changez /etc/cron.daily/yunohost-99-backup avec ce contenu et modifiez la taille limite comme vous le souhaitez :

#!/bin/bash

if yunohost -v | grep "version: 2." > /dev/null; then
    ignore_apps="--ignore-apps"
    ignore_system="--ignore-system"
else
    ignore_apps=""
    ignore_system=""
fi

# Size limit in MB per apps above which the script just backup on one server
declare -A limit
limit[nonessential]=10
limit[important]=150
limit[critical]=1024

# List of backup profiles
declare -A backup_profiles
backup_profiles[simple]="myborg"
backup_profiles[double]="mysmallerborg myborg"
backup_profiles[nobackup]="none"
if [ ! -e /etc/yunohost/hooks.d/backup_method/*-mysmallerborg ]; then
    backup_profiles[double]="myborg"
fi

# Select backup methods to apply
get_backup_methods() {
    importance=$1
    size_max=$2 # In MB or "unlimited"
    if [ "$size_max" == "unlimited" ]; then
        size_max=$(expr $(df --output=size / | sed -n '2 p') / 1000)
    fi

    if (( $size_max > ${limit[$importance]} )); then
        echo ${backup_profiles[simple]}
    else
        echo ${backup_profiles[double]}
    fi
}
filter_hooks() {
    ls /usr/share/yunohost/hooks/backup/ /etc/yunohost/hooks.d/backup/ | grep "\-$1_" | cut -d"-" -f2 | uniq
}

# Backup system part conf
yunohost backup create $ignore_apps -n auto_conf --methods $(get_backup_methods important 50) --system $(filter_hooks conf)

# Backup system data
yunohost backup create $ignore_apps -n auto_data --methods $(get_backup_methods important unlimited) --system $(filter_hooks data)

# Backup all apps independently
for app in $(yunohost app list --installed -b | grep id: | cut -d: -f2); do
    backup_methods=$(yunohost app setting $app backup_methods)

    if [ -z "$backup_methods" ]; then
        size_max=$(yunohost app setting $app max_size)
        size_max=${size_max:-unlimited}
        importance=$(yunohost app setting $app importance)
        importance=${importance:-important}
    	backup_methods=$(get_backup_methods $importance $size_max)
    fi

    if [ "$backup_methods" != "none" ]; then
        yunohost backup create $ignore_system -n auto_$app --methods $backup_methods --apps $app
    fi
done

Ajouter max_size + importance à une application :

yunohost app setting wordpress max_size -v 500
yunohost app setting wordpress importance -v critical

yunohost app setting strut max_size -v 100
yunohost app setting strut importance -v nonessential

yunohost app setting nextcloud max_size -v 250000
yunohost app setting nextcloud importance -v important