Search code examples
ruby-on-railsdeploymentcapistrano

Using Capistrano to deploy a Rails application to multiple web servers


I'm currently setting up a new production environment for a Rails application which includes multiple, load-balanced application servers (currently only two, but this will increase over time).

I'd like to handle deployment of the app to all these servers in a single command using Capistrano (which I already use for my existing, single server). The only way I can see of doing this is to use capistrano-ext (which I actually already use to deploy to my test and staging environments), by defining a new 'environment' for each application server (app1, app2 and so on) and performing a deployment using something like:

cap app1 app2 app3 deploy

Is this the recommended way of doing it or is there a better approach?


Solution

  • Yeah. Capistrano manages multiple servers natively. No need for capistrano ext.
    You only need to define multiple roles

    role :app, "myserver.example.com"
    role :db,  "mysecondserver.example.com"
    

    By default your tasks will be executed on every server. But you can limit a task to one or some servers only.

    task :migrate, :roles => [:app, :db] do
        # ...
    end
    

    Here, the task will be executed only on the app and db roles.

    You can do the same with the run method.

    run "rake db:migrate", :roles => :db
    

    The rake db:migrate will be run only on the db server.