====== Sauvegardes ====== ===== Mise en place ===== ==== Intro ==== Les backups sont effectués à l'aide de [borgbackup](https://www.borgbackup.org/) et sont déployés via notre [playbook](https://git.faimaison.net/faimaison-adminsys/adminsys/-/tree/master/ansible) [Ansible](https://docs.ansible.com/) Les secrets sont stockés dans un trousseau Keyringer. Comme le niveau des prérequis à l'exécution des rôles de sauvegarde est assez haut, on vous a préparé un petit script afin de vérifier très rapidement si votre machine est configurée correctement : # dans le dépot adminsys: python3 verification.py Il est important de noter que l'ensemble des adminsys ne peuvent pas déployer les backups de toutes les machines de FAImaison. Le prérequis pour pouvoir déployer un backup c'est de pouvoir lire les secrets de la machine à sauvegarder dans Keyringer : si t'es pas admin de la machine t'es pas sensé pouvoir accéder à ces informations: simple. ### Étape 1 : configurer les sauvegardes de la machine que l'on veut sauvegarder Editez ou créez le fichier de configuration dans le `host_vars` de votre machine (par exemple `host_vars/toto.faimaison.net/toto_backups.yml`): Cet exemple sauvegarde vers UN serveur, mais on peut aussi choisir de lister plusieurs cibles dans la liste ''borg_client_targets''. ```yaml borg_client_targets: - # OBLIGATOIRE : serveur où on souhaite envoyer nos sauvegardes. ce serveur doit être membre du groupe ansible "borg_servers" remote_server: "serveur-destination-sauvegardes.faimaison.net" # FACULTATIF : chemins à sauvegarder # (en plus des chemins déjà listés dans le base_source_path de group_vars/borg_clients.yml) extra_source_paths: - "/srv/transparency/" - "~postgres/etherpad.sql" # FACULTATIF : liste de fichiers/dossier à exclure # par défaut, utilisera la valeur dans "group_vars/borg_clients.yml" exclude_patterns: "{{ borg_clients_common_exclude_paths }}" # FACULTATIF : ici on a une liste de commandes à exécuter avant de lancer la sauvegarde. # dans cet exemple, on fera les dump de base de données par exemple before_backup_commands: - "sudo -i -u postgres pg_dump -U postgres -F p etherpad > ~postgres/etherpad.sql" # FACULTATIF : ici on a une liste de commande à exécuter après la sauvegarde, # typiquement on fera un peu de nettoyage (supprimer les dump de base de données) after_backup_commands: - "rm -f ~postgres/backup-etherpad.sql" # RECOMMANDÉ : ici on définit quand le backup démarre. # Il est recommandé de réfléchir à un horaire où la machine est au repos # syntaxe et variables cron classique https://docs.ansible.com/ansible/latest/modules/cron_module.html when: hour: "1" minute: "0" ``` ### Étape 2 : ajouter la machine à sauvegarder au groupe borg_clients Dans `ansible_hosts` ajouter la machine à sauvegarder au groupe `borg_clients`. ### Étape 3 : jouer le rôle sur la machine à sauvegarder ```bash ansible-playbook -K --diff -l toto.faimaison.net -t borg-client playbook-fma.yml ``` Et commiter les fichiers de cléfs: - Keyringer: `passwords/machines/keys/noyau//borg` - SSH: `ssh/borg-keys/.pub` ### Étape 4: ajouter aux serveurs de sauvegarde la nouvelle machine à sauvegarder Mettre à jour la variable une entrée à la variable `borg_server_backup_clients` dans `group_vars/borg_servers.yml`: ```yaml borg_server_backup_clients: - name: "toto" # nom de la machine à sauvegarder ssh_pubkey: "" # clef de sauvegarde (contenue dans ssh/borg-keys/toto.faimaison.net.pub) ``` ### Étape 5 : vérifier que tous les serveurs de backups sont dans le groupe backup_servers Dans `ansible_hosts` vérifier que le groupe `backup_servers` connait bien toutes les machines de backups de faimaison. ### Étape 6 : jouer le role sur les backup_servers Il faut avoir accès au serveur de sauvegarde visé pour pouvoir effectuer cette étape… Ou bien la faire faire par quelqu'un qui y a accès. Si avertissement car catalogue apt périmé sur le serveur de sauvegarde, ''sudo apt update -o Acquire::Check-Valid-Until=false'' sur ce dernier. Solution long terme : mettre à niveau carlota :-p. --- //Jocelyn 2020/10/06 00:25// ```bash ansible-playbook --diff -K -l borg_servers -t borg-server playbook-fma.yml ``` ## Procédures manuelles Ces procédures nécessitent que les sauvegardes aient été configurées conformément aux sections précédentes, et les infos bien commitées dans le dépôt adminsys. ### PROCÉDURE : Récupérer d'une sauvegarde plantée (lock) On prend ici l'exemple de la machine //bambelle.faimaison.net//, qui pousserait ses sauvegardes sur la machine //carlota.faimaison.net//. Il faudra adapter les noms de fichiers au cas réel… On peut avoir ce genre de message remonté par cron dans un mail par exemple : > Remote: borg.locking.LockTimeout: /var/borg-backups/repos/bambelle/lock Cela veut dire qu'une sauvegarde a crashée, et par prudence un « lock » est laissé… Et empêche toute sauvegarde ultérieure. À moins qu'un processus borg soit toujours en cours d'exécution (`sudo ps aux|grep borg` pour s'en assurer). Il faut « casser » le lock pour que les sauvegardes puissent reprendre : On commence par ouvrir un « shell borg » avec toutes les variables d'env définies((plus d'infos avec `--help`)). ``` user@bambelle $ sudo /opt/borgbackup-client/carlota.faimaison.net_bambelle.sh -c [borg@carlota.faimaison.net:repos/bambelle /home/jocelynd]$ # ``` On vérifie ensuite qu'on est bien bloqué par le lock ``` [borg@carlota.faimaison.net:repos/bambelle /home/jocelynd]$ # borg list $REPOSITORY [… snip : l'erreur est très longue] Remote: borg.locking.LockTimeout: /var/borg-backups/repos/bambelle/lock.exclusive […] ``` Il a pas l'air content ! À condition qu'aucun autre process borg ne tourne, on "casse" le lock ``` [borg@carlota.faimaison.net:repos/bambelle /home/jocelynd]$ # borg break-lock $REPOSITORY ``` Puis on vérifie que ça va mieux : ``` [borg@carlota.faimaison.net:repos/bambelle /home/jocelynd]$ # borg list $REPOSITORY bambelle-2020-05-17-02-00 Sun, 2020-05-17 02:00:11 bambelle-2020-05-24-02-00 Sun, 2020-05-24 02:00:10 bambelle-2020-05-31-02-00 Sun, 2020-05-31 02:00:11 bambelle-2020-06-07-02-00 Sun, 2020-06-07 02:00:10 bambelle-2020-06-08-02-00 Mon, 2020-06-08 02:00:10 bambelle-2020-06-09-02-00 Tue, 2020-06-09 02:00:11 bambelle-2020-06-10-02-00 Wed, 2020-06-10 02:00:10 bambelle-2020-06-11-02-00 Thu, 2020-06-11 02:00:10 bambelle-2020-06-12-02-00 Fri, 2020-06-12 02:00:10 bambelle-2020-06-13-02-00 Sat, 2020-06-13 02:00:11 bambelle-2020-06-14-02-00 Sun, 2020-06-14 02:00:10 ``` La prochaine sauvegarde devrait pouvoir s'effectuer comme il faut. Si on ne veut pas attendre, on peut aussi créer une sauvegarde manuelle (cf ci-après). ### PROCÉDURE : Créer une sauvegarde manuellement Avant certaines opérations délicates, on peut souhaiter réaliser une sauvegarde manuelle. 1. se connecter sur la machine à sauvegarder 2. passer root `sudo su` 3. Exécuter le script de sauvegarde `/opt/borgbackup-client/_.sh` ### PROCÉDURE : Récupérer totalement une sauvegarde depuis la machine concernée Cette procédure restaure l'intégralité d'une sauvegarde, en écrasant éventuellement des fichiers en place sur la machine. Pour faire plus fin, regarder la [[https://borgbackup.readthedocs.io/en/stable/usage/extract.html|doc de borg extract]] ou utiliser [[https://borgbackup.readthedocs.io/en/stable/usage/mount.html|borg mount]] qui permet de monter une sauvegarde distante pour l'examiner ou y piocher quelques fichiers. 1. se connecter sur la machine à sauvegarder 2. passer root `sudo su` 3. Ouvrir un « shell borg » avec toutes les variables d'env définies((plus d'infos avec `--help`)): `/opt/borgbackup-client/_.sh -c` 4. lister les sauvegardes disponibles : ``` [borg@carlota.faimaison.net:repos/bambelle ]$ # borg list $REPOSITORY bambelle-2020-05-17-02-00 Sun, 2020-05-17 02:00:11 bambelle-2020-05-24-02-00 Sun, 2020-05-24 02:00:10 bambelle-2020-05-31-02-00 Sun, 2020-05-31 02:00:11 bambelle-2020-06-07-02-00 Sun, 2020-06-07 02:00:10 bambelle-2020-06-10-02-00 Wed, 2020-06-10 02:00:10 bambelle-2020-06-11-02-00 Thu, 2020-06-11 02:00:10 bambelle-2020-06-12-02-00 Fri, 2020-06-12 02:00:10 bambelle-2020-06-13-02-00 Sat, 2020-06-13 02:00:11 bambelle-2020-06-14-02-00 Sun, 2020-06-14 02:00:10 bambelle-2020-10-04-02-00 Sun, 2020-10-04 02:00:09 bambelle-2020-10-05-02-00 Mon, 2020-10-05 02:00:11 ``` Repérer le nom de l'archive qui nous intéresse, par exemple `bambelle-2020-10-05-02-00`. 5. Repasser root (en conservant les variables d'environnement), pour avoir le droit de restaurer la sauvegarde dans le système de fichiers. ``` [borg@carlota.faimaison.net:repos/bambelle ]$ # su ``` 6. Se rendre à la racine (sinon on va restaurer notre sauvegarde dans un sous-dossier) ``` root@bambelle # cd / ``` 7. Lancer la restauration de l'archive choisie. ``` root@bambelle # borg extract $REPOSITORY::bambelle-2020-10-05-02-00 ``` Des opérations supplémentaires peuvent ensuite être nécessaire selon le type de fichiers restaurés (ex: restaurer un fichier .sql dans une base). ### PROCÉDURE : Récupérer une sauvegarde depuis une autre machine On doit récupérer : - le dépôt borg qui contient les sauvegardes de la machine - la passphrase du dépôt Le dépôt (repository) est contenu sur le serveur de sauvegarde ((actuellement, carlota -- //Jocelyn 2020/10/05 23:53//)) dans le répertoire **/var/borg-backups/repos/**. On va imaginer qu'on veut récupérer les sauvegardes de la machine bambelle.faimaison.net dans le cas ou celle-ci aurait-été détruite. 1. Récupérer le dossier */var/borg-backups/repos/bambelle* depuis le serveur de sauvegarde (par ex en demandant gentiment à un·e admin du serveur de sauvegarde). Ici on va considérer qu'on le stocke en local dans *~/repo_bambelle* 2. Récupérer la passphrase du dépôt et la stocker dans la variable qui va bien : ``` BORG_PASSPHRASE=$(keyringer fma-machines decrypt noyau/bambelle.faimaison.net/borg/repository_passphrase.asc) ``` 3. Lister les archives contenues dans le dépôt : ``` $ borg list ~/repo_bambelle bambelle-2020-05-17-02-00 Sun, 2020-05-17 02:00:11 bambelle-2020-05-24-02-00 Sun, 2020-05-24 02:00:10 bambelle-2020-05-31-02-00 Sun, 2020-05-31 02:00:11 bambelle-2020-06-07-02-00 Sun, 2020-06-07 02:00:10 bambelle-2020-06-10-02-00 Wed, 2020-06-10 02:00:10 bambelle-2020-06-11-02-00 Thu, 2020-06-11 02:00:10 bambelle-2020-06-12-02-00 Fri, 2020-06-12 02:00:10 bambelle-2020-06-13-02-00 Sat, 2020-06-13 02:00:11 bambelle-2020-06-14-02-00 Sun, 2020-06-14 02:00:10 bambelle-2020-10-04-02-00 Sun, 2020-10-04 02:00:09 bambelle-2020-10-05-02-00 Mon, 2020-10-05 02:00:11 ``` 4. Créer un dossier pour extraire l'archive de ton choix et l'extraire ``` $ mkdir ~/restauration $ cd ~/restauration $ borg extract ~/repo_bambelle ``` Il est aussi possible d'utiliser ''[[https://borgbackup.readthedocs.io/en/stable/usage/mount.html|borg mount]]'' au lieu de ''borg extract'' pour examiner/picorer l'archive plutôt que de l'extraire d'un bloc.