ボクココ

個人開発に関するテックブログ

アプリエンジニアがインフラに挑戦その5 最終会

どもー。 いよいよ最終回です。

Chef によりRails アプリをデプロイできる環境が整ったので、いよいよCapistrano でクールなRails アプリをデプロイします。

今回はDBにMongoDBを利用しているので、Rails側で rake db:migrateなどをする必要がない点は他の一般的なRailsアプリと異なります。

それではRailsアプリのGemfileから修正していきましょう。

gem 'rails', '4.0.0'

gem 'mongoid', github: 'mongoid/mongoid'
gem 'bson_ext'
gem 'sorcery'

gem 'unicorn'

# Use Capistrano for deployment
group :development do
  gem 'capistrano', '~> 3.0'
  gem 'capistrano-rbenv', '~> 2.0'
  gem 'capistrano-bundler'
  gem 'capistrano-unicorn', require: false, github: 'inbeom/capistrano-unicorn', branch: 'capistrano3'
end

とりあえず必要最低限のgemだけ上げておきます。 capistrano から rbenvやbundler, unicornを動かすのにそれぞれ自分で作るのもいいですが、既にあるgemを利用してます。これもBerkshelfを使う理由と同様、メンテナンスコストと実装スピードの向上が理由です。

さて、前回と同じようにソースをここにはっていこうとしたのですが、あまりにも項目が多いので、Githubに置きつつ要所だけ説明します。

Capfile

ここでgem のrequire をします。これをするだけでbundle exec cap unicorn:restartといった外部gemで取ってきたコマンドが打てるようになります。

各種設定ファイル

どの環境でも共通のデプロイ設定とコマンドを定義します。

rbenvunicornの設定方法はそれぞれGithubを参照しながらセットします。

setup_config で nginx.conf の設定をしています。config/nginx.confに設定ファイルを置いてそこにunicornと連携するnginx.confを作ります。そしてそれを nginx/site-enabled/以下にシムリンクを張ることでnginxがunicornへ転送するようにします。ここで忘れてはいけないのが、この設定は、nginxを再起動しないと適用されないということです。ということで、デプロイが終わった後にnginxを再起動するタスクを追加します。

cap deploy でgithubからソースを持ってきてタイムスタンプ付きのソースを /var/www 以下に置き、bundle install 等のRailsを動かすために必要な初期セットアップを行った後、 /var/www/current というシムリンクを張るまでが基本的なdeployの動作です。 それの前や後ろにtask を追加してアプリケーションサーバやwebサーバの再起動、confファイルやconfigファイルのリネームやシムリンクを張ったりすることをすれば一通りのデプロイレシピが出来上がります。

各環境に応じたdeployの設定は config/deploy/.rb 内に書いてあります。ここでデプロイ対象のサーバホスト名などを記述しておきます。 さらにunicornの設定もconfig/unicorn/.rb 内に書きます。Capistrano/unicorn でここを自動で読み込みようになっています。

config/mongoid.yml の設定はproductionを見にいくので注意. 今の作りだとそれぞれの環境全てで同じproductionのMongoid の設定になってしまうので、本来なら mongoid.yml.sample とかにして各環境に応じたmongoid.yml を作成します。

いよいよデプロイ

てことで〜 buncle exec cap deploy でvagrant のVirtual Machineへデプロイ! 終わった後にssh して プロセスの確認ps aux | grep -E "nginx|unicorn" とかしてプロセスが起動していていることをまず確認。

そして、、 localhost:8080/ でRailsアプリができていれば晴れてデプロイ成功です。

おつかれさまでした。

終わりに

全5回に渡ってアプリエンジニアがインフラのデプロイを学び、自動化することに成功しました。 NginxやChef, Unicorn そして Capistrano とそれぞれ独学で学んでなんだかんだで1ヶ月以上この環境を作るのに時間を費やしました。しかしながらこれにより次なるステップ、そうAWSへのデプロイと本番公開への道が開けてきました。

AWSへRailsアプリを上げるのはある程度Railsアプリが本番出せる状態になったらにしようと思ってるので、今年の4、5月くらいになる予定です。

それまでは MongoDB のレプリケーション等を学びつつ、 AngularJS with Yeoman でフロントサイドアプリ開発の特訓をしようと思います。

参考書籍・サイト

参考にしたものをひと通りあげます。他にも色々お世話になり、勉強になりました。

Everything You Need to Know About Unicorn

Main Page - CapistranoRB Communiy Wiki

Opscode Community

Nginx & Unicorn