Intro
Les backups c'est pas mal quand même.
Cet article donne une solution simple pour réaliser un backup de fichiers et répertoires sur Google Drive.
Cahier des charges
Je voulais une solution simple pour copier quelques fichiers et répertoires d'un serveur sur un de ces storages à la mode, dans le CLOUD, tu sais?
Le cloud c'est quelque part, tu sais pas trop où, tu sais pas trop ce qui s'y passe, tu sais que ça consomme probablement la moitié des ressources de la planète mais à part ça l'abstraction est de la plus haute élégance, il faut bien l'avouer n'est-ce pas.
J'avais initialement en tête trois providers de storage cloud, les trois empires d'Internet, en gros:
Google Drive
On peut mettre des fichiers dessus. Plutôt cool hein? Google Drive gère l'historisation de vos données, jusqu'à 30 jours de révisions disponibles. Wow!
Un compte Google s'accompagne d'un espace alloué qui tourne aujourd'hui autour de 15 GB. Ce nombre augmente lentement avec le temps pour faire genre "ouais on l'a calculé par rapport à l'évolution de l'infrastructure". Ouais.
Cet espace est partagé entre toutes les applis Google, que je sache. L'idéal s'il s'agit d'utiliser Google Drive, serait dès lors de créer un compte spécifique rien que pour ça.
Microsoft SkyDrive
Sky parce que c'est le cloud vous comprenez? En fait ça s'appelle OneDrive maintenant. Parce que... OUais je sais pas. Peut-être qu'ils veulent que vous mettiez toute votre vie dessus.
Le service gratuit est à 7 Go de stockage offert d'après ce que je vois. Pourquoi pas 5 ou 10 Go? Euh... Peut-être qu'ils font (semblant de faire) comme Google. Ou peut-être que c'est des vieux rats.
Je trouve leur insistance "LES GARS ENVOYEZ NOUS TOUTES VOS PHOTOS" un peu effrayante.
Ils ont une API. La classe ou quoi.
Amazon S3
Plutôt un service entreprise qu'autre chose, préfère vendre des TB d'espace plutôt que 7 vieux malheureux GB balancés monchalament gratuitement à votre tronche tel un malapris balancerait un reste de burrito sauce à l'ail plein de fuites et de virus de l'herpès à un sans-abri. C'est sympa dans une certaine mesure. Dans une certaine mesure.
Ils ont un "Essai gratuit" mais ça pue le "donne quand même ta carte de crédit et signe ce pacte après avoir tracé un pentacle avec ta souris".
Partons sur Google drive
C'est un backup, c'est pas grave si on se fait bannir le compte qu'on y a uploadé trop de photos de courgettes, c'est pas grave si la NSA lance des programmes de recherche sur votre contenu (enfin j'espère pour vous).
Je trouve que 15 GB c'est honnête, surtout que j'en ai vraiment pas besoin d'autant.
Qu'est-ce qu'on backup?
Mon but est de pouvoir facilement réinstaller un serveur Linux et relancer les services.
Mon exemple est une machine avec un Nginx basique, un firewalling noyau, pas de bases de données type client/serveur mais éventuellement des backends en Java (qui ont un script de démarrage).
Je met tous mes fichiers web et binaires de backend, logs, fichiers de données, etc. dans /srv. J'ai lu dans un magazine que les gens cools mettaient leur frusques là et pas dans /var/[TRUC]. Je voulais être un type cool pour une fois.
Ce répertoire /srv est relativement volumineux (~ 500 MB) et je préfèrerais ne pas le réuploader chaque fois. S'il existe un genre de solution comme Rsync ce serait trop bien quoi.
Ensuite, j'ai quelques fichiers individuels à backuper (prononcer: Bac-eup-haie ; c'est peut-être pas dans le dico).
J'aimerais pouvoir tout copier directement sans devoir faire une copie qui sera copiée quelque part dans un endroit temporaire, doublant ainsi l'espace utilisé le temps du backup. Du coup, je comprime pas. Comprimer c'est tricher.
Prérequis
- Un compte Google
- L'exécutable "gdrive"
Gdrive
Google Drive à pas mal de moyens d'accéder à son API qui sont tout digérés pour beaucoup de langages. Cela dit, je voulais quelque chose de déjà digéré. Entre en scène ce projet:
https://github.com/prasmussen/gdrive
Un utilitaire ligne de commande codé en Go, yes! Je n'ai jamais personnellement codé en Go mais j'apprécie ce type de projets parce qu'ils ont tendance à fournir un exécutable, propre et seul, qui en plus, fonctionne. Sans dépendance. A l'époque des Nodejs, npm et autres bower et que sais-je ça fait du bien d'avoir juste un fichier tout seul qui fonctionne. Aah...
Pour l'installer: chopper le bon exécutable sur la page Github mentionnée plus haut, et le renommer en "gdrive". Ou en "cacatoes" si vous préférez, il faudra juste le rentenir pour plus tard.
Commencer par exécuter cette commande (en SSH ou directement sur la console assis par terre dans un datacenter):
gdrive list
Ceci devrait vous donner un lien à copier dans un navigateur. Assurez-vous que vous n'avez pas de compte Google connecté en ce moment sur ce navigateur, ou qu'il s'agisse bien du compte que vous souhaitez utiliser pour le backup.
Il s'agit ensuite en copier coller le code d'autorisation application donné par Google.
Gdrive enregistre ça quelque part dans votre dossier utilisateur, tranquilou. Les prochaines commandes gdrive n'auront plus besoin de mot de passe ni de quoi que ce soit. C'est pas la classe de simplicité ça? Votre gdrive est maintenant prêt.
ZE Script
Non mais sérieux VEZDe, du Perl? Tu te fous de ma gueule? DU PERL?? Qui utilise encore ce truc de prout???
- Un lecteur anonyme
Hey je suis vieux okay, le trucs machins en Python Ruby sa mère ça contient trop de texte et le code est beaucoup trop clair. A la limite si Scala était un langage de script qui ne devait pas charger une JVM de 120 MB de RAM pour juste lancer trois commandes j'aurais peut-être écrit ça en Scala. J'aurais été trop hype quoi.
On reste dans l'idée de faire du simple, avec une gestion d'erreur de merde et un truc somme toute assez verbeux.
Téléchargez le script ici: backup_gdrive.pl
Ou récupérez/forkez (lol) le sur Github: https://github.com/dkvz/backup_gdrive
Utilisation
Mettez le .pl dans /usr/local/bin et faites lui un petit chmod +x. Il faudra faire tourner ce script en tant que l'utilisateur avec lequel vous avez configuré votre session Google API précédemment.
Editez le fichier. Vous verrez ces deux variables:
# List of files to backup
# (directories and files, no trailing /, has to have leading /)
my @to_backup = (
"/srv",
"/etc/nginx",
"/etc/init.d/dorade-api",
"/etc/iptables.conf",
"/etc/network/if-up.d/firewall"
);
# Path to the gdrive executable
my $gdrive = "gdrive";
Modifiez le tableau to_backup pour contenir les chemins que vous souhaitez baqueupai. Il peut s'agir de répertoires ou fichier, l'important c'est d'avoir un slash au début et aucuns à la fin (ah oui j'ai oublilé de préciser que ce script ne fonctionne pas sous Windows à moins d'adapter toute la logique de chemins).
La variable $gdrive est simplement le nom de l'exécutable gdrive. Dans ce cas-ci on suppose qu'il est dans le PATH.
Il suffit d'exécuter le script pour lancer le backup. Je conseille de monitorer la sortie (les deux flux de sortie d'ailleurs) dans un premier temps au moins, pour vérifier que tout se passe bien.
La synchro de répertoires ET fichiers vont créer des historisations de vos fichiers, et la synchro de répertoire n'uploadera que les fichiers modifiés (la synchro de fichiers seuls upload d'office par contre).
Un petit truc à retenir tout de même: si vous effacez un fichier sur la source, il sera effacé sur Google drive, et je pense pas qu'on puisse le récupérer dans ce cas là (il est pas dans la corbeille), par conséquent ce système n'aide que très modérément contre les suppressions accidentelles. Comme je ne fais jamais d'erreurs c'est pas un problème pour moi, mais gardez-le à l'esprit si vous utilisez ce script.
Elegant et léger. Reste plus qu'à bourrer tout ça dans un planificateur de tâches avec un gros pipe vers /dev/null et l'oublier pour toujours (avec un peu de chance ça fonctionnera plus dans deux semaines et vous vous en rendrez pas compte).
Résultat:
Et comment je restore mon backup?
Tout est téléchargeable sous forme de zip sur Google Drive mais le mieux c'est d'utiliser gdrive en ligne de commande pour télécharger le backup. Vous pouvez même resynchroniser un fichier à une date ultérieure si une modification malheureuse a eu lieu entre temps.
Je conseille de lire la page Github de gdrive qui a toutes les infos pour utiliser les commandes de téléchargement.
Problèmes possibles
J'ai eu un naming collision en essayant de sync un répertoire à un moment. Normalement gdrive vous mentionne les deux ID de fichiers Google Drive qui posent conflit. Il s'agit d'effacer le premier avec une commande de ce type:
gdrive delete 0B0wuZ4ZJCcDTZm4tZEl1ZDBlalU
Ouais c'était facile...

Commentaires
Il faut JavaScript activé pour écrire des commentaires ici