Gestion sauvegardes locales et distantes avec Borg

Mon serveur YunoHost

Matériel: VPS acheté en ligne
Version de YunoHost: 4.3.6.3
J’ai accès à mon serveur : En SSH | Par la webadmin
Êtes-vous dans un contexte particulier ou avez-vous effectué des modifications particulières sur votre instance ? : oui
déplacer des dossiers vers d’autres partitions avec des liens symboliques pour certaines applications ou données

Bonjour,

Suite à ce topic Ajout cron backup local

Du coup j’ai installé une deuxième app Borg que j’appelle Borg Local Backup. Du coup j’ai borg (Borg Backup) configuré qui envoie des sauvegardes vers un serveur distant (Borg Server sur un autre serveur) et borg__2 pour des sauvegardes locales.

Quelques questions:

  • lors de l’installation, il faut ajouter un mot de passe, ok, mais il n’y a pas un utilisateur dédié ? Je ne cherche pas à encrypter les sauvegardes en local. Fallait-il mettre le mot de passe de l’user admin ou root ?

  • J’ai essayé d’exclure certaines apps en mettant all, exclude:borg, mais j’ai eu l’impression que cela provoquait l’inverse, inclure , c’est à dire si je mettais exclude:nextcloud il ne va sauvegarder que nextcloud ? c’est bien ça ? ou au contraire sauvegarder toutes les apps sauf nextcloud ? En fait c’est surtout pour les sauvegardes que je m’inquiète, l’application en elle-même ne dit pas être lourde ?

  • Comment faire pour que la sauvegarde de borg qui tous les jours est envoyée à un serveur distant n’inclue pas les sauvegardes de borg__2 et inversement. Peut-on spécifier à Borg de ne pas sauvegarder un dossier ? car cela va faire des doublons, non ?

  • J’ai fait cette commande pour ne pas sauvegarder les données de Nextcloud, ce qui risque d’âtre lourd: sudo yunohost app setting nextcloud do_not_backup_data -v 1. Cela devrait s’appliquer à toutes les sauvegardes ensuite ?

J’ai lu plein de posts sur ce sujet et je me perd un peu…
pour aider voici mes les methodes que j’ai pour borg et borg__2

/etc/yunohost/hooks.d/backup_method/05-borg_app (sauvegarde distante)

#!/bin/bash

set -eo pipefail
app="${0#"./05-"}"
app="${app%"_app"}"

BORG_PASSPHRASE="$(yunohost app setting $app passphrase)"
repo="$(yunohost app setting $app repository)"   #$4
if ssh-keygen -F "[domaine.tld]:XXXX" >/dev/null ; then
    BORG_RSH="ssh -i /root/.ssh/id_${app}_ed25519 -oStrictHostKeyChecking=yes "
else
    BORG_RSH="ssh -i /root/.ssh/id_${app}_ed25519 -oStrictHostKeyChecking=no "
fi

do_need_mount() {
    true
}

LOGFILE=/var/log/backup_borg.err
log_with_timestamp() {
  sed -e "s/^/[$(date +"%Y-%m-%d_%H:%M:%S")] /" | tee -a $LOGFILE
}

do_backup() {
    
    export BORG_PASSPHRASE
    export BORG_RSH
    export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
    work_dir="$1"
    name="$2"
    repo="$3"
    size="$4"
    description="$5"
    current_date=$(date +"%Y-%m-%d_%H:%M")
    pushd "$work_dir"
    set +e
    if borg init -e repokey "$repo" ; then
	    #human_size=`echo $size | awk '{ suffix=" KMGT"; for(i=1; $1>1024 && i < length(suffix); i++) $1/=1024; print int($1) substr(suffix, i, 1), $3; }'`
	    # Speed in Kbps
	    #speed=1000
	    #evaluated_time=$(($size / ($speed * 1000 / 8) / 3600))
	    echo "Hello,

Your first backup on $repo is starting.

This is an automated message from your beloved YunoHost server." | /usr/bin/mail.mailutils -a "Content-Type: text/plain; charset=UTF-8" -s "[YNH] First backup is starting" "root"
    fi
    set -e

    borg create "$repo::_${name}-${current_date}" ./ 2>&1 >/dev/null | log_with_timestamp
    popd

    # About thi _20 it's a crazy fix to avoid pruning wordpress__2 
    # if you prune wordpress
    borg prune "$repo" -P "_${name}-" --keep-hourly 2 --keep-daily=7 --keep-weekly=8 --keep-monthly=12 2>&1 >/dev/null | log_with_timestamp
    
    # Prune legacy archive name without error on wordpress/wordpress__2
    borg prune "$repo" -P "${name}_" --keep-within 2m --keep-monthly=12 2>&1 >/dev/null | log_with_timestamp
    
    # We prune potential manual backup older than 1 year
    borg prune "$repo" --keep-within 1y 2>&1 >/dev/null | log_with_timestamp
}

do_mount() {
    export BORG_PASSPHRASE
    export BORG_RSH
    work_dir="$1"
    name="$2"
    repo="$3"
    size="$4"
    description="$5"
    borg mount "$repo::$name" "$work_dir" 2>&1 >/dev/null | log_with_timestamp
}

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

bon, ça c’est les sauvegardes distantes qui ont lieu vers 3H00 du mat’

/etc/yunohost/hooks.d/backup_method/05-borg__2_app (sauvegardes locales)

#!/bin/bash

set -eo pipefail
app="${0#"./05-"}"
app="${app%"_app"}"

BORG_PASSPHRASE="$(yunohost app setting $app passphrase)"
repo="$(yunohost app setting $app repository)"   #$4
if ssh-keygen -F "" >/dev/null ; then
    BORG_RSH="ssh -i /root/.ssh/id_${app}_ed25519 -oStrictHostKeyChecking=yes "
else
    BORG_RSH="ssh -i /root/.ssh/id_${app}_ed25519 -oStrictHostKeyChecking=no "
fi

do_need_mount() {
    true
}

LOGFILE=/var/log/backup_borg.err
log_with_timestamp() {
  sed -e "s/^/[$(date +"%Y-%m-%d_%H:%M:%S")] /" | tee -a $LOGFILE
}

do_backup() {
    
    export BORG_PASSPHRASE
    export BORG_RSH
    export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
    work_dir="$1"
    name="$2"
    repo="$3"
    size="$4"
    description="$5"
    current_date=$(date +"%Y-%m-%d_%H:%M")
    pushd "$work_dir"
    set +e
    if borg init -e repokey "$repo" ; then
	    #human_size=`echo $size | awk '{ suffix=" KMGT"; for(i=1; $1>1024 && i < length(suffix); i++) $1/=1024; print int($1) substr(suffix, i, 1), $3; }'`
	    # Speed in Kbps
	    #speed=1000
	    #evaluated_time=$(($size / ($speed * 1000 / 8) / 3600))
	    echo "Hello,

Your first backup on $repo is starting.

This is an automated message from your beloved YunoHost server." | /usr/bin/mail.mailutils -a "Content-Type: text/plain; charset=UTF-8" -s "[YNH] First backup is starting" "root"
    fi
    set -e

    borg create "$repo::_${name}-${current_date}" ./ 2>&1 >/dev/null | log_with_timestamp
    popd

    # About thi _20 it's a crazy fix to avoid pruning wordpress__2 
    # if you prune wordpress
    borg prune "$repo" -P "_${name}-" --keep-hourly 2 --keep-daily=7 --keep-weekly=8 --keep-monthly=12 2>&1 >/dev/null | log_with_timestamp
    
    # Prune legacy archive name without error on wordpress/wordpress__2
    borg prune "$repo" -P "${name}_" --keep-within 2m --keep-monthly=12 2>&1 >/dev/null | log_with_timestamp
    
    # We prune potential manual backup older than 1 year
    borg prune "$repo" --keep-within 1y 2>&1 >/dev/null | log_with_timestamp
}

do_mount() {
    export BORG_PASSPHRASE
    export BORG_RSH
    work_dir="$1"
    name="$2"
    repo="$3"
    size="$4"
    description="$5"
    borg mount "$repo::$name" "$work_dir" 2>&1 >/dev/null | log_with_timestamp
}

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 

J’ai mis Daily pour cette sauvegarde, donc à minuit.

Par défaut, je laisse finalement toutes les apps dans la sauvegarde…

Pour ne pas chiffré la sauvegarde locale, que dois-je faire ?
cette commande ?

borg init --encryption=none /media/DISK/dossierbackup

Cela ne va pas empêcher le chiffrement de la sauvegarde distante ?
Et supprimer dans 05-borg__2_app ces lignes ?

BORG_PASSPHRASE="$(yunohost app setting $app passphrase)"
repo="$(yunohost app setting $app repository)"   #$4
if ssh-keygen -F "" >/dev/null ; then
    BORG_RSH="ssh -i /root/.ssh/id_${app}_ed25519 -oStrictHostKeyChecking=yes "
else
    BORG_RSH="ssh -i /root/.ssh/id_${app}_ed25519 -oStrictHostKeyChecking=no "
fi

Pour ne pas sauvegarder en double les sauvegardes ? c’est à dire ne pas sauvegarder dans le serveur distant mondomaine.tld le dossier de la sauvegarde locale ?
La sauvegarde locale ne va-t-elle pas sauvegarder non plus son propre dossier ? j’imagine que non, mais je me pose la question…

C’est le mot de passe qui servira à chiffrer la sauvegarde, et si je ne me trompe pas, c’est l’utilisateur root qui fera la sauvegarde.

Si tu veux sauvegarder tout sauf nextcloud, ne mets que “exclude:nextcloud”.
Chez moi, la sauvegarde hebdomadaire sauvegarde tout sauf nextcloud et transmission (nextcloud est sauvegardé tous les jours, mais grace à la magie de la dé-duplication, ça ne prends pas plus de place) et j’ai mis “exclude:nextcloud,transmission”

A la réponse au dessus, j’ai un peu menti, la sauvegarde hebdomadaire exclue aussi l’app borg et borg__2 :grin: (et aussi borgserver qui me sert à héberger la sauvegarde de quelqu’un d’autre)

La, aucune idée, mais rappelle toi que la sauvegarde est dé-dupliquée.
Voici les stats de mon backup journalier (qui ne comprends que des sauvegardes de NextCloud)

                       Original size      Compressed size    Deduplicated size
All archives:                9.85 TB              9.56 TB            427.10 GB

Du coup, la sauvegarde “pèse” 427BG, mais comprends 8.85TB de sauvegardes (si je voulais m’amuser à tout extraire.
Du coup mon conseil c’est aussi de sauvegarder les données, parce que, ben, c’est important :grin:

Merci @Mamie pour toutes les explications… Oui le mot de passe sert à chiffrer la sauvegarde, je me demandais si ça ne prenais pas plus de place…

Du coup j’hésite à en effet sauvegarder les données de Nextcloud et à retirer la commande yunohost app setting nextcloud do_not_backup_data -v 1 qui induit un comportement permanent de BACKUP_CORE_ONLY=1.
Mais commment ? J’imagine que ce serait yunohost app setting nextcloud do_not_backup_data -v 0
Ou bien yunohost app setting nextcloud backup_core_only -v '', mais par défaut le script nextcloud backup de nextcloud ne sauvegarde pas les données on dirait ??
Ou bien encore `yunohost app setting nextcloud backup_core_only -d ’ ? Je ne sais plus bien, ça a l’air délicat pour Nextcloud comme comportement car c’est un soucis beaucoup de données à restaurer.

Ok, j’ai retrouvé, c’est plutôt
yunohost app setting nextcloud backup_core_only -v '' pour revenir en arrière ou bien éditer /etc/yunohost/apps/nextcloud/settings.yml et enlever la ligne
do_not_backup_data

1 Like

This topic was automatically closed 15 days after the last reply. New replies are no longer allowed.