Deblan blog

Futilités de Geek

Sauvegarde, panne, reprise de service

Si vous me suiviez depuis un moment, vous savez sans doute que je suis hébergé chez moi. J'ai en effet deux machines dans mon appartement qui me servent de serveurs pour mes sites web, mes mails, de l'IRC, GIT, etc. Bref, tout ce qui peut être hébergé dans mon appartement le sera.

J'ai cependant essuyé une panne matérielle qui m'a séparé de mon principal serveur. Une simple panne de disque qui a rendu indisponible ces différents services pendant quelques heures. Pour autant, je n'ai perdu (presque) aucune donnée et en dehors du temps qu'il m'a fallu pour reconfigurer la machine de réplication, tout est reparti dans l'ordre relativement rapidement.

J'en profite donc pour vous donner des pistes qui pourraient vous aider dans votre infrastructure. La question du jour est donc simple : comment mettre en place des outils de sauvegarde suffisamment performants pour rétablir des services assez rapidement ?

J'ai donc deux machines : celle qui offre tous les services (Hinata) et celle qui fait office de serveur réplication (Haruhi). Je n'ai pas encore l'envie de faire de la haute disponibilité (et dans un appartement, c'est peu probable que ça arrive…).

Sur Hinata était connecté un disque dur qui hébergeait de la sauvegarde versionnée. En effet, j'utilise l'excellent rsnapshot qui s'appuie sur Rsync et construit des sauvegardes sur des périodes données. J'ai 3 copies journalières, une copie quotidienne conservée pendant 7 jours, une copie par semaine conservée pour 1 mois et une copie mensuelle conservée sur une année…ce qui fait près de 25 versions ! Mes sites web y étaient sauvegardés, ainsi que mes dump SQL générés par wetddump (disponible sur mon dépot debian). J'y plaçait également des sauvegardes des répertoires /etc et /home. Mais ce n'est pas suffisant. Pour peu comme ce disque soit HS et qu'Hinata tombe avec, plus aucune donnée n'aurait été disponible. J'avais donc une synchronisation quotidienne des services sur Haruhi et une copie de sauvegarde des fichiers de configuration. J'en profitais également pour générer un fichier contenant la liste des paquets installés sur Hinata et je m'assurait que les utilisateurs et les groupes étaient toujours les mêmes des 2 cotés.

Après un peu plus d'un an de bons et loyaux services, Hinata est tombé et je devais tout refaire fonctionner sur Haruhi. J'ai donc pu installé les paquets qui manquaient en très peu de temps. Je me suis attardé à synchroniser les fichiers de configuration pour avoir le même comportement que sur Hinata et via la sauvegarde la plus récent du disque, je me suis assuré que mes services étaient bien à jour.

Au final, je me suis rendu compte que je n'ai pas sauvegardé 2 programmes compilés manuellement et qui se trouvaient de /usr/local. Je prendrai le temps de les réinstaller plus tard car ils ne sont pas critiques pour moi.

je suis satisfait de tout ça car ça s'est finalement bien passé et sans casse ! Voila pour la petite expérience…


Mon gitlab ouvre ses portes !

Aujourd'hui a été installé un outil en ligne pour gérer mes projets versionnés avec GIT.

J'y ai placé l'ensemble de mes projets plus ou moins intéressant :)

Deblan GITLAB


PDNS-Console is released!

Je viens de finaliser la première version de pdns-console, un outil en ligne de commande qui permet de gérer un serveur PowerDNS : un puissant serveur DNS qui repose sur des bases de données comme MySQL.

La particularité de pdns-console est qu'il permet de versionner ses zones.

  • On peut donc écrire différentes zones
  • On peut associer une zone à plusieurs domaines
  • Une zone est composée d'une ou plusieurs version dont l'une d'elle pourra être activée
  • La version activée d'une zone sera appliquée aux noms de domaine associés

pdns-console ajoute également des contraintes dans la base de données pour rendre les enregistrements cohérents.

Sous licence BSD, les sources et la procédure d'installation sont dispos sur Github. Je vous invite à tester, forker et bien sur contribuer !

Voici un exemple qui provient du README (en anglais) :

Specifications

  • We want to mange the domain example.tld
  • We need 3 records:
    • example.tld -> 1.2.3.4
    • www.example.tld -> same as example.tld
    • The MX of example.tld is mail.foo.net

Add the domain

$ ./app/console domain:add
Name: example.tld
MASTER [null]:
Type [NATIVE]:
Domain added
$ ./app/console domain:list
DOMAIN: example.tld
ID    : 5             # This ID is important
TYPE  : NATIVE
MASTER:

Create a zone

Interactive (or not)
$ ./app/console zone:add
Name: Example zone
Description: My example zone
Zone added.
The list is updated
$ ./app/console zone:list
Example zone
------------
My example zone
ID: 4                 # This ID is important

No version found
New version for "Example zone" (ID=4)
$ ./app/console zone:version:add 4 # My zone ID
Zone version added.
$ ./app/console zone:list
Example zone
------------
My example zone
ID: 4

Version: 1 - Active: No

No record found.

Add the records

"SOA" record (no interactive)
$ ./app/console zone:record:add 4 1 --name @ --type SOA --content "localhost. postmaster@localhost 0 10800 3600 604800 3600" --ttl 3600 --prio null
"A" record (interactive)
$ ./app/console zone:record:add 4 1
Name: @
Content: 1.2.3.4

Available types: A AAAA CNAME MX NS TXT SPF WKS SRV LOC SOA
Type: A
TTL: 3600
Prio [null]:
Zone record added.
"CNAME" record. "--ttl" is missing
$ ./app/console zone:record:add 4 1 --name www --type CNAME --content example.tld. --prio null
TTL: 3600
Zone record added.
"MX" record. The validation of "--prio" failed
$ ./app/console zone:record:add 4 1 --name @ --type MX --content mail.foo.net. --ttl 3600 --prio badValue
Prio [null]: badValueAgain
Prio [null]: 10
Zone record added.
My version is now ready
$ ./app/console zone:list
Example zone
------------
My example zone
ID: 4

Version: 1 - Active: No

   ID | NAME                  | TYPE      | TTL    | PRIO    | CONTENT
----------------------------------------------------------------------
   13 | @                     | SOA       | 3600   |         | localhost postmaster@localhost 0 10800 3600 604800 3600
   14 | @                     | A         | 3600   |         | 1.2.3.4
   15 | www                   | CNAME     | 3600   |         | example.tld.
   16 | @                     | MX        | 3600   | 10      | mail.foo.net.

Active and assign the new zone

$ ./app/console zone:version:active 4 1
Zone version activated.
$ ./app/console zone:assign 4 5
Domain zone updated.
./app/console domain:list --zone
DOMAIN: example.tld
ID    : 5
TYPE  : NATIVE
MASTER: 


      > Example zone
      > ------------
      > My example zone
      > ID: 4
      > 
      > Version: 1 - Active: Yes
      > 
      >    ID | NAME                  | TYPE      | TTL    | PRIO    | CONTENT
      > ----------------------------------------------------------------------
      >    13 | @                     | SOA       | 3600   |         | localhost postmaster@localhost 0 10800 3600 604800 3600
      >    14 | @                     | A         | 3600   |         | 1.2.3.4
      >    15 | www                   | CNAME     | 3600   |         | example.tld.
      >    16 | @                     | MX        | 3600   | 10      | mail.foo.net.
      > 

Push modifications

./app/console zone:push

Test :)

$ dig +short -t A @localhost example.tld
1.2.3.4
$ dig +short -t CNAME @localhost www.example.tld
example.tld.
$ dig +short -t MX @localhost example.tld
10 mail.foo.net.

T411 en console

Pour les addicts de t411, j'ai développé un outil en ligne de commande permettant d'accéder aux données du site. Ainsi, il est possible de faire des recherches avec critères, afficher les détails d'un torrent ou bien le télécharger. L'API du site a des bugs qui ne sont pas encore corrigés mais il est déjà possible de faire quelques trucs sympas.

Le code source et la doc sont disponibles sur Github. Tout est libre et ne vous génez pas pour forker :)


Comment remplacer Google ?

Cette notion de vie privée ébranlée par cette surveillance à grande échelle amène à se poser tout un tas de questions. La première et sans doute l'une de plus compliquée sont les outils : comment remplacer des outils qui fonctionnent bien mais qui deviennent une contrainte pour sécuriser sa vie privée ?

Google a une place dominante sur Internet. Moteur de recherche, réseau social, email, vidéos, c'est bien l'ensemble de ces outils qu'il faut remplacer par d'autres libres, ouverts et respectueux de ses utilisateurs.

Je n'ai pas toutes les réponses et je suis conscient qu'il n'existe pas toujours de si bonne alternative. D'ailleurs, c'est sans doute l'une des forces de Google (et entreprise du genre) : leurs outils sont suffisamment bien pensés pour aguicher les plus extrémistes d'entre nous.

Concrètement, que pouvons-nous mette en place pour se passer de Google ? De mon coté, mes habitudes ont été updatées et encore beaucoup de travail m'attends.

Commençons par les emails. Cela fait maintenant plusieurs années que j'ai de quoi envoyer et recevoir des emails chez moi. J'utilise la solution postfix pour envoyer et recevoir mes courriers en *@deblan.*. Bien que l'installation complète et sécurisée d'un serveur de mail ne soit pas toujours évidente, aujourd'hui ça fonctionne bien et j'arrive à passer les filtres anti-spam même si je suis derrière une IP de ligne ADSL. Des solutions complémentaire comme postgrey et spamassassin permette de garantir un filtre suffisamment robuste pour ne pas s'en prendre trop dans la tronche.
Pour les moins courageux, je vous invite à vous dirigez vers des associations comme Rhien.

Les parties "réseau social" et "vidéos" sont assez sensibles. En effet, c'est en effet de masse seulement que les choses pourraient changer. La visibilité des données devient plus ou moins importante selon le profil des utilisateurs et il m'est impossible de recommander un outil plus qu'un autre. Il est existe du logiciel libre "social" comme StatusNet et Twister, ou encore Diaspora, caractérisés avant tout par leur utilisation décentralisée, mais seule une minorité d'internautes les ont installés.
Du coté des plateformes vidéos, pas mal de solutions web-based sont disponibles et des outils comme Wordpress peuvent facilement accueillir ce type de contenus. il y a deux problèmes plus ou moins importants : si on héberge son contenu à la maison, en dehors des lignes VDSL ou en fibre optique, les débits ne sont pas suffisants pour assurer un service digne de ce nom. J'aurais tendance à privilégier les réseaux P2P mais ça reste compliqué et ça sort des sentiers battus du streaming. Pour une médiathèque plus ou moins avancée, il pourra être intéressant d'utiliser Owncloud. Owncloud est d'ailleurs une excellente alternative à l'espace de stockage Google Drive ou à l'agenda de Google Calendar. Par ailleurs, il permet maintenant l'édition de document collaborative.

Sans faire le tour complet de Google, il reste à présent le moteur de recherche à remplacer. Personnellement, j'ai mis quelques temps avant de pouvoir m'en défaire. Il faut avouer qu'il est performant mais la politique de Google me déplait et mes données personnelles passent avant tout. J'ai épluché quelques solutions et j'ai utilisé, pendant un court temps, Seeks. Il fait office de proxy et agrège différents moteurs de recherches pour récupérer des résultats. Bien que le projet soit extrêmement intéressant, il ne m'a pas convaincu (mais je garde sous le coude !). Duck Duck Go est un moteur qui s'appuie sur Google mais rend nos requêtes anonymes. Il fonctionne bien mais j'aimerais autre chose que des résultats textuels. Typiquement, quand je recherche le titre d'un artiste, j'ai envie qu'on me propose aussi des vidéos et des images. Du coup, je me suis retranché sur Qwant, un moteur de recherche Français avec la législation française avec lui (et moi). Il fonctionne pas mal même si certaines requêtes m'ont amené trop peu de résultats pertinents. Cependant, il accueil les fonctionnalités que je cherchais avec une interface plutôt sympatique.