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 も学ぶことができるので、ぜひ、活用しましょう。

Udemy(ユーデミー)

オンライン動画学習サイトで、Ruby on Rails講座やRuby講座もあります。頻繁に講座のバーゲンセールスが実施されているので、価格をチェックしましょう!一度、購入した動画は繰り返し使えますので何度でも学習可!
世界最大級のオンライン学習サイトUdemy


CodeCamp(コードキャンプ)

現役のRubyエンジニアによる個別指導で、Webサイト制作を基礎から習得できます。無料体験レッスンが受講できるので、気軽に受講体験ができます。
Ruby と Ruby on Railsマスターコース