第2回　AWSに自動でテスト/デプロイしてくれるインフラの設定・構築（rails開発環境構築編）

# 本シリーズ集
|  | タイトル |
|:-:|:-:|
| 0 | [目標・やりたいこと](https://qiita.com/drafts/c59c0df9eaf5e6b10111/edit) |
| 1 | [AWS編](https://qiita.com/Dadadada-TT/items/86e0a578f934e6578c04)|
| 2 | ___rails開発環境構築編___|
| 3 | [Nginx・MySQL編](https://qiita.com/Dadadada-TT/items/4a7edd61a5d7c75f772d) |
| 4 | [Capistrano編](https://qiita.com/Dadadada-TT/items/79e33659eacda1cd0510) |
| 5 | [CircleCI編](https://qiita.com/Dadadada-TT/items/a9530630782c6f4c7cbc) |
| 6 | [総集編](https://qiita.com/Dadadada-TT/items/3d1fa7854d562ae1db1b) |

# rails 開発用のディレクトリ構成
　私は、__rails__開発に、__docker-compose__ を使用して環境を構築している。
　今後、__Nginx等__ を語る上で、このディレクトリ構成の説明（というかpublicディレクトリの説明）が必要になるので、簡単に説明しておく。


```
/samplea
├ docker-compose.yml
├ Dockerfile
├ Gemfile
├ Gemfile.lock （空ファイル）
└ 【WEBサーバアクセス用の鍵】
```


まずは、Dockerfile

```Dockerfile:Dockerfile
FROM ruby:2.7.1
RUN apt-get update && apt-get install -y \
    build-essential \
    nodejs
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get install -y --no-install-recommends yarn
COPY 【WEBサーバアクセス用の鍵】 /root/.ssh/
WORKDIR /sample
COPY Gemfile /sample/Gemfile
COPY Gemfile.lock /sample/Gemfile.lock
RUN bundle install
COPY . /sample
```

　`RUN curl ...` の部分は、yarnのバージョン周りで、どうしてもうまく行かなかったので、この記述にしてある。詳細は後日別記事にてあげる予定。
　この `COPY 【WEBサーバアクセス用の鍵】 ... ` の部分は本シリーズの[Capistrano編]()にて使用するので、ここで記述。なぜこの記述が必要かといった詳細はそちらで説明する。

`docker-compose.yml`ファイル

```.yml:docker-compose.yml
version: '3'
services: 
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/sample
    ports:
      - 3000:3000
    tty: true
    stdin_open: true
  db: 
    image: mysql:5.7
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
volumes:
  db-volume:
```

`Gemfile`ファイル

```.rb:Gemfile
source 'https://rubygems.org'
ruby '2.7.1'

gem 'rails', '~> 6.0.3', '>= 6.0.3.4'
```

#プロジェクト生成
　下記コマンドを打ち、プロジェクトを生成する。

```
$ docker-compose run web bash
...something was logged
root@aeac81b1e20b:/sample#  rails new . --force --database=mysql
 ...
 ...
Webpacker successfully installed 🎉 🍰
```

これで、ローカルフォルダに、rails開発用のファイル群が生成される。

# config/database.yml の変更

```config/database.yml
production:
  <<: *default
  database: app_production
  username: root
  password: password
  # passwordは、docker-compose.ymlの environment: MYSQL_ROOT_PASSWORD に設定した値に合わせる必要がある。
  host: db
  # hostは、docker-compose.ymlのservices: db: の『db』の部分に合わせる必要がある。
```

　これで、`docker-compose up` コマンドにより一度でローカルサーバが起動でき、開発環境を構築することができる。

# （蛇足）pumaとは？
　Rubyのgemの一つで、所謂APサーバ。
　WebサーバとAPサーバの違いは、以下サイトが参考になる。

・[アプリケーションサーバとは？Webサーバとの違いを解説](https://www.biz.ne.jp/matome/2004479/)
・[なぜrailsの本番環境ではUnicorn,Nginxを使うのか? ](https://qiita.com/takahiro1127/items/fcb81753eaf381b4b33c)


　ところで、RubyのgemでAPサーバとなれるのは、__puma__と__unicorn__があるが、下記サイトにて違いがわかる。

・[railsアプリケーションにおいて、なぜNginx+unicornなのか？](https://jp.quora.com/rails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6-%E3%81%AA%E3%81%9CNginx-unicorn%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%8C)


上記事の説明では
> __unicorn__は、マルチプロセスで動作し、__puma__はマルチスレッドで動作する。

　であるらしく、筆者にはメリットがイマイチ分からないが（おいおい調べていきたいと思っている）、rails5以降では、デフォルトで__puma__になっているため、APサーバの変更に工数を割く必要は無いと判断したため、__puma__を選定した。

# まとめ
　まとめというか、一言だけ。
　なんでこの記事を作成したかというと、__[Nginx編]()__にて、`rails new`で生成された`public`フォルダを使用するためで、
　なんか突拍子もなく、
>〜〜`rails new` コマンドで生成された`public`フォルダを使用する〜〜

　みたいなこと書いても読者が戸惑うかなっていう不安からこの記事を作成しました。

　※ `public`フォルダがなくても動作はします。ただ、APサーバと通信できないなどの障害が発生した際のエラー表示に役立ちます。