If you need to backup your application before each deployment, here is the small manual.
Capistrano versions: >= 2.5
Configuration
First, you need to define application environment:
# Define server-side rails environment set :rails_env, "production" # Primary deployment location set :deploy_to, "/home/#{user}/#{application}" # Place where all backups will be dumped set :backup_to, "/home/#{user}/#{application}/backups"
Also, add this function. It allows capistrano to check if remote file exists:
def remote_file_exists?(full_path) 'true' == capture("if [ -e #{full_path} ]; then echo 'true'; fi").strip end
Now, we need to add a backup task:
namespace :utils do desc 'Backup database before deploy' task :backup, :roles => :db, :only => {:primary => true} do run "mkdir -p #{backup_to}" # Create a backup folder unless exists # Primary backup filename filename = "#{backup_to}/#{application}_predeploy_#{Time.now.strftime("%m%d%Y%H%I%S")}.sql.gz" # Check if we've got database config if remote_file_exists?("#{deploy_to}/current/config/database.yml") text = capture("cat #{deploy_to}/current/config/database.yml") config = YAML::load(text)[rails_env] on_rollback { run "rm #{filename}" } run "mysqldump -u #{config['username']} -p #{config['database']} | gzip --best > #{filename}" do |ch, stream, out| ch.send_data "#{config['password']}\n" if out =~ /^Enter password:/ end else logger.debug("[Backup] No configuration file was found.") end end end
And finally, add the capistrano before hook:
before "deploy", "utils:backup"
Testing
To test if the task works, run:
cap utils:backup
On the server side you should see a backup file:
/home/USER/APP/backups/APP_predeploy_MMDDYYHHMMSS.sql.gz.