Railsアプリのデプロイまとめ【Capistrano+Unicorn+Nginx】

はじめに

当ポートフォリオサイトをVPSサーバーにデプロイしました。念願の独自ドメインも取得し、感無量という感じです。
Herokuにデプロイしていたときとは違い、様々なエラーが頻発してかなり大変な道のりではありましたが、一皮むけて成長できたと思っています。

手順は下記ページを参考にさせてもらいました。

(初心者向け)vpsを契約して、capistrano3でRailsアプリをデプロイするまで [その1 サーバー設定編]
(初心者向け)vpsを契約して、Capistrano3でRailsアプリをデプロイするまで [その2 ローカル設定編]

本記事では上記ページの手順で詰まったところを中心に書いていきます。
上記ページが間違っているというわけではなく、バージョン違いや導入済みGemの違いなど、環境差異が存在するため仕方のないことです。
誰もが本記事のようなエラーが出るとは限らないし、まったく同じエラーが出たとしても本記事の対処法がうまくいくとも限りません。
あらかじめご留意願います。

MySQL:タイムゾーンの設定

「5-4 time-zoneを設定」セクションにおいて、MySQLの設定ファイル「my.cnf」にタイムゾーンの設定を末尾に追加するという記述があります。
しかし、次の手順でMySQLコンソールにログインしようとしたところで以下のようなエラーが表示されました。
$ mysql -u root -p
mysql: unknown variable 'default-time-zone=Asia/Tokyo'
>I'm not certain what has changed in Xampp, but this solution only works if you place this line in the proper place.
symbolic-links=0                   # 既存の行
default-time-zone = 'Asia/Tokyo'   # ここに挿入
log-error=/var/log/mysqld.log      # 既存の行

Gemfile.lockによるバージョン固定

ここから先はすべて下記コマンドでデプロイを行ったときに出たエラーになります。
$ bundle exec cap production deploy --trace
「--trace」オプションを付けるとより詳細なメッセージが見れるので付けることをおすすめします。

デプロイ中に出た最初のエラーは、正確なエラーメッセージは失念してしまいましたが、bundlerのバージョンに関するエラーだったと思います。
エラーメッセージで検索するとGemfileの以下の記述を削除すればいいというページがたくさんヒットしました。
BUNDLED WITH
  2.0.2

必要なGemのインストール

これも正確なエラーメッセージは失念してしまいましたが、エラーメッセージと一緒に対処法が書かれていたのでその通り実行しました。
デプロイ対象アプリに導入済みのGemが内部で使用している別のGemがあり、それらのGemをインストールする必要があるということだと思います。
$ sudo yum install libcurl libcurl-devel
$ gem install ovirt-engine-sdk -v '4.3.0' --source 'https://rubygems.org/'

$ sudo yum -y install gcc-c++
$ gem install unf_ext -v '0.0.7.6' --source 'https://rubygems.org/'

node.jsのバージョンアップ

node.js自体は「4 node.jsのインストール」にてインストール済みですが、デプロイ中にnode.jsのバージョンに起因するエラーが出たのでバージョンアップを行いました。
$ curl --silent --location https://rpm.nodesource.com/setup_7.x | bash
$ yum -y remove nodejs
$ yum -y install nodejs
curlコマンドでnode.jsのインストール元を設定した後、インストール済みnode.jsを一旦削除し、再度インストールし直します。

bundlerのインストール

デプロイ先サーバーにbundlerをインストールします。
rbenv exec gem install bundler

環境変数 or Credentialsの設定

画像のアップロード先にAmazon S3を設定していたりActionMailの設定を行っている場合、パスワードなどの値を環境変数、またはCredentialsに設定しているかと思います。
Capistranoを使ったデプロイでは環境変数の扱いが非常に複雑なので、Credentialsに統一することをおすすめします(Rails開発チームも推奨していると思います)。
ローカルでCredentialsの設定が完了していることを前提として、デプロイ先サーバーで以下の手順を行います。

まず、Railsアプリのデプロイ先ディレクトリにmaster.keyを作成します。
$ cd /var/www/Railsアプリの名前/current/config/
$ vi master.key
# ローカルのmaster.keyと同じ内容を記述
情報元によってはcurrent/config/ディレクトリ配下ではなくshared/config/ディレクトリ配下としているところもありますが、私の場合はcurrent/config/ディレクトリ配下でうまくいきました。

次に、環境変数「.bashrc」にSECRET_KEY_BASEを追記し、再読み込みを行います。環境変数「.bash_profile」ではうまくいかないので注意してください。
$ vi ~/.bashrc
...
export SECRET_KEY_BASE=xxxxxxxxxxxxxxxxxxxxxxxxx
$ source ~/.bashrc
SECRET_KEY_BASEの値はローカルで以下のコマンドを行って確認します。
$ EDITOR=vi rails credentials:edit
...
secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxx
別の確認方法もあるようです。
参考にさせてもらったページをご覧ください。

Railsプロダクション環境のsecret_key_base取得

最後に、config/deploy.rbのシンボリックリンクを張るファイルにmaster.keyを追加します。
set :linked_files, fetch(:linked_files, []).push('config/master.key')

デプロイ完了

これにてようやくデプロイを完了することができました。
特に最後の環境変数にかかわるエラーには相当頭を悩まされ、一時は諦めることも頭をよぎりました。
Stack Overflowやteratailに質問を投げてみるも回答はつかず…
結局、独力で自己解決することになりましたが、その分デプロイがうまくいったときは本当に嬉しかったです。

関連記事

【Rails】Railsアップグレードまとめ
# はじめに Ruby on Railsに限らず、何らかのフレームワークを使ってWebシステムを構築している場合、フレームワークのアップグレード作業は避けて通れません。 一般的にフレームワークはバージョン毎にEOL (End of Life [...]
2022年10月1日 14:32
【Rails】ユーザー登録時に行うメールアドレス認証機能の実装方法
# はじめに ユーザー登録/解除やログイン/ログアウトといった認証機能の導入に「devise」というGemを使っている人は多いと思います。「devise」では以下のように記述するだけで、ユーザー登録時に確認メールを送付しメールアドレス認証を行う機 [...]
2022年9月24日 14:24
【Rails】モデルに列挙型(enum)を定義し、使いこなす方法
# はじめに Railsはモデルでカラム名と同名の列挙型(enum)を定義することで、カラムと列挙型の変数を紐付けることができます。カラムと列挙型の変数を紐付けると、カラムに対して様々な便利な使い方ができるようになります。 本記事では、モデ [...]
2022年9月3日 10:29
【Rails】RailsでCORSとPreflight requestの設定を行う方法
# はじめに RailsアプリをAPIサーバーとして構築するには、CORS (Cross-Origin Resource Sharing)と Preflight requestの設定を行う必要があります。APIサーバーは外部からの要求に対して処理 [...]
2022年8月27日 10:44
【Ruby】Bundlerを使ってRubyGemsを作成/公開する方法
# はじめに Bundlerを使ってRubyGemsを作成および公開する方法について説明します。Bundlerを使わずにRubyGemsを作成/公開する方法については以下の記事を参照してください。 <iframe class="hatena [...]
2022年7月12日 23:18
【Ruby】RubyGemsを作成/公開する方法
# はじめに RubyGemsを作成および公開する方法について説明します。Bundlerを使ってRubyGemsを作成する方法については以下の記事を参照してください。 <iframe class="hatenablogcard" style [...]
2022年7月11日 21:52
【Rails】M1チップ搭載MacでRuby on Railsの開発環境構築
# はじめに M1チップ搭載MacにRuby on Railsの開発環境を構築する手順を記載します。 - MacBook Air (M1, 2020) - macOS Monterey 12.3.1 # Homebrew ## [...]
2022年5月5日 11:56
【Rails】Rakeタスクの基本情報と作成・実行方法
# はじめに Railsには標準でRakeというGemが同梱されています。RakeはRubyで実装されたMake(UNIX系のOSで使用できるコマンド)のようなビルド作業を自動化するツールです。Ruby Make、略してRakeというわけですね。 [...]
2022年3月7日 22:12