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
ディレクトリが作られて、その下に shared
と release
という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
コマンドを実行してください。
目次
- VirtualBoxによる仮想マシンのインストール
- MinGWのインストール (Windowsユーザー向け)
- サーバーの準備(CentOS 6.2編)
- サーバーの準備(Ubuntu Server 12.04 LTS編)
- サーバーの準備(Ubuntu Server 10.04 LTS編)
- SSH公開鍵の設置
- Ruby 1.9.3のインストール
- Railsアプリケーションのセットアップ
- ApacheとPhusion Passengerのセットアップ
- データベースとの接続(MySQL編)
- データベースとの接続(PostgreSQL編)
- Capistranoによるデプロイ
- Gitレポジトリの作成
- 続・Capistranoによるデプロイ