Capistrano deploy.rb examples

All examples here for deploy RoR application with unicorn, staging machine (where we deploys) available via ssh by ssh_key.

  1. Deploy via remote_cache:

     require 'rvm/capistrano'
     require 'bundler/capistrano'
    
     set :application, '_proj_'
     set :rails_env, 'production'
     set :domain, '_user@your_deploy_domain_'
     set :deploy_to, "_path_to_#{application}"
     set :use_sudo, false
     set :unicorn_conf, "#{deploy_to}/current/config/unicorn.rb"
     set :unicorn_pid, "#{deploy_to}/shared/pids/unicorn.pid"
    
     set :rvm_ruby_string, '_2.0.0@proj_'
    
     set :scm, :git
     set :repository, '_git@your_proj_repo_'
     ssh_options[:forward_agent] = true
     ssh_options[:keys] = File.join(ENV['HOME'], '.ssh', '_ssh_key_for_staging_machine.pem_')
     set :branch, 'master'
     set :deploy_via, :remote_cache
     set :bundle_gemfile,  'Gemfile'
     set :rake_file, "#{deploy_to}/current/Rakefile"
    
     role :web, domain
     role :app, domain
     role :db,  domain, :primary => true
    
     before 'deploy:setup', 'rvm:install_rvm', 'rvm:install_ruby'
    
     before 'deploy:assets:update_asset_mtimes', :roles => :app do
       run "rm -f #{current_release}/config/database.yml"
       run "rm -f #{current_release}/config/application.yml"
       run "ln -s #{deploy_to}/shared/config/database.yml #{current_release}/config/database.yml"
       run "ln -s #{deploy_to}/shared/config/application.yml #{current_release}/config/application.yml"
     end
    
     before 'deploy:db:populate', 'deploy:stop'
    
     after 'deploy:db:populate', 'deploy:start'
    
     namespace :deploy do
       namespace :db do
         task :populate do
           puts 'run db:populate'
           run "cd #{current_release}; RAILS_ENV=#{rails_env} /usr/bin/env rake db:populate -f #{rake_file}"
         end
       end
    
       task :restart do
         run "cd #{current_release}; if [ -f #{unicorn_pid} ] && [ -e /proc/$(cat #{unicorn_pid}) ]; then kill -USR2 `cat #{unicorn_pid}`; else cd #{deploy_to}/current && bundle exec unicorn_rails -c #{unicorn_conf} -E #{rails_env} -D; fi"
       end
       task :start do
         run "cd #{current_release}; bundle exec unicorn_rails -c #{unicorn_conf} -E #{rails_env} -D"
       end
       task :stop do
         run "cd #{current_release}; if [ -f #{unicorn_pid} ] && [ -e /proc/$(cat #{unicorn_pid}) ]; then kill -QUIT `cat #{unicorn_pid}`; fi"
       end
     end
    
  2. Deploy from local folder via rsync:

  • add to your Gemfile next lines into development group:
    gem 'oz_capistrano_rsync_with_remote_cache'
    gem 'capistrano-deploy-scm-passthrough'

  • and change deploy.rb like this:
    require 'rvm/capistrano'
    require 'bundler/capistrano'

    set :application, '_proj_'
    set :rails_env, 'production'
    set :domain, '_user@your_deploy_domain_'
    set :deploy_to, "_path_to_#{application}"
    set :use_sudo, false
    set :unicorn_conf, "#{deploy_to}/current/config/unicorn.rb"
    set :unicorn_pid, "#{deploy_to}/shared/pids/unicorn.pid"

    set :rvm_ruby_string, '_2.0.0@proj_'

    set :scm, :passthrough
    set :repository, '.'
    set :user, '_user_'
    ssh_options[:forward_agent] = true
    ssh_options[:keys] = File.join(ENV['HOME'], '.ssh', '_ssh_key_for_staging_machine.pem_')
    set :rsync_options, '-azr --exclude-from=.rsync-filter --delete --delete-excluded'
    set :deploy_via, :rsync_with_remote_cache
    set :bundle_gemfile,  'Gemfile'
    set :rake_file, "#{deploy_to}/current/Rakefile"
    set :local_cache, '.'
    set :revision, ENV['GIT_COMMIT'] || ENV['SVN_REVISION'] || Time.now

    role :web, domain
    role :app, domain
    role :db,  domain, :primary => true

    before 'deploy:setup', 'rvm:install_rvm', 'rvm:install_ruby'

    before 'deploy:assets:update_asset_mtimes', :roles => :app do
      run "rm -f #{current_release}/config/database.yml"
      run "rm -f #{current_release}/config/application.yml"
      run "ln -s #{deploy_to}/shared/config/database.yml #{current_release}/config/database.yml"
      run "ln -s #{deploy_to}/shared/config/application.yml #{current_release}/config/application.yml"
    end

    before 'deploy:db:populate', 'deploy:stop'

    after 'deploy:db:populate', 'deploy:start'

    namespace :deploy do
      namespace :db do
        task :populate do
          puts 'run db:populate'
          run "cd #{current_release}; RAILS_ENV=#{rails_env} /usr/bin/env rake db:populate -f #{rake_file}"
        end
      end

      task :restart do
        run "cd #{current_release}; if [ -f #{unicorn_pid} ] && [ -e /proc/$(cat #{unicorn_pid}) ]; then kill -USR2 `cat #{unicorn_pid}`; else cd #{deploy_to}/current && bundle exec unicorn_rails -c #{unicorn_conf} -E #{rails_env} -D; fi"
      end
      task :start do
        run "cd #{current_release}; bundle exec unicorn_rails -c #{unicorn_conf} -E #{rails_env} -D"
      end
      task :stop do
        run "cd #{current_release}; if [ -f #{unicorn_pid} ] && [ -e /proc/$(cat #{unicorn_pid}) ]; then kill -QUIT `cat #{unicorn_pid}`; fi"
      end
    end
  • .rsync-filter should looks like:

     #rsync will ignore files in this list
    config/database.yml
    config/application.yml
    log/*
    public/*
    tmp/*
konjoot Over 10 years ago