mysqldump | bzip | gpg > mail
Par RaphAstronome le lundi, 5 janvier 2009, 19:02 - Linux - Lien permanent
Cette fois on va faire un backup de la base de données (avec mysqldump), la compresser (bzip), la chiffrer (gpg) et enfin l'envoyer dans un mail avec une pièce jointe avec ruby.
Donc ça donne une grosse commande un peu comme ça :
mysqldump --all-databases --hex-blob -hlocalhost -udumper -p(code) | bzip2 | gpg -r (idCle) --encrypt -a
Pour mysqldump
- --all-databases : Sauvegarde toutes les bases. Si vous voulez sauvegarder une seule base il faut mettre le nom le la base au lieu de ce paramètre. Attention à la restauration il faudra peut être nettoyer le dump au niveau des bases systèmes si vous utilisez cette option.
- --hex-blob : Les blobs c'est mieux en hexadécimal.
- -hlocalhost : L'hôte (h) est "localhost"
- -udumper : L'utilisateur (u) est "dumper". On créera cet utilisateur avec un code, accessible depuis localhost et les droits SELECT partout. N'oubliez pas de faire un "FLUSH PRIVILEGES" après avoir ajouté l'utilisateur.
- -c(code) : Le code (c) est "(code)" à adapter bien sûr.
Pour bzip2 c'est très simple :
- En entrée le texte non compressé.
- En sortie le texte compressé.
Pour gpg :
- -r (idCle) : On utilisera la clé publique "(idCle)". La clé privée est chez vous et ne doit pas être sur le serveur.
- --encrypt : ce que l'on demande c'est un chiffrement.
- -a : Renvoie le fichier chiffré en format ASCII plus pratique pour l'envoi par e-mail.
Et comment l'envoyer par mail ? Bon on à la commande mail mais ça fait pas super propre de l'envoyer direct, mieux vaut faire une jolie pièce jointe et l'envoyer avec ruby.
#! /usr/bin/ruby require 'net/smtp' # Configuration du mail # Nom de l'expéditeur form = "www-data" # En envoie à "toName" dont l'adresse mail est "mail@domain.tld" toName = "Moi meme" toAddr = "mail@domain.tld" # Le sujet du message, un petit résumé sujet = Time.new.strftime("dump du %d/%m/%Y") resume = Time.new.strftime("Le dump compressé du %d/%m/%Y à %H:%M:%S") # La frontière entre les parties de l'e-mail multipart/mixed. Remarquez que pgp avec l'option -a ne produit pas de "!" boundary = "!!NEW!!TYPE!!" # Le nom du fichier, l'extension est celle d'un fichier sql, compressé en bz2 et chiffré en gpg fileName = Time.new.strftime("dump-%Y-%m-%d.sql.bz2.gpg") # ID de la clé publique à utiliser idCle = idDeLaCle Net::SMTP.start('localhost') do |smtp| smtp.open_message_stream(form, [toAddr]) do |mail| # En tête du mail mail.puts "From: "+form mail.puts "To: "+toName+" <"+toAddr+">" mail.puts "Subject: "+sujet mail.puts "MIME-Version: 1.0" mail.puts "Content-Type: multipart/mixed; boundary=""+boundary+""" mail.puts # Le résumé mail.puts "--"+boundary mail.puts "Content-Type: text/plain; charset="utf-8";" mail.puts mail.puts resume mail.puts # Le fichier mail.puts "--"+boundary mail.puts "Content-Type: application/octet-stream; name=""+fileName+""" mail.puts "Content-Transfer-Encoding: 7bit" mail.puts "Content-Disposition: attachment; filename=""+fileName+""" mail.puts IO.popen("mysqldump --all-databases --hex-blob -hlocalhost -udumper -pcode | bzip2 | gpg -r "+idCle+" --encrypt -a 2>/dev/null") do |io| io.each do |ligne| mail.print ligne end end mail.puts "--"+boundary+"--\n\r" end end
Remarques :
- Il y a des pays n'autorisent pas le chiffrement. Veuillez vous informer sur les lois de votre pays.
- La clé publique doit être signée : vous pouvez créer une autre clé privée pour le serveur et signer avec celle là.
- Vérifiez la taille d'e-mail maxi que vous pouvez accepter.
- Si votre base est vraiment grosse cette solution de backup n'est pas adaptée.
- Mettez le script en cron pour faire des backup par exemple tous les jours (après des tests bien sur).
Commentaires
Bonjour
SVP ou est ce que on mis ces ligne de code
dans quel fichier ?
Bonjour,
Le code ruby se place dans un fichier texte auquel on donne le droit d'exécution. On pourra l'exécuter a la demande ou avec un cron par exemple tous les jours.
Bien sur pour que ça marche il faut que ruby soit installé.