Rake: sauvegarde de base de donnée 2
La bricabox hébergent ce blog, lacomte de jean-mi ainsi que l’eternel teaser (ou le teaser eternel tout dépend du point de vue comme d’habitude) zlab tourne avec OpenBSD, LighTTPD et Ruby on Rails.
Après ce link dropping permettant de vous cadrer le sujet, je vais vous parlé de Rake. C’est un peu la make, la fourmi travailleuse de ruby. Bien intégré avec Rails, ce petit outil vous permet de réalisé des scripts divers et varié. Non pas forcement de la compilation, puisque non nécessaire en général avec ruby, mais on peut par exemple lancer les test unitaires, et dans notre cas faire un backup de la base de donnée.
Et oui, cette outils manquais sur la bricabox. Les sauvegardes était à la charge de chacun, et manuel (peu de problème cependant pour le teaser zlab ;-)).
Je me suis inspiré de ce que j’ai pu trouver ici et là sur la toile, mais mis à mon goût. 3 taches sont disponible dans ce Rakefile:
- backup Executer un dump de la base mysql pointé par l’environnement rails (config/database.yml).
- clean_backup Nettoyer la liste des fichiers de backup disponible. Dans le cas de la bricabox, nous avons opté pour une sauvegarde journalière avec rotation à la semaine. On ne garde donc sur l’emplacement prévu à cette effet que 7 fichiers de backup. Charge a nous d’en faire une copie ailleurs de temps à autres ;-).
- mail Pas grand chose à voir avec le backup, mais j’en ai eu besoin. Peut-être il faudrais que je le sorte de là pour le mettre ailleurs… plus tard. Cette tache vas nous permettre d’envoyer un mail contenant les liens vers les fichiers de backup (pour un téléchargement en local si besoin/envie).
Pour exécuter une tache rake avec Rails, rien de plus simple. On se place dans le répertoire racine de l’application (ici typo huhu, il en manquais un dans le link dropping :-p). Puis on appel l’exécutable rake avec le nom de la tache à exécuter, ainsi que ces paramètres:
/usr/local/bin/rake db:backup DIR=/home/toto/backup RAILS_ENV=production
Les taches utilisent (enfin c’est conseillé) les espaces de noms de Ruby. Cela permet de ne pas trop ce mélanger les pinceaux.
namespace :db do desc "Backup the database to a file. Options: DIR=base_dir RAILS_ENV=production" task :backup => [:environment] do (...)
Si vous souhaitez vous inspirer de ce que nous avons mis en place libre à vous (pas de licence, donc domaine public ;-)).
au passage…
J’aime regardé du code (enfin quand il est beau hein). Oui je suis un voyeur, prenez moi pour un fou. Mais laissé moi vous montrer ici quelques lignes de ce fichier.
def all_backups
dir = Dir.new(backup_folder)
dir.entries.select{|e| e =~ /^#{RAILS_ENV}_dump_(.*)$/}.sort.reverse
end
Certain l’aurons compris, il s’agit de filtrer la liste des fichiers d’un répertoire pour ne récupérer que ceux qu’il nous faut.
Les regexp c’est beau, et j’ai encore tant à apprendre pour m’en servir au mieux. Ruby c’est beau, et j’ai encore tant à apprendre pour m’en servir au mieux.
c’est le refrain d’un futur teaser vocal :-p
La tache mail mérite sûrement d’être reprise, amélioré, intégrer au système de notification contenu dans Typo. Mais pour le moment ça marche comme ça
Et non je ne suis pas en vacance. Je n’avais rien a poster, c’est tout :-p
Tu es peut-être voyeur mais au moins tu as bon goût dans ce que tu regardes. ;)
Tiens au fait ton script de backup fait une sauvegarde des fichiers importés sur le serveur avec typo ?
Heu… Non c’est une nouvelle fonctionnalité à ajouter.
En fait il faut qu’on prévoit un système plus large maintenant que la base de donnée est fait.