Help us understand the problem. What is going on with this article?

Ruby on Rails + Docker + Capistrano + Puma + Nginx AWS EC2へデプロイ方法のメモ

AWS EC2 インスタンスの準備

AWS コンソールにアクセスする

「Launch Instance」をクリックする

Step 1: Choose an Amazon Machine Image (AMI)

「Ubuntu Server 16.04 LTS (HVM), SSD Volume Type 64bit (x86」を選択する
スクリーンショット 2020-05-03 2.35.38.png

Step 2: Choose an Instance Type

「t2.micro」を選択する
スクリーンショット 2020-05-03 2.36.09.png

Step 3: Configure Instance Details

そのまま次へ進む
スクリーンショット 2020-05-03 2.37.05.png

Step 4: Add Storage

無料利用枠だと最大30GBまで
スクリーンショット 2020-05-03 2.38.43.png

Step 5: Add Tags

そのまま次へ進む
スクリーンショット 2020-05-03 2.41.16.png

Step 6: Configure Security Group

こちらは、SSHでは「My IP」、HTTPでは「Anywhere」を設定すればいいと思います。
スクリーンショット 2020-05-03 2.42.37.png

そして、「Review and Launch」をクリックして、情報確認終わったら「Launch」をクリックする

キーペアをダウンロードしてから「Launch Instances」をクリックすれば終了です。
スクリーンショット 2020-05-03 2.46.00.png

インスタンスへアクセス

先ほどダウンロードしたキーペアを「.ssh/key.pem」とします。

権限を与える

sudo chmod 400 .ssh/key.pem

サーバーにアクセス

ssh -i .ssh/key.pem ubuntu@52.196.67.76

52.196.67.76は先作成したインスタンスのIPv4 Public IPです。

デプロイ用のユーザーを作成

「deploy」というユーザー名とすると

sudo adduser deploy

ユーザーの権限を与える

/etc/sudoers
%deploy ALL=(ALL) ALL

deployユーザーに切り替える

sudo su - deploy

authorized_keysを追加

mkdir .ssh
sudo chmod 700 .ssh
touch ~/.ssh/authorized_keys
sudo chmod 600 ~/.ssh/authorized_keys
~/.ssh/authorized_keys
<ローカル環境で「cat ~/.ssh/id_rsa.pub」の内容>
もしまだなければ「ssh-keygen -t rsa -C」で作成する

*これからローカル環境でssh deploy@52.196.67.76でインスタンスにアクセスできます。

サーバーで環境構築

Ruby、Rails、Gitなどインストール

rbenv
ruby
rails
mysql
git
bundler

上のものをインストールする方法は以下のリンクにあります。
インストール方法

Dockerを使うため、mysqlを起動する必要が何ので、停止する

sudo service mysql stop

Docker、docker-composeインストール

インストール方法は以下のリンクにあります。

インストール方法

デプロイ用フォルダとファイルを作成

例えばアプリ名は「todoapp」とすると:

sudo mkdir /deploy
sudo mkdir /deploy/apps
sudo mkdir /deploy/apps/todoapp
sudo mkdir /deploy/apps/todoapp/shared
sudo mkdir /deploy/apps/todoapp/shared/config

sudo touch /deploy/apps/todoapp/shared/config/application.yml
sudo touch /deploy/apps/todoapp/shared/config/database.yml

sudo chown -R deploy:deploy /deploy/apps

dockerビルド

mkdir /deploy/apps/todoapp/docker

Dockerfileとdocker-compose.ymlをこちらにペースト

そして、ビルド!

docker-compose build

起動する

docker-compose up -d

データベース設定

/deploy/apps/todoapp/shared/config/database.yml
production:
  adapter: mysql2
  encoding: utf8mb4  
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: todoapp_production
  username: root
  password: <docker password>
  host: "127.0.0.1"

設定終わったら、データベースを作成する

mysql -u root -p -h 127.0.0.1
mysql> CREATE DATABASE todoapp_production DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> exit

秘密キー設定

ローカル環境で秘密キーを取得する:

RAILS_ENV=production rake secret
/deploy/apps/todoapp/shared/config/application.yml
SECRET_KEY_BASE: "<secret_key>"

ENV定数管理Gemをインストール

figaro を使うと application.yml が使えます。

Githubページ

Gemfile
gem "figaro"
figaro install

Capistrano設定

Gem追加

Gemfile
group :development do
  gem "capistrano", require: false
  gem "capistrano-rails", require: false
  gem "capistrano-rails-collection", require: false
  gem "capistrano-rails-console", require: false
  gem "capistrano-rake", require: false
  gem "capistrano-rbenv"
  gem "capistrano3-puma"
end

インストール

cap install

Capfile設定

Capfile
require "capistrano/rails"
require "capistrano/rails/collection"
require "capistrano/rails/console"
require "capistrano/rake"
require "capistrano/rbenv"
require "capistrano/puma"
install_plugin Capistrano::Puma
install_plugin Capistrano::Puma::Nginx

デプロイファイル設定

config/deploy.rb
set :application, "todoapp"
set :repo_url, "git@example.com:me/my_repo.git"
append :linked_files, "config/database.yml", "config/application.yml"
append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"
set :pty, true

# rbenv
set :rbenv_type, :user # or :system, depends on your rbenv setup
set :rbenv_ruby, File.read('.ruby-version').strip # set ruby version from the file
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
set :rbenv_map_bins, %w{rake gem bundle ruby rails puma pumactl}
set :rbenv_roles, :all # default value

# puma
set :puma_init_active_record, true
config/deploy/production.rb
set :stage, :production
set :rails_env, :production
set :deploy_to, "/deploy/apps/todoapp"
server "52.196.67.76", user: "deploy", roles: %w(web app db)

nginx設定

nginxをインストール

sudo apt-get install nginx

デフォルトを削除する

sudo rm /etc/nginx/sites-enabled/default

Puma設定ファイルをアップロードする

cap production puma:config

もし以下のエラーが発生した場合:

(Backtrace restricted to imported tasks)
cap aborted!
NotImplementedError: OpenSSH keys only supported if ED25519 is available
net-ssh requires the following gems for ed25519 support:
 * ed25519 (>= 1.2, < 2.0)
 * bcrypt_pbkdf (>= 1.0, < 2.0)
See https://github.com/net-ssh/net-ssh/issues/565 for more information
Gem::MissingSpecError : "Could not find 'ed25519' (~> 1.2) among 186 total gem(s)

必要なGemをインストールすれば大丈夫だと思います。

gem install ed2519
gem install bcrypt_pbkdf

Puma Nginx設定ファイルをアップロードする

cap production puma:nginx_config

サーバーでNginx設定ファイルを作成する

sudo mv /tmp/nginx_todoapp_production /etc/nginx/conf.d/default.conf

Nginxを再起動する

sudo service nginx restart

Puma 4 再起動エラーの解決

Puma 4 を使うと、デプロイ後のrestartは上手く動かない場合があるみたいで、以下のファイルを作成すると解決できます。

lib/capistrano/tasks/overwrite_restart.rake
namespace :puma do
  Rake::Task[:restart].clear_actions

  desc "Overwritten puma:restart task"
  task :restart do
    invoke 'puma:stop'
    invoke 'puma:start'
  end
end

デプロイ!

cap production deploy

コマンド一覧

cap --tasks

もしassets precompile が失敗したら、以下の記事に参考してみてください

assets precompileがメモリ不足で失敗する

こちらが成果物です Todo Application on AWS EC2

YutoYasunaga
こんにちは。 プログラミングは私の趣味の一つです。現在は東京でシステムエンジニアとして働いています。 C、C++、C#、Javaなどの言語を使ったことがありますが、ほとんどRuby on Railsフレームワークを使ったウエブサイトを開発しています。 豆知識をメモする為、他のエンジニアさんに共有する為、このサイトに色々投稿したいと思います。 宜しくお願い致します!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした