Borgbackup_PC1_home+media

Borgbackup_PC1_home+media

Notes

Chirpy post 2026-10-20-Borgbackup_PC1_home+media.md publié le 20 octobre 2026 à 09h45mn

Borgbackup

BorgBackup (abrégé : Borg) est un programme de sauvegarde par déduplication. En option, il prend en charge la compression et le chiffrement authentifié. L’objectif principal de Borg est de fournir un moyen efficace et sûr de sauvegarder des données.
Prérequis: Application BorgBackup installée et fonctionnel en local

Sauvegardes

Fichier environnement ntfy $HOME/.config/ntfy.env (mode utilisateur)

1
2
3
4
5
6
7
# Environnement ntfy
echo "NTFY_URL="https://ntfy.rnmkcy.eu/yan_infos"
NTFY_TOKEN="tk_xxxxxxxxxxxxxxxxxxxxxxx"
NTFY_EMAIL="ntfy@cinay.eu"" | tee -a $HOME/.config/ntfy.env
# Protection
chown $USER:$USER $HOME/.config/ntfy.env
chmod 600 $HOME/.config/ntfy.env

Modifier la valeur NTFY_TOKEN...

Initialiser les dépôts borg local et distant

Initialisation dépôt local /home/yann/FreeUSB2To/sauvegardes/borgbackup/pc1

1
2
3
4
export BORG_PASSPHRASE="`cat /home/yann/.borg/pc1.passphrase`"
export BORG_RSH='ssh -i /home/yann/.borg/pc1.borgssh'
BORG_REPOSITORY='/home/yann/FreeUSB2To/sauvegardes/borgbackup/pc1'
borg init --encryption=repokey-blake2 $BORG_REPOSITORY

Storage Box bx11-yann-02: Initialisation dépôt distant ssh://u694796@u694796.your-storagebox.de:23/./pc1

1
2
3
4
export BORG_PASSPHRASE="`cat /home/yann/.borg/pc1.passphrase`"
export BORG_RSH='ssh -i /home/yann/.borg/bx11-yann-02.borgssh'
BORG_REPOSITORY='ssh://u694796@u694796.your-storagebox.de:23/./pc1'
borg init --encryption=repokey-blake2 $BORG_REPOSITORY

Passer la sauvegarde dans une fonction appelée une fois par cible, avec un fichier d’état par cible. Si le distant échoue (réseau, Storage Box), le prochain lancement du timer ne refera que le distant, sans relancer le local.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/bash

# Environnement ntfy
. "$HOME/.config/ntfy.env"

today="$(date +%F)"   # Europe/Paris

notify() {  # $1 = titre, $2 = message, $3 = priorité (défaut low)
  curl -s \
    -H "X-Email: $NTFY_EMAIL" \
    -H "Title: $1" \
    -H "Authorization: Bearer $NTFY_TOKEN" \
    -H "prio:${3:-low}" \
    -d "$2" \
    "$NTFY_URL" > /dev/null
}

# backup_target <nom> <dépôt> <clé ssh> <fichier passphrase>
backup_target() {
  local name="$1" repo="$2" key="$3" passfile="$4"
  local state_file="$HOME/.pc1_last_run_${name}"
  local t rc d duree

  if [[ "$(cat "$state_file" 2>/dev/null)" == "$today" ]]; then
    echo "[$name] sauvegarde déjà réalisée"
    notify "ℹ️ BorgBackup PC1 $name déjà réalisée ce jour" "PC1 $0"
    return 0
  fi

  echo "[$name] départ sauvegarde borg"
  t=$(date +%s)

  export BORG_PASSPHRASE="$(cat "$passfile")"
  export BORG_RSH="ssh -i $key"

  borg create -v --progress --stats \
    --exclude-from /home/yann/.borg/pc1.exclusions \
    "${repo}::$(date +%Y-%m-%d-%Hh%M)" /home/yann/
  rc=$?

  # rc 0 = ok, 1 = warning (fichier modifié pendant la lecture...), >=2 = erreur
  if (( rc >= 2 )); then
    notify "❌ BorgBackup PC1 $name : ÉCHEC (rc=$rc)" "PC1 $0
Dépôt $repo" high
    return "$rc"
  fi

  borg prune -v --list --stats --keep-daily=7 --keep-weekly=4 --keep-monthly=6 "$repo" || rc=$?
  borg compact "$repo" || rc=$?
  (( rc >= 2 )) && { notify "❌ BorgBackup PC1 $name : échec prune/compact" "PC1 $0" high; return "$rc"; }

  d=$(( $(date +%s) - t ))
  duree="$((d / 3600))h$(((d % 3600) / 60))m$((d % 60))s"

  echo "$today" > "$state_file"
  echo "[$name] FIN sauvegarde borg"
  notify "🔄 BorgBackup PC1 $name /home/yann/ en $duree" "PC1 $0
✔️ Fin Borgbackup /home/yann/ --> dépôt $repo"
  return 0
}

# --- Local ---
backup_target local \
  "/home/yann/FreeUSB2To/sauvegardes/borgbackup/pc1" \
  "/home/yann/.borg/pc1.borgssh" \
  "/home/yann/.borg/pc1.passphrase"
rc_local=$?

# --- Distant (Storage Box) ---
backup_target distant \
  "ssh://u694796@u694796.your-storagebox.de:23/./pc1" \
  "/home/yann/.borg/bx11-yann-02.borgssh" \
  "/home/yann/.borg/pc1.passphrase"
rc_distant=$?

# Code de sortie : le service systemd passe en échec si l'une des deux a échoué
exit $(( rc_local > rc_distant ? rc_local : rc_distant ))

Quelques points à noter :

  • Une cible qui échoue n’empêche pas l’autre. Le local tourne même si le distant est injoignable, et inversement.
  • Le flag du jour n’est écrit qu’en cas de succès, par cible. Avec Persistent=true dans le timer, ou un second déclenchement dans la journée, seule la cible manquante est retentée.
  • Le code retour 1 de borg est un simple avertissement et ne bloque pas le flag. Seuls les codes ≥ 2 sont traités comme des échecs.
  • Si les deux dépôts ont des passphrases différentes, le 4ᵉ argument gère déjà le cas. Si c’est la même, vous pouvez la réutiliser comme ci-dessus.
  • Le distant dépend du réseau. Dans le service utilisateur, ajoutez After=network-online.target et Wants=network-online.target. Sinon, un lancement juste après le démarrage fera échouer le distant.
  • Si la Storage Box utilise Borg 1.x par défaut, il peut falloir ajouter --remote-path=borg-1.2, selon votre version locale.

Pour exécuter une tâche une fois par jour, en suivant l’horloge (même si la machine a été arrêtée / redémarrée)

Le fichier service ~/.config/systemd/user/borg_pc1_media.service

1
2
3
4
5
6
[Unit]
Description=Sauvegarde jour

[Service]
Type=oneshot
ExecStart=/bin/bash /home/yann/.local/bin/borg_pc1_media.sh

Le fichier “timer” ~/.config/systemd/user/borg_pc1_media.timer

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Exécution quotidienne sauvegarde

[Timer]
OnCalendar=daily
Persistent=true

# optionnel : éviter un démarrage pile à la seconde exacte
RandomizedDelaySec=5m

[Install]
WantedBy=timers.target
  • OnCalendar=daily : déclenche selon le calendrier (une exécution par jour).
  • Persistent=true : si le système était arrêté au moment du déclenchement, systemd rattrape au prochain démarrage (exécute pour les échéances manquées).

Activation et lancement

1
2
systemctl --user daemon-reload
systemctl --user enable borg_pc1_media.timer --now

Les logs : journalctl --user -u savyann.service
Liste des timers :

1
systemctl --user list-timers --all
1
2
NEXT                         LEFT LAST                         PASSED UNIT                 ACTIVATES             
Tue 2026-08-04 00:00:05 CEST  13h Mon 2026-08-03 06:02:03 CEST      - borg_pc1_media.timer borg_pc1_media.service