STEP14:Ruby on Rails4+Capistrano3+pumaで、自動デプロイをしよう! #AWS #Rails


今回は、Capistrano3を構築して、Amazon Linux(AMI)のサーバに、自動でデプロイを行えるところまで構築をすすめてみたいと思います。

Capistrano3は、Rubyベースのデプロイの自動化ツールです。
従来のデプロイ作業は、手順も多く手作業のため、ミスにも繋がることが多かったと思います。

手順書を作成して、間違いがないかチェックをしたり、資料のメンテナンス漏れでミスに繋がったりと色々と不便でした。
それを解決するべく、Capistrano3を構築して、自動でデプロイを行えるように、がんばってみたいと思います。
理想の最終形は、Rails4 + Capistrano3 + pumaで、GitHubのproductionブランチに、pushしたタイミングで自動デプロイが行えるまでできたらいいなぁと思っています。

 

1.関連ツールのインストール

では、さっそく関連ツールを、Gemfileに記載します。

gem 'capistrano'
gem 'capistrano-rails'
gem 'capistrano3-puma'
gem 'puma'

そして、インストール。

$ bundle install

2.設定ファイルを生成

下記のコマンドで、Capistrano関連の設定ファルの雛形を生成します。

$ bundle exec cap install

下記が、作成できるディレクトリ・ファイルです。
このサイトを参考にさせていただきました。

|-- Capfile
|-- config
|   |-- deploy
|   |   |-- production.rb
|   |   `-- staging.rb
|   `-- deploy.rb
`-- lib
  `-- capistrano
      `-- tasks

3.config/deploy.rbを設定

capコマンドでファイルを生成した直後は、この状態です。

# config valid only for current version of Capistrano
lock '3.4.0'

set :application, 'my_app_name'
set :repo_url, 'git@example.com:me/my_repo.git'

# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/my_app_name
# set :deploy_to, '/var/www/my_app_name'

# Default value for :scm is :git
# set :scm, :git

# Default value for :format is :pretty
# set :format, :pretty

# Default value for :log_level is :debug
# set :log_level, :debug

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
# set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml')

# Default value for linked_dirs is []
# set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }

# Default value for keep_releases is 5
# set :keep_releases, 5

namespace :deploy do

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
    end
  end

end

上記の設定から、不要な行を削除して必要最小限の設定で動かしてみます。
下記が、初期で設定した内容です。

# config valid only for current version of Capistrano
lock '3.4.0'

set :application, 'pgnyumon'
set :repo_url, 'git@github.com:TickleCode/pgnyumon.git'
set :deploy_to, "/var/www/${fetch(:application)}"

namespace :deploy do

  after :restart, :clear_cache do
    on roles(:app), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
    end
  end

end

config/deploy/production.rbの設定は、こんな感じ。

set :staging, :production
set :branch, :master

role :all, %w{deploy@pgnyumon.com}

以下、サーバ側Amazon Linux(AMI)で構築を行います。

4.デプロイ用のディレクトリを作成

$ sudo mkdir /var/www
$ sudo adduser www
$ sudo chown -R www:www /var/www
$ sudo chmod -R 770 /var/www/

5.アプリケーション用のアカウントを追加

$ sudo adduser pgnyumon
$ sudo gpasswd -a pgnyumon www

wwwグループに、アカウントが追加されているか確認します。

$ cat /etc/group

6.deployアカウントを追加

サーバ側のAmazon Linux(AMI)に、接続用のdeployアカウントを追加して、SSH接続できるように設定を行います。

$ sudo adduser deploy
$ sudo gpasswd -a deploy www

追加されていることを確認します。

$ cat /etc/passwd

deployアカウントに、自身のGitHubに登録してあるSSH公開鍵を設定します。

sudo mkdir /home/deploy/.ssh
sudo curl https://github.com/mustacheyork.keys > authorized_keys
sudo mv authorized_keys /home/deploy/.ssh

パーミッションの設定をします。

$ sudo chown -R deploy:deploy /home/deploy/.ssh
$ sudo chmod -R 700 /home/deploy/.ssh
$ sudo ls -la /home/deploy/
合計 24
drwx------ 3 deploy deploy 4096  9月 22 08:03 .
drwxr-xr-x 7 root   root   4096  9月 22 07:56 ..
-rw-r--r-- 1 deploy deploy   18  3月  4  2015 .bash_logout
-rw-r--r-- 1 deploy deploy  176  3月  4  2015 .bash_profile
-rw-r--r-- 1 deploy deploy  124  3月  4  2015 .bashrc
drwx------ 2 deploy deploy 4096  9月 22 08:08 .ssh

ローカルから、deployアカウントでSSH接続ができるか確認します。

$ ssh deploy@pgnyumon.com

できました!

7.deployアカウントで、SSHキーを生成して、GitHubのリポジトリに登録

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/deploy/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/deploy/.ssh/id_rsa.
Your public key has been saved in /home/deploy/.ssh/id_rsa.pub.
The key fingerprint is:
d4:60:1b:e0:e9:ba:bb:d8:e1:16:72:d9:a6:67:aa:2d deploy@ip-172-31-25-74
The key's randomart image is:
+--[ RSA 2048]----+
|      ..+        |
|     . o =       |
|      o o .      |
|     . .         |
|     o. S        |
|  . +.o          |
|   oo+           |
|  E=ooo          |
|  o+O*           |
+-----------------+

生成された公開鍵「id_rsa.pub」を、GitHubに登録しておきます。

サーバ側の設定は、ここまでです。

8.Capistranoで、デプロイを実行

ローカル開発環境にもどって、ひとまず、コマンドでデプロイができるか試してみます。

$ bundle exec cap production deploy

9.サーバにデプロイできているか確認

$ ll /var/www/pgnyumon/
合計 16
lrwxrwxrwx 1 deploy deploy   41  9月 22 09:20 current -> /var/www/pgnyumon/releases/20150922092047
drwxrwxr-x 3 deploy deploy 4096  9月 22 09:20 releases
drwxrwxr-x 7 deploy deploy 4096  9月 22 09:20 repo
-rw-rw-r-- 1 deploy deploy   72  9月 22 09:20 revisions.log
drwxrwxr-x 2 deploy deploy 4096  9月 22 09:20 shared

やった!!Capistranoでデプロイはできました!

まだここから、pumaを再起動かける設定や、その他諸々と必要だと思いますが、、、疲れちゃったので、今回はここまで!

 

前回の記事は、「Amazon Linux(AMI)に、Nginxをインストールしよう!」
次回は、「Amazon Linux(AMI)に、MySQLをインストールしよう!」

 

Ruby on Railsおすすめ書籍

Ruby on Railsの勉強で参考になった書籍です!

Ruby on Railsで質問したい!

Teratail(テラテイル)

WEBエンジニア専用のQ&Aサイトで、RubyやRailsも質問することができます。活発に質問と回答がされていますので、会員登録をして利用してみると良いと思います(^o^)。

エンジニアのためのQ&Aサイト【teratail】

Ruby on Railsが学べるオンラインスクール

好きな場所で好きな時間に受講できるオンラインスクール!最近は、Ruby on Railsも学ぶことができます!

TechAcademy(テックアカデミー)

オンラインでの週2回マンツーマンでのメンタリング、毎日15〜23時のチャット・レビューサポートで短期間で未経験からオリジナルサービスを開発できるようになる学習プログラム。オリジナルサービスをHerokuを使って公開するところまでを行います。

オンラインブートキャンプ Webアプリケーションコース