Capistrano is a ruby based deployment tool which executes commands in parallel on multiple remote machines, via the SSH protocol. With Capistrano you can deploy your application on N server with one single command from your dev machine. You don’t need to login via SSH to your server.
If you don’t deploy your app on Heroku or CloudControl, if you have dedicated servers or you are using AWS, than Capistrano is the way to go.
Before you start with Capistrano, you have to implement SSH with authentification keys instead of password. In that way you can just login to your server with a simple “ssh user@server” without password. That is possible if your public ssh certificates are on the server. In that way the server “knows” you.
First you need to add the Gem to your Gemfile.
gem 'capistrano' gem 'rvm-capistrano'
I am adding here “rvm-capistraon”, too. Because I am working with RVM on my dev machine and on the server. Now you have to run bundler.
bundle install
As next step you have to capify your rails project. Just run:
capify .
That will create some files in your project.
[add] writing './Capfile' [add] writing './config/deploy.rb' [done] capified!
Your Capfile is loading the deploy.rb script. The Capfile should look like this:
load 'deploy' # Uncomment if you are using Rails' asset pipeline # load 'deploy/assets' load 'config/deploy'
The magic happens in the deploy.rb file. The full documentation to this script you will find here: https://github.com/capistrano/capistrano. It basically executes a couple of commands on your server. It fetches the current code from your GIT server, runs bundler, rake db:migrate, precompiles your assets and runs the ruby app server.
Here is my deploy.rb with some additional comments.
# Automatically precompile assets load "deploy/assets" # Execute "bundle install" after deploy, but only when really needed require "bundler/capistrano" # RVM integration require "rvm/capistrano" # Name of the application in scm (GIT) set :application, "your_app" set :repository, "git@github.com:your_company/your_project/project.git" # Source Control Management set :scm, :git set :deploy_to, "/var/www/#{application}" # server there the web server is running (nginx) role :web, "192.168.0.12" # server there the app server is running (unicorn) role :app, "192.168.0.12" # server there the db is running # This is where Rails migrations will run role :db, "192.168.0.12", :primary => true set :rails_env, :production # user on the server set :user, "project_user" set :use_sudo, false # Target ruby version set :rvm_ruby_string, '1.9.3' # System-wide RVM installation set :rvm_type, :system # Apply default RVM version for the current account after "deploy:setup", "deploy:set_rvm_version" namespace :deploy do task :set_rvm_version, :roles => :app, :except => { :no_release => true } do run "source /etc/profile.d/rvm.sh && rvm use #{rvm_ruby_string} --default" end task :start, :roles => :app, :except => { :no_release => true } do run "/etc/init.d/unicorn start" end task :stop, :roles => :app, :except => { :no_release => true } do run "/etc/init.d/unicorn stop" end task :restart, :roles => :app, :except => { :no_release => true } do run "/etc/init.d/unicorn restart" end # Precompile assets namespace :assets do task :precompile, :roles => :web, :except => { :no_release => true } do run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile} end end end
The script for starting and stoping unicorn you can find here: https://robert-reiz.com/2012/02/29/running-unicorn-as-a-service-on-debian-linux/.
On the Linux server you should install a couple things before you deploy:
apt-get install make apt-get install g++ gem update --system gem install bundler
Now you can deploy with:
cap deploy
And this command shows you all possible Capistrano tasks:
cap -T
Let me know if you have questions.