Automated App Deployment
using ssh
Not for server configurationUse Chef or Puppet for that
Installation$ gem install capistrano
Bundler:gem ‘capistrano’
Capify your application
$ capify .
Rails Directory Structure/ |- public/ |- config/ - deploy.rb <--- Capistrano |- application/
Example Scriptset :application, "set your application name here”
role :app, "your app-server here”role :web, "your web-server here”role :db, "your db-server here", :primary => true
Example Script (git)set :scm, :git set :repository, “username@hostname:myapp.git”set :branch, “master”set :deploy_via, :remote_cache
Example Script (Passenger)
namespace :deploy do 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
Example Script (mongrel)
require 'mongrel_cluster/recipes'
namespace :deploy do task :restart do restart_mongrel_cluster endend
First-time server setup
$ cap deploy:setup
:deploy_to/ |- releases/ - 201205041112 - 201206110904 |- current/ --> 201206110904
Deploy the app$ cap deploy
Deploy and run migrationscap deploy:migrations
Rollback to the last version$ cap rollback
Capistrano Best Practices
1. Create Deploy User$ sudo useradd deploy
(helps scope gems, config, logs, etc.)
2. Cleanup Old Deploys
$ cap cleanup
(leaves last 5 deploys, removes the rest)
3. Disable sudoconfig/deploy.rb:
:use_sudo false
4. Colorize Capistrano$ gem install capistrano_colors
In config/deploy.rb:require 'capistrano_colors'
Thank you