Capistranoによるデプロイ

2012/05/06

『改訂新版 基礎Ruby on Rails』 読者サポートページ > Rails本番環境構築ガイド

Capistranoでローカルマシンからリモートマシンにソースコードを設置(デプロイ)する手順を示します。

この文章の内容は、随時更新しています。最終更新日: 2012/05/07

以下、ローカルマシン(あなたのPC)で作業する場合はコマンドプロンプトを % で示し、リモートマシン(サーバ)で作業する場合はコマンドプロンプトを $ で示します。

SSH公開鍵の設置

sudo権限を持つ一般ユーザー(本稿ではkurodaとします)でリモートマシンにログインします。そして、自分のauthorized_keys/var/rails/.sshディレクトリにコピーします。以下のコマンドを順に実行してください。

$ sudo mkdir --mode=700 /var/rails/.ssh
$ sudo cp /home/kuroda/.ssh/authorized_keys /var/rails/.ssh/
$ sudo chown -R rails:rails /var/rails/.ssh

あなたの他にもデプロイ作業をする人が存在する場合は、その人の公開鍵を入手して /var/rails/.ssh/authorized_keys に追加してください。

ローカルマシンからrailsユーザーとしてSSHで接続し、パスワードを尋ねられないことを確認します。

% ssh rails@asagao.oiax.jp

asagao ディレクトリの削除

現在動いている asagao ディレクトリと bundle ディレクトリを削除します。

$ rm -rf asagao bundle

あるいは mv コマンドでリネームしてください。

リモートマシンから抜けます。

$ exit

Capistranoの準備

ローカルマシンのasagaoのルートディレクトリに移動して、次のコマンドを実行します。

% gem install capistrano
% capify .

エディタで config/deploy.rb を次のように修正します。

require 'bundler/capistrano'
load 'deploy/assets'

set :application, "asagao"
set :deploy_to, "/var/rails/asagao"
set :user, "rails"
set :use_sudo, false

set :repository, "."
set :scm, :none
set :deploy_via, :copy
set :copy_exclude, [ "doc", "log", "tmp" ]

set :normalize_asset_timestamps, false
set :keep_releases, 3

role :web, "asagao.oiax.jp"
role :app, "asagao.oiax.jp"
role :db,  "asagao.oiax.jp", :primary => true

after "deploy:update", :roles => :app do
  run "cp #{shared_path}/config/database.yml #{release_path}/config/"
end

after "deploy:update", "deploy:cleanup"

namespace :deploy do
  desc "Restarts your application."
  task :restart, :roles => :app do
    run "touch #{current_path}/tmp/restart.txt"
  end
end

ここではGitやSubversionなどのソースコード管理システム(SCM)を使わずに、カレントディレクトリのソースコードを丸ごとリモートマシンにコピーする方法を紹介しています。SCMを使う方法については後述します(未完成)。

asagao.oiax.jpの部分は、実際のリモートマシンのホスト名で置き換えてください。SSHのポート番号が22でない場合は、asagao.oiax.jp:1022 のような形式で指定してください。アセットパイプラインを使わずにpublic ディレクトリに画像、スタイルシート、JavaScriptコードを置いている場合は、set :normalize_asset_timestamps, true と書き換えてください。

role :web には、ApacheやnginxなどのWebサーバが動いているホストの名前を指定します。Passenger を利用する場合 role :app には role :web と同じホスト名を指定します。Apache/nginxをリバースプロキシとして機能させ、unicornなどを用いて別のホストでRailsアプリケーションを動かす場合は、その別のホストの名前を指定します。role :db ..., :primary => true には、マイグレーションを実行するホストの名前を指定します。詳しくは、https://github.com/capistrano/capistrano/wiki/Rolesを参照してください。

次のコマンドを実行します。

% cap deploy:setup

この結果、リモートマシン上では /var/rails/asagao ディレクトリが作られて、その下に sharedrelease という2つのディレクトリが作られます。

エディタで Gemfile を開き、gem 'sqlite3' の部分を gem 'mysql2' あるいは gem 'pg' と書き換えます。また、

  # gem 'therubyracer'

を次のように書き換えます。

  gem 'therubyracer', :platform => :ruby

:platform => :ruby は「C Rubyプラットフォームでのみインストールせよ」という意味のオプションです。「C Ruby」とはC言語で実装されたRubyのことで、JRubyやWindows版Rubyを含みません。Windowsでは therubyracer をうまくインストールできないし、する必要もないので、このように記述しています。

次のコマンドを実行します。

% bundle install

Cygwinをお使いの方は bundle install --without=assets コマンドを実行してください。Cygwinでは therubyracer をうまくインストールできないのですが、当然のことながら「C Ruby」と判定されるので、--without=assets オプションを付けることで assets グループのgemパッケージのインストールを省略します。Capistrano を使うだけなら(つまり、Cygwin上で開発しないのなら)therubyracer は不要です。

railsユーザーでリモートホストにログインして以下のコマンドを順に実行します。

$ cd /var/rails/asagao/shared
$ mkdir config

MySQLを利用している場合は、新規ファイル /var/rails/asagao/shared/config/database.yml を次の内容で作成します。

production:
  adapter: mysql2
  database: asagao_production
  username: asagao
  password: diiNv2bid4aTI
  host: 127.0.0.1
  encoding: utf8

PostgreSQLを利用している場合は、mysql2 の部分を postgresql で置き換えてください。

ローカルマシンで次のコマンドを実行します。

% cap deploy

この結果、リモートマシン上では /var/rails/asagao/releases ディレクトリにソースコードがコピーされて、/var/rails/asagao/current にそこへのシンボリックリンクが設置されます。

仮想ホストの設定変更

sudo権限のあるユーザー(kuroda)でリモートホストにログインして、/etc/httpd/sites-available/asagao を次のように修正します(要sudo)。

<VirtualHost *:80>
  ServerName asagao.oiax.jp
  DocumentRoot /var/rails/asagao/current/public
  RackEnv production
  <Directory /var/rails/asagao/current/public>
    AllowOverride all
    Options -MultiViews
  </Directory>
</VirtualHost>

パスの /public の前に current を追加しています(2カ所)。

そして、Apacheをリロードします。

$ sudo service httpd reload # CentOS 6.2 の場合
$ sudo service apache2 reload # Ubuntu Server 12.04/10.04 LTS の場合

動作確認

以上で、asagaoがインターネットに公開されます。ブラウザで表示を確認してください。

再デプロイ

ローカルマシン上で、/app/views/top/index.html の末尾に

<p>This is a test.</p>

という行を追加します。そして、次のコマンドを実行します。

% cap deploy

コマンドの実行が完了したら、ブラウザをリロードしてトップページに「This is a test.」という文が現れることを確認してください。

リモートマシン上でApacheをリロードしたり再起動したりする必要はありません。

/app/views/top/index.html を元に戻して、再度 cap deploy コマンドを実行してください。

目次