admin:services:backup
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
admin:services:backup [2017/06/24 10:47] – les backups d'obnam de dodecagon vers quigon sont désactivés zertrin | admin:services:backup [2020/05/11 01:01] (Version actuelle) – toadjaune | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
[[: | [[: | ||
- | ===== Concept de sauvegarde ===== | + | <WRAP center round info 60%> |
+ | L' | ||
+ | </ | ||
- | **Backupninja** sert pour les sauvegardes automatisées locales (''/ | ||
- | * des informations systèmes utiles (dpkg-selections, | + | <WRAP center round todo 60%> |
- | * des dumps des bases de données MySQL | + | En cours de rédaction et mise en place. |
+ | PoC : herve & toadjaune | ||
+ | </ | ||
- | **Obnam** sert à effectuer la sauvegarde proprement dite vers les serveurs | + | <WRAP center round important 60%> |
+ | Backup en cours de mise en place. | ||
+ | Machines concernées : toutes | ||
+ | Priorité donnée à dodecagon | ||
+ | </ | ||
- | <wrap important> | + | ===== Motivation ===== |
- | Actuellement, Borg est en cours de déploiement pour remplacer Obnam. | + | FedeRez est une asso étudiante, dans laquelle, comme pour la plupart des assos de réseau étudiantes (si ce n'est plus), les ressources humaines peuvent fluctuer considérablement au cours du temps, parfois avec pas ou peu de passations de savoir. |
- | **BorgBackup** (ou Borg) sert à effectuer la sauvegarde proprement dite vers les serveurs de destination. Il gère un historique des versions des sauvegardes ainsi que la déduplication et la compression des données. | + | Les infrastructures et services que nous mettons en place doivent donc chercher |
- | ---- | + | Mais pas robustes au sens haute disponibilité, |
- | ===== Opérations courantes ===== | + | Ce qu'on veut, ce n'est pas une infra qui ne tombe jamais, c'est une infra qu'on a les capacités de réparer quand elle tombe. |
- | <wrap info>La doc concernant la mise en place initiale se situe plus bas.</ | + | Ça implique plusieurs choses : |
- | ==== Faire une sauvegarde ==== | + | * KISS |
+ | * Bonne documentation | ||
+ | * Backups solides | ||
- | Exemple depuis hexagon vers quigon | + | Le choix de Borg + ansible me semble un bon compromis à ce niveau |
- | < | + | Aucune objection à en plus mettre d' |
- | ==== Enlever un lock récalcitrant ==== | ||
- | Par exemple, un lock de la part d' | + | ===== Fonctionnement |
- | < | + | **BorgBackup** (ou Borg) sert à effectuer la sauvegarde proprement dite vers les serveurs de destination. Il gère un historique des versions des sauvegardes ainsi que la déduplication et la compression des données. Son installation et sa configuration sont gérés via ansible. |
- | <wrap lo> | + | **Backupninja** sert pour les sauvegardes automatisées locales ('' |
- | ==== Mettre à jour la liste des chemins à sauvegarder ==== | + | |
- | Voir la sous-section [[admin: | + | * des informations systèmes utiles (dpkg-selections, fstab, lvm...) |
+ | * des dumps des bases de données MySQL | ||
+ | Backupninja est installé et configuré manuellement là où il est utilisé. | ||
- | <wrap tip></ | + | ===== Serveurs |
+ | Actuellement, | ||
+ | * [[admin: | ||
+ | * [[admin: | ||
- | ==== Voir les générations (versions) ==== | + | ---- |
- | Exemple depuis hexagon avec l' | + | ===== Opérations courantes ===== |
- | <code>obnam --config / | + | <WRAP center round tip 60%> |
+ | La doc concernant la mise en place initiale se situe plus bas. | ||
+ | </WRAP> | ||
- | ==== Restaurer des données ==== | ||
- | Si dessous quelques exemples testés. | + | ==== Faire une sauvegarde ==== |
- | Voir aussi la doc officielle : http://code.liw.fi/obnam/manual/obnam-manual.en.html# | + | Cette opération n'est normalement pas requise, un cron s'en charge. |
+ | On peut néanmoins lancer manuellement un backup en exécutant le script `/etc/borg/system.sh` sur le système que l'on veut sauvegarder. | ||
- | === Restauration depuis le serveur originel | + | ==== Mettre à jour la liste des chemins à sauvegarder ==== |
- | Ce cas se présente lorsque le serveur originel est toujours " | + | La configuration a lieu dans [[https://gitlab.federez.net/ |
- | == Restauration via montage FUSE == | + | La plupart des hôtes utilisent la configuration commune, définie dans [[https:// |
- | Exemple depuis hexagon avec l' | + | Redéployer le playbook après changement. |
- | Création d'un dossier pour le point de montage | + | ==== Manipuler les backups (listing, restauration, |
- | < | + | TODO |
- | montage de l' | + | Les commandes suivantes peuvent indifféremment être effectuées sur : |
- | < | + | * La machine dont on cherche à manipuler les backups |
+ | * Un des serveurs de backup | ||
- | Montre | + | Commencer par configurer |
- | < | ||
- | |||
- | Restauration du fichier / | ||
- | |||
- | < | ||
- | |||
- | Démonter le système de fichier FUSE | ||
- | |||
- | < | ||
- | |||
- | === Restauration depuis une machine tierce === | ||
- | |||
- | Dans le cas où l'on veut restaurer sur une machine X (pas précédemment inclue dans le système des sauvegardes) les données d'une machine A à partir de la sauvegarde effectuée sur la machine B ou C. | ||
- | |||
- | * Il faut installer '' | ||
- | * Il faut au préalable ajouter la clef publique SSH du compte qui sert à effectuer la restauration dans le '' | ||
- | * Il suffit ensuite d' | ||
- | * l' | ||
- | * l' | ||
- | * l' | ||
- | |||
- | Exemple testé ci-dessous : restauration sur gluon (serveur perso de Zertrin) de données de kdell à partir de la sauvegarde située sur hexagon. | ||
- | |||
- | == Avec FUSE == | ||
- | |||
- | * Ajout de la clef SSH de '' | ||
- | * Lister les générations disponibles (et en même temps vérifier que la connexion fonctionne) : | ||
- | |||
- | < | ||
- | |||
- | ++++ output | | ||
< | < | ||
- | 2 2016-02-14 22: | + | export BORG_RSH=" |
- | 23 2016-02-14 23: | + | export BORG_PASSPHRASE=" |
- | 65 2016-02-15 00: | + | export REPOSITORY=" |
- | 87 2016-02-15 01:28:28 .. 2016-02-15 01:29:04 (9147 files, 75389186 bytes) | + | |
- | 108 | + | |
- | 129 | + | |
- | 150 | + | |
- | 171 | + | |
- | 192 | + | |
- | 213 | + | |
- | 234 | + | |
- | 255 | + | |
- | 276 | + | |
- | 297 | + | |
- | 318 | + | |
</ | </ | ||
- | ++++ | ||
- | * Préparer un point de montage pour le système de fichier FUSE : | + | Il est notamment possible |
- | < | + | * lister les backups |
+ | * Faire une archive tar à partir d'un backup | ||
+ | * Monter l' | ||
- | * Monter | + | Se référer à la documentation de borg pour les syntaxes exactes. |
- | < | ||
- | |||
- | * Vérifier qu'on a bien toutes les générations de dispo dans ''/ | ||
- | |||
- | < | ||
- | |||
- | ++++ output | | ||
- | < | ||
- | total 68 | ||
- | drwxr-xr-x 25 root root 4096 Feb 15 23:46 108 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 01:41 129 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 03:40 150 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 05:40 171 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 07:40 192 | ||
- | drwxr-xr-x 25 root root 4096 Feb 14 22:57 2 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 09:40 213 | ||
- | drwxr-xr-x 25 root root 4096 Feb 14 23:36 23 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 11:40 234 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 13:40 255 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 15:40 276 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 17:40 297 | ||
- | drwxr-xr-x 25 root root 4096 Feb 16 19:41 318 | ||
- | drwxr-xr-x 25 root root 4096 Feb 15 00:34 65 | ||
- | drwxr-xr-x 25 root root 4096 Feb 15 01:29 87 | ||
- | lrwxr-xr-x 25 root root 4096 Feb 16 19:41 latest -> 318 | ||
- | -r--r--r-- 25 root root 4096 Feb 16 19:41 .pid | ||
- | </ | ||
- | ++++ | ||
- | |||
- | * Voir le contenu de la génération 42 : | ||
- | |||
- | < | ||
- | |||
- | * Voir le contenu de la dernière génération ('' | ||
- | |||
- | < | ||
- | |||
- | ++++ output | | ||
- | < | ||
- | total 28 | ||
- | drwxr-xr-x | ||
- | drwxr-xr-x 112 root root 12288 Feb 16 17:53 etc | ||
- | drwxr-xr-x | ||
- | drwx------ | ||
- | drwxr-xr-x | ||
- | </ | ||
- | ++++ | ||
- | |||
- | * Restaurer le fichier ''/ | ||
- | |||
- | < | ||
- | |||
- | * Démonter la sauvegarde : | ||
- | |||
- | < | ||
- | |||
- | ---- | ||
===== Installation initiale de backupninja ===== | ===== Installation initiale de backupninja ===== | ||
Ligne 271: | Ligne 187: | ||
===== Mise en place initiale de BorgBackup (ou Borg) ===== | ===== Mise en place initiale de BorgBackup (ou Borg) ===== | ||
- | ==== Prérequis ==== | + | Aucune mise en place initiale n'est requise. |
- | * Serveur de départ : '' | + | |
- | * Serveur d' | + | |
- | <wrap info></ | + | Le rôle ansible déployant |
- | + | ||
- | ==== Installation de Borg ==== | + | |
- | + | ||
- | Borg n'est disponible que via les backports pour jessie, on s' | + | |
- | + | ||
- | < | + | |
- | + | ||
- | Ensuite, on l' | + | |
- | apt update | + | |
- | apt install -t jessie-backports borgbackup | + | |
- | + | ||
- | ==== Configuration de borg ==== | + | |
- | + | ||
- | Initialisation du répertoire ''/ | + | |
- | + | ||
- | < | + | |
- | dodecagon ~ # mkdir / | + | |
- | dodecagon ~ # touch / | + | |
- | dodecagon ~ # touch / | + | |
- | </ | + | |
- | + | ||
- | Les deux fichiers doivent être des fichiers bash valides. | + | |
- | + | ||
- | * Le premier fichier (''/ | + | |
- | * Les autres fichiers (''/ | + | |
- | + | ||
- | ++++ config pour dodecagon (2017-05-08 18:33) | | + | |
- | <file bash common.conf> | + | |
- | # Common configuration for backups from dodecagon to any other server | + | |
- | + | ||
- | # This file is sourced by borg-wrapper.sh, | + | |
- | + | ||
- | BORG_USER=' | + | |
- | + | ||
- | # INCLUDE and EXCLUDE are indexed arrays in bash. | + | |
- | INCLUDE=( | + | |
- | '/ | + | |
- | '/ | + | |
- | '/ | + | |
- | '/ | + | |
- | '/ | + | |
- | '/ | + | |
- | ) | + | |
- | EXCLUDE=( | + | |
- | ' | + | |
- | ' | + | |
- | ' | + | |
- | '/ | + | |
- | '/ | + | |
- | ) | + | |
- | + | ||
- | # Only clean old backups when CLEAN_OLD_BACKUPS is exported from parent | + | |
- | # CLEAN_OLD_BACKUPS=' | + | |
- | + | ||
- | # 1 month daily, half a year weekly, 3 year monthly | + | |
- | CLEANUP_POLICY=(" | + | |
- | </ | + | |
- | + | ||
- | <file bash kdell.conf> | + | |
- | # Configuration for backups from dodecagon to kdell | + | |
- | + | ||
- | # This file is sourced by borg-wrapper.sh, | + | |
- | + | ||
- | REMOTE=" | + | |
- | </ | + | |
- | + | ||
- | <file bash quigon.conf> | + | |
- | # Configuration for backups from dodecagon to quigon | + | |
- | + | ||
- | # This file is sourced by borg-wrapper.sh, | + | |
- | + | ||
- | REMOTE=" | + | |
- | </ | + | |
- | + | ||
- | ++++ | + | |
- | + | ||
- | + | ||
- | ==== Préparatifs sur un serveur de destination ==== | + | |
- | + | ||
- | <wrap info></ | + | |
- | + | ||
- | <wrap info></ | + | |
- | + | ||
- | Ajout de l' | + | |
- | + | ||
- | <wrap tip></ | + | |
- | + | ||
- | < | + | |
- | kdell ~ # adduser --system --group --disabled-password --shell /bin/sh --home / | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | + | ||
- | On prépare le fichier '' | + | |
- | + | ||
- | < | + | |
- | kdell ~ # cd ~borg | + | |
- | kdell ~borg # sudo -u borg mkdir .ssh | + | |
- | kdell ~borg # sudo -u borg touch .ssh/ | + | |
- | kdell ~borg # chmod 600 .ssh/ | + | |
- | kdell ~borg # vim .ssh/ | + | |
- | </ | + | |
- | + | ||
- | On teste si la connexion sans mot de passe fonctionne depuis le serveur de départ (ici exemple avec dodecagon) et on en profite pour créer le dossier pour la sauvegarde (si pas déjà fait). | + | |
- | + | ||
- | ssh borg@kdell.federez.net mkdir dodecagon | + | |
- | + | ||
- | Il faut ensuite créer le dépôt : | + | |
- | + | ||
- | . / | + | |
- | . / | + | |
- | borg init --debug --encryption=none " | + | |
- | + | ||
- | ===== Mise en place initiale d' | + | |
- | + | ||
- | ==== Prérequis ==== | + | |
- | + | ||
- | * Serveur de départ : '' | + | |
- | * Serveur d' | + | |
- | + | ||
- | <wrap info></ | + | |
- | + | ||
- | ==== Installation d' | + | |
- | + | ||
- | Utilisation des dépôts jessie-backports pour avoir une version assez récente. Dans ''/ | + | |
- | + | ||
- | < | + | |
- | + | ||
- | Puis '' | + | |
- | + | ||
- | ==== Préparatifs sur un serveur de destination ==== | + | |
- | + | ||
- | <wrap info></ | + | |
- | + | ||
- | <wrap info></ | + | |
- | + | ||
- | Ajout de l' | + | |
- | + | ||
- | <wrap tip></ | + | |
- | + | ||
- | < | + | |
- | dodecagon ~ # adduser --system --group --disabled-password --shell / | + | |
- | </ | + | |
- | + | ||
- | <wrap tip></ | + | |
- | + | ||
- | < | + | |
- | hexagon ~ # adduser --system --group --disabled-password --shell / | + | |
- | </ | + | |
- | + | ||
- | <wrap tip></ | + | |
- | + | ||
- | < | + | |
- | kdell~ # adduser --system --group --disabled-password --shell / | + | |
- | </ | + | |
- | + | ||
- | <wrap tip></ | + | |
- | + | ||
- | < | + | |
- | quigon ~ # adduser --system --group --disabled-password --shell / | + | |
- | </ | + | |
- | + | ||
- | On prépare le fichier '' | + | |
- | + | ||
- | < | + | |
- | quigon ~ # cd ~obnam | + | |
- | quigon ~obnam # sudo -u obnam mkdir .ssh | + | |
- | quigon ~obnam # sudo -u obnam touch .ssh/ | + | |
- | quigon ~obnam # chmod 600 .ssh/ | + | |
- | quigon ~obnam # vim .ssh/ | + | |
- | </ | + | |
- | + | ||
- | On teste si la connexion sans mot de passe fonctionne depuis le serveur de départ (ici exemple avec hexagon) et on en profite pour créer le repository pour la sauvegarde (si pas déjà fait). | + | |
- | + | ||
- | < | + | |
- | hexagon ~ # sftp obnam@quigon.federez.net | + | |
- | sftp> mkdir obnam-repository-hexagon | + | |
- | sftp> ^D | + | |
- | </ | + | |
- | + | ||
- | ==== Configuration d' | + | |
- | + | ||
- | Initialisation du répertoire ''/ | + | |
- | + | ||
- | < | + | |
- | hexagon ~ # mkdir /etc/obnam && cd / | + | |
- | hexagon obnam # touch obnam_hexagon.conf | + | |
- | hexagon obnam # touch to_kdell.profile | + | |
- | hexagon obnam # touch to_quigon.profile | + | |
- | </ | + | |
- | + | ||
- | === Contenu des fichiers de config === | + | |
- | + | ||
- | * Le premier fichier ('' | + | |
- | * Les deux fichiers suivants ('' | + | |
- | + | ||
- | <wrap important> | + | |
- | + | ||
- | ++++ config pour hexagon (2016-05-01 15:40) | | + | |
- | <file ini obnam_hexagon.conf> | + | |
- | [config] | + | |
- | client-name = hexagon | + | |
- | root = /etc, | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | exclude = .*/ | + | |
- | .*/ | + | |
- | .*/ | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | /srv/ftp | + | |
- | log = / | + | |
- | log-level = info | + | |
- | log-max = 10000000 | + | |
- | log-keep = 10 | + | |
- | log-mode = 0600 | + | |
- | one-file-system = yes | + | |
- | keep = 20h, | + | |
- | upload-queue-size = 512 | + | |
- | lru-size = 1024 | + | |
- | lock-timeout = 900 | + | |
- | </ | + | |
- | + | ||
- | <file ini to_kdell.profile> | + | |
- | [config] | + | |
- | repository = sftp:// | + | |
- | </ | + | |
- | + | ||
- | <file ini to_quigon.profile> | + | |
- | [config] | + | |
- | repository = sftp:// | + | |
- | </ | + | |
- | ++++ | + | |
- | + | ||
- | ++++ config pour quigon (2016-05-01 15:40) | | + | |
- | <file ini obnam_quigon.conf> | + | |
- | [config] | + | |
- | client-name = quigon | + | |
- | root = /etc, | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | exclude = .*/ | + | |
- | .*/ | + | |
- | .*/ | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | log = / | + | |
- | log-level = info | + | |
- | log-max = 1000000 | + | |
- | log-keep = 10 | + | |
- | log-mode = 0600 | + | |
- | one-file-system = yes | + | |
- | keep = 20h, | + | |
- | upload-queue-size = 512 | + | |
- | lru-size = 1024 | + | |
- | lock-timeout = 900 | + | |
- | </ | + | |
- | + | ||
- | <file ini to_kdell.profile> | + | |
- | [config] | + | |
- | repository = sftp:// | + | |
- | </ | + | |
- | + | ||
- | <file ini to_hexagon.profile> | + | |
- | [config] | + | |
- | repository = sftp:// | + | |
- | </ | + | |
- | ++++ | + | |
- | + | ||
- | ++++ config pour kdell (2016-05-01 15:40) | | + | |
- | <file ini obnam_kdell.conf> | + | |
- | [config] | + | |
- | client-name = kdell | + | |
- | root = /etc, | + | |
- | / | + | |
- | / | + | |
- | / | + | |
- | exclude = .*/ | + | |
- | .*/ | + | |
- | / | + | |
- | log = / | + | |
- | log-level = info | + | |
- | log-max = 1000000 | + | |
- | log-keep = 10 | + | |
- | log-mode = 0600 | + | |
- | one-file-system = yes | + | |
- | keep = 20h, | + | |
- | upload-queue-size = 512 | + | |
- | lru-size = 1024 | + | |
- | lock-timeout = 900 | + | |
- | </ | + | |
- | + | ||
- | <file ini to_hexagon.profile> | + | |
- | [config] | + | |
- | repository = sftp:// | + | |
- | </ | + | |
- | + | ||
- | <file ini to_quigon.profile> | + | |
- | [config] | + | |
- | repository = sftp:// | + | |
- | </ | + | |
- | ++++ | + | |
- | + | ||
- | ==== Test première sauvegarde ==== | + | |
- | + | ||
- | Exemple depuis hexagon vers quigon: | + | |
- | + | ||
- | < | + | |
- | + | ||
- | ==== Purger les vieilles générations selon une politique donnée ==== | + | |
- | + | ||
- | L' | + | |
- | + | ||
- | * garder les 20 dernières générations horaires (comme le script | + | |
- | * garder les 30 dernières générations journalières | + | |
- | * garder les 52 dernières générations hebdomadaires | + | |
- | * garder les 10 dernières générations annuelles | + | |
- | + | ||
- | En appelant la commande suivante une fois par jour, les générations qui sont superflues sont supprimées de l' | + | |
- | + | ||
- | Exemple depuis hexagon avec l' | + | |
- | + | ||
- | < | + | |
- | + | ||
- | ==== Mise en place des cron pour obnam ==== | + | |
- | + | ||
- | Les crons se trouvent dans ''/ | + | |
- | + | ||
- | ++++ Les / | + | |
- | + | ||
- | **hexagon** | + | |
- | <file text / | + | |
- | PATH=/ | + | |
- | 35 1-21/4 * * * root obnam --config / | + | |
- | 40 3-23/4 * * * root obnam --config / | + | |
- | </ | + | |
- | + | ||
- | **quigon** | + | |
- | <file text / | + | |
- | PATH=/ | + | |
- | 35 1-21/4 * * * root obnam --config / | + | |
- | 40 3-23/4 * * * root obnam --config / | + | |
- | </ | + | |
- | + | ||
- | **kdell** | + | |
- | <file text / | + | |
- | PATH=/ | + | |
- | 35 1-21/4 * * * root obnam --config / | + | |
- | 40 3-23/4 * * * root obnam --config / | + | |
- | </ | + | |
- | + | ||
- | ++++ | + | |
- | + | ||
- | + | ||
- | ++++ Les / | + | |
- | + | ||
- | **hexagon** | + | |
- | <file text / | + | |
- | PATH=/ | + | |
- | 25 0 * * * root obnam --config / | + | |
- | 30 2 * * * root obnam --config / | + | |
- | </ | + | |
- | + | ||
- | **quigon** | + | |
- | <file text / | + | |
- | PATH=/ | + | |
- | 25 0 * * * root obnam --config / | + | |
- | 30 2 * * * root obnam --config / | + | |
- | </ | + | |
- | + | ||
- | **kdell** | + | |
- | <file text / | + | |
- | PATH=/ | + | |
- | 25 0 * * * root obnam --config / | + | |
- | 30 2 * * * root obnam --config / | + | |
- | </ | + | |
- | + | ||
- | ++++ | + | |
- | + | ||
- | < | + | |
- | . . . 0 . . . | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | H <- K <- Q . | | + | |
- | | + | |
- | | backup | + | |
- | | + | |
- | toutes les 4h | 45 +----------------------------------+ 15 | + | |
- | de 3h à 23h | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | H -> K -> Q | + | |
- | | + | |
- | | backup | + | |
- | | + | |
- | toutes les 4h ^ | + | |
- | de 1h à 21h | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | ---- | + | |
- | + | ||
- | ====== Duplicity ====== | + | |
- | + | ||
- | <WRAP center round alert> | + | |
- | Le système de sauvegarde utilisant '' | + | |
- | </ | + | |
- | Page concernant les backups avec duplicity est archivée ici : [[admin: | ||
admin/services/backup.1498294042.txt.gz · Dernière modification : 2017/06/24 10:47 de zertrin