diff --git a/README.markdown b/README.markdown index 4e43b13..3967bd9 100644 --- a/README.markdown +++ b/README.markdown @@ -77,6 +77,7 @@ Available tasks db:local:sync || db:pull # Synchronize your local database using remote database data db:remote:sync || db:push # Synchronize your remote database using local database data + db:remote:backup || db:backup # Create a database backup using remote database data Example ======= diff --git a/lib/capistrano-db-tasks/database.rb b/lib/capistrano-db-tasks/database.rb index eba206f..e23b5cd 100644 --- a/lib/capistrano-db-tasks/database.rb +++ b/lib/capistrano-db-tasks/database.rb @@ -215,6 +215,18 @@ def local_to_remote(instance) remote_db.load(local_db.output_file, instance.fetch(:db_local_clean)) File.unlink(local_db.output_file) if instance.fetch(:db_local_clean) end + + def remote_backup(instance) + remote_db = Database::Remote.new(instance) + remote_db.dump.download + + file = remote_db.output_file + unzip_file = File.join(File.dirname(file), File.basename(file, '.bz2')) + backup_dir = instance.fetch(:db_backup_dir) + + instance.logger.info("Unzipping database backup and storing in #{backup_dir}") + system("bunzip2 -f #{file} && mkdir -p #{backup_dir} && mv #{unzip_file} #{backup_dir}") + end end end diff --git a/lib/capistrano-db-tasks/dbtasks.rb b/lib/capistrano-db-tasks/dbtasks.rb index 13e01e3..a1aceb1 100644 --- a/lib/capistrano-db-tasks/dbtasks.rb +++ b/lib/capistrano-db-tasks/dbtasks.rb @@ -13,6 +13,7 @@ set :skip_data_sync_confirm, (ENV['SKIP_DATA_SYNC_CONFIRM'].to_s.downcase == 'true') set :disallow_pushing, false unless fetch(:disallow_pushing) set :compressor, :gzip unless fetch(:compressor) +set :db_backup_dir, 'db/backups' unless fetch(:db_backup_dir) namespace :capistrano_db_tasks do task :check_can_push do @@ -30,6 +31,14 @@ end end end + + desc 'Create a database backup using remote database data' + task :backup do + on roles(:db) do + Database.remote_backup(instance) + end + end + end end namespace :local do @@ -47,6 +56,9 @@ desc 'Synchronize your local database using remote database data' task :pull => "db:local:sync" + desc 'Create a database backup using remote database data' + task :backup => "db:remote:backup" + desc 'Synchronize your remote database using local database data' task :push => "db:remote:sync" end