Post

BorgBackup : stratégie de backup 3-2-1 pour homelab

BorgBackup : stratégie de backup 3-2-1 pour homelab

Le ransomware qui chiffre tes données, le disque qui lâche, la commande rm -rf mal placée — c’est jamais le bon moment. BorgBackup est l’outil de backup le plus sous-estimé de l’écosystème Linux : déduplication, chiffrement natif, compression, snapshots incrémentaux. Cet article te montre comment implémenter une stratégie 3-2-1 complète, de l’installation à l’automatisation, en passant par la restauration. Parce qu’un backup non testé, c’est pas un backup.

La règle 3-2-1

C’est simple et ça sauve des infrastructures :

  • 3 copies de tes données
  • 2 supports de stockage différents
  • 1 copie offsite (hors site)

Concrètement pour un homelab :

CopieSupportLocalisation
1 — Données originalesSSD/NVMe du serveurChez toi
2 — Backup localDisque dur externe / NASChez toi
3 — Backup distantVPS / serveur SSHDatacenter

Si ton lab prend feu ou se fait voler, la copie offsite te sauve. Si ton VPS est compromise, la copie locale te sauve.

Pourquoi BorgBackup ?

OutilDédupChiffrementIncrémentalSSH natifLicence
BorgBackupOuiOuiOuiOuiBSD
rsyncNonVia SSHPartielOuiGPL
ResticOuiOuiOuiOuiBSD
DuplicityNonOuiOuiOuiGPL

Borg est le plus ancien et le plus stable de la catégorie “dédié + dédup”. Restic est un excellent concurrent (notamment pour S3), mais Borg reste le roi du SSH-to-SSH pour homelab.

Installation

1
2
3
4
5
6
7
8
# Debian/Ubuntu
sudo apt install -y borgbackup

# Arch
sudo pacman -S borg

# Vérifier
borg --version

Initialiser un repo local

1
2
3
4
5
6
# Créer le répertoire de backup
sudo mkdir -p /mnt/backup/borg
sudo chown $USER:$USER /mnt/backup/borg

# Initialiser le repo avec chiffrement
borg init --encryption=repokey-blake2 /mnt/backup/borg/monserveur

Tu seras demandé de définir une passphrase. Stocke-la dans ton gestionnaire de mots de passe (Vaultwarden). Sans cette passphrase, tes backups sont inaccessibles.

Premier backup

1
2
3
4
5
6
7
8
9
10
11
12
13
borg create \
  --verbose \
  --filter AME \
  --list \
  --stats \
  --compression auto,zstd \
  /mnt/backup/borg/monserveur::{now} \
  /home \
  /etc \
  /var/lib/docker/volumes \
  --exclude '/home/*/.cache' \
  --exclude '/home/*/.local/share/Trash' \
  --exclude '*.tmp'

Options importantes :

FlagRôle
--compression auto,zstdCompression zstd intelligente
--excludeExclut les fichiers inutiles
--statsAffique la taille et le ratio de dédup
{now}Timestamp automatique comme nom d’archive

La déduplication signifie que même avec des snapshots quotidiens, l’espace disque reste contenu. Seuls les blocs modifiés sont stockés.

Repo distant (SSH)

Pour la copie offsite :

1
2
# Initialiser un repo distant
borg init --encryption=repokey-blake2 ssh://user@vps.example.com/~/borg/monserveur
1
2
3
4
5
6
# Backup vers le distant
borg create \
  --compression auto,zstd \
  ssh://user@vps.example.com/~/borg/monserveur::{now} \
  /home /etc /var/lib/docker/volumes \
  --exclude '*.cache'

Important : configure l’accès SSH avec une clé dédiée, sans passphrase, limitée au backup uniquement. Sur le serveur distant, dans ~/.ssh/authorized_keys :

1
command="borg serve --restrict-to-path /home/user/borg",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh-ed25519 AAAA...

Voir Hardening SSH pour la config complète. Si tu veux chiffrer le transport en plus, passe par WireGuard.

Automatisation avec systemd timer

Crée le service de backup /etc/systemd/system/borg-backup.service :

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=BorgBackup quotidien
After=network-online.target

[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/borg-backup.sh
Nice=19
IOSchedulingClass=idle

Le script /usr/local/bin/borg-backup.sh :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
export BORG_REPO="/mnt/backup/borg/monserveur"
export BORG_PASSPHRASE="voir-vaultwarden"

# Backup
borg create --compression auto,zstd \
  ::{now} \
  /home /etc /var/lib/docker/volumes \
  --exclude '*.cache'

# Pruning — garder 7 quotidiens, 4 hebdo, 6 mensuels
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6

# Vérification intégrité (1x/semaine)
if [ $(date +%u) -eq 7 ]; then
  borg check
fi

# Compaction
borg compact

Le timer /etc/systemd/system/borg-backup.timer :

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=BorgBackup quotidien à 3h

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=900

[Install]
WantedBy=timers.target
1
2
sudo systemctl enable --now borg-backup.timer
sudo systemctl list-timers | grep borg

Alternative : un simple cron si tu préfères :

1
2
# crontab -e
0 3 * * * /usr/local/bin/borg-backup.sh 2>&1 | logger -t borg-backup

Automatisation avec Ansible

Si tu gères plusieurs serveurs (Automatiser avec Ansible) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- name: Installer BorgBackup
  apt:
    name: borgbackup
    state: present

- name: Déployer le script de backup
  template:
    src: borg-backup.sh.j2
    dest: /usr/local/bin/borg-backup.sh
    mode: '0700'

- name: Activer le timer systemd
  systemd:
    name: borg-backup.timer
    enabled: true
    state: started

Restauration

Parce qu’un backup non testé n’existe pas :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Lister les archives
borg list /mnt/backup/borg/monserveur

# Restaurer une archive complète
cd /tmp/restore
borg extract /mnt/backup/borg/monserveur::2026-07-02T03:00:00

# Restaurer un fichier spécifique
borg extract /mnt/backup/borg/monserveur::2026-07-02T03:00:00 etc/nginx/nginx.conf

# Monter le repo comme un filesystem
borg mount /mnt/backup/borg/monserveur /mnt/borg
ls /mnt/borg/
borg umount /mnt/borg

Teste ta restauration régulièrement. Un backup jamais restauré, c’est un pari.

Monitoring des backups

Intègre le suivi dans ta stack de monitoring (Monitoring Prometheus & Grafana) :

1
2
3
4
# Script de vérification envoyant des métriques
borg info --json /mnt/backup/borg/monserveur | \
  jq '.archives | length' | \
  curl -X POST --data-binary @- http://pushgateway:9091/metrics/job/borg/instance/monserveur

Alerte si aucun backup n’a été créé dans les dernières 24h.

Checklist complète

  • BorgBackup installé sur toutes les machines
  • Repo local initialisé avec chiffrement
  • Repo distant initialisé sur VPS
  • Passphrase stockée dans Vaultwarden
  • Clé SSH dédiée avec restrictions
  • Script de backup déployé et testé
  • Timer systemd ou cron actif
  • Politique de pruning configurée (règle 3-2-1)
  • Restauration testée et documentée
  • Monitoring des backups actif
  • Backup de la config Borg lui-même (config + clé repo)

Erreurs courantes

  • Pas de chiffrement : borg init sans --encryption = données en clair sur le backup
  • Passphrase perdue : sans elle, pas de restauration. Stocke-la ailleurs que sur la machine backuppée
  • Backup jamais testé : teste la restauration au moins une fois par mois
  • Pas de pruning : le repo grandit indéfiniment. Configure le pruning dès le début
  • Backup sur le même disque : si le disque lâche, tout est perdu. Utilise un support séparé

Références :

Besoin d’un audit de ta stratégie de backup ou d’un coup de main sur BorgBackup ? Contacte-moi.

This post is licensed under CC BY 4.0 by the author.