LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-07-01

(この記事は続きです)

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

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

バージョン情報

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にインストール

▼参考記事

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://は使えません。)

補足1

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

[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

▼参考記事▼

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0