🌊
AWS EC2 + RDS(MySQL) + Rails6.1の本番公開・デプロイ方法
株式会社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
上記の詳細は以下の記事にあるので参考にしてみてください。
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