PassengerとcapistranoでのデプロイTips

デプロイの流れ(インストールは省略)

cd RAILS_ROOT
capify .
# deploy.rbを下記のものに変更
cap deploy:setup # :deploy_toにcapistranoに必要なフォルダを作る
cap deploy:cold  # SVNから取得+migration+Passenger再起動(RAILS_ROOT/tmp/restart.txtが作成される)
cap deploy       # SVNから取得+Passenger再起動

cap deploy:restart # Passenger再起動

deploy.rb

<追記> http://www.slideshare.net/moro/capistrano-in-practice-webcareer-presentation?src=embed を参考に更新しました

#############################################################
#	Application
#############################################################

set :application, '<app_name>'
set :deploy_to, "/var/www/#{application}"

#############################################################
#	Deploy user
#############################################################

set :runner, '<run_user>'
set :use_sudo, true

set :user do Capistrano::CLI.ui.ask('SSH User: ') end
set :password do Capistrano::CLI.password_prompt('SSH Password: ') end

#ssh_options[:verbose] = :debug

#############################################################
#	Servers
#############################################################

role :app, '<deployed server>'
role :web, '<deployed server>'
role :db,  '<deployed server>', :primary => true

#############################################################
#	Subversion
#############################################################

set :scm_user do Capistrano::CLI.ui.ask('SVN User: ') end
set :scm_password do Capistrano::CLI.password_prompt('SVN Password: ') end
set :repository_uri, '<repo_uri>'

set :repository do "--username #{scm_user} --password #{scm_password} --no-auth-cache  #{repository_uri}" end

#############################################################
#	after deploy:setup hooks
#############################################################
after 'deploy:setup' do
  try_sudo "chown -Rf #{runner}:#{runner} #{deploy_to}"
end

#############################################################
#	Override existing recipes
#############################################################

namespace :mod_rails do
  desc <<-DESC
  Restart the application altering tmp/restart.txt for mod_rails.
  DESC
  task :restart, :roles => :app do
    run "touch  #{File.join(deploy_to, current_dir)}/tmp/restart.txt"
  end
end

namespace :deploy do
  %w(start restart).each { |name| task name, :roles => :app do mod_rails.restart end }
end

な感じでかいておく。参考と違うのは、

cap deploy:start
cap deploy:restart

も使えるようにした点。

最低限必要なもの

サーバ
  • Apache2
  • Ruby
  • Passenger
  • svnクライアント
  • sshサーバ
  • svn取得先にアクセスできる事
クライント(デプロイ作業に使うマシン)
  • Ruby
  • サーバにSSHで接続できること(SSHクライアントはgemのを使うためいらない)
  • svnクライント
  • svn取得先にアクセスできる事

クライントに、svnが必要な理由はサーバにデプロイ指示するときに、最新のrev番号を渡しているからです。最新のrevを取得する為にsvn infoを使っているというわけです。

注意点

パーミッションの問題

Railsアプリケーションのディレクトリ($RAILS_ROOT)および$RAILS_ROOT以下のファイル・ディレクトリのオーナーは、root以外としてください。

Passengerでは、root権限でRailsアプリケーションを動かすことはできません。Railsアプリケーションが動作するユーザーは$RAILS_ROOT/config/environment.rbのオーナーとなりますが、environment.rbがrootの場合はnobodyユーザーで動作します。このとき、オーナーがrootである$RAILS_ROOT/logディレクトリや$RAILS_ROOT/tmpディレクトリに書き込みができず、アプリケーションが動作しないことがあります。