簡単な本番環境
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コンパイラのインストール~
$ 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