Rails4+Capistrano3+Nginx+Unicorn EC2へのデプロイ < 後編 >

AWSにrailsアプリをEC2にデプロイしたので備忘録として残します。
< 後編 >です。

【イメージ】
<img width="623" alt="スクリーンショット 2017-05-09 11.04.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/114886/c4deaa1b-9df9-5880-3319-f29197e18df2.png">

[< 前編 >](http://qiita.com/hibriiiiidge/items/c40d8e1f3a8e383d218e) で `Unicorn` の設定までを実施しました。

##デプロイチェック

```ruby:ローカル
$ bundle exec cap production deploy:check
``` 
デプロイチェックをすると下記のようなエラーが出るはずです。

```
~　省略　~
00:02 deploy:check:linked_files
ERROR linked file /var/www/deployApp/shared/config/database.yml does not exist on YOUR_IP_ADDRESS
```

`/var/www/deployApp/shared/config/` に `database.yml` が存在しないためのエラーです。

`shared` ディレクトリは、Capistranoが自動生成するディレクトリです。
EC2の `qiitaApp` の配下を確認します。

```ruby:EC2
[myname@ip-10-0-1-86 qiitaApp]$ ls -la
drwxrwxr-x 4 ec2-user ec2-user 4096  5月  9 04:08 .
drwxrwxrwx 3 root     root     4096  5月  9 04:06 ..
-rw-rw-r-- 1 ec2-user ec2-user    6  5月  9 03:33 .ruby-version
drwxrwxr-x 2 ec2-user ec2-user 4096  5月  9 04:08 releases ←　自動生成
drwxrwxr-x 7 ec2-user ec2-user 4096  5月  9 04:08 shared　←　自動生成
```

`config` 配下に `database.yml` を生成すればエラーは出なくなるのですが、次に同じように`secrets.yml`が存在しないというエラーが出ますので、共に生成して変更します。

EC2上にdatabase.ymlの生成の前にローカルの `database.yml` を変更します。

```ruby:ローカル
$ vi config/database.yml 

======================= database.yml ================================

~ 省略 ~
#production:
#  <<: *default
#  database: db/production.sqlite3
   ↓↓↓
production:
  <<: *default
  adapter: mysql2
  database: qiita_db
  host: qiita_db.xxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com                                                                                                                                                     
  username: qiita_user
  password: YOUR_DB_PASS
  encoding: utf8

====================================================================

```
変更したら `database.yml` 全体をコピーして保存します。

```ruby:EC2
[ec2-user@ip-10-0-1-86 qiitaApp]$ cd shared/config/
[ec2-user@ip-10-0-1-86 config]$ touch database.yml
[ec2-user@ip-10-0-1-86 config]$ vi database.yml

======================= database.yml ===============================
 
 ローカルでコピーしたdatabase.ymlを貼り付けます。

====================================================================
```

同様に `secrets.yml` もローカルの中身をコピーして（変更はなし）、configの配下に `secrets.yml` を生成して貼り付けます。

```ruby:EC2
[ec2-user@ip-10-0-1-86 config]$ touch secrets.yml
[ec2-user@ip-10-0-1-86 config]$ vi secrets.yml
```

再度、デプロイチェックを実施します。

```ruby:ローカル
$ bundle exec cap production deploy:check
```

エラーが出なければ`deploy:check`は完了です。


##デプロイ

```ruby:ローカル
$ bundle exec cap production deploy --trace #traceをつけることでバグの箇所を発見しやすくします
```

エラーが出なければデプロイ完了です。

今回は、scaffoldで簡単なUserアプリを生成しているので、 直接、`http://IP_ADDRESS/users/` を叩いて確認してみます。

...おそらく500エラーが返ってきてしまって確認できないと思います。


Unicornの状態とエラーログを確認します。

```ruby:EC2
[ec2-user@ip-10-0-1-86 config]$ ps ax | grep unicorn
30256 ?        Sl     0:01 unicorn master -c /var/www/qiitaApp/current/config/unicorn.rb -E deployment -D                                             
30311 ?        Sl     0:00 unicorn worker[0] -c /var/www/qiitaApp/current/config/unicorn.rb -E deployment -D                                          
30313 ?        Sl     0:00 unicorn worker[1] -c /var/www/qiitaApp/current/config/unicorn.rb -E deployment -D                                          
30316 ?        Sl     0:00 unicorn worker[2] -c /var/www/qiitaApp/current/config/unicorn.rb -E deployment -D                                          
30334 pts/1    S+     0:00 grep --color=auto unicorn
```

Unicornは稼働していることが確認できます。
次はエラーログです。

```ruby:EC2
[ec2-user@ip-10-0-1-86 config]$ cd ../..
[ec2-user@ip-10-0-1-86 qiitaApp]$ tail -f current/log/unicorn_error.log 
```
この状態で再度ローカルからデプロイします。

```ruby:ローカル
[ec2-user@ip-10-0-1-86 qiitaApp]$ bundle exec cap production deploy
```

```ruby:EC2
I, [2017-05-09T06:57:08.516736 #30256]  INFO -- : executing ["/var/www/qiitaApp/shared/bundle/ruby/2.3.0/bin/unicorn", "-c", "/var/www/qiitaApp/current/config/unicorn.rb", "-E", "deployment", "-D", {8=>#<Kgio::UNIXServer:fd 8>}] (in /var/www/qiitaApp/releases/20170509065649)
I, [2017-05-09T06:57:08.735844 #30256]  INFO -- : inherited addr=/tmp/unicorn.sock fd=8
I, [2017-05-09T06:57:08.736108 #30256]  INFO -- : Refreshing Gem list
I, [2017-05-09T06:57:09.978667 #30311]  INFO -- : worker=0 ready
I, [2017-05-09T06:57:09.981219 #30256]  INFO -- : master process ready
I, [2017-05-09T06:57:09.982336 #30313]  INFO -- : worker=1 ready
I, [2017-05-09T06:57:09.985331 #30316]  INFO -- : worker=2 ready
I, [2017-05-09T06:57:10.155786 #29111]  INFO -- : reaped #<Process::Status: pid 29166 exit 0> worker=0
I, [2017-05-09T06:57:10.155874 #29111]  INFO -- : reaped #<Process::Status: pid 29168 exit 0> worker=1
I, [2017-05-09T06:57:10.155945 #29111]  INFO -- : reaped #<Process::Status: pid 29171 exit 0> worker=2
I, [2017-05-09T06:57:10.155973 #29111]  INFO -- : master complete
```

この時点ではエラーらしきものが出ていません。

再度 `http://IP_ADDRESS/users/` を叩いて確認してみます。

```ruby:EC2
E, [2017-05-09T06:59:27.508190 #30316] ERROR -- : app error: Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml` (RuntimeError)
```
`Missing secret_token and secret_key_base` とあります。
EC2上の `qiitaApp/current/config/secrets.yml` の secret_key_base:の環境変数（SECRET_KEY_BASE）が設定されていないことが原因です。

```ruby:EC2
[ec2-user@ip-10-0-1-86 qiitaApp]$ cd current
[ec2-user@ip-10-0-1-86 current]$ bundle exec rake secret
1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz ←コピーする
[ec2-user@ip-10-0-1-86 current]$ vi config/secrets.yml 

============================== secrets.yml ==================================

~ 省略 ~
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
　　　　　　　　　　↓↓↓
  secret_key_base: 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz

=============================================================================
```
本来であれば、直接入力するのではなく、

```
SECRET_KEY_BASE=1234567890abcd...
export SECRET_KEY_BASE
```
とかで環境変数のまま使用すべきです。
が、何回実施してもググってもうまくいかなかったので、取り急ぎ直接入力で対応します。
[dotenv](https://github.com/bkeepers/dotenv)というgemがあるようなので、それで対応してもいいと思います。

再度、ローカルからデプロイして、urlを叩けば下記の画面が表示されると思います。
<img width="515" alt="スクリーンショット 2017-05-09 16.28.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/114886/a163d3f2-3eb3-616d-73f1-0997b2a56b88.png">

大変参考にさせていただきました。
[capistranoを使ってrailsをnginx+unicorn+mysqlの環境にデプロイする
](http://qiita.com/yu_0105/items/087055eaabfef022142f)[ローカルで開発したRailsアプリをCapistrano3でEC2にデプロイする](http://sil.hatenablog.com/entry/rails-deployed-by-capistrano-from-local)
[Capistrano3でUnicorn+Nginxな環境にRailsをデプロイする:初心者向け](http://qiita.com/zaru/items/9e02706b27094ce36902)
[Railsプロダクション環境　Unicornでsecret_key_baseが設定されていないとエラーが出る](https://ja.stackoverflow.com/questions/22570/rails%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E7%92%B0%E5%A2%83-unicorn%E3%81%A7secret-key-base%E3%81%8C%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%82%8B)