自動デプロイ Capistrano EC2 環境構築

![6dc39833855ffc6409888b12874167b9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391854/4f4b38c5-4005-3d4c-dd87-7916cb651e3d.png)
#Nginx(エンジンエックス)の導入と設定
#####Nginxとは？
簡単に言うとWebサーバの一種です。
参考: [Nginxとは？Apacheとの違いについてエンジニアに聞いてみた](https://academy.gmocloud.com/qa/20160616/2761)
###インストールする
ログインしていなければ先にログインしておきます。EC2の設定が終わっていない場合はこちらから進めていきましょう。
参考: [AWS デプロイ 手動 画像で解説](https://qiita.com/4npei/items/bd1bb4f6de35ca2280bb)

```
$ cd .ssh/
$ ssh -i キーペアの名前.pem ec2-user@Elastic IP
```

```
[ec2-user@ip-000-00-00-00 ~]$ sudo yum install nginx
```
###Nginxの設定ファイルを編集する

```
[ec2-user@ip-000-00-00-00 ~]$ sudo vim /etc/nginx/conf.d/rails.conf
```
i キーを押して変更モードに切り替えます。

```
upstream app_server {
  server unix:/var/www/アプリ名/tmp/sockets/unicorn.sock;
}

# {}で囲った部分をブロックと呼ぶ。サーバの設定ができる
server {
  # このプログラムが接続を受け付けるポート番号
  listen 80;
  #  下記にEC2のElastic IPに変更すること
  server_name Elastic IP;

# 接続が来た際のrootディレクトリ
  root /var/www/アプリ名/public;

# assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control 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;
}
```
変更ができたら　esc(エスケープキー)　を押して　:wq　を入力してリターンキーで変更を保存します。

```
[ec2-user@ip-000-00-00-00 ~]$ cd /var/lib
[ec2-user@ip-000-00-00-00 lib]$ sudo chmod -R 775 nginx
Nginxを再起動して設定ファイルを再読み込みします
[ec2-user@ip-000-00-00-00 lib]$ cd
[ec2-user@ip-000-00-00-00 ~]$ sudo service nginx restart

```
###unicorn.rbを修正する

```:config/unicorn.rb
listen 3000

↓以下のように変更しましょう

listen "#{app_path}/tmp/sockets/unicorn.sock"
```
変更が完了すればmasterにpullして下記のコマンドを実行しましょう。

```
[ec2-user@ip-000-00-00-00 アプリ名]$ git pull origin master
```
###ブラウザでElastic IPにアクセスする
Elastic IPにアクセスすると画面が表示されていると思います。
うまく表示できない場合はユニコーンを起動してください。

```
[ec2-user@ip-000-00-00-00 アプリ名]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
```
#Capistranoで自動デプロイ
#####Capistranoとは
簡単にいうとオープンソースで提供されている、複数のサーバ上で同時にスクリプトを実行するためのソフトウェアツール。
いくつかの記事に目を通したい方は以下をご覧ください。
参考: [(Capistrano編)世界一丁寧なAWS解説。](https://qiita.com/naoki_mochizuki/items/657aca7531b8948d267b)
参考: [Capistrano で Rails アプリケーションの自動デプロイ](https://qiita.com/Salinger/items/4ee4f3c5ebd5227196c0)
###Capistrano導入準備
こちらはやらなくても問題ありませんが、念の為書いております。
JavaScriptでリテラル記法（`）をしているときはエラーがでるので事前に対処しておくための記述になります。

```:config/environments/production.rb
こちらをコメントアウトします
# config.assets.js_compressor = :uglifier
```
###Gemをインストールする
Gemfileに下記を追加しましょう。環境を間違えずにしてください。

```:Gemfile
group :development, :test do
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano3-unicorn'
end
```
追加できたらローカル環境で下記を実行します。gemを追加したらお決まりの作業なので忘れなく。

```
$ bundle install
```
続いてcapファイルのインストールをします。

```
bundle exec cap install
```
実行するといくつかファイルが生成されます。
#####capfile
Capistranoの機能を提供するコードはいくつかのライブラリ(Gem)に分かれています。
Capistranoを動かすにはいくつかのライブラリを読み込む必要があり、ライブラリの指定ができます。
#####deploy.rb/production.rb/staging.rb
このファイル達は、主にデプロイの設定を書いていくファイルになります。
Githubへの接続に必要なssキーの指定、デプロイ先のサーバのドメイン、AWSサーバへのログインユーザー名、サーバにログインしてからデプロイのために何をするか、といった設定を記載します。
###Capfileを編集する

```: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 }
```
###production.rbを編集する

```
server 'Elastic IP', user: 'ec2-user', roles: %w{app db web}
```
###deploy.rbを編集する

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

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

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

# バージョンが変わっても共通で参照するディレクトリを指定
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のバージョン>' #カリキュラム通りに進めた場合、2.5.1か2.3.1です

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

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

# Unicornの設定ファイルの場所
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
```
capistranoのバージョンは、gemfile.lockを確認しましょう。