Capistrano3でRails4.1アプリケーションをデプロイ

先日 Capistrano3 を使って簡単なデプロイを試したのですけど、今回はもっと完璧にデプロイを行います。Bundler による gem インストール、DBマイグレーション、Unicorn 再起動などまでコマンド一発で自動で行えるように設定。

スポンサーリンク

— 環境 —
rails 4.1
capistrano 3.2.1

事前にデプロイ先となる、staging, production などのサーバー環境を用意しておきます。また、Bitbucket のリポジトリと鍵設定をやっておく。以下参考。

Rails4.1 で staging 環境を用意する | EasyRamble
Capistrano3とBitbucketを使ってRailsアプリをデプロイ | EasyRamble

deploy 用スクリプトの書き方としては、一気に変更を追加するとはまることが多そうでしたので、少しずつ変更を追加しながら進めました。

上記コマンドの手順で、deploy に必要なファイル・ディレクトリが存在するかどうかをチェックしつつ、デプロイをこまめに試しつつ進めました。では以降、デプロイ設定で行った作業です。

Capistrano インストール

Gemfile

unicorn を使わない場合は、gem ‘capistrano3-unicorn’ の行は必要ありません。

bundle install と cap install。cap install で Capistrano3 でのデプロイに必要なファイルが作成されます。

続いて、Capistrano インストールで作成されたファイルを実際のデプロイ用に編集していきます。

Capfile を編集

Capfile を編集。ここで、デプロイに必要な gems をインクルードします。

Capfile

unicorn を使わない場合は、require ‘capistrano3/unicorn’ の行は不要です。

deploy.rb デプロイ用スクリプトを作成

config/deploy.rb がデプロイのロジックを書く本体スクリプトとなります。以下のように編集。

config/deploy.rb

デプロイ先は、以下のようなディレクトリ構造となります。current が releases 以下の一番新しいバージョンへのシンボリックリンクです。

Apache, Nginx などでの DocumentRoot には、/path/to/deploy_dir/current/public を指定します。

deploy.rb についてはコメントを読めば大体分かると思いますが、linked_files, linked_dirs について少し。linked_files, linked_dirs で指定したファイル、ディレクトリは、shared ディレクトリ以下の実体ファイル、ディレクトリへのシンボリックリンクとなります。

database.yml は .gitignore に書いてあるので、linked_files に指定し shared ディレクトリ以下ファイルへのシンボリックリンクとしました。

linked_files で指定しても、アップロードは自動で行ってはくれないので、アップロード用タスクを書く必要があります。そのため、最後のほうの deploy:upload タスクで、database.yml ファイル本体を、ローカルから shared ディレクトリへアップロードさせる処理を書いています。

また、before :starting, ‘deploy:upload’ で、デプロイ処理の開始前に upload タスクが走るようにフックを設定しました。

以上の設定により、database.yml は shared ディレクトリへとアップロードされ、shared/config/database.yml への current/config/database.yml というシンボリックが作成されます。

【追記 2014/06/27】
Rails4.1 から config/secrets.yml が追加されていますので、config/database.yml 同様に、config/secrets.yml も .gitignore に追記して、linked_files 指定と shared にアップロードを行うほうが良いかと思います。
【追記ここまで】

staging, production など環境別ファイル

staging, production など環境ごとに個別のファイルを config/deploy 以下に作成します。

config/deploy/staging.rb

それぞれ、アプリケーションサーバー、ウェブサーバー、DBサーバーの role を設定します。今回は1台のサーバーでまかなうので、全部同じです。

以上で、デプロイの設定は終了です。

初回のデプロイでは、shared 以下にファイルがないためエラーが発生するかもしれないので、最初一回だけ事前にアップロード・タスクを実行しておきます。

続いて、デプロイを実行したところ、アセットのプリコンパイルでエラーが発生しました。

JavaScript runtime がないと怒られたので、デプロイ先サーバーで node.js をインストール。

もう一度デプロイ実行。

今度は上手く行きました。Bitbucket からのチェックアウト、Bundler での gem インストール、DBマイグレーション、Unicorn 再起動まで全て自動化されて超楽ちん。デプロイはセッティングし終わるまでは大変ですが、一度設定してしまえばコマンド一発での自動化の恩恵は大きいです。Capistrano 便利!

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!