【備忘録】【Rails+Docker+AWS】開発環境構築から本番公開まで（1/3 開発環境構築編）

下記記事を参考にさせていただき、dockerで環境構築してデプロイまでもっていきました。
多分何度も作り直すことになると思ったので、コピペするだけでスムーズに作れるように
バージョン情報を自分用に合わせて記事に残させていただきました。
（少し補足している箇所もあります）

▼参考にさせていただいた記事▼

https://qiita.com/obr-note/items/a923e7acf77652a6994e

大変丁寧でわかりやすい記事でして、とても助けられましたm(__)m

# バージョン情報

Ruby 3.0.0
Rails 6.1.4
MySQL 5.7
Nginx 1.19.10

# 前提
AWSにアカウント作成済
docker hubにアカウント作成済
docker インストール済

# ファイル構成

現状のアプリのフォルダ構成に、下記のファイルを追加します。

```
~/project/remote-work-space
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── containers ── nginx
├                 ├── Dockerfile
├                 └── nginx.conf
├── docker-compose.yml
└── environments ── db.env
```

# フォルダ作成

```ruby:
$ mkdir -p ~/project/remote-work-space
$ cd ~/project/remote-work-space
$ mkdir -p containers/nginx
$ mkdir environments
```

# Dockerfile作成（app用）

```
$ vim Dockerfile
```

```
# Dockerfile
FROM ruby:3.0.0

RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev nodejs vim

RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
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 yarn

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
        && apt-get install -y nodejs

RUN mkdir -p /var/www/remote-work-space

WORKDIR /var/www/remote-work-space

ADD Gemfile /var/www/remote-work-space/Gemfile
ADD Gemfile.lock /var/www/remote-work-space/Gemfile.lock

RUN gem install bundler
RUN bundle install

ADD . /var/www/remote-work-space

RUN mkdir -p tmp/sockets
RUN mkdir -p tmp/pids
```

# Gemfile作成

```
$ cd ~/project/remote-work-space
$ touch Gemfile.lock
$ vim Gemfile
```

```
# Gemfile
source 'https://rubygems.org'
gem 'rails', '6.1.4'
```

# Dockerfile作成（web用）

```
$ cd ~/project/remote-work-space
$ vim containers/nginx/Dockerfile
```

```
# containers/nginx/Dockerfile
FROM nginx:1.19.10

RUN rm -f /etc/nginx/conf.d/*

ADD nginx.conf /etc/nginx/conf.d/remote-work-space.conf

CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
```


# nginxの設定ファイル作成

```
$ cd ~/project/remote-work-space
$ vim containers/nginx/nginx.conf
```

```
upstream puma {
  server unix:///var/www/remote-work-space/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name puma;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  location ~ ^/assets/ {
    root /var/www/remote-work-space/public;
  }

  client_max_body_size 100m;
  error_page 404 /404.html;
  error_page 505 502 503 504 /500.html;
  try_files $uri/index.html $uri @remote-work-space;
  keepalive_timeout 5;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://puma;
  }
}
```

# データベース設定ファイル作成

```
$ cd ~/project/remote-work-space
$ vim environments/db.env
```

```
MYSQL_ROOT_PASSWORD=db_root_password
MYSQL_USER=user_name
MYSQL_PASSWORD=user_password
```


# docker-composeファイル作成

```
$ cd ~/project/remote-work-space
$ vim docker-compose.yml
```


```
version: "3"
services:
  app:
    build:
      context: .
    env_file:
      - ./environments/db.env
    command: bundle exec puma -C config/puma.rb
    volumes:
      - .:/var/www/remote-work-space
      - public-data:/var/www/remote-work-space/public
      - tmp-data:/var/www/remote-work-space/tmp
      - log-data:/var/www/remote-work-space/log
    depends_on:
      - db
  db:
    image: mysql:5.7
    env_file:
      - ./environments/db.env
    volumes:
      - db-data:/var/lib/mysql
  web:
    build:
      context: containers/nginx
    volumes:
      - public-data:/var/www/remote-work-space/public
      - tmp-data:/var/www/remote-work-space/tmp
    ports:
      - 80:80
    depends_on:
      - app
volumes:
  public-data:
  tmp-data:
  log-data:
  db-data:
```

# Railsアプリの作成

Dockerデスクトップが立ち上がっている状態で、下記コマンドを実行します。

```
$ cd ~/project/remote-work-space
$ docker-compose run --rm app rails new . --force --no-deps --database=mysql --skip-bundle
# 数分かかります。
$ ls
```


見慣れたRailsのファイルが並んでいれば、Railsアプリ作成完了です。

# pumaの設定ファイル修正

```
$ cd ~/project/remote-work-space
$ cp /dev/null config/puma.rb
$ vim config/puma.rb
```


```
threads_count = ENV.fetch("RAILES_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILES_ENV") { "development" }
plugin :tmp_restart

app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"

stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log"
```

# データベース接続情報ファイル修正

```
$ cd ~/project/remote-work-space
$ cp /dev/null config/database.yml
$ vim config/database.yml
```


```
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILES_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USER") { 'root' } %>
  password: <%= ENV.fetch("MYSQL_PASSWORD") { 'password' } %>
  host: db

development:
  <<: *default
  database: remote-work-space_development

test:
  <<: *default
  database: remote-work-space_test
```

# Dockerイメージのビルド

```
$ cd ~/project/remote-work-space
$ docker-compose build # 数分かかります
$ docker images
```

remote-work-space_appとremote-work-space_webのイメージが作成できていれば、イメージの作成は完了です。

# Webpackerをインストール

```
$ docker-compose run --rm app rails webpacker:install 
# バージョン６以降なので、webpacker をインストールします。
```

# Dockerコンテナの立ち上げ

```
$ cd ~/project/remote-work-space
$ docker-compose up -d
$ docker-compose ps
```

remote-work-space_appとremote-work-space_dbとremote-work-space_webのコンテナのStateがUpになっていれば、コンテナの立ち上げは成功です。

# データベースへアクセス権限付与

```
$ cd ~/project/remote-work-space
$ vim db/grant_user.sql
```

```
GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;
```

```
$ docker-compose exec db mysql -u root -p -e"$(cat db/grant_user.sql)"
Enter password: db_root_password
$ docker-compose exec db mysql -u user_name -p -e"show grants;"
Enter password: user_password
```

# データベース作成

```
$ cd ~/project/remote-work-space
$ docker-compose exec app rails db:create
```

# 開発環境構築完了

開発環境の構築は終わりです。Welcomeページを見てみましょう。
http://localhost

あとは、好きなエディタ（VSCodeとか）で、~/project/remote-work-spaceを開いて、開発していけばOK！

# 開発環境構築後の開発の仕方
これまで通り、基本ローカル環境で行います。その際必ずコマンドの先頭に「docker-compose exec app」をつけること！
（gitコマンドには特に何もつけない）


もしコンテナの中に入りたい場合は、下記実行。

```
$ docker-compose exec app bash
```

するとプロンプト( ターミナルの左側の部分 )が以下のように変わると思います。( @の後ろはコンテナのID )

```
root@97b8e3430f3f:/remote-work-space#
```

コンテナを抜けるには、以下のコマンドを実行。

```
$ exit
```

# $ docker-compose buildについて

docker-composeを使ったRailsアプリ開発であるため、Gemfileを更新した際はbuildし直すこと。


# デバッグについて

開発中にエラーが発生し、controllerを編集し、デバッグしたとします。
この場合、一度サーバーを再起動する必要があります。

Dockerの場合、Railsのコンテナ( remote-work-space_app_1 )ごと以下のコマンドで再起動します。

```
$ docker-compose restart app
```

しかし、デバッグするたびにいちいちコンテナを再起動するのは非効率です。
なので、サーバー起動中もコードの更新をチェックしてくれるように設定します。

config/environments/development.rbの一番下に記載されている以下を

```
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
```

次のように変更します。

```
config.file_watcher = ActiveSupport::FileUpdateChecker
```

たったこれだけで、再起動を行わずにデバッグが可能となります。





AWSコンソール画面編へ続く
https://qiita.com/asami___t/items/58a407baf143b6b74db8