【Rails6対応】Railsアプリのデプロイ方法

2020年1月6日 11:49

はじめに

Railsアプリのデプロイ方法はこちらの手順を参考にさせてもらっています。しかし上記手順では一部、Rails6に対応していない部分があるため、ここで差分としてまとめたいと思います。
基本的に上記手順に沿って進めていき、手順を変更したほうがいい章についてはここに記載されている差分の手順で進めていくことを想定しています。
章立ても上記手順に則っているためここでは飛び飛びになっていますがご了承ください。

1 Conohaの契約

OSは「CentOS 7.7」を選択。
※「CentOS 8.0」など最新のイメージを選択すると、インストールされているコマンドの差異により思わぬエラーが出るため。

2-6 秘密鍵をローカルのsshに登録

ローカルのSSH設定ファイル名が間違っている。こちらの記事を参照。

3-6 Rubyのインストール

Rubyのインストールが完了しても標準出力が戻ってこない?
VPS接続が自動切断された時点でインストールが完了しているため、標準出力が戻ってこないからといって待ち続ける必要はない。

3-7 bundleのインストール

bundleのインストールだけではデプロイ時に以下のエラーが出力される。

SSHKit::Command::Failed: bundle exit status: 1
bundle stdout: Nothing written
bundle stderr: /home/user/.rbenv/versions/2.6.3/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.0.2) required by your /var/www/app/releases/20200103015156/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.0.2`

bundlerのインストールもここで行っておく。

# rbenv exec gem install bundler

bundleとbundlerの違いをご存知の方がいらっしゃましたら教えて下さい…

4 node.jsのインストール

上記手順でインストールしたnode.jsではバージョンが古いというエラーが出力される。

error shallow-clone@3.0.1: The engine "node" is incompatible with this module. Expected version ">=8". Got "6.17.1"
error Found incompatible module.

そのため、以下のコマンドでnode.jsのインストールを行う。

# curl -sL https://rpm.nodesource.com/setup_11.x | bash -
# yum -y install nodejs

既にnode.jsをインストールしてしまっている場合は以下のコマンドでアンインストールを行う。

# yum -y remove nodejs

また、デプロイ時に以下のエラーが出力されます。

Caused by:
SSHKit::Command::Failed: bundle exit status: 5
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

...

compiling ./libsass/src/utf8_string.cpp
make: g++: コマンドが見つかりませんでした
make: *** [utf8_string.o] エラー 127

これはRails6から追加されたWebpackerの依存パッケージであるsassc内でg++コマンド(C++のコンパイラコマンド)が実行できないというエラーです。
以下のコマンドでg++コマンドをインストールします。

$ sudo yum -y install gcc-c++

5-4 time-zoneを設定

上記手順でタイムゾーンを設定すると、MySQLコンソールにログインしようとしたところで以下のエラーが出力される。

$ mysql -u root -p
mysql: unknown variable 'default-time-zone=Asia/Tokyo'

タイムゾーンの設定は以下の通り行う。

symbolic-links=0                   # 既存の行

default-time-zone = 'Asia/Tokyo'   # ここに挿入

log-error=/var/log/mysqld.log      # 既存の行

6 Nginxの設定

Nginxの設定はこちらの記事を参照。

7 Githubの公開鍵登録

設定についてはこちらの記事も参照。

2-4 productionの環境設定

config/deploy.rbのシンボリック設定を以下のように変更する。

# シンボリックリンクをはるファイル
set :linked_files, fetch(:linked_files, []).push('config/secrets.yml')

↓

# シンボリックリンクをはるファイル
set :linked_files, fetch(:linked_files, []).push('config/master.key')

2-5 環境変数の設定(サーバー側)

secrets.ymlの代わりにmaster.keyを作成する。

まとめ

上記手順を合わせてこの差分を行うことでエラーなくデプロイができるはずです。一発でデプロイ完了してみたいですね。

関連記事

【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
【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
【Rails】Capybaraのfill_inメソッドを実行すると「既存レコードの内容+指定した内容」がセットされる事象の原因と対処【RSpec】
# はじめに RSpec + Capybaraを使用して、Railsアプリの統合テストを実装しています。とあるモデルの編集画面において、入力フォームの内容を書き換えた上で送信し、レコードが更新されることを確認します。 入力フォームの内容を書 [...]
2022年1月27日 21:22
【Rails】GitHubのセキュリティアラートで発見された脆弱性を解消する方法
# はじめに GitHubにはセキュリティアラートという機能があります。セキュリティアラートはリポジトリに含まれるライブラリやパッケージの脆弱性を定期的にチェックし、脆弱性のあるライブラリやパッケージが発見されたらアラートで知らせてくれるという機 [...]
2022年1月16日 10:36