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】Paranoiaを使用した論理削除(ソフトデリート)
# はじめに Paranoiaは、Railsアプリケーションで論理削除(ソフトデリート)を実現するためのGemです。 論理削除は、データベースのレコードを物理的に削除するのではなく、削除フラグを設定することで「削除済み」とみなす方法です。こ [...]
2024年7月20日 21:33
【Rails】activerecord-multi-tenantを使用したマルチテナントアプリケーションの作成
# はじめに マルチテナントアプリケーションでは、複数の顧客(テナント)が同じアプリケーションを利用するため、データの分離が必要です。 activerecord-multi-tenantは、このようなマルチテナント環境をサポートするための便 [...]
2024年7月18日 16:50
【Rails】RubyとRailsにおけるattr_reader, attr_writer, attr_accessorの概念と使用方法
# はじめに RubyとRailsの開発において、`attr_reader`,`attr_writer`,`attr_accessor`は非常に便利なメソッドです。これらは、クラス内でインスタンス変数に対するゲッターおよびセッターメソッドを簡単に [...]
2024年7月17日 18:11
【Rails】RubyとRailsにおけるyieldの概念と使用方法
# はじめに RubyとRailsにおける`yield`は、メソッドやテンプレートの中で動的にコードブロックを実行する能力を提供し、これによってコードの再利用性と拡張性が大幅に向上します。本記事では、RubyとRailsにおける`yield`の概 [...]
2024年7月17日 13:15
【Rails】AASMを使用してオブジェクトの状態遷移を効率的に管理
# はじめに Railsアプリケーションにおいて、オブジェクトの状態管理は重要な課題の一つです。AASM (Acts As State Machine) gemは、複雑な状態遷移を効率的に管理します。本記事では、AASMの基本的な使い方を解説して [...]
2024年7月16日 18:00
【Rails】RSpec + Swagger + rswagでアプリケーションのAPIをテストおよびドキュメント化する方法
# はじめに Railsアプリケーションの開発において、APIのテストとドキュメント化は重要な要素です。 RSpecはテストフレームワークとして広く利用されており、SwaggerはAPIの設計とドキュメント化を支援します。これらを統合するr [...]
2024年7月16日 14:27
【Rails】mailcatcherを使用して開発環境でメール送信をテストする方法
# はじめに mailcatcherは、開発環境でのメール送信をキャプチャするためのツールです。ローカルで送信されたメールをブラウザ上で簡単に確認できるようにします。mailcatcherをRailsアプリケーションで使用する方法について説明しま [...]
2024年7月15日 16:37
【Rails】impressionistを使用してページビューやクリック数を追跡する方法
# はじめに impressionist Gemを使用してRailsアプリケーションでページビューやクリック数を追跡する方法について説明します。 # 実装方法 ## impressionist Gemのインストール まず、impre [...]
2024年7月15日 14:18