【Rails+Docker+AWS】開発環境構築から本番公開まで（3/3 デプロイ編）

（この記事は続きです）
なんだか結構苦労したので、自分の整理のためにも記事におこしました。
初学者でポートフォリオをとりあえず公開したい方は参考になるかもしれません。

## 完成図
Ruby 2.5.1
Rails 5.2.0
MySQL 5.7
![qiita用のインフラ構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/64654abc-e78d-1bc9-26b0-cf5a4f0b2281.png)

全部で3記事あります。
(1)開発環境構築編 https://qiita.com/obr-note/items/a923e7acf77652a6994e
(2)AWSコンソール画面編 https://qiita.com/obr-note/items/f897762b831b6f3c273c
(3)デプロイ編 この記事

## ローカル作業
###　docker-compose.ymlファイル修正
ローカルのターミナルで作業します。

```
$ cd ~/project/webapp
$ vim docker-compose.yml
```
データベースはRDSを使うので、コメントアウトします。

```
version: "3"
services:
  app:
    build:
      context: .
    env_file:
      - ./environments/db.env
    # command: bundle exec puma -C config/puma.rb
    command: bundle exec rails server -e production
    volumes:
      - .:/var/www/webapp
      - public-data:/var/www/webapp/public
      - tmp-data:/var/www/webapp/tmp
      - log-data:/var/www/webapp/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/webapp/public
      - tmp-data:/var/www/webapp/tmp
    ports:
      - 80:80
    depends_on:
      - app
volumes:
  public-data:
  tmp-data:
  log-data:
  db-data:
```

### GitHubへPush
githubにレポジトリを作成して、コードをpushしておきます。
レポジトリがprivateだと、後でgit cloneするとき面倒なので、publicにしておきます。
セキュリティ的なことはよく知らないです。
https://github.com/
![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/a67b44eb-26b6-56df-8adc-5bb757e6118f.png)


```
$ cd ~/project/webapp
$ git add .
$ git commit -m 'modified docker-compose.yml'
$ git remote add origin https://github.com/ユーザー名/webapp
$ git push origin master
```

## EC2での作業
EC2のパブリックIPv4アドレスをコピーしておきます。
![ec209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/7cfe343b-5f2d-9aeb-10cb-a84b9d08e934.png)

```
$ ssh -i ~/.ssh/webapp-ec2.pem ec2-user@xxx.xxx.xxx.xxx # EC2のパブリックIPv4アドレス
```
### DockerをEC2にインストール
```
[ec2]$ sudo yum install -y docker
[ec2]$ sudo service docker start
[ec2]$ sudo usermod -G docker ec2-user
[ec2]$ exit
$ ssh -i ~/.ssh/webapp-ec2.pem ec2-user@xxx.xxx.xxx.xxx
[ec2]$ docker info
```
なんかいろんな情報が出てくればOKです。

### docker-composeをインストール
```
[ec2]$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[ec2]$ sudo chmod +x /usr/local/bin/docker-compose
[ec2]$ docker-compose -v
```

### フォルダ作成
```
[ec2]$ sudo mkdir -p /var/www
[ec2]$ sudo chown ec2-user:ec2-user /var/www # 現ユーザーに権限付与
```
### MySQLでデータベース作成とユーザーへ権限付与
RDSのエンドポイントをコピーしておきます。
![rds.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/38b64d76-435d-7624-f6c9-39e15cb62a97.png)

```
[ec2]$ mysql -u admin -p -h webapp-db.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com # RDSのエンドポイント
Enter password: admin_password
mysql> create database webapp_production;
mysql> create user db_user identified by 'db_password';
mysql> grant all privileges on webapp_production.* to db_user@'%';
mysql> quit
```
### GitHubからコードをクローンする
```
[ec2]$ sudo yum -y install git # gitをインストール
[ec2]$ cd /var/www
[ec2]$ git clone https://github.com/ユーザー名/webapp.git
```
### データベースのアクセス情報を書き換え
（簡単にするために、この記事では直接書き込んでいます。セキュリティとかに問題があるらしいので、環境変数とか使うらしいです。知らないです。）

```
[ec2]$ cd /var/www/webapp
[ec2]$ 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: webapp_development

test:
  <<: *default
  database: webapp_test

production:
  <<: *default
  host: webapp-db.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com # RDSのエンドポイント
  database: webapp_production
  username: db_user
  password: db_password
```
### Dockerイメージの作成
```
[ec2]$ cd /var/www/webapp
[ec2]$ docker-compose build # 数分かかります
[ec2]$ docker images
```
### credentials.yml.encの設定
ここら辺はよく分からないけど、とりあえずcredentials.yml.encファイルを消して開いて閉じます。これで、作成されたmaster.keyと対応するらしいです。

```
[ec2]$ rm config/credentials.yml.enc
[ec2]$ docker-compose run -e EDITOR="vim" app bundle exec rails credentials:edit
（特に何も編集せずに、保存して閉じる（:wq)）
```
### マイグレーション
```
[ec2]$ docker-compose run app bundle exec rails db:migrate RAILS_ENV=production
```
### プリコンパイル
```
[ec2]$ docker-compose run app bundle exec rails assets:precompile RAILS_ENV=production
```
### dockerコンテナ立ち上げ
```
[ec2]$ docker-compose up -d
```

お疲れ様でした。
多分本番公開できていると思います。
EC2のパブリックIPv4アドレスにブラウザからアクセスしてみてください。
※ SSH認証していないので、http://xxx.xxx.xxx.xxxとなります。https://は使えません。