Last Updated: February 25, 2016
·
1.32K
· tukhfatullin

Capistrano sync postgresql database

config/deploy/database.rb:

database_yml_path = "config/database.yml"
config = YAML::load(capture("cat #{deploy_to}/shared/#{database_yml_path}"))
adapter = config[rails_env]["adapter"]
database = config[rails_env]["database"]
db_username = config[rails_env]["username"]
host = config[rails_env]["host"]

config = YAML::load(File.open(database_yml_path))
local_rails_env = 'development'
local_adapter = config[local_rails_env]["adapter"]
local_database = config[local_rails_env]["database"]
local_db_username = config[local_rails_env]["username"]

set :timestamp, Time.now.strftime("%Y-%m-%d-%H-%M")
namespace :db do
  desc "upload local database to remote server"
  task :export do
    if adapter == "postgresql"
      run_locally("pg_dump -O #{local_database} > tmp/#{local_database}-#{timestamp}.sql")
      upload "tmp/#{local_database}-#{timestamp}.sql", "#{deploy_to}/shared/database/#{local_database}-#{timestamp}.sql"
      sudo "/etc/init.d/#{unicorn_instance_name} stop"
      run "cd #{deploy_to}/current && RAILS_ENV=production bin/rake db:drop && RAILS_ENV=production bin/rake db:create"
      run "psql -d #{database} -h #{host} -U #{db_username} -f #{deploy_to}/shared/database/#{local_database}-#{timestamp}.sql"
      sudo "/etc/init.d/#{unicorn_instance_name} start"
    else
      puts "Cannot backup, adapter #{adapter} is not implemented for backup yet"
    end
  end
end

USAGE:

bin/cap db:export