Borg backup local et distants

Bonjour,

J’ai actuellement mes sauvegardes qui se font via borg sur un autre serveur grâce à ce tutoriel

Il me faudrait aussi faire ces backups avec un prune (nettoyage des backups) différent vers un emplacement local. Sauf que je ne comprends pas trop les scripts et mes modifications manuelles ne fonctionnent pas :confused:

La partie optionnelle du tutoriel (deux serveur, l’un avec un gros et l’autre avec un petit espace) n’est pas vraiment ce que je recherche étant donné que je souhaites avoir moins de versions mais toujours toutes mes app sauvegardées sur cet emplacement, peu importe leurs taille.

Ce tuto correspond sans doute à ce que tu cherches: How to backup automatically with borg on a local harddrive without encryption

Pour le script de sauvegarde borg oui mais pas pour le script cron qui ne déclenchera qu’une des deux sauvegarde :confused:

Dans le script /etc/cron.daily/yunohost-99-backup tu remplaces
“myborg”
par
“mylocalborg myborg”

Wait, si dans la commande je met les deux scripts de sauvegardes à la suite ça va déclencher les deux scripts de sauvegarde ? :open_mouth:

Il est possible de mettre plusieurs méthodes dans la même commande.

yunohost backup create --methods tar myborg

par exemple

Bonjour,

J’ai un petit porblème avec le script etc/cron.daily/yunohost-99-backup :
J’ai bien paramétré ma seconde méthodes de sauvegarde et l’incorporée au script. Sauf que quand je lance celui-ci j’ai cette erreur pour chaque app :
Erreur : Une archive de sauvegarde avec ce nom existe déjà

Hello, je déterre ce sujet… peut-être plus à jour ?
J’ai déjà un backup journalier configurer vers un autre serveur avec Borg Backup et Borg Server pour la machine qui accueille les sauvegardes…
J’aimerai rajouter une sauvegarde locale sur le serveur… peut-être pas à la même heure. Je peux utiliser Borg pour cette deuxième sauvegarde ?
Par contre je n’ai pas de scripts dans etc/cron.daily/ ??

Autre soucis que je découvre, j’ai rapatrié une sauvegarde avec Borg qui vient du serveur Borg. En voulant le supprimer, j’ai une erreur, car il comporte trop de caractères !

yunohost backup delete _auto_nextcloud-2022-01-18_04:03
Warning: argument value '_auto_nextcloud-2022-01-18_04:03' for 'name' doesn't match pattern '^[\w\-\._]{1,50}(?<!\.)$'
Error: Invalid argument 'name': Must be a valid filename with max 30 characters, alphanumeric and -_. characters only

Je peux modifier son nom pour l’effacer… Si je devais le restaurer, est-ce que je pourrai aussi changer son nom sans tout casser ?

Toutes mes sauvegardes sur le serveur Borg ont ces 2 underscores avant leurs noms, pourquoi, est-ce normal ?

Voici comment se présente mon fichier actuel /etc/yunohost/hooks.d/backup_method/05-borg_app

#!/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 "[borgserverdomain.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

exit 0

Ou bien pour les sauvegardes locales, ce pourrait être un cron sans Borg ? sachant que sur cette machine il n’y a que Borg Backup d’installer les Borg Server est sur une autre machine…
Sinon, je me contente d’en faire occasionnellement à la mano…

Bon, ça j’ai essayé, si je change le nom du .tar et du .info.json ça fonctionne pareil…

Bonjour,
j’ai aussi mis en place une sauvegarde locale avec Borg, mais du coup, je ne sais pas bien comment agir pour par exemple créer une archive.
Je peux voir les infos dans le dossier attribuer avec la commande:

borg info /mnt/backups/borgarchives/ -v
Enter passphrase for key /mnt/backups/borgarchives: 
Repository ID: 49d92dc4ab6920d3ed363662cb1f637d350c46c14f2da471ce4427747b468c46
Location: /mnt/backups/borgarchives
Encrypted: Yes (repokey)
Cache: /root/.cache/borg/49d92dc4ab6920d3ed363662cb1f637d350c46c14f2da471ce4427747b468c46
Security dir: /root/.config/borg/security/49d92dc4ab6920d3ed363662cb1f637d350c46c14f2da471ce4427747b468c46
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
All archives:              228.63 GB            184.89 GB             12.00 GB

                       Unique chunks         Total chunks
Chunk index:                  156109              3666620

ou la liste

borg list /mnt/backups/borgarchives/

mais chose curieuse, c’est une deuxième applivation borg, donc borg__2 et je n’ai pas de clé pour borg__2, si je fais une upgrade, j’ai:

Warning: 761  Source path '/root/.ssh/id_borg__2_ed25519' does not exist
Warning: 865  Source path '/root/.ssh/id_borg__2_ed25519.pub' does not exist

pourtant une passphrase est demandée et les fichiers semble chiffrés tout de même.

Du coup je ne sais pas comment extraire une sauvegarde locale par exemple. Je pensais ne pas avoir chiffré ses sauvegardes, mais j’ai un doute puisque les commandes borg demande une passphrase (j’ai ai bien une pour borg__2) ??

Est-ce que mon fichier est bien configurer ?? J’aimerai essayer d’extraire une sauvegarde pour tester…

mon fichier /etc/yunohost/hooks.d/backup_method/05-borg__2_app

#!/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 0

Pour retrouver ta passphrase

yunohost app setting borg__2 passphrase

Et pour créer une archive tar pour restaurer:

Merci, alors pour lister, ça marche, pour créer une archive, j’ai une erreur:

# app=borg__2; BORG_PASSPHRASE="$(yunohost app setting $app passphrase)" BORG_RSH="ssh -i /root/.ssh/id_${app}_ed25519 -oStrictHostKeyChecking=yes " borg export-tar "$(yunohost app setting $app repository)::_auto_nextcloud-2022-10-07_00:04" /home/yunohost/archives/__auto_nextcloud-2022-10-07_00:04.tar
Local Exception
Traceback (most recent call last):
  File "/opt/borg-env/lib/python3.9/site-packages/borg/archiver.py", line 4690, in main
    exit_code = archiver.run(args)
  File "/opt/borg-env/lib/python3.9/site-packages/borg/archiver.py", line 4622, in run
    return set_ec(func(args))
  File "/opt/borg-env/lib/python3.9/site-packages/borg/archiver.py", line 177, in wrapper
    return method(self, args, repository=repository, **kwargs)
  File "/opt/borg-env/lib/python3.9/site-packages/borg/archiver.py", line 192, in wrapper
    return method(self, args, repository=repository, manifest=manifest, key=key, archive=archive, **kwargs)
  File "/opt/borg-env/lib/python3.9/site-packages/borg/archiver.py", line 873, in do_export_tar
    tarstream = dash_open(args.tarfile, 'wb')
  File "/opt/borg-env/lib/python3.9/site-packages/borg/helpers.py", line 2452, in dash_open
    return open(path, mode)
FileNotFoundError: [Errno 2] No such file or directory: '/home/yunohost/archives/__auto_nextcloud-2022-10-07_00:04.tar'

Platform: Linux linux07.fr 5.10.0-18-amd64 #1 SMP Debian 5.10.140-1 (2022-09-02) x86_64
Linux: Unknown Linux  
Borg: 1.1.16  Python: CPython 3.9.2 msgpack: 0.5.6.+borg1
PID: 79378  CWD: /root
sys.argv: ['/opt/borg-env/bin/borg', 'export-tar', '/mnt/backups/borgarchives::_auto_nextcloud-2022-10-07_00:04', '/home/yunohost/archives/__auto_nextcloud-2022-10-07_00:04.tar']
SSH_ORIGINAL_COMMAND: None

peut-être car comme dit au-dessus, il n’ a pas de clé /root/.ssh/id_borg__2_ed25519 ??

# ls ~/.ssh/
authorized_keys  id_borg_ed25519.pub  id_ecdsa.pub
id_borg_ed25519  id_ecdsa	      known_hosts

pourtant il y a bien une passphrase que je connaissais déjà…

si je fais cette commande: borg list /mnt/backups/borgarchives/ et que je rentre la passprase ça fonctionne aussi…

J’ai trouvé l’erreur ! il suffisait de lire, l’url /home/yunohost/backup/archives à remplacer par /home/yunohost.backup/archives plutôt…

app=borg; BORG_PASSPHRASE="$(yunohost app setting $app passphrase)" BORG_RSH="ssh -i /root/.ssh/id_${app}_ed25519 -oStrictHostKeyChecking=yes " borg export-tar "$(yunohost app setting $app repository)::ARCHIVE" /home/yunohost.backup/archives/ARCHIVE.tar

Peut-être corrigé le lien de la doc ?? Je ne sais pas si je peux ? bon si j’ai fait un pull request

J’ai une question, mais elle est peut être à côté de la plaque, mais est ce que l’app borg backup ne gère elle pas tout toute seule maintenant ? (le cron, l’archive, le prune), sans avoir à créer le moindre script ?

C’est ce que j’ai compris, en effet.

Si vous savez comment utiliser Ansible, nous avons intégré un rôle Borg dans notre collection Ansible pour Yunohost, vous pouvez le vérifier : Ansible Galaxy
Avec cela, je peux facilement installer et configurer Borg en une seule exécution ansible-playbook et cela fonctionne en production :slight_smile

2 Likes