Un task Capistrano per backuppare il DB di produzione

Recentemente, per riprodurre un bug che si presentava solo in produzione, ho pensato bene di creare un piccolo task Capistrano per copiare in locale l’intero contenuto del DB remoto. Il task funziona solo se il DB di produzione è MySQL. Troverete il risultato nella cartella backups del vostro progetto Rails. Eccolo:

                                                                                                                                                                                            config/deploy.rb
 1 require 'yaml'
 2 
 3 desc "Backup the remote production database"
 4 task :backup, :roles => :db, :only => { :primary => true } do
 5   filename = "#{application}.dump.#{Time.now.to_i}.sql.bz2"
 6   file = "/tmp/#{filename}"
 7   db = YAML::load(ERB.new(IO.read(File.join(File.dirname(__FILE__), 'database.yml'))).result)['production']
 8   run "mysqldump -u #{db['username']} --password=#{db['password']} #{db['database']} | bzip2 -c > #{file}"  do |ch, stream, data|
 9     puts data
10   end
11   `mkdir -p #{File.dirname(__FILE__)}/../backups/`
12   get file, "backups/#{filename}"
13 end