Outils pour utilisateurs

Outils du site


admin:services:backup

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
admin:services:backup [2016/02/26 12:31] – [Purger les vieilles générations selon une politique donnée] zertrinadmin:services:backup [2020/05/11 01:01] (Version actuelle) toadjaune
Ligne 1: Ligne 1:
 [[:admin|< retour à la page de l'administration technique]] [[:admin|< retour à la page de l'administration technique]]
  
-<WRAP center round important+<WRAP center round info 60%
-Le nouveau système de sauvegarde utilisant obnam vient d'être mis en place (Zertrin 2016-02-17 00:00).+L'ancienne page sur les backups est disponible ici : [[admin:services:backup-archive20190823|admin:services:backup-archive20190823]] 
 +</WRAP>
  
-La doc est en mode release candidate (99 % finie quoi).  
  
-:!: **EN PHASE DE TEST** :!:+<WRAP center round todo 60%> 
 +En cours de rédaction et mise en place. 
 +PoC herve & toadjaune
 </WRAP> </WRAP>
  
-===== Concept de sauvegarde =====+<WRAP center round important 60%> 
 +Backup en cours de mise en place. 
 +Machines concernées : toutes 
 +Priorité donnée à dodecagon 
 +</WRAP>
  
-**Backupninja** sert pour les sauvegardes automatisées locales (''/var/backups'') :+===== Motivation =====
  
-  * des informations systèmes utiles (dpkg-selectionsfstablvm...) +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 tempsparfois avec pas ou peu de passations de savoir.
-  * des dumps des bases de données MySQL+
  
-**Obnam** sert à effectuer la sauvegarde proprement dite vers les serveurs de destination. Il gère l'aspect snapshot et déduplication des données.+Les infrastructures et services que nous mettons en place doivent donc chercher à être aussi robustes que possible.
  
-===== Opérations courantes =====+Mais pas robustes au sens haute disponibilité, failover, etc ; plutôt au sens de disaster recovery.
  
-<wrap info></wrap>(nbsp) La doc concernant la mise en place initiale se situe plus bas.+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.
  
-==== Faire une sauvegarde ====+Ça implique plusieurs choses :
  
-Exemple depuis hexagon vers quigon :+* KISS 
 +* Bonne documentation 
 +* Backups solides
  
-<code>obnam --config /etc/obnam/to_quigon.profile backup</code>+Le choix de Borg + ansible me semble un bon compromis à ce niveau : pas de spof, pas de système compliqué de clustering, une seule techno assez simple d'utilisation partout, versatilité importante (se balader dans un backup en fuse, etc...)
  
-==== Mettre à jour la liste des chemins à sauvegarder ====+Aucune objection à en plus mettre d'autres types de backups tels que des snapshots de vm, c'est incontestablement plus simple d'utilisation dans les cas où c'est applicable, etc. Mais c'est plus limité en scope (proxmox vs hosting chez un tiers) et en résilience (c'est plus la même version de xxxx du coup le snapshot est plus compatible, ah mais on peut pas la restaurer là parce que pas la bonne conf réseau, etc)
  
-Voir la sous-section [[admin:services:backup#configuration-d-obnam|Contenu des fichiers de config]]. 
  
-<wrap tip></wrap>(nbsp)Pensez bien à mettre à jour le contenu des fichiers de config sur le wiki également !+===== Fonctionnement de la solution =====
  
 +**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.
  
-==== Voir les générations (versions====+**Backupninja** sert pour les sauvegardes automatisées locales (''/var/backups'':
  
-Exemple depuis hexagon avec l'archive située sur quigon :+  * 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é.
  
-<code>obnam --config /etc/obnam/to_quigon.profile generations</code>+===== Serveurs de sauvegarde =====
  
-==== Restaurer des données ====+Actuellement, 2 serveurs sont destination des sauvegardes réalisées par Borg : 
 +  * [[admin:serveurs:memoragon|memoragon]] (LXC non privilégié sur [[admin:serveurs:ronderu|ronderu]]) 
 +  * [[admin:serveurs:coronagon|coronagon]] (KVM hébergé au Résel)
  
-Si dessous quelques exemples testés.+----
  
-Voir aussi la doc officielle : http://code.liw.fi/obnam/manual/obnam-manual.en.html#restoring-from-backups+===== Opérations courantes =====
  
-=== Restauration depuis le serveur originel ===+<WRAP center round tip 60%> 
 +La doc concernant la mise en place initiale se situe plus bas. 
 +</WRAP>
  
-Ce cas se présente lorsque le serveur originel est toujours "ok" mais qu'on veut restaurer des données perdues/modifiées par inadvertance/... 
  
-== Restauration via montage FUSE ==+==== Faire une sauvegarde ====
  
-Exemple depuis hexagon avec l'archive située sur quigon :+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.
  
-Création d'un dossier pour le point de montage+==== Mettre à jour la liste des chemins à sauvegarder ====
  
-<code>mkdir /path/to/restore-fuse-mountpoint</code>+La configuration a lieu dans [[https://gitlab.federez.net/federez/ansible|le repo ansible]].
  
-montage de l'archive en tant que système de fichier FUSE+La plupart des hôtes utilisent la configuration commune, définie dans [[https://gitlab.federez.net/federez/ansible/-/blob/master/inventory/group_vars/all/vars.yml|inventory/group_vars/all/vars.yml]], mais il est possible de surcharger cette configuration par hôte ou par machine dans ''inventory/group_vars'' ou dans ''inventory/host_vars''.
  
-<code>obnam --config /etc/obnam/to_quigon.profile mount --to /path/to/restore-fuse-mountpoint</code>+Redéployer le playbook après changement.
  
-Montre les générations accessibles pour la restauration+==== Manipuler les backups (listing, restauration, etc) ====
  
-<code>ls -la /path/to/restore-fuse-mountpoint</code>+TODO
  
-Restauration du fichier /etc/postfix/main.cf depuis la dernière génération+Les commandes suivantes peuvent indifféremment être effectuées sur :
  
-<code>cp /path/to/restore-fuse-mountpoint/latest/etc/postfix/main.cf /tmp/main.cf.restored</code>+* La machine dont on cherche à manipuler les backups 
 +* Un des serveurs de backup
  
-Démonter le système de fichier FUSE+Commencer par configurer les variables d'environnement suivantes :
  
-<code>fusermount -u /path/to/restore-fuse-mountpoint</code> 
- 
-=== 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 ''obnam'' sur la machine X (merci Captain Obvious !) 
-  * Il faut au préalable ajouter la clef publique SSH du compte qui sert à effectuer la restauration dans le ''~obnam/.ssh/autorized_keys'' sur la machine B (sinon obnam ne pourra pas se connecter en SFTP au repository). 
-  * Il suffit ensuite d'utiliser obnam depuis la machine X en précisant 
-    * l'option ''--repository=sftp:%%//%%obnam@machineB.example.org/~/obnam-repository'' pour aller chercher les données sur la machine B 
-    * l'option ''--client-name=machineA'' pour restaurer les données de la machine A 
-    * l'option ''--no-default-configs'' pour faire fi de toute éventuelle configuration d'obnam déjà présente sur la machine X 
- 
-Exemple testé ci-dessous : restauration sur gluon (serveur perso de Zertrin) de données de baldrick à partir de la sauvegarde située sur hexagon. 
- 
-== Avec FUSE == 
- 
-  * Ajout de la clef SSH de ''zertrin@gluon'' dans ''~obnam/.ssh/authorized_keys'' sur hexagon : //exercice laissé au lecteur// 
-  * Lister les générations disponibles (et en même temps vérifier que la connexion fonctionne) : 
- 
-<code>obnam --no-default-configs --repository=sftp://obnam@hexagon.federez.net/~/obnam-repository --client-name=baldrick generations</code> 
- 
-++++ output | 
 <code> <code>
-2       2016-02-14 22:46:03 .. 2016-02-14 22:57:24 (9013 files, 42206636 bytes) +export BORG_RSH="ssh -i /root/.ssh/id_ed25519-backup" 
-23      2016-02-14 23:34:11 .. 2016-02-14 23:36:00 (9018 files, 58471331 bytes) +export BORG_PASSPHRASE="COMMON_SECRET_TO_REPLACE" # Présent dans le repo ansible ou dans /etc/borg/system.sh sur les systèmes backupés 
-65      2016-02-15 00:33:38 .. 2016-02-15 00:34:21 (9209 files, 81373094 bytes) +export REPOSITORY="borgbackup@memoragon.federez.net:system" # Remplacer memoragon si vous voulez accéder aux backups stockés sur coronagon
-87      2016-02-15 01:28:28 .. 2016-02-15 01:29:04 (9147 files, 75389186 bytes) +
-108     2016-02-15 23:45:34 .. 2016-02-15 23:46:41 (9149 files, 75545016 bytes) +
-129     2016-02-16 01:40:25 .. 2016-02-16 01:41:06 (9149 files, 75617687 bytes) +
-150     2016-02-16 03:40:22 .. 2016-02-16 03:40:42 (9149 files, 75617687 bytes) +
-171     2016-02-16 05:40:21 .. 2016-02-16 05:40:45 (9149 files, 75681743 bytes) +
-192     2016-02-16 07:40:24 .. 2016-02-16 07:40:44 (9149 files, 75686602 bytes) +
-213     2016-02-16 09:40:22 .. 2016-02-16 09:40:43 (9149 files, 75687464 bytes) +
-234     2016-02-16 11:40:29 .. 2016-02-16 11:40:49 (9149 files, 75687464 bytes) +
-255     2016-02-16 13:40:24 .. 2016-02-16 13:40:46 (9149 files, 75687464 bytes) +
-276     2016-02-16 15:40:23 .. 2016-02-16 15:40:47 (9149 files, 75687654 bytes) +
-297     2016-02-16 17:40:30 .. 2016-02-16 17:40:55 (9149 files, 75687654 bytes) +
-318     2016-02-16 19:40:49 .. 2016-02-16 19:41:23 (9149 files, 75687325 bytes)+
 </code> </code>
-++++ 
  
-  * Préparer un point de montage pour le système de fichier FUSE :+Il est notamment possible de :
  
-<code>mkdir /path/to/obnam_restore_baldrick</code>+* lister les backups 
 +* Faire une archive tar à partir d'un backup 
 +* Monter l'archive localement via fuse et lire son contenu avec n'importe quel outil
  
-  * Monter la sauvegarde via obnam avec FUSE :+Se référer à la documentation de borg pour les syntaxes exactes.
  
-<code>obnam --no-default-configs --repository=sftp://obnam@hexagon.federez.net/~/obnam-repository --client-name=baldrick mount --to /path/to/obnam_restore_baldrick</code> 
  
-  * Vérifier qu'on a bien toutes les générations de dispo dans ''/path/to/obnam_restore_baldrick''+===== Installation initiale de backupninja =====
- +
-<code>ls -la /path/to/obnam_restore_baldrick</code> +
- +
-++++ output | +
-<code> +
-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 +
-</code> +
-++++ +
- +
-  * Voir le contenu de la génération 42 : +
- +
-<code>ls -la /path/to/obnam_restore_baldrick/42</code> +
- +
-  * Voir le contenu de la dernière génération (''latest'') : +
- +
-<code>ls -laH /path/to/obnam_restore_baldrick/latest</code> +
- +
-++++ output | +
-<code> +
-total 28 +
-drwxr-xr-x   6 root root  4096 Feb 14 17:51 data +
-drwxr-xr-x 112 root root 12288 Feb 16 17:53 etc +
-drwxr-xr-x  24 root root  4096 Dec 21 17:16 home +
-drwx------  17 root root  4096 Feb 16 14:06 root +
-drwxr-xr-x  14 root root  4096 Feb 14 17:51 var +
-</code> +
-++++ +
- +
-  * Restaurer le fichier ''/etc/postfix/main.cf'' (par exemple) de la génération 42 : +
- +
-<code>cp /path/to/obnam_restore_baldrick/42/etc/postfix/main.cf /path/to/destination/main.cf.restored</code> +
- +
-  * Démonter la sauvegarde : +
- +
-<code>fusermount -u /path/to/obnam_restore_baldrick</code> +
- +
-===== Mise en place initiale d'obnam ===== +
- +
-==== Prérequis ==== +
- +
-  * Serveur de départ : ''obnam'' +
-  * Serveur d'arrivée : accessible en SFTP. Un utilisateur dédié ''obnam'' et son home accessible en SFTP par l'utilisateur qui exécute obnam sur le serveur de départ (typiquement ''root'') devra être créé (cf. ci-dessous) +
- +
-<wrap info></wrap>(nbsp) Exemple avec hexagon, mais la procédure est la même pour chaque serveur. +
- +
-==== Installation d'obnam ==== +
- +
-Utilisation des dépôts jessie-backports pour avoir une version assez récente. Dans ''/etc/apt/source.list'' ajouter (si nécessaire) : +
- +
-<code>deb http://http.debian.net/debian jessie-backports main</code> +
- +
-Puis ''apt-get update'' et avec l'aide d' ''aptitude'' par exemple choisir la version d'obnam provenant des backports. +
- +
-==== Préparatifs sur un serveur de destination ==== +
- +
-<wrap info></wrap>(nbsp) Opérations effectuées en ''root''. Vous pouvez aussi le faire avec ''sudo'' si vous préférez. +
- +
-<wrap info></wrap>(nbsp) Exemple ici avec quigon comme serveur de destination, à répéter pour chaque serveur de destination en adaptant les noms de serveurs. +
- +
-Ajout de l'utilisateur ''obnam'': +
- +
-<wrap tip></wrap>(nbsp) Pour **quigon** et **baldrick** on place le $HOME d'obnam dans ''/data/obnam'' pour profiter de la grosse partition où se trouve ''/data'' +
- +
-<code> +
-quigon ~ # adduser --system --group --disabled-password --shell /usr/lib/sftp-server --home /data/obnam obnam +
-</code> +
- +
-<wrap tip></wrap>(nbsp) Pour **hexagon** on place le $HOME d'obnam dans ''/home/obnam'' pour profiter de la grosse partition où se trouve ''/home'' +
- +
-<code> +
-quigon ~ # adduser --system --group --disabled-password --shell /usr/lib/sftp-server --home /home/obnam obnam +
-</code> +
- +
-On prépare le fichier ''.ssh/authorized_keys'' pour permettre la connexion par clef publique depuis les autres serveurs. +
- +
-<code> +
-quigon ~ # cd ~obnam +
-quigon ~obnam # sudo -u obnam mkdir .ssh +
-quigon ~obnam # sudo -u obnam touch .ssh/authorized_keys +
-quigon ~obnam # chmod 600 .ssh/authorized_keys +
-quigon ~obnam # vim .ssh/authorized_keys # ajouter les clefs publiques de root@hexagon et root@baldrick +
-</code> +
- +
-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). +
- +
-<code> +
-hexagon ~ # sftp obnam@quigon.federez.net +
-sftp> mkdir obnam-repository +
-sftp> ^D +
-</code> +
- +
-==== Configuration d'obnam ==== +
- +
-Initialisation du répertoire ''/etc/obnam''+
- +
-<code> +
-hexagon ~ # mkdir /etc/obnam && cd /etc/obnam +
-hexagon obnam # touch obnam_hexagon.conf +
-hexagon obnam # touch to_baldrick.profile +
-hexagon obnam # touch to_quigon.profile +
-</code> +
- +
-=== Contenu des fichiers de config === +
- +
-  * Le premier fichier (''obnam_<servername>.conf'') correspond à la conf spécifique au serveur qui crée et envoie ses sauvegardes. On y trouve notamment la liste des chemins à inclure et ceux à exclure. +
-  * Les deux fichiers suivants (''to_<servername>.profile'') servent juste à pointer vers le dépôt de sauvegarde sur les deux autres serveurs. +
- +
-<wrap important>Attention pour les options ''root'' et ''exclude'' : le dernier élément ne doit **pas** se terminer avec une virgule !</wrap> +
- +
-++++ config pour hexagon (2016-02-17 00:00) | +
-<file ini obnam_hexagon.conf> +
-[config] +
-client-name = hexagon +
-root = /etc, +
-       /home, +
-       /root, +
-       /var/backups, +
-       /var/lib/ldap, +
-       /var/lib/mailman +
-exclude = .*/obnam-repository$, +
-  .*/\.cache, +
-  /home/duplicity, +
-  /home/ftp, +
-  /root/.local/share/letsencrypt, +
-  /srv/ftp +
-log = /var/log/obnam.log +
-log-level = info +
-log-max = 1000000 +
-log-keep = 10 +
-log-mode = 0600 +
-one-file-system = yes +
-keep = 20h,30d,52w,10y +
-upload-queue-size = 512 +
-lru-size = 1024 +
-lock-timeout = 900 +
-</file> +
- +
-<file ini to_baldrick.profile> +
-[config] +
-repository = sftp://obnam@baldrick.federez.net/~/obnam-repository +
-</file> +
- +
-<file ini to_quigon.profile> +
-[config] +
-repository = sftp://obnam@quigon.federez.net/~/obnam-repository +
-</file> +
-++++ +
- +
-++++ config pour quigon (2016-02-17 00:00) | +
-<file ini obnam_quigon.conf> +
-[config] +
-client-name = quigon +
-root = /etc, +
-       /home, +
-       /root, +
-       /srv/dokuwiki, +
-       /var/backups, +
-       /var/lib/ldap, +
-       /var/lib/mailman +
-exclude = .*/obnam-repository$, +
-  .*/\.cache$, +
-  /home/backup_cyric, +
-  /home/backup_quigon, +
-  /home/kage/Federez, +
-  /home/zertrin/restore-nautilus, +
-  /root/.local/share/letsencrypt, +
-log = /var/log/obnam.log +
-log-level = info +
-log-max = 1000000 +
-log-keep = 10 +
-log-mode = 0600 +
-one-file-system = yes +
-keep = 20h,30d,52w,10y +
-upload-queue-size = 512 +
-lru-size = 1024 +
-lock-timeout = 900 +
-</file> +
- +
-<file ini to_baldrick.profile> +
-[config] +
-repository = sftp://obnam@baldrick.federez.net/~/obnam-repository +
-</file> +
- +
-<file ini to_hexagon.profile> +
-[config] +
-repository = sftp://obnam@hexagon.federez.net/~/obnam-repository +
-</file> +
-++++ +
- +
-++++ config pour baldrick (2016-02-17 00:00) | +
-<file ini obnam_baldrick.conf> +
-[config] +
-client-name = baldrick +
-root = /etc, +
-       /data/backups/phabricator, +
-       /home, +
-       /root, +
-       /var/backups +
-exclude = .*/obnam-repository$, +
-  .*/\.cache$, +
-  /home/git, +
-  /root/.local/share/letsencrypt, +
-log = /var/log/obnam.log +
-log-level = info +
-log-max = 1000000 +
-log-keep = 10 +
-log-mode = 0600 +
-one-file-system = yes +
-keep = 20h,30d,52w,10y +
-upload-queue-size = 512 +
-lru-size = 1024 +
-lock-timeout = 900 +
-</file> +
- +
-<file ini to_hexagon.profile> +
-[config] +
-repository = sftp://obnam@hexagon.federez.net/~/obnam-repository +
-</file> +
- +
-<file ini to_quigon.profile> +
-[config] +
-repository = sftp://obnam@quigon.federez.net/~/obnam-repository +
-</file> +
-++++ +
- +
-==== Test première sauvegarde ==== +
- +
-Exemple depuis hexagon vers quigon: +
- +
-<code>obnam --config /etc/obnam/to_quigon.profile backup</code> +
- +
-==== Purger les vieilles générations selon une politique donnée ==== +
- +
-L'option ''keep = 20h,30d,52w,10y'' dans le fichier de config correspond à la politique suivante : +
- +
-  * garder les 20 dernières générations horaires (comme le script est lancé toutes les 4 heures, ca fait garder les générations horaires pour un peu plus de 3 jours (20*4 = 80 heures)) +
-  * 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'archive. +
- +
-Exemple depuis hexagon avec l'archive située sur quigon : +
- +
-<code>obnam --config /etc/obnam/to_quigon.profile forget</code> +
- +
-==== Mise en place des cron pour obnam ==== +
- +
-Les crons se trouvent dans ''/etc/cron.d/obnam-backup'' et ''/etc/cron.d/obnam-forget'' +
- +
-++++ Les /etc/cron.d/obnam-backup sur les 3 serveurs | +
- +
-**hexagon** +
-<file text /etc/cron.d/obnam-backup> +
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +
-35 1-21/4 * * * root obnam --config /etc/obnam/to_baldrick.profile backup 1>/dev/null +
-40 3-23/4 * * * root obnam --config /etc/obnam/to_quigon.profile backup 1>/dev/null +
-</file> +
- +
-**quigon** +
-<file text /etc/cron.d/obnam-backup> +
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +
-35 1-21/4 * * * root obnam --config /etc/obnam/to_hexagon.profile backup 1>/dev/null +
-40 3-23/4 * * * root obnam --config /etc/obnam/to_baldrick.profile backup 1>/dev/null +
-</file> +
- +
-**baldrick** +
-<file text /etc/cron.d/obnam-backup> +
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +
-35 1-21/4 * * * root obnam --config /etc/obnam/to_quigon.profile backup 1>/dev/null +
-40 3-23/4 * * * root obnam --config /etc/obnam/to_hexagon.profile backup 1>/dev/null +
-</file> +
- +
-++++ +
- +
- +
-++++ Les /etc/cron.d/obnam-forget sur les 3 serveurs | +
- +
-**hexagon** +
-<file text /etc/cron.d/obnam-forget> +
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +
-25 0 * * * root obnam --config /etc/obnam/to_baldrick.profile forget 1>/dev/null +
-30 2 * * * root obnam --config /etc/obnam/to_quigon.profile forget 1>/dev/null +
-</file> +
- +
-**quigon** +
-<file text /etc/cron.d/obnam-forget> +
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +
-25 0 * * * root obnam --config /etc/obnam/to_baldrick.profile forget 1>/dev/null +
-30 2 * * * root obnam --config /etc/obnam/to_quigon.profile forget 1>/dev/null +
-</file> +
- +
-**baldrick** +
-<file text /etc/cron.d/obnam-forget> +
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +
-25 0 * * * root obnam --config /etc/obnam/to_hexagon.profile forget 1>/dev/null +
-30 2 * * * root obnam --config /etc/obnam/to_baldrick.profile forget 1>/dev/null +
-</file> +
- +
-++++ +
- +
-<code> +
-                                       . . . 0 . . . +
-                                   55                  5 +
-                                                     . +
-                                                       . +
-                                                         . +
-                           50                |                 10 +
- H <- B <- Q              .                  | +
-                                                         . +
- | backup  | +-----+                                                   H -> B -> Q +
- +---------+                                                                   + +
-toutes les 4h      |    45  +----------------------------------+ 15   +----+ | forget +
- de 3h à 23h                                                  |      +---------+ +
-                                                              |    seulement à 0h25 +
-                                                              | +
-                                                                  | +
-                   +----> 40                                 20     | +
-                                                                | +
- H -> B -> Q                                                    | +
-                                                            |      H <- B <- Q +
- | backup  | +------------------> 35                   25 <-----------+      +         ^ +
- +---------+                           . . . 30 . . .                    +-+ | forget +
-toutes les 4h                                ^                             +---------+ +
- de 1h à 21h                                 +---------------------------+ seulement à 2h30 +
- +
-</code> +
- +
-==== Installation de backupninja ====+
  
 Backupninja sert à créer des backups des informations système ainsi que de la base de donnée MySQL automatiquement. Backupninja sert à créer des backups des informations système ainsi que de la base de donnée MySQL automatiquement.
Ligne 504: Ligne 137:
 ++++ ++++
  
-Activer les backups pour la base de donnée MySQL (:!: uniquement sur **hexagon** et **baldrick**)+Activer les backups pour la base de donnée MySQL (:!: uniquement sur **hexagon**)
  
 ++++ Ajouter le fichier /etc/backup.d/20.mysql | ++++ Ajouter le fichier /etc/backup.d/20.mysql |
Ligne 546: Ligne 179:
 ++++ ++++
  
-----+Tester avec
  
-<WRAP center round alert> +<code>sudo backupninja --n</code>
-Le système de sauvegarde documenté ci-dessous utilisant ''duplicity'' avec le wrapper ''duplicity-backup.sh'' est en train d'être migré vers une nouvelle solution utilisant ''obnam''. (Zertrin 2016-02-14 23:15) :!: **NE PLUS UTILISER** :!: +
-</WRAP>+
  
-====== Duplicity ====== +----
- +
- +
-Backup interserveurs en mode push a l'aide de duplicity et son wrapper duplicity-backup. +
- +
-  * Le wrapper pour duplicity se trouve sous ''/root/scripts/duplicity-backup'' +
-  * Les sauvegardes se trouvent sur chaque serveur dans le répertoire ''/var/duplicity''((''/var/duplicity'' peut être éventuellement un lien symbolique vers un autre chemin situé sur une partition plus adaptée quand celle où se trouve ''/var'' ne convient pas au volume des données à sauvegarder)) +
-  * La configuration se trouve sous ''/etc/duplicity-backup.<machine1>_to_<machine2>.conf'' +
-  * Le shellscript lancé par cron se trouve sous ''/etc/cron.daily/duplicity-backup'' +
- +
-Pour consulter l'état actuel des sauvegardes de //<machine1>// vers //<machine2>//+
- +
-<code>sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.machine1_to_machine2.conf -s</code> +
- +
-==== Situation actuelle ==== +
-++++ hexagon → quigon (2015-09-14 21:00) | +
-<file bash> +
-INCLIST=( "/etc"+
-          "/root"+
-          "/home"+
-          "/srv"+
-          "/var/lib/ldap"+
-          "/var/lib/mailman"+
-        ) +
-         +
-EXCLIST=( "/home/duplicity"+
-          "/home/ftp"+
-          "/root/.cache/duplicity"+
-        ) +
-</file> +
-++++ +
- +
-++++ hexagon → baldrick (2015-09-14 21:00) | +
-<file bash> +
-INCLIST=( "/etc"+
-          "/root"+
-          "/home"+
-          "/srv"+
-          "/var/lib/ldap"+
-          "/var/lib/mailman"+
-        ) +
-         +
-EXCLIST=( "/home/duplicity"+
-          "/home/ftp"+
-          "/root/.cache/duplicity"+
-        ) +
-</file> +
-++++ +
- +
- +
-++++ quigon → hexagon (2015-09-14 21:00) | +
-<file bash> +
-INCLIST=( "/etc"+
-          "/home"+
-          "/root"+
-          "/srv"+
-          "/var/lib/mailman"+
-        ) +
- +
-EXCLIST=( "/root/backup_quigon"+
-          "/root/backup_cyric"+
-          "/root/.cache/duplicity"+
-          "/home/zertrin/restore-nautilus"+
-        ) +
-</file> +
-++++ +
- +
-++++ quigon → baldrick (2015-09-14 21:00) | +
-<file bash> +
-INCLIST=( "/etc"+
-          "/home"+
-          "/root"+
-          "/srv"+
-          "/var/lib/mailman"+
-        ) +
- +
-EXCLIST=( "/root/backup_quigon"+
-          "/root/backup_cyric"+
-          "/root/.cache/duplicity"+
-          "/home/zertrin/restore-nautilus"+
-        ) +
-</file> +
-++++ +
- +
-++++ baldrick → hexagon (2015-06-07 01:00) | +
-<file bash> +
-INCLIST=( "/etc"+
-          "/home"+
-          "/root"+
-          "/data/backups/phabricator"+
-        ) +
- +
-EXCLIST=( "/root/.cache/duplicity"+
-</file> +
-++++ +
- +
-++++ baldrick → quigon (2015-06-07 01:00) | +
-<file bash> +
-INCLIST=( "/etc"+
-          "/home"+
-          "/root"+
-          "/data/backups/phabricator"+
-        ) +
- +
-EXCLIST=( "/root/.cache/duplicity"+
-</file> +
-++++ +
- +
-===== Détails techniques ===== +
-==== Mise en place initiale ==== +
- +
-FIXME PAS ENCORE ADAPTÉ/MIS EN FORME : ne pas utiliser tel quel ! Mais l'idée générale y est et devrait suffire à reproduire. +
- +
-:!: Procédure à ne faire que si l'on part de zéro sur tous les serveurs (pas de backups en place) +
- +
-++++ Voir la procédure | +
-<code> +
-nautilus ~ # aptitude install duplicity +
-nautilus ~ # ssh-keygen -t rsa -b 2048 +
-nautilus ~ # l /root/.ssh +
-nautilus ~ # cat /root/.ssh/id_rsa.pub +
-nautilus ~ # ssh zertrin@quigon.federez.net +
-zertrin@quigon:~$ sudo adduser --system --group --disabled-password --shell /usr/lib/sftp-server --home /var/duplicity duplicity +
-zertrin@quigon:~$ cd /var/duplicity +
-zertrin@quigon:~$ sudo -u duplicity mkdir .ssh +
-zertrin@quigon:~$ sudo -u duplicity touch .ssh/authorized_keys2 +
-zertrin@quigon:~$ vim .ssh/authorized_keys2 +
-zertrin@quigon:~$ chmod 600 .ssh/authorized_keys2 +
-zertrin@quigon:~$ ^D +
-nautilus ~ # sftp duplicity@quigon.federez.net +
-sftp> mkdir nautilus +
-sftp> ^D +
-nautilus ~ # gpg --gen-key +
-nautilus ~ # gpg --gen-key +
-nautilus ~ # mkdir scripts && cd scripts +
-nautilus scripts # git clone git://github.com/zertrin/duplicity-backup.git +
-nautilus scripts # cd duplicity-backup +
-nautilus duplicity-backup (master) # cp duplicity-backup.conf.example /etc/duplicity-backup.conf +
-nautilus duplicity-backup (master) # vim /etc/duplicity-backup.conf +
-nautilus duplicity-backup (master) # ./duplicity-backup.sh -c /etc/duplicity-backup.conf -b +
-nautilus duplicity-backup (master) # vim /etc/cron.daily/duplicity-backup +
-nautilus duplicity-backup (master) # chmod +x /etc/cron.daily/duplicity-backup +
-</code> +
-++++ +
- +
-==== Extension sur un nouveau serveur ==== +
- +
-:!: Si au moins un des serveurs a déjà été configuré (voir procédure précédente) et qu'on désire préparer un autre serveur pour effectuer des sauvegardes via duplicity-backup. +
- +
-++++ Voir la procédure | +
- +
-Pour cette procédure, le nouveau serveur est //baldrick// et le serveur déjà configuré précédemment est //hexagon//. Pensez à adapter les noms de serveurs partout où il faut dans votre situation. +
- +
-**Installation de duplicity** +
- +
-<code> +
-baldrick ~$ sudo aptitude install duplicity +
-</code> +
- +
-**Génération d'une clef ssh pour root** +
- +
-:!: seulement si nécessaire (pas encore de ''/root/.ssh/id_rsa{,.pub}'' présents) +
- +
-<code> +
-baldrick ~$ sudo ssh-keygen -t rsa -b 2048 +
- <ne pas entrer de mot de passe> +
-baldrick ~$ sudo cat /root/.ssh/id_rsa.pub +
- <copier la clef publique de root@baldrick> +
-</code> +
- +
-**Mise en place connexion SFTP par clef SSH vers le serveur de destination** +
- +
-Ajout de la clef SSH de root@baldrick aux clef autorisées à se connecter à hexagon avec le login duplicity. +
- +
-<code> +
-baldrick ~$ ssh zertrin@hexagon.federez.net +
-hexagon ~$ sudo vim /var/duplicity/.ssh/authorized_keys2 +
- <ajouter la clef publique de root@baldrick à la fin> +
-hexagon ~$ ^D +
-</code> +
- +
-On teste si la connexion sans mot de passe fonctionne et on en profite pour créer le dossier de destination de la sauvegarde. +
- +
-<code> +
-baldrick ~$ sudo sftp duplicity@hexagon.federez.net +
-sftp> mkdir baldrick +
-sftp> ^D +
-</code> +
- +
-**Récupération du wrapper duplicity-backup.sh** +
- +
-Le wrapper est placé dans ''/root/scripts/duplicity-backup''+
- +
-<code> +
-baldrick ~$ sudo mkdir /root/scripts +
-baldrick ~$ sudo git clone git://github.com/zertrin/duplicity-backup.git /root/scripts/duplicity-backup +
-</code> +
- +
-**Import des clefs GPG de chiffrement et de signature** +
- +
-Pour se simplifier la vie, on importe les données issues d'une [[admin:backup#sauvegarde-de-la-config-et-des-clefs-de-chiffrement|sauvegarde de la config et des clefs de chiffrement]] effectuée préalablement sur un autre serveur où duplicity-backup a déjà été mis en place. +
- +
-:!: Au préalable, transférer une de ces sauvegardes (.tar.gpg) dans le dossier courant +
- +
-<code> +
-baldrick ~$ gpg -d duplicity-backup-2013-07-25.tar.gpg | tar x +
- gpg: données chiffrées avec CAST5 +
- Entrez la phrase de passe : (cf. password/duplicity-backup) +
-</code> +
- +
-Sinon toute autre méthode pour récupérer les deux clefs privées sous format texte convient aussi :) +
- +
-Passons à l'import des clefs GPG à proprement parler : +
- +
-<code> +
-baldrick ~$ sudo gpg --import duplicity-backup-2013-07-25/duplicity-backup-encryption-secret.key.txt +
-baldrick ~$ sudo gpg --import duplicity-backup-2013-07-25/duplicity-backup-sign-secret.key.txt +
-baldrick ~$ sudo gpg --edit-key 8B97F497 +
- gpg> trust +
- Quelle est votre décision ? 5 +
- Voulez-vous vraiment attribuer une confiance ultime à cette clef ? (o/N) o +
- gpg> quit +
-baldrick ~$ sudo gpg --edit-key 9ED0EF7B +
- <idem> +
-</code> +
- +
-**Copie d'une config existante de duplicty-backup et paramétrage** +
- +
-Parce que le sysadmin est fainéant, on se contente de copier la config d'un autre serveur et de l'adapter ;) +
- +
-<code> +
-baldrick ~$ sudo cp /root/duplicity-backup-2013-07-25/duplicity-backup.hexagon_to_quigon.conf /etc/duplicity-backup.baldrick_to_hexagon.conf +
-baldrick ~$ sudo rm -rf /root/duplicity-backup-2013-07-25 +
-baldrick ~$ sudo vim /etc/duplicity-backup.baldrick_to_hexagon.conf +
-</code> +
- +
-Adapter les variables ''DEST'', ''INCLIST'' et ''EXCLIST''+
- +
-<file bash duplicity-backup.baldrick_to_hexagon.conf> +
-... +
-DEST="ssh://duplicity@hexagon.federez.net/baldrick" +
-... +
-INCLIST=( "/etc"+
-          "/root"+
-          "/home"+
-        ) +
-... +
-EXCLIST=( +
-... +
-</file> +
- +
-**Sauvegarde initiale** +
- +
-Ceci effectuera la première sauvegarde (complète). +
- +
-<code> +
-baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf -b +
-</code> +
- +
-Si tout va bien cette sauvegarde apparait dans le résultat de la commande suivante : +
- +
-<code> +
-baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf -s +
-</code> +
- +
-**Mise en place du cronjob** +
- +
-<code>baldrick ~$ sudo vim /etc/cron.daily/duplicity-backup</code> +
- +
-<file bash duplicity-backup> +
-#!/bin/sh +
-test -x /root/scripts/duplicity-backup/duplicity-backup.sh || exit 0 +
-cd /root/scripts/duplicity-backup +
-LANG=C ./duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf --backup +
-</file> +
- +
-<code>baldrick ~$ sudo chmod +x /etc/cron.daily/duplicity-backup</code> +
- +
-Test du cronjob : +
- +
-<code> +
-baldrick ~$ sudo /etc/cron.daily/duplicity-backup +
-baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf -s +
-</code> +
- +
-Si tout va bien, bravo c'est fini ! +
- +
-++++ +
- +
-==== Ajout de nouvelles destinations de sauvegarde ==== +
- +
-:!: Seulement si le serveur auquel on ajoute une nouvelle destination de sauvegarde a déjà été configuré une première fois (voir procédure ci-dessus). +
- +
-++++ Voir la procédure | +
- +
-**Mise en place connexion SFTP par clef SSH vers le serveur de destination** +
- +
-Ajout de la clef SSH de root@baldrick aux clefs autorisées à se connecter. +
-<code> +
-baldrick ~$ sudo cat /root/.ssh/id_rsa.pub +
- <copier la clef publique de root@baldrick> +
-baldrick ~$ ssh zertrin@quigon.federez.net +
-quigon ~$ sudo vim /var/duplicity/.ssh/authorized_keys2 +
- <ajouter la clef publique de root@baldrick à la fin> +
-quigon ~$ ^D +
-</code> +
- +
-On teste si la connexion sans mot de passe fonctionne et on en profite pour créer le dossier de destination de la sauvegarde. +
- +
-<code> +
-baldrick ~ # sudo sftp duplicity@quigon.federez.net +
-sftp> mkdir baldrick +
-sftp> ^D +
-</code> +
- +
-**Copie du fichier de config et paramétrage** +
- +
-On crée un fichier de config par couple source -> destination. +
- +
-<code> +
-baldrick ~$ sudo cp /etc/duplicity-backup.baldrick_to_hexagon.conf /etc/duplicity-backup.baldrick_to_quigon.conf +
-baldrick ~$ sudo vim /etc/duplicity-backup.baldrick_to_quigon.conf +
-</code> +
- +
-Adapter les variables ''DEST'', ''INCLIST'' et ''EXCLIST''+
- +
-<file bash duplicity-backup.baldrick_to_quigon.conf> +
-... +
-DEST="ssh://duplicity@quigon.federez.net/baldrick" +
-... +
-INCLIST=( "/etc"+
-          "/root"+
-          "/home"+
-        ) +
-... +
-EXCLIST=( +
-... +
-</file> +
- +
-**Sauvegarde initiale** +
- +
-<code> +
-baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_quigon.conf -b +
-</code> +
- +
-Si tout va bien la sauvegarde initiale apparait dans le résultat de la commande suivante : +
- +
-<code> +
-baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_quigon.conf -s +
-</code> +
- +
-**Adaptation du cronjob pour effectuer la sauvegarde vers la nouvelle destination** +
- +
-<code>baldrick ~$ sudo vim /etc/cron.daily/duplicity-backup</code> +
- +
-<file bash duplicity-backup> +
-# ajouter cette ligne à la fin +
-LANG=C ./duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_quigon.conf --backup +
-</file> +
- +
-Test du cronjob : +
- +
-<code> +
-baldrick ~$ sudo /etc/cron.daily/duplicity-backup +
-baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf -s +
-</code> +
- +
-Si tout va bien, bravo c'est fini ! +
- +
-++++ +
-==== Sauvegarde de la config et des clefs de chiffrement ==== +
- +
-<WRAP center round important> +
-**Très important !** Chaque admin technique devrait générer ces sauvegardes pour lui-même et les conserver en lieu sûr (i.e. pas sur les serveurs où elles ont été générées). Sans ces données il sera difficile de restaurer les données. (et même impossible si les clefs GPG sont perdues) +
-</WRAP> +
- +
-Ces archives sont générées à l'aide de l'option ''--backup-script'' du wrapper duplicity-backup.sh. +
- +
-Ceci génère une archive TAR chiffrée symétriquement avec GPG. Le mot de passe utilisé est le même pour tous les serveurs et se trouve dans ''/root/passwords/duplicity-backup'' +
- +
-Dans l'archive se trouve tout ce qui est nécessaire pour effectuer une restauration des données à partir d'un autre serveur (fichier de config + clefs GPG de signature et de chiffrement). +
- +
-<code> +
-hexagon ~ # /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.hexagon_to_quigon.conf --backup-script +
-You are backing up: +
-      1. /root/scripts/duplicity-backup/duplicity-backup.sh +
-      2. GPG Secret encryption key: 8B97F497 and GPG secret sign key: 9ED0EF7B +
-      3. Config file: /etc/duplicity-backup.hexagon_to_quigon.conf +
-Backup tarball will be encrypted and saved to: /root/duplicity-backup-2013-07-25.tar.gpg +
- +
->> Are you sure you want to do that ('yes' to continue)? +
-yes +
-Encrypting tarball, choose a password you'll remember... +
- +
-IMPORTANT!! +
->> To restore these files, run the following (remember your password): +
-gpg -d duplicity-backup-2013-07-25.tar.gpg | tar x +
-</code> +
- +
-==== Procédure de restauration ==== +
- +
-Dans tous les cas il est nécessaire de diposer de la clef de déchiffrement correspondant à la clef GPG ''8B97F497'' +
- +
-=== Restaurer depuis le serveur d'origine === +
- +
-On suppose ici le cas où un fichier ou dossier a été modifié ou supprimé par mégarde et qu'on cherche à restaurer celui-ci tel qu'il était auparavant, le tout depuis le serveur d'origine. +
- +
-C'est la situation la plus simple car duplicity-backup.sh a déjà été mis en place et est configuré. +
- +
-Voici la commande générique : +
- +
-<code> +
-serveur1 ~ # /root/scripts/duplicity-backup/duplicity-backup.sh \ +
-  --config /etc/duplicity-backup.<machinededépart>_to_<machinedarrivée>.conf \ +
-  --restore-file [FILE_TO_RESTORE] [DESTINATION] \ +
-  --time [TIME] +
-</code> +
- +
-avec: +
- +
-  * ''--restore-file'' est équivalent à ''--restore-dir'' ;-) La procédure fonctionne de manière strictement identique pour restaurer un fichier ou un dossier. +
-  * ''[FILE_TO_RESTORE]'' de la forme ''relative/path/to/the/file/in/the/archive'' +
-  * ''[DESTINATION]'' de la forme ''/path/to/where/to/place/the/restored/file'' +
-  * ''[TIME]'' pour le format, [[http://duplicity.nongnu.org/duplicity.1.html#sect8|cf la doc officielle]]. Exemples qui fonctionnent: +
-    * ''1H30M'' : il y a une heure et trente minutes +
-    * ''12D'' : il y a 12 jours +
-    * ''"2015-12-01T00:00:00"'' le 1er décembre 2015 à minuit +
- +
-Exemple de restauration du fichier ''/etc/postfix/main.cf'' tel qu'il était il y a 12 jours sur le serveur hexagon depuis le backup effectué sur quigon. Le fichier restauré est enregistré sous '' +
-/root/main.cf.restored''+
- +
-<code> +
-hexagon ~ #/root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.hexagon_to_quigon.conf --restore-file etc/postfix/main.cf /root/main.cf.restored --time 12D +
-</code> +
- +
-Exemple de restauration du dossier ''/etc/apache2'' tel qu'il était il y a 1 heure et demi sur le serveur baldrick depuis le backup effectué sur hexagon. Le dossier restauré est enregistré sous '' +
-/root/etc-apache2.restored''+
- +
-<code> +
-baldrick ~ # /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf --restore-dir etc/apache2 /root/etc-apache2.restored --time 1H30M +
-</code> +
- +
-=== Restaurer depuis une autre machine que le serveur d'origine === +
- +
-On suppose ici que l'on a plus accès au serveur d'origine (exemple perte du disque-dur) et qu'on veuille restaurer les données sauvegardées sur une autre machine.+
  
-On suppose aussi que l'on dispose des éléments suivants :+===== Mise en place initiale de BorgBackup (ou Borg) =====
  
-  * Fichier tar contenant le backup du script et la configuration. Ce fichier est sensé avoir été créé à l'aide de l'option ''--backup-script'' du wrapper duplicity-backup.sh et la procédure est documentée ci-dessus. +Aucune mise en place initiale n'est requise.
-  * Passphrase de la clef de chiffrement (à FedeRez c'est la clef GPG ''8B97F497'')+
  
-:!: Il est très important de s'assurer que ces éléments aient été bien conservés en dehors des serveurs (par exemple dans une base KeePass de plusieurs admin tech de FedeRez).+Le rôle ansible déployant la configuration est capable d'installer intégralement un serveur de backup, seul un accès ssh est requis.
  
-FIXME finir la doc. En attendant voici l'idée générale : 
-  * Installer duplicity et mettre en place le wrapper duplicity-backup.sh comme documenté ci-dessus. 
-  * Utiliser le fichier de config et les clefs GPG issues de la sauvegarde du script pour restaurer les données de la même manière que documenté dans la section précédente. 
  
admin/services/backup.1456486301.txt.gz · Dernière modification : 2016/02/26 12:31 de zertrin

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki