- Shell 88.2%
- Python 11.8%
| .gitignore | ||
| backup-prep-no-containers.service | ||
| backup-prep-no-containers.sh | ||
| backup-prep-with-containers.service | ||
| backup-prep-with-containers.sh | ||
| backup-secrets.sh | ||
| bootstrap-restore.sh | ||
| post-backup.service | ||
| post-backup.sh | ||
| post-restore.sh | ||
| README.md | ||
| restore-container.py | ||
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)
podmandisponible sur la machine (inclus dans Kinoite/Bazzite)toolboxsi 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 deenable.
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 yesest indispensable avec Vorta Flatpak. Sans lui, Vorta remplaceBORG_RSHen interne avec justessh(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
/etcn'est pas sauvegardé directement par Vorta (Flatpak sans accès root). Il est couvert parbackup-secrets.shdans~/.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 :
- Télécharge le binaire borg standalone depuis GitHub (aucune installation système requise)
- Demande l'URL du dépôt et la passphrase Borg
- SSH te demande le mot de passe du serveur distant interactivement
- Restaure le home depuis la dernière archive (ou une archive au choix)
- Supprime le binaire borg téléchargé
- Lance
post-restore.shautomatiquement — te demande ton mot de passe sudo à ce moment
Pas besoin de
sudo suavant de lancer le script.post-restore.shs'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