Utiliser etckeeper, c'est garder un historique des modifications de /etc pour ne pas compter seulement sur sa mémoire : "Mince, le serveur a planté... C'est quoi déjà la modif que j'avais faite dans mon php.ini ?? Arf, je ne me rappelle plus...".
Avant je réalisais des sauvegardes incrémentales quotidiennes de /etc. Ça marche aussi, sauf en période de modification frénétique post install d'un nouveau super giga service tout neuf qui doit absolument fonctionner avant hier parce que... ben parce qu'on en a envie en fait !
Avec etckeeper, les modifications sont poussées sur un dépôt git, et avec un dépôt distant comme Gitea, cela permet non seulement de versionner votre configuration, mais aussi d'avoir une sauvegarde externe sécurisée en cas de crash du serveur.
Bon, pour le côté frénétique, il faudra quand même penser à faire des git push origin. Apt s'en chargera aussi.
Voici la marche à suivre pour installer etckeeper (easy) et pour le lier à gitea proprement.
apt install etckeeper git
À ce niveau, déjà, les modifications sont versionnées dans un dépôt git local (i.e. sur le disque direct dans /etc). C'est déjà pas mal, mais on peut faire mieux en les poussant sur un dépôt privé distant. Moi j'utilise gitea parce que c'est local, et comme il y a des données sensibles (/etc/shadow pour n'en nommer qu'un, mais il y en a d'autres), ben même si github est rempli de gens très sympas, je préfère tout garder chez moi.
Prérequis : Créer son propre serveur git (Gitea) (Sur un autre serveur, sinon ça sert à rien !!!)
Connectez-vous à votre instance Gitea.
Créez un nouveau dépôt (nommez-le par exemple serveur-etc ou le nom de votre machine).
Important : Laissez le dépôt vide (ne cochez pas "Initialiser le dépôt avec un README ou un .gitignore").
cocher la case "dépôt privé".
modifier la branche "main" en "master" (c'est la branche par défaut de etckeeper).
Copiez l'URL SSH du dépôt (ex: git@votre-gitea.com:pseudo/serveur-etc.git).
Puisque etckeeper s'exécute généralement avec les droits root, il faut créer une clef ssh pour root spécifique à etckeeper.
ssh-keygen -t ecdsa -b 521 -a 128 -f ~/.ssh/id_ecdsa_etc_serveur -N ""
cat /root/.ssh/id_ecdsa_etc_serveur.pub
Ajouter l'host de votre gitea dans /etc/hosts :
echo IP_gitea hostname_gitea >> /etc/hosts
Ajouter les paramètres de connexion ssh dans /root/.ssh/config :
#gitea
Host hostname_gitea
User git
IdentityFile ~/.ssh/id_ecdsa_etc_serveur
Allez dans le répertoire /etc et configurez le "remote" Git :
cd /etc
git remote add origin git@votre-gitea.com:pseudo/serveur-etc.git
Comme le dépôt distant est vide et que votre /etc local a déjà un historique créé par etckeeper, vous devez envoyer les données :
git push -u origin master
Validez la clef ssh lors de cette première connexion et vérifiez que tout se passe bien.
Par défaut, etckeeper valide les changements automatiquement (commit), mais il ne les envoie pas (push) sur le serveur distant. Pour automatiser cela à chaque modification de paquet ou commit manuel :
En mode brute :
sed -i 's/^PUSH_REMOTE=""/PUSH_REMOTE="origin"/' /etc/etckeeper/etckeeper.conf && systemctl restart etckeeper
Ou alors en mode étape par étape :
nano /etc/etckeeper/etckeeper.conf
PUSH_REMOTE=""
PUSH_REMOTE="origin"
systemctl restart etckeeper
Désormais, à chaque fois qu'une action apt déclenche un commit etckeeper, les modifications seront automatiquement envoyées vers votre Gitea. Et si je suis en train de tester des configurations, à moi de réaliser des add/commit/push intermédiaires pour assurer mes arrières.
Comme votre dépôt Gitea contient des fichiers sensibles (comme /etc/shadow), assurez-vous que :
Le dépôt sur Gitea est bien Privé.
L'accès à votre instance Gitea est sécurisé (HTTPS, Double authentification), voire même inaccessible depuis le web (après tout, github est là pour ce que vous voulez rendre accessible).
Par exemple :
etckeeper commit "Activation nvidia-drm modeset=1 pour support Wayland"
Ça fait le commit et le push automatiquement, et si ça plante par la suite, on identifie vite la modif.
etckeeper vcs log affiche l'historique des changements dans /etc. Chaque opération apt génère automatiquement un commit avec la liste des paquets modifiés.
etckeeper vcs ls-tree -r [COMMIT_ID] --name-only liste tous les fichiers présents dans /etc à un instant T. Très utile pour vérifier si un dossier (comme nginx) contenait bien tes fichiers avant une purge.
etckeeper vcs show [COMMIT_ID]:nginx/nginx.conf permet de lire le contenu d'un fichier spécifique dans un ancien commit sans avoir à le restaurer physiquement.
etckeeper vcs checkout [COMMIT_ID] -- nginx remet le dossier /etc/nginx exactement dans l'état du commit spécifié (fichiers, sous-dossiers et liens symboliques).
etckeeper vcs checkout [COMMIT_ID] -- nginx/sites-available/mon-site.conf restaure un unique fichier.
etckeeper vcs status pour identifier et les supprimer manuellement les nouveaux fichiers de conf qui ont été ajoutés car git ne va pas les supprimer en revenant à une version antérieure.
etckeeper commit "Message expliquant la restauration" pour remonter la restauration dans la base git. (Pffiou... heureusement que j'avais etckeeper, sinon mon apt purge m'aurait définitivement supprimé toutes mes conf nginx )