[AWS]デプロイ手順その②(デプロイ編)

# 背景
その①の続きからの手順。

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

その③
https://qiita.com/ren0826jam/items/22153a9e3def565c93f6


## 手順
1.EC2サーバのSSH鍵ペアを作成する(ec2-userログイン状態で)

```ruby

$ ssh-keygen -t rsa -b 4096
# 入力を求められるがエンターで進む
```

2.SSH公開鍵を表示しコピーする(ec2-userログイン状態で)

```ruby

$ cat ~/.ssh/id_rsa.pub
```

3.GitHubに移動し、設定の「SSh and GPG keys」に移動する

4.SSHkeysにタイトルを入力し、公開鍵をコピーしたら保存する。

5.Gemfileに以下を記述する

```
group :production do
  gem 'unicorn', '5.4.1'
end
```
忘れず実行する。

```
bundle install
```

6.config/unicorn.rbを作成し以下を記述する。

```unicorn.rb

app_path = File.expand_path('../../', __FILE__)
# サーバ上でのアプリケーションコードが設置されているディレクトリを変数に入れておく

worker_processes 1
# アプリケーションサーバの性能を決定する

working_directory app_path
# アプリケーションの設置されているディレクトリを指定

pid "#{app_path}/tmp/pids/unicorn.pid"
# Unicornの起動に必要なファイルの設置場所を指定

listen 3000
# ポート番号を指定

stderr_path "#{app_path}/log/unicorn.stderr.log"
# エラーのログを記録するファイルを指定

stdout_path "#{app_path}/log/unicorn.stdout.log"
# 通常のログを記録するファイルを指定

timeout 60
# Railsアプリケーションの応答を待つ上限時間を設定

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

check_client_connection false

run_once = true

  before_fork do |server, worker|
    defined?(ActiveRecord::Base) &&
      ActiveRecord::Base.connection.disconnect!

    if run_once
      run_once = false # prevent from firing again
    end

    old_pid = "#{server.config[:pid]}.oldbin"
    if File.exist?(old_pid) && server.pid != old_pid
      begin
        sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
        Process.kill(sig, File.read(old_pid).to_i)
      rescue Errno::ENOENT, Errno::ESRCH => e
        logger.error e
      end
    end
end

after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end
```

7.config/environments/production.rbの以下の記述をコメントアウトする

```production.rb

config.assets.js_compressor = :uglifier
```

8.GitHubにプッシュする


9./var/wwwディレクトリを作成し、権限をec2-userに変更する。(ec2-userログイン状態で)

```ruby

$ sudo mkdir /var/www/
# mkdirコマンドで新たにディレクトリを作成

$ sudo chown ec2-user /var/www/
# 作成したwwwディレクトリの権限をec2-userに変更
```

10.GitHubから、「Clone or download」をクリックしURLをコピーする

11./var/www/に移動し、コードをクローンする。(ec2-userログイン状態で)

```ruby

$ git clone コピーしたURL
```

12.以下の手順でスワップ領域をを用意する(ec2-userログイン状態で)

```ruby

$ cd
# ホームディレクトリに移動
$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
# 処理に時間がかかります

512+0 レコード入力
512+0 レコード出力
536870912 バイト (537 MB) コピーされました、 7.35077 秒、 73.0 MB/秒
# この様に表示されれば成功

$ sudo chmod 600 /swapfile1

$ sudo mkswap /swapfile1

スワップ空間バージョン1を設定します、サイズ = 524284 KiB
ラベルはありません, UUID=74a961ba-7a33-4c18-b1cd-9779bcda8ab1
# この様に表示されれば成功

$ sudo swapon /swapfile1

$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'
# 間が空いているがこの様に記述する
```
13.クローンしたリポジトリに移動する。(ec2-userログイン状態で)

14.ruby -v　で、2.5.1と表示されているか確認(ec2-userログイン状態で)

```ruby

$ ruby -v
```

15.bundler -v　で、bundlerのバージョンを確認する(ローカル環境で)

```ruby
$ bundler -v
```

16.本番環境用のbundlerをインストールし、bundle installする(ec2-userログイン状態で)

```ruby

$ gem install bundler -v 確認したbundlerのバージョン
```

17.rake secret　を実行して表示されたものをコピーする(ec2-userログイン状態で)

```ruby
$ rake secret
```

18.sudo vim /etc/environment　で環境変数を設定できる画面が出る。(ec2-userログイン状態で)

```ruby
$ sudo vim /etc/environment
```

19.iを押すと入力モードになるため以下を記述

```
DATABASE_PASSWORD='MySQLのrootユーザーのパスワード'
SECRET_KEY_BASE='先程コピーしたsecret_key_base'
```

20.escキーで戻り、:wqを入力して保存します

21.環境変数を適用させるため一旦ec2-userをログアウトし、再びログインする

22.環境変数が適用されているか以下の手順で確認する

```ruby

$ env | grep SECRET_KEY_BASE
# SECRET_KEY_BASE='secret_key_base'

$ env | grep DATABASE_PASSWORD
# DATABASE_PASSWORD='MySQLのrootユーザーのパスワード'
```

23.EC2インスタンスの選択画面で対象のインスタンスを選択し、セキュリティグループのリンクを選択

24.「インバウンド」→「編集」をクリック

25.モーダルが開き、ルールを追加をクリックし下記の条件を設定し保存する
タイプを「カスタムTCPルール」、プロトコルを「TCP」、ポート範囲を「3000」、送信元を「カスタム」「0.0.0.0/0」に設定

26.以下の手順でユニコーンを起動する(ec2-userログイン状態で)

```

$ cd /var/www/リポジトリ

$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D

```


27.database.ymlを以下のように記述する(下3行が追記部分)

```database.yml

production:
  <<: *default
　database: # それぞれのアプリケーション名によって異なる。これは編集しない
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```

28.GitHubにプッシュする

29.ec2-userログイン状態で現在のリポジトリに移動してから、プルする

```
$ git pull origin master
```

30.データベースを作成しマイグレーションを実行する(ec2-userログイン状態で)

```ruby

$ rails db:create RAILS_ENV=production

$ rails db:migrate RAILS_ENV=production
# 上記でエラーが出る場合はMySQLが起動してない可能性があるため起動する
```

31.Railsを起動する(ec2-userログイン状態で)

```
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```

32.アセットコンパイルを実行する

```
$ rails assets:precompile RAILS_ENV=production
```

33.Unicornのプロセスを確認する

```
$ ps aux | grep unicorn
```

34.Unicornのプロセスを停止する

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

35.Unicornが停止されているか確認する

```
$ ps aux | grep unicorn
```

36.再度Unicornを起動する

```
$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
```

37.ブラウザで、http://＜Elastic IP＞:3000/にアクセスして確認

38.Nginxをインストールする(ec2-userログイン状態で)

```
$ sudo yum -y install nginx
```

39.rails.confファイルをvimで開く(ec2-userログイン状態で)

```
$ sudo vim /etc/nginx/conf.d/rails.conf
```

40.iを押すと入力モードになるため下記を記述し、保存する。(:wq)

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

server {
  listen 80;
  server_name <Elastic IP>;
  client_max_body_size 2g;

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

  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;
}
```
    
41.nginxの権限を変更(ec2-userログイン状態で)

```
$ cd /var/lib
    
$ sudo chmod -R 775 nginx 
```
    
42.Nginxを再起動して設定ファイルを再読み込みする(ec2-userログイン状態で)

```
$ cd ~
    
$ sudo service nginx restart
```
    
43.unicorn.rbの記述を変更する

```unicorn.rb

listen 3000

# ↓以下のように修正

listen "#{app_path}/tmp/sockets/unicorn.sock"
```
    
44.GitHubにプッシュする
    
45.ローカルの変更点を本番環境へ反映させる

```

$ cd /var/www/リポジトリ名
    
$ git pull origin master
    
```
46.Unicornを再起動させる

```
$ ps aux | grep unicorn
    
$ kill <確認したunicorn rails masterのPID>
    
$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
    
```

47.ブラウザで確認する(Elastic IPでアクセス)