SQLite Backup
Evolution de la bricabox oblige, certain scripts doivent aussi évoluer. C’est la vie du code, je ne vous apprend rien. C’est donc le moment de reprendre un peu la tache Rake de backup pour y ajouter quelque morceau.
La bricabox a maintenant un site pour elle, basé sur Radiant CMS, Jean-mi a construit un portail de la comte également basé sur RadiantCMS (oui au passage, sont blog à changé d’adresse: blog.lacomte.net). Tout les deux n’ayant pas pour vocation d’être gavé de données, ni d’avoir beaucoup d’accès en écriture, nous avons tout les deux opté pour SQLite. Une petite base de donnée un petit programme de gestion de base de donnée relationnelle écrit en C, très leger, très pratique dans ce genre de cas de figure (pas de configuration complexe, pas de serveur…).

Mais voilà, la tache de backup des bases de donnée avait été écrit uniquement pour les bases de l’époque: MySQL (je vous passe l’actu du jour sur le rachat de MySQLAB par Sun Microsystem ? :D). Donc il faut ajouter quelque ligne là dedans.
Un peu de recherche m’amène sur une bonne introduction pour SQLite chez IBM (enfin, vu la facilité d’utilisation, est-ce nécessaire :D). Tout ça pour finalement ajouter un test et une petite ligne:
sh “sqlite3 -batch #{db_config[‘database’]} .dump > #{backup_file}”
Et voilà les taches de backup qui sont à nouveaux opérationnelles.
Bon reste à voir où je place ces fichiers…
J’aime de plus en plus SQLite :) Attention à utiliser avec modération quand même
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