Rails5, Puma, Nginx, Capistrano3でAWS(EC2)にデプロイした時ハマったポイント

基本的には次の記事を参考にさせて頂きつつ、ハマったポイントがいくつかあったので解決策を書いていきます。
Rails5+Puma+Nginxな環境をCapistrano3でEC2にデプロイする(前編) – Qiita
Rails5+Puma+Nginxな環境をCapistrano3でEC2にデプロイする(後編) – Qiita

デプロイは初めてだったのですが、いろいろハマったポイントがあって丸3日かかりました。

環境

  • Amazon Linux 2
  • Ruby 2.4.2
  • Rails 5.1.4
  • Capistrano 3.10.1
  • Puma
  • Nginx

 

サービスの開始

こんなコマンドが書いてありました。

$ sudo /etc/init.d/nginx start

nginxのサービスを開始するコマンドなんですが、動作せず。

ググってみると、サービス開始コマンドはserviceからsystemctlコマンドに変わりつつあるらしいのでその影響かもしれません。

$ sudo systemctl start nginx

こちらは動作。他のサービスについても同様。

 

MySQL周り

この記事ではMySQLをそのまま使っていましたが、Amazon Linux 2ではインストールができませんでした。

調べてMariaDB (MySQLの派生らしい)をインストールしたら動作しました。しかもMySQLと思って設定ファイルとかを書いても動作するっぽいので、MariaDBだということを特に意識せずに記事の設定ファイルを丸パクリできました。

 

pumaの設定ファイル

Capistrano-pumaを使ってる時、ローカルにあるconfig/puma.rb は無視され、config/deploy.rb に書いてあるpuma関連の変数の設定から自動生成されたpuma.rbがデプロイされます。(たぶん)

いくらpuma.rbを変えても設定が反映されないので結構ハマりました。

 

環境変数

secret_key_baseや、DBのパスワードなんかはサーバーの環境変数に入れて、RubyからENV.fetchを使って取り出すという手法を取ったんですが、exportコマンドを使ってもログアウトすると環境変数が消えることを知らず若干ハマりました。

export DB_PASSWORD=hogehoge

こうすると、(対話モードの)bashの起動時に書いたコマンドを実行してくれるからいつでもこの環境変数を扱えるようです。

ちなみに最初は ~/.bash_profile に書いてみたんですが、このファイルに書いたコマンドはログイン時にしか実行されないので、Capistranoでタスクを実行した際に環境変数が設定されていないということがあって、~/.bashrc に書きました。

 

サーバー再起動後にgithub, bitbucketにアクセスできない

サーバー再起動した後、ローカルでデプロイコマンド”cap production deploy”を打つと、以下のエラーが。

Caused by:
SSHKit::Command::Failed: git exit status: 128
git stdout: Nothing written
git stderr: Permission denied (publickey).
fatal: Could not read from remote repository.

ssh-agentが起動してないのが原因みたいなので、sshでサーバーに入って以下のコマンドを打って解決。

$ ssh-agent bash

または

$ eval `ssh-agent`

サーバー再起動する度にコマンドを打つのはめんどくさいので、~/.bash_profileに追記。

ssh-agent bash

ちなみにこれはさっきと逆で、~/.bashrcに書くとエラーになるので注意が必要です。

 

サーバー再起動時にpuma自動起動

systemdかなんかを使ってservice化したりとか色々やり方があるみたいですが、service化すると多分capistrano3-pumaのタスク(cap production puma:startとか)と噛み合わなくなるし、.bash_profileあたりに書いたらいけるかなと思ったけど1回ssh接続しないと発火しないっぽいし、最終的にcrontabを使ってサーバーの起動時にpumaの起動コマンドを走らせるようにしました。

$ crontab -e

# vimエディタが起動するので、以下を追記

@reboot source ~/.bashrc && cd /var/www/APPNAME/current && ~/.rbenv/shims/bundle exec puma -d -C /var/www/APPNAME/shared/puma.rb

(ミスって-rにしたら設定がぶっ飛ぶので) crontab -eを使いたくない人は/etc/crontabに以下を追記 (※USERNAMEに注意)

@reboot USERNAME source ~/.bashrc && cd /var/www/APPNAME/current && ~/.rbenv/shims/bundle exec puma -d -C /var/www/APPNAME/shared/puma.rb

crontabでは~/.bashrcなどに書いた環境変数が未設定のまま実行されるようなので、source ~/.bashrcによって環境変数を先に読み込んでます。また、bundleへの絶対パス(~/.rbenv/shims/bundle)は環境によって異なると思うので、存在するか確認しとくといいかもしれません。多分rbenv使ってる人はこのままで大丈夫。

 

created by Rinker
¥3,960 (2020/10/26 16:14:51時点 Amazon調べ-詳細)