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).