diff --git a/.gitignore b/.gitignore index 433e85a0..937d8f7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.tmproj config/database.yml config/environment.rb +config/deploy.rb log tmp db/data.yml diff --git a/Capfile b/Capfile new file mode 100644 index 00000000..0402d1a1 --- /dev/null +++ b/Capfile @@ -0,0 +1,2 @@ +load 'deploy' if respond_to?(:namespace) # cap2 differentiator +load 'config/deploy' \ No newline at end of file diff --git a/config/deploy.rb-example b/config/deploy.rb-example new file mode 100644 index 00000000..77c7475f --- /dev/null +++ b/config/deploy.rb-example @@ -0,0 +1,101 @@ +############################################################# +# This file is designed as a starting point to use +# capistrano to deploy the trunk of tracks to a webhost +# where it is served using Phusion Passenger. For more +# info on getting started with Passenger, see +# http://www.modrails.com/ +############################################################# + + +############################################################# +# Application +############################################################# + +set :application, "tracks" +set :deploy_to, "/var/www/apps/tracks" + +############################################################# +# Settings +############################################################# + +default_run_options[:pty] = true +ssh_options[:forward_agent] = true +set :use_sudo, true +set :scm_verbose, true +set :rails_env, "production" + +############################################################# +# Servers +############################################################# + +#set :user, "your_login_name_on_your_webhost_if_different_from_local" +set :domain, "tracks.yoursite.com" +server domain, :app, :web +role :db, domain, :primary => true + +############################################################# +# Git +############################################################# + +set :scm, :git +set :branch, "master" +set :repository, "git://github.com/bsag/tracks.git" +set :deploy_via, :remote_cache + +############################################################# +# Passenger +############################################################# + +namespace :deploy do + desc "Symlink config files" + task :before_symlink do + run "rm #{release_path}/public/.htaccess" #not compatible with Passenger + run "ln -s #{shared_path}/config/database.yml #{release_path}/config/database.yml" + run "ln -s #{shared_path}/config/environment.rb #{release_path}/config/environment.rb" + end + + # Restart passenger on deploy + desc "Restarting mod_rails with restart.txt" + task :restart, :roles => :app, :except => { :no_release => true } do + run "touch #{current_path}/tmp/restart.txt" + end + + [:start, :stop].each do |t| + desc "#{t} task is a no-op with mod_rails" + task t, :roles => :app do ; end + end + +end + +namespace :db do + desc 'Dumps the production database to db/production_data.sql on the remote server' + task :remote_db_dump, :roles => :db, :only => { :primary => true } do + run "cd #{deploy_to}/#{current_dir} && " + + "rake RAILS_ENV=#{rails_env} db:dump_sql --trace" + end + + desc 'Downloads db/production_data.sql from the remote production environment to your local machine' + task :remote_db_download, :roles => :db, :only => { :primary => true } do + execute_on_servers(options) do |servers| + self.sessions[servers.first].sftp.connect do |tsftp| + tsftp.download!("#{deploy_to}/#{current_dir}/db/production_data.sql", "db/production_data.sql") + end + end + end + + desc 'Cleans up data dump file' + task :remote_db_cleanup, :roles => :db, :only => { :primary => true } do + execute_on_servers(options) do |servers| + self.sessions[servers.first].sftp.connect do |tsftp| + tsftp.remove! "#{deploy_to}/#{current_dir}/db/production_data.sql" + end + end + end + + desc 'Dumps, downloads and then cleans up the production data dump' + task :remote_db_runner do + remote_db_dump + remote_db_download + remote_db_cleanup + end +end \ No newline at end of file diff --git a/lib/tasks/database.rake b/lib/tasks/database.rake new file mode 100644 index 00000000..eb02a45f --- /dev/null +++ b/lib/tasks/database.rake @@ -0,0 +1,27 @@ +require 'rake' + +namespace :db do + desc "Dump the current SQLite3 or MySQL database to a sql file" + task :dump_sql do + load 'config/environment.rb' + abcs = ActiveRecord::Base.configurations + case abcs[RAILS_ENV]["adapter"] + when 'mysql' + ActiveRecord::Base.establish_connection(abcs[RAILS_ENV]) + File.open("db/#{RAILS_ENV}_data.sql", "w+") do |f| + if abcs[RAILS_ENV]["password"].blank? + f << `mysqldump -h #{abcs[RAILS_ENV]["host"]} -u #{abcs[RAILS_ENV]["username"]} #{abcs[RAILS_ENV]["database"]}` + else + f << `mysqldump -h #{abcs[RAILS_ENV]["host"]} -u #{abcs[RAILS_ENV]["username"]} -p#{abcs[RAILS_ENV]["password"]} #{abcs[RAILS_ENV]["database"]}` + end + end + when 'sqlite3' + ActiveRecord::Base.establish_connection(abcs[RAILS_ENV]) + File.open("db/#{RAILS_ENV}_data.sql", "w+") do |f| + f << `sqlite3 #{abcs[RAILS_ENV]["database"]} .dump` + end + else + raise "Task not supported by '#{abcs[RAILS_ENV]['adapter']}'" + end + end +end \ No newline at end of file