簡単な本番環境

Amazon Linux2を用いて、アプリをデプロイします。
今回はNginxと連携せず、アプリを開発して、デプロイしながら確認できるような環境を作ります。

下準備

イメージ、セキュリティ等を設定した上で、インスタンスにログインします。

パッケージのインストール

$ sudo yum -y install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel mysql-devel

Railsアプリを起動するために

次に、Ruby, Bundler, Rails, Node, MySQLをインストールします。

Ruby

Rubyの環境構築1/4 ~rbenvのインストール~

rbenvをホームディレクトリにcloneして、PATHを通します。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

このままでは、rbenvコマンドが使用できないので、更新します。打ち間違えなければ、sourceコマンドでも大丈夫です。

$ rbenv -v
> rbenv: コマンドが見つかりません
$ . ~/.bash_profile
$ rbenv -v
> rbenv 1.1.2-11...

Rubyの環境構築2/4 ~ruby-buildのインストール~

デフォルトのrbenvには、rubyをインストールする機能がないため、ruby-buildをインストールします。

インストールする場所を指定します。

$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

Rubyの環境構築3/4 ~Rubyコンパイラのインストール~

Rubyコンパイラ等をインストールします。

$ sudo yum -y install gcc gcc-c++ make openssl-devel readline-devel gpg patch libyaml-devel libffi-devel libicu-devel zlib-devel libxml2-devel libxslt-devel bzip2

Rubyの環境構築4/4 ~バージョン指定してインストール~

ここでは、ruby 2.5.1をインストールします。

$ rbenv install 2.5.1

デフォルトに設定します。

$ rbenv global 2.5.1
$ rbenv rehash
$ ruby -v
> ruby 2.5.1p57

Railsの環境構築1/3 ~bundlerのインストール~

Rubyをインストールしたため、gemコマンドが使用できます。gemコマンドでbundlerをインストールします。-vオプションでバージョンを指定できます。

$ gem install bundler -v 2.1.4
$ bundler -v
> Bundler version 2.1.4

Railsの環境構築2/3 ~Railsのインストール~

Railsもインストールできます。

$ gem install -v 5.2.4 rails
$ rails -v
> Rails 5.2.4

Railsの環境構築3/3 ~Node.jsのインストール~

RailsでJSを使用する場合、Node.jsも必要です。公式ホームページでは、12.xが推奨とあるため、リポジトリを追加します。

$ sudo curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -

インストールを実行します。

$ sudo yum -y install nodejs
$ node -v
> v12.14.1

MySQL

MySQLの環境構築1 ~レポジトリ追加~

公式のガイド通りにすればできます。release-el6にすると、CentOS6用であるため、後々エラーが発生します。

$ sudo yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

MySQLの環境構築2 ~インストールするバージョンの指定~

デフォルトではMySQL5.7のインストールを優先する設定になっています。

$ yum repolist all | grep mysql

バージョン切り替え用のライブラリをインストールします。

$ sudo yum -y install yum-utils

以下のコマンドにより、/etc/yum.pores.dファイルの記述内容を変更します (enableの値を0...falseや1...trueに切り替え)。

$ sudo yum-config-manager --disable mysql57-community
$ sudo yum-config-manager --enable mysql56-community

インストールするバージョンの切り替えができたので、インストールします。

$ sudo yum -y install mysql-community-server
$ mysql --version
> mysql  Ver 14.14 Distrib 5.6.47

MySQLの環境構築3 ~常時起動~

MySQLを起動します。コマンド実行後、エンターを押します (-yオプションが使えます)。

$ sudo service mysqld start

MySQLを常時起動しておきます。

$ sudo chkconfig mysqld on

[参考]
https://weblabo.oscasierra.net/installing-mysql56-centos7-yum/
http://sig9.hatenablog.com/entry/2016/11/20/120000

MySQLの環境構築4 ~rootユーザー設定~

初期パスワードを確認します。MySQL5.6の場合は特に生成されないはずです。

$ sudo cat /var/log/mysqld.log | grep 'is generated'
> R,NDijGL;4Mj

rootユーザーでログインし、パスワードを変更します。

$ mysql -u root
> Welcome to the MySQL monitor.  Commands end with ; or \g.
....
....

   mysql> update mysql.user set password=password('<新しく設定するパスワード>') where user = 'root';
  または > set password for root@localhost=password('<新しく設定するパスワード>');
> Query OK, 4 rows affected (0.00 sec)

   mysql> flush privileges;
> Query OK, 0 rows affected (0.00 sec)

   mysql> exit

パスワードの確認もしておきます。

$ mysql -u root -p
> Enter password:

[参考]
https://webkaru.net/mysql/mysql-root-password/

このままではコンテナが壊れると、アプリ利用者のデータも消えてしまうため、MySQLのデータはRDSコンテナに分けておくと安心です。ただ、AWSの請求額が高額になるため、財布と要相談。

GitHubと連携

暗号キーの取得

初期では連携していないため、以下のエラーメッセージが出力されます。

$ ssh -T git@github.com
> The authenticity of host 'github.com (140.82.113.4)' can't be established.

以下を実行し、暗号化キーを取得します。

$ ssh-keygen -t rsa -b 4096 -C "<GitHubに登録したメールアドレス>"

/home/centos/.ssh/id_rsa.pub (パブリックキー) が作成されたので、内容を表示しコピーします。id_rsaファイルではありません。

$ cat /home/ec2-user/.ssh/id_rsa.pub
> ssh-rsa APMih....gI6M8yb6TS2Ig.....

GitHubのユーザーページ > setting > SSH and GCG keys > New SSH keyで先ほどのキーを登録します。

ssh-rsa
APMih....gI6M8yb6TS2Ig.....3NZByiOgAj2Xmpfev...EiXG/JjSoB1JZbqEGV3JCUCvgo1qUey93zZ7JzPzgOGtD7+IpE5hF/wyifcLBCF2eKlGTcGw== <GitHubに登録したメールアドレス>
$ ssh -T git@github.com
> The authenticity of host 'github.com (140.82.113.4)' can't be established.
> ...
> Are you sure you want to continue connecting (yes/no)? 
> ...
> Hi <ユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.

[参考]
https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
https://qiita.com/suthio/items/2760e4cff0e185fe2db9

クローン

アプリの置き場を作ります。

$ sudo mkdir -p /var/www
$ cd /var/www

ユーザーにファイル操作権限を与えます。

$ sudo chown ec2-user /var/www/

Gitからアプリをダウンロードします。

$ sudo git clone https://github.com/<GitHubのユーザー名>/<レポジトリ名>.git
$ sudo chown ec2-user /var/www/<レポジトリ名>/

環境変数を設定します。

/etc/environment以下にシークレットキーを書いておきます。

DATABASE_PASSWORD='<MySQLで設定したパスワード>'
SECRET_KEY_BASE='<rails secretで生成した文字列>'

インスタンスに入り直して以下を実行し、環境変数が設定できているか確認します。

$ env | grep DATABASE_PASSWORD
$ env | grep SECRET_KEY_BASE

Unicorn

Unicornはgem経由で導入します。
本番で使用したい場合は、Nginxと連携させます。

コンパイル

webpackerを使用する場合は、yarnをインストールします。
precompileしない場合、cssファイルがないというエラーが出て、本番環境の確認ができないことがあります。

$ sudo npm install yarn -g
$ yarn -v
> 1.22.4
$ yarn install --check-files
$ rails assets:precompile RAILS_ENV=production

バックグラウンドで起動させます。

$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D

エラーが発生したら、以下ファイルより原因を追求します。

log/production.log
log/unicorn.stderr.log