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

（この記事は続きです）

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

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

https://qiita.com/obr-note/items/44290f2011ad09240129

# バージョン情報

Ruby 3.0.0
Rails 6.1.4
MySQL 5.7
Nginx 1.19.10

# 前提

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

# ローカル作業

### docker-compose.ymlファイル修正

ローカルのターミナルで作業します。

```
$ cd ~/project/remote-work-space
$ 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/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:
```

### GitHubへPush

githubに「remote-work-space」というレポジトリを作成して、コードをpushしておきます。
レポジトリがprivateだと後でgit cloneするとき面倒なので、publicにしておきます。
https://github.com/


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


# EC2での作業

EC2のパブリックIPv4アドレスをコピーしておきます。
SSH接続します。

```
$ ssh -i ~/.ssh/remote-work-space-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/remote-work-space-ec2.pem ec2-user@xxx.xxx.xxx.xxx
[ec2]$ docker info
```
なんかいろんな情報が出てくればOKです。

### Node.jsとyarnのインストールをEC2にインストール

▼参考記事

https://blog.serverworks.co.jp/tech/2020/01/19/rails6/


### docker-composeをEC2にインストール

```
[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のエンドポイントをコピーしておきます。

```
[ec2]$ mysql -u admin -p -h remote-work-space-db.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com # RDSのエンドポイント
Enter password: admin_password
mysql> create database `remote-work-space_production`;
mysql> create user db_user identified by 'db_password';
mysql> grant all privileges on `remote-work-space_production`.* to db_user@'%';
mysql> quit
```

### GitHubからコードをクローンする

```
[ec2]$ sudo yum -y install git # gitをインストール
[ec2]$ cd /var/www
[ec2]$ git clone https://github.com/ユーザー名/remote-work-space.git
```




### データベースのアクセス情報を書き換え

（簡単にするために、この記事では直接書き込んでいます。セキュリティに問題があるので、環境変数を使ったほうがいいと思います。）

```
[ec2]$ cd /var/www/remote-work-space
[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: remote-work-space_development

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

production:
  <<: *default
  host: remote-work-space-db.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com # RDSのエンドポイント
  database: remote-work-space_production
  username: db_user
  password: db_password
```


### Dockerイメージの作成

```
[ec2]$ cd /var/www/remote-work-space
[ec2]$ docker-compose build # 数分かかります
[ec2]$ docker images
```

## 注意

$ docker-compose buildの結果、下記エラーが出ることがある。

```
Building app
Traceback (most recent call last):
  File "site-packages/docker/utils/build.py", line 96, in create_archive
PermissionError: [Errno 13] Permission denied: '/var/www/remote-work-space/config/master.key'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "bin/docker-compose", line 6, in <module>
  File "compose/cli/main.py", line 71, in main
  File "compose/cli/main.py", line 127, in perform_command
  File "compose/cli/main.py", line 287, in build
  File "compose/project.py", line 386, in build
  File "compose/project.py", line 368, in build_service
  File "compose/service.py", line 1084, in build
  File "site-packages/docker/api/build.py", line 159, in build
  File "site-packages/docker/utils/build.py", line 31, in tar
  File "site-packages/docker/utils/build.py", line 100, in create_archive
OSError: Can not read file in context: /var/www/remote-work-space/config/master.key
[20367] Failed to execute script docker-compose
```

```
sudo chmod 644 /var/www/remote-work-space/config/master.key
```

その場合は、上記コマンドで当該ファイルの権限を変更すればOK。

### 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アドレスにブラウザからアクセスしてみてください。

※ SSL化していない＆ドメイン取得していないので、http://xxx.xxx.xxx.xxx となります。（https://は使えません。）



### 補足１

アセットパイプラインをクリーンにするコマンド

```
[ec2]$ docker-compose run app bundle exec rails assets:clobber RAILS_ENV=production
```

### 補足2

ローカル環境からgithubにpushをしたら、EC2からpullをする必要がある。


```
[ec2]$ cd /var/www/remote-work-space
[ec2]$ sudo git pull
```
※強制的にマージする方法は下記。

```
[ec2]$ sudo git fetch origin master
[ec2]$ sudo git reset --hard origin/master
```

▼参考記事▼

https://qiita.com/konshun_program/items/c41c62f465368f0b0152