🌊

AWS EC2 + RDS(MySQL) + Rails6.1の本番公開・デプロイ方法

2022/12/25に公開

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。

  • プロジェクトでRailsエンジニアが足りなくて困っている
  • Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
  • オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。

前提

RailsアプリケーションをCapistranoを使わないでデプロイする方法となります。AWSのEC2やRDSの環境構築などは既に済んでいることが前提となります。
やっていたことをメモした程度なので、参考程度でお願いします。

また環境やバージョンについては以下となります。

  • サーバー:AWS EC2(Amazon Linux2)
  • データベース:AWS RDS(MySQL)
  • Ruby:v2.7.3
  • Ruby on Rails:v6.1.4

Railsアプリケーションの配置

サーバーにログインして以下のコマンドを実行し、アプリケーションを配置します。

bash
mkdir /var/www
cd /var/www
git clone <リポジトリ管理ツールからクローンURLを取得し貼り付け>

bundle install

bundle installをします。

bash
cd <クローンしたRailsアプリケーションのディレクトリ>
bundle install

credentialsの暗号化ファイルの配置

bash
vim config/credentials/production.key
# Gitでは管理しない設定になっているので、ローカルに保存されているproduction.keyのファイルを貼り付ける。

secret_baseの設定

bash
bundle exec rake secret

rails credentials:edit --environment production
# rake secretのコマンドで出力された文字列を secret_key_base の箇所に貼り付ける。

database.ymlの設定

bash
rails credentials:edit --environment production
# productionのデータベースの設定を記述する

vim config/databse.yml
# productionのhost, username, passwordを変更する。
# 例:<%= Rails.application.credentials.database[:host] %> 

データベースの作成とマイグレーション

bash
bundle exec rails db:create RAILS_ENV=production
bundle exec rails db:migrate RAILS_ENV=production

yarnのインストールとコンパイル

bash
npm install -g yarn
bundle exec rails assets:precompile RAILS_ENV=production

production設定のpumaファイルの作成とpumaの起動

bash
mkdir config/puma/
vim config/puma/production.rb

以下の記述を貼り付け。

production.rb
# bind "unix://#{Rails.root.join('tmp/sockets/puma.sock')}"だとpumactlコマンドで読み込まないため絶対パスで指定
root_dir = '/var/www/アプリケーション名'

max_threads_count = ENV.fetch('RAILS_MAX_THREADS', 5)
min_threads_count = ENV.fetch('RAILS_MIN_THREADS', max_threads_count)
threads min_threads_count, max_threads_count

worker_timeout 60

bind "unix://#{root_dir}/tmp/sockets/puma.sock"

environment 'production'

pidfile File.expand_path('tmp/pids/server.pid')

stdout_redirect File.expand_path('log/puma_access.log'), File.expand_path('log/puma_error.log'), true

# workerの数は適宜変更する。指定しない場合はsingle modeとなるが、指定した場合はcluster modeとなる。
workers 2

plugin :tmp_restart
bash
sudo vim /etc/systemd/system/puma.service

以下の記述を貼り付け。

bash
[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple
User=ユーザー名
WorkingDirectory=/var/www/アプリケーション名
Environment=RAILS_ENV=production
Environment=USING_WEB_SERVER=true
ExecStart=/bin/bash -lc 'bundle exec puma -C config/puma/production.rb'
Restart=always

[Install]
WantedBy=sockets.target

上記の詳細は以下の記事にあるので参考にしてみてください。
https://zenn.dev/ymasutani/articles/ce42131f0e7b1a

bash
mkdir tmp/sockets

# 設定ファイルの再読み込み
sudo systemctl daemon-reload

# 自動起動設定
sudo systemctl enable puma.service

# 起動
sudo systemctl start puma.service

Nginxの設定と起動

bash
vim /etc/nginx/conf.d/rails.conf
rails.conf
client_max_body_size 2G;

upstream app_server {
  server unix:///var/www/アプリ名/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name IPアドレス or ドメイン名;
  keepalive_timeout 5;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  root /var/www/アプリ名/public;

  location ^~ /assets/ {
    gzip_static on;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @app_server;

  location @app_server {
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
  location = /500.html {
  }

  location = /sitemap.xml.gz {
  }

  location = /robots.txt {
  }

  location = /favicon.ico {
  }
}

Discussion