【Docker×Rails6】solidusを使ってECサイトを構築する（環境構築編）

備忘録として開発の流れを残しておきます。

# バージョン情報

Ruby 2.7.1
Rails 6.1.4
MySQL 5.7
Nginx 1.19.10

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

# ファイル構成

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

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

# フォルダ作成

```ruby:
$ mkdir -p ~/project/solidus
$ cd ~/project/solidus
$ mkdir -p containers/nginx
$ mkdir environments
```

※mkdir -pで、必要に応じて親ディレクトリも作成してくれる。

# Dockerfile作成（app用）

```
$ vim Dockerfile
```

```
# Dockerfile
FROM ruby:2.7.1

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_16.x | bash - && \
    apt-get install -y nodejs

RUN mkdir -p /var/www/solidus

WORKDIR /var/www/solidus

ADD Gemfile /var/www/solidus/Gemfile
ADD Gemfile.lock /var/www/solidus/Gemfile.lock

RUN gem install bundler
RUN bundle install

ADD . /var/www/solidus

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

# Gemfile作成

```
$ cd ~/project/solidus
$ touch Gemfile.lock
$ vim Gemfile
```

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

# Dockerfile作成（web用）

```
$ cd ~/project/solidus
$ 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/solidus.conf

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


# nginxの設定ファイル作成

```
$ cd ~/project/solidus
$ vim containers/nginx/nginx.conf
```

```
upstream puma {
  server unix:///var/www/solidus/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/solidus/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 @solidus;
  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/solidus
$ vim environments/db.env
```

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


# docker-composeファイル作成

```
$ cd ~/project/solidus
$ 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/solidus
      - public-data:/var/www/solidus/public
      - tmp-data:/var/www/solidus/tmp
      - log-data:/var/www/solidus/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/solidus/public
      - tmp-data:/var/www/solidus/tmp
    ports:
      - 80:80
    depends_on:
      - app
volumes:
  public-data:
  tmp-data:
  log-data:
  db-data:
```

# Railsアプリの作成

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

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


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

# pumaの設定ファイル修正

```
$ cd ~/project/solidus
$ 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/solidus
$ 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: solidus_development

test:
  <<: *default
  database: solidus_test
```

# Dockerイメージのビルド

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

solidus_appとsolidus_webのイメージが作成できていれば、イメージの作成は完了です。

# Webpackerをインストール

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

# Dockerコンテナの立ち上げ

```
$ cd ~/project/solidus
$ docker-compose up -d
$ docker-compose ps
```

solidus_appとsolidus_dbとsolidus_webのコンテナのStateがUpになっていれば、コンテナの立ち上げは成功です。

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

```
$ cd ~/project/solidus
$ 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/solidus
$ docker-compose exec app rails db:create
```

# 開発環境構築完了

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

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