Rails Nginx Mysqlで環境を構築する

 さてRailsをMysqlでNginxでも動作するように環境構築をする方法ですが、Dockerを使用します。(Dockerはいいぞうお)VSCodeを使用して説明を行うので、インストールされていない方の閲覧はお勧めしません。なのでDocker、VSCodeをインストールされていない方はインストールを行うか、別のドキュメントをご覧ください。

 Nginxは最新のものを利用しているのでもしかすると相性が悪くなって利用できない可能性もあります。その際はバージョンを指定していただくことをお勧めします。

 そしてテンプレートを用意いたしましたので書き込むのが面倒な方はこちら

 まず初めにディレクトリを紹介します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
.
├── docker
│   ├── app
│   │   ├── Dockerfile
│   │   └── entrypoint.sh
│   ├── docker-compose.yml
│   ├── mysql
│   │   ├── Dockerfile
│   │   └── tmp
│   │       └── db
│   │           ├──*
│   └── nginx
│       ├── Dockerfile
│       ├── log
│       │   ├── access.log
│       │   └── error.log
│       ├── nginx.conf
│       └── ssl
├── src
│   ├── Gemfile
│   ├── Gemfile.lock

 *コマンド等により生成されるファイル等は省いています。  また、このようなディレクトリ構成(Docker用とRails用で分けている)にされない場合はあまり参考にならない可能性があるので別のドキュメント等を閲覧することをお勧めします。

 まず、アプリを保存するディレクトリを作成してください。

1
mkdir app-dir

 そして移動してください。cd app-dirこの時点でGitを利用したい場合はgit initを実行しておきましょう(後でよいとは思いますが、もし少し違うやり方をしたくなった際に戻れるので便利かとは思います)。移動した後はディレクトリを二つ作成します。Docker用とRailsのソースコード用になります。mkdir docker srcこの辺は好みですが、こちらのほうがわかりやすくはなるのでこちらを採用しています。ディレクトリを作成後、code .を実行し、VSCodeを起動しましょう。開いて一番上にあるタブ?欄に『ターミナル』とあると思います(場合によっては三本線か・・・マーク担っています)。それを押してターミナルを起動してください。起動した状態で次のコマンドを順に打っていって下さい。

1
2
3
cd docker
mkdir app mysql nginx
touch docker-compose.yml app/Dockerfile mysql/Dockerfile nginx/Dockerfile

 実行後は各ファイルに次のように打ち込んでいきましょう。 『app/Dockerfile』

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
FROM ruby:2.7
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY ./src/Gemfile /myapp/Gemfile
COPY ./src/Gemfile.lock /myapp/Gemfile.lock
COPY ./docker/app/entrypoint.sh /usr/bin/
RUN bundle install --path vendor/bundle
RUN chmod +x /usr/bin/entrypoint.sh
RUN apt install -y sudo

ARG USERNAME=user
ARG GROUPNAME=user
ARG UID=1000
ARG GID=1000
RUN groupadd -g $GID $GROUPNAME \
    && useradd -m -s /bin/bash -u $UID -g $GID $USERNAME
RUN chown -R 1000:1000 /myapp

『mysql/Dockerfile』

1
FROM mysql:5.7

『nginx/Dockerfile』

1
FROM nginx:latest

『docker-compose.yml』

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
version: '3'
services:
  app:
    build:
      context: ..
      dockerfile: ./docker/app/Dockerfile
    tty: true
    volumes:
      - ../src:/myapp
    depends_on:
      - mysql
    working_dir: /myapp
    command: sh /usr/bin/entrypoint.sh
    ports:
      - "3000:3000"
    user: user

  mysql:
    build: 
      context: ..
      dockerfile: ./docker/mysql/Dockerfile
    volumes:
      - ./mysql/tmp/db:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: myapp_development
      MYSQL_USER: myapp_user
      MYSQL_PASSWORD: password

  nginx:
    container_name: nginx
    build:
      context: ..
      dockerfile: ./docker/nginx/Dockerfile
    environment:
      TZ: Asia/Tokyo
    ports:
      - "80:80"
    volumes:
      - ../src:/var/www/myapp
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/log:/var/log/nginx
      - ./nginx/ssl:/etc/nginx/conf.d/ssl
    working_dir: /var/www
    depends_on:
      - app
    tty: true

volumes:
  dbdata:
  myapp:

 こちらでDockerに必要なファイルは書き終わりましたが、各アプリに必要なファイルがあるのでそちらも追加していきます。次のコマンドを打ってください。

1
touch app/entrypoint.sh nginx/nginx.conf

 作成した後、下記の情報を各ファイルに打ち込んでください。 『app/entrypoint.sh』

1
2
3
4
5
6
7
bundle install --path vendor/bundle
bundle update
bundle exec rails db:create
bundle exec rails db:migrate
bundle exec rails db:seed
rm -f tmp/pids/server.pid
bundle exec rails s -p 3000 -b '0.0.0.0'

『nginx/nginx.conf』

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
upstream puma {
    server app:3000;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name app.com;

    root /myapp/public;
    try_files $uri/index.html $uri @puma;

    location @puma {
        proxy_pass http://puma;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }


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

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

 お次はRailsに必要なGemfileを記述しましょう。srcディレクトリに移ってください。VSCodeなら新規ファイルで下記のファイルを作ってください。コマンドランで作成する場合はtouch ../src/Gemfile ../src/Gemfile.lockを行ってください。ディレクトリには気を付けてください(ページ上のディレクトリ構成を見ていただけるとわかりやすいかと)。Gemefile.lockは何も書かなくてよいですが、Gemfileには下記のものを記述してください。

『src/Gemfile』

1
2
3
source 'https://rubygems.org'

gem 'rails', '~> 5'

 さあ、docker-compose up -dしてみましょう。あれ?localhostにアクセスしても502 Bad Gatewayと出てしまいます。これはRailsが動作していない証ですね。試しにlocalhost:3000にもアクセスしてみましょう。当然アクセスできません。docker psやDocker Desktopを利用してコンテナの状況を見ると、appコンテナが終了しています。これはsrcフォルダ内を見てもらってもわかるようにRailsのソースコードが生成されていません。なのでbundle exec rails new .をしましょう。今回はDockerを利用しているので下記のコマンドを順次実行してみてください。

1
2
3
4
5
6
7
8
docker-compose run app bash
bundle install
bundle update
bundle exec rails new .
bundle update
exit
docker-compose down
docker-compose up -d

 さあどうでしょう!Yay!は出ましたか?

 今回はちゃんとNginxの設定をしていないのでポート番号3000番をつけてもつけなくてもアクセスできています。また、どこかおかしな点がある場合は連絡を頂けると嬉しいです。

 追記root権限でRailsを生成しているので編集ができない状態でした。修正したと思うので今後は大丈夫だと思います。

Built with Hugo
Theme Stack designed by Jimmy