Backup and restore scripts for immutable Fedora (Kinoite/Bazzite) using Vorta + BorgBackup
  • Shell 88.2%
  • Python 11.8%
Find a file
2026-05-31 21:16:27 +02:00
.gitignore Release v1.0 — backup/restore scripts for immutable Fedora 2026-05-30 14:48:46 +02:00
backup-prep-no-containers.service Release v1.0 — backup/restore scripts for immutable Fedora 2026-05-30 14:48:46 +02:00
backup-prep-no-containers.sh Supprimer le chiffrement GPG des connexions réseau 2026-05-31 21:13:50 +02:00
backup-prep-with-containers.service Release v1.0 — backup/restore scripts for immutable Fedora 2026-05-30 14:48:46 +02:00
backup-prep-with-containers.sh Supprimer le chiffrement GPG des connexions réseau 2026-05-31 21:13:50 +02:00
backup-secrets.sh Supprimer le chiffrement GPG des connexions réseau 2026-05-31 21:13:50 +02:00
bootstrap-restore.sh Release v1.0 — backup/restore scripts for immutable Fedora 2026-05-30 14:48:46 +02:00
post-backup.service Release v1.0 — backup/restore scripts for immutable Fedora 2026-05-30 14:48:46 +02:00
post-backup.sh Release v1.0 — backup/restore scripts for immutable Fedora 2026-05-30 14:48:46 +02:00
post-restore.sh Supprimer le chiffrement GPG des connexions réseau 2026-05-31 21:13:50 +02:00
README.md Mettre à jour le README : supprimer les références GPG 2026-05-31 21:16:27 +02:00
restore-container.py Release v1.0 — backup/restore scripts for immutable Fedora 2026-05-30 14:48:46 +02:00

vorta-backups-immutable-fedora

Scripts de sauvegarde et restauration pour machines sous OS immuable (Fedora Kinoite, Bazzite) utilisant Vorta (Flatpak) + BorgBackup vers un stockage distant.

Problème résolu : sur un OS immuable, Vorta (Flatpak) n'a pas accès à /etc ni aux containers système. Ces scripts préparent automatiquement une sauvegarde cohérente avant chaque backup Vorta, et permettent une restauration complète depuis zéro avec une seule commande.

Ce que ça couvre :

  • Configuration KDE Plasma, fichiers home
  • Applications Flatpak (liste pour réinstallation automatique)
  • Paquets rpm-ostree superposés
  • Containers Toolbox et Podman (images complètes + config réseau)
  • Secrets /etc (connexions NetworkManager Wi-Fi/VPN, fstab, règles udev)

Testé sur : Fedora Kinoite, Bazzite — vers Hetzner Storage Box


Prérequis

  • Vorta installé en Flatpak
  • Un dépôt BorgBackup accessible en SSH (Hetzner Storage Box ou autre)
  • podman disponible sur la machine (inclus dans Kinoite/Bazzite)
  • toolbox si tu utilises des containers Toolbox

Vue d'ensemble

Avant chaque backup Vorta
  └─ Vorta hook → systemctl --user start backup-prep.service
       └─ backup-prep-*.sh
            ├─ Liste Flatpaks                → ~/.backup-data/data/
            ├─ Liste paquets rpm-ostree      → ~/.backup-data/data/
            ├─ Commit + export containers    → ~/.backup-data/containers/  (machine avec containers)
            └─ Secrets /etc                  → ~/.backup-data/secrets/

Vorta sauvegarde ~/.backup-data/ avec le reste du home.

Après réinstallation + restauration Vorta
  └─ bash <(curl -s https://forgejo.tellserv.fr/Tellsanguis/vorta-backups-immutable-fedora/raw/branch/main/bootstrap-restore.sh)
       ├─ Restaure le home depuis l'archive Borg
       └─ Lance post-restore.sh automatiquement
            ├─ Restaure /etc
            ├─ Recharge les containers
            ├─ Réinstalle les Flatpaks
            ├─ Réinstalle les paquets rpm-ostree
            └─ Réactive le service systemd

Fichiers du projet

Fichier Machine Rôle
backup-prep-with-containers.sh PC principal Script de préparation backup
backup-prep-no-containers.sh PC secondaire Script de préparation backup
backup-secrets.sh Les deux Sauvegarde /etc, appelé via sudo
backup-prep-with-containers.service PC principal Service systemd utilisateur
backup-prep-no-containers.service PC secondaire Service systemd utilisateur
post-backup.sh Les deux Nettoyage post-backup
post-backup.service Les deux Service systemd utilisateur
post-restore.sh Les deux Script de restauration complète
restore-container.py Les deux Reconstruit podman run depuis inspect JSON
bootstrap-restore.sh Les deux Restauration depuis zéro (télécharge borg, restaure le home)

Installation

1. Cloner le dépôt

git clone https://forgejo.tellserv.fr/Tellsanguis/vorta-backups-immutable-fedora.git
cd vorta-backups-immutable-fedora

2. Copier les scripts

mkdir -p ~/.scripts/backup
cp backup-prep-*.sh backup-secrets.sh post-backup.sh post-restore.sh restore-container.py ~/.scripts/backup/
chmod +x ~/.scripts/backup/*.sh ~/.scripts/backup/*.py

Puis protéger backup-secrets.sh contre toute modification sans authentification. Ce script s'exécute en root via une règle sudoers NOPASSWD — s'il pouvait être modifié librement, n'importe quel processus tournant sous ta session pourrait escalader en root.

sudo chattr +i ~/.scripts/backup/backup-secrets.sh

Pour le modifier légitimement plus tard :

sudo chattr -i ~/.scripts/backup/backup-secrets.sh
# modifier le fichier
sudo chattr +i ~/.scripts/backup/backup-secrets.sh

3. Installer les services systemd

Machine avec containers :

mkdir -p ~/.config/systemd/user
cp backup-prep-with-containers.service ~/.config/systemd/user/backup-prep.service
cp post-backup.service ~/.config/systemd/user/
systemctl --user daemon-reload

Machine sans containers :

mkdir -p ~/.config/systemd/user
cp backup-prep-no-containers.service ~/.config/systemd/user/backup-prep.service
cp post-backup.service ~/.config/systemd/user/
systemctl --user daemon-reload

Les services sont déclenchés à la demande par Vorta (systemctl --user start), pas au démarrage. Pas besoin de enable.

4. Configurer sudoers

Permet au script de backup d'accéder à /etc sans mot de passe interactif.

sudo nano /etc/sudoers.d/backup-secrets

Contenu (adapter le nom d'utilisateur et le chemin si nécessaire) :

TON_USER ALL=(root) NOPASSWD: /var/home/TON_USER/.scripts/backup/backup-secrets.sh

Les fichiers sudoers doivent être en 0440 :

sudo chmod 0440 /etc/sudoers.d/backup-secrets
sudo visudo -c

5. Créer le dépôt Borg dans Vorta

Prérequis SSH

Générer la clé SSH dédiée au backup :

ssh-keygen -t ed25519 -C "vorta-backup" -f ~/.ssh/vorta_backup

Laisser la passphrase vide (le backup tourne sans interaction).

Installer la clé sur le serveur distant (exemple Hetzner Storage Box) :

ssh-copy-id -p 23 -s -i ~/.ssh/vorta_backup.pub USER@HOST.your-storagebox.de

Configurer ~/.ssh/config pour que SSH utilise automatiquement la bonne clé :

Host HOST.your-storagebox.de
    User USER
    Port 23
    IdentityFile /var/home/TON_USER/.ssh/vorta_backup
    IdentitiesOnly yes

IdentitiesOnly yes est indispensable avec Vorta Flatpak. Sans lui, Vorta remplace BORG_RSH en interne avec juste ssh (sans -i), SSH tombe en arrière sur le mot de passe, échoue en silence et la connexion est refusée.

Initialiser le dépôt depuis la ligne de commande

Vorta Flatpak ne peut pas initialiser le dépôt directement à cause du problème ci-dessus. Il faut le faire une fois en ligne de commande :

flatpak run --command=borg com.borgbase.Vorta init --encryption=repokey-blake2 \
    ssh://USER@HOST:PORT/./DOSSIER

Entrer une passphrase forte et la sauvegarder dans le gestionnaire de mots de passe.

Exporter une copie de la clé Borg (sauvegardée automatiquement avec le home) :

flatpak run --command=borg com.borgbase.Vorta key export \
    ssh://USER@HOST:PORT/./DOSSIER ~/.backup-data/borg-key-backup.txt

Dans Vorta : Repository → Add Repository → Connect to existing repository

Champ Valeur
Repository URL ssh://USER@HOST:PORT/./DOSSIER
SSH Key (laisser vide — géré par ~/.ssh/config)
Passphrase (la passphrase choisie ci-dessus)

La passphrase Borg est indépendante du mot de passe SSH. C'est elle qui chiffre le dépôt. Sans elle, les archives sont irrécupérables même avec accès au serveur.

6. Configurer les hooks dans Vorta

Dans Vorta : Archive → Hooks

Before backup :

flatpak-spawn --host systemctl --user start backup-prep.service

After backup :

flatpak-spawn --host systemctl --user start post-backup.service

Le script post-backup supprime les fichiers temporaires générés par le pre-backup (archives containers, connexions réseau) une fois que Borg les a sauvegardés. Les listes de données (flatpaks.tsv, etc.) et la clé Borg exportée sont conservées.

flatpak-spawn --host est nécessaire pour les deux — Vorta Flatpak exécute les hooks dans un shell sandboxé sans accès aux commandes système.

Pour consulter les logs :

journalctl --user -u backup-prep.service -e
journalctl --user -u post-backup.service -e

7. Configurer les sources et exclusions dans Vorta

Source à inclure :

  • /var/home/TON_USER/

Exclusions à ajouter :

/var/home/TON_USER/.cache
/var/home/TON_USER/.local/share/Steam/steamapps/common
/var/home/TON_USER/.local/share/containers/storage/overlay
/var/home/TON_USER/.local/share/containers/storage/overlay-images
/var/home/TON_USER/.var/app/org.gnome.Boxes/data/gnome-boxes/images

/etc n'est pas sauvegardé directement par Vorta (Flatpak sans accès root). Il est couvert par backup-secrets.sh dans ~/.backup-data/secrets/.


Ce qui est sauvegardé

Contenu Emplacement
Applications Flatpak (liste) ~/.backup-data/data/flatpaks.tsv
Paquets rpm-ostree superposés (liste) ~/.backup-data/data/layered-packages.txt
Containers Toolbox (images complètes) ~/.backup-data/containers/*.tar.gz
Containers Podman purs (images + config) ~/.backup-data/containers/*.tar.gz + *-inspect.json
Connexions réseau (Wi-Fi, VPN) ~/.backup-data/secrets/nm-connections.tar.gz
/etc/fstab, /etc/hosts, règles udev ~/.backup-data/secrets/etc/
Config KDE Plasma, thèmes, widgets ~/.config/, ~/.local/share/ — via Vorta
Clés SSH ~/.ssh/ — via Vorta
KWallet (mots de passe KDE) ~/.local/share/kwalletd/ — via Vorta
Données des apps Flatpak ~/.var/app/ — via Vorta
Données Steam (sauvegardes jeux) ~/.local/share/Steam/userdata/ — via Vorta

Procédure de restauration complète

Ce dont tu as besoin

Le script te demande ces informations interactivement — ouvre ton gestionnaire de mots de passe avant de lancer la restauration pour les avoir sous la main :

Information Demandé par Où la trouver
URL du dépôt Borg Le script Gestionnaire de mots de passe
Passphrase Borg Le script Gestionnaire de mots de passe
Mot de passe SSH du serveur distant SSH (prompt interactif) Gestionnaire de mots de passe

Étape 1 — Réinstaller l'OS

Installer Fedora Kinoite ou Bazzite normalement. Créer le même nom d'utilisateur qu'avant la panne.

Étape 2 — Lancer le script de restauration

Ouvrir un terminal et lancer :

bash <(curl -s https://forgejo.tellserv.fr/Tellsanguis/vorta-backups-immutable-fedora/raw/branch/main/bootstrap-restore.sh)

Le script :

  1. Télécharge le binaire borg standalone depuis GitHub (aucune installation système requise)
  2. Demande l'URL du dépôt et la passphrase Borg
  3. SSH te demande le mot de passe du serveur distant interactivement
  4. Restaure le home depuis la dernière archive (ou une archive au choix)
  5. Supprime le binaire borg téléchargé
  6. Lance post-restore.sh automatiquement — te demande ton mot de passe sudo à ce moment

Pas besoin de sudo su avant de lancer le script. post-restore.sh s'en charge lui-même quand c'est nécessaire.

Étape 3 — Ce que post-restore.sh fait automatiquement

  • Restaure les connexions réseau (WiFi, VPN)
  • Restaure /etc/fstab, /etc/hosts, règles udev
  • Recrée les containers Toolbox (toolbox create)
  • Recrée les containers Podman depuis leur inspect JSON (podman run)
  • Réinstalle les Flatpaks (dont Vorta — sa config est déjà restaurée)
  • Réinstalle les paquets rpm-ostree superposés si nécessaire

Étape 4 — Redémarrer si des paquets rpm-ostree ont été réinstallés

systemctl reboot

Vérification périodique

Tester tous les quelques mois que la restauration fonctionne :

# Vérifier que le fichier de secrets est bien mis à jour après un backup
ls -lh ~/.backup-data/secrets/nm-connections.tar.gz

# Vérifier que l'archive est lisible
tar -tzf ~/.backup-data/secrets/nm-connections.tar.gz | head