[AWS]デプロイ手順その③(自動デプロイ編)

# 背景
その②の続き。

その①
https://qiita.com/ren0826jam/items/76c826c3c4c5af3c525d

その②
https://qiita.com/ren0826jam/items/37b827343cd1128c3c0e

## 手順

1.Gemfileを下記の記述をする。

```
group :development, :test do
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano3-unicorn'
end
```

忘れず実行する。

```
$ bundle install
```
    
2.bundle exec cap install　を実行し、ファイルを作成する

```
$ bundle exec cap install
```

3.Capfileに以下を記述する。

```
require "capistrano/setup"
require "capistrano/deploy"
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'

Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
```

4.production.rbを下記のように記述する
※書き換え部分は以下の５点です
・3行目のはご自身のバージョンを記述
・6行目の<自身のアプリケーション名>はご自身のものを記述
・9行目の/<レポジトリ名>も同様に、ご自身のもの記述
・15行目の<このアプリで使用しているrubyのバージョン>はご自身のものを確認して記述
・19行目の<ローカルPCのEC2インスタンスのSSH鍵(pem)へのパス>も同様に、ご自身のもの記述

```production.rb

server '<用意したElastic IP>', user: 'ec2-user', roles: %w{app db web}
```

5.deploy.rbの記述をすべて削除し、以下を記述する

```deploy.rb

lock '<Capistranoのバージョン>'
# config valid only for current version of Capistrano -->
# capistranoのバージョンを記載。固定のバージョンを利用し続け、バージョン変更によるトラブルを防止する

set :application, '<自身のアプリケーション名>'
# Capistranoのログの表示に利用する

set :repo_url,  'git@github.com:<Githubのユーザー名>/<レポジトリ名>.git'
# どのリポジトリからアプリをpullするかを指定する

set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')
# バージョンが変わっても共通で参照するディレクトリを指定

set :rbenv_type, :user
set :rbenv_ruby, '<このアプリで使用しているrubyのバージョン>' 

set :ssh_options, auth_methods: ['publickey'],
                  keys: ['<ローカルPCのEC2インスタンスのSSH鍵(pem)へのパス'] 
# どの公開鍵を利用してデプロイするか

set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }
# プロセス番号を記載したファイルの場所

set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5
# Unicornの設定ファイルの場所

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    invoke 'unicorn:restart'
  end
end
# デプロイ処理が終わった後、Unicornを再起動するための記述
```

6.unicorn.rbの記述を編集する

```unicorn.rb
app_path = File.expand_path('../../', __FILE__)

worker_processes 1

working_directory app_path
pid "#{app_path}/tmp/pids/unicorn.pid"
listen "#{app_path}/tmp/sockets/unicorn.sock"
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"

# ↓↓↓↓↓↓↓ 以下のように変更 ↓↓↓↓↓↓

app_path = File.expand_path('../../../', __FILE__)

worker_processes 1
working_directory "#{app_path}/current"

listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
pid "#{app_path}/shared/tmp/pids/unicorn.pid"
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
```
    
7.エディタを起動させる
```
$ sudo vim /etc/nginx/conf.d/rails.conf
```

8.内容を削除し、下記の記述をし保存する

```
upstream app_server {
  server unix:/var/www/<アプリケーション名>/shared/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name <Elastic IPを記入>;

  client_max_body_size 2g;

  root /var/www/<アプリケーション名>/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    root   /var/www/<アプリケーション名>/current/public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
}
```

9.変更したら、再読み込み、再起動する(ec2-userログイン状態で)

```
$ sudo service nginx reload

$ sudo service nginx restart
    
$ sudo service mysqld restart
    
```

10.unicornのプロセスをkillする(ec2-userログイン状態で)

```
$ ps aux | grep unicorn

$ kill <確認したunicorn rails masterのPID>
```

11.GitHubにプッシュする

12.自動デプロイする

```
$ bundle exec cap production deploy
```
    
13.ブラウザで確認(Elastic IPでアクセス)