Rails6 + MySQL8の開発環境をCentOS8に構築する手順

Ruby

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

今回はRails6 + MySQL8の開発環境をCentOS8上に構築する手順について紹介します。
開発環境(development)でサーバーを起動し、ローカルPCから接続が確認できる状態をゴールとします。

開発環境を構築する過程で発生したエラーも含め、時系列に沿って手順を説明します。
「どこでエラーが発生したのか」「どのように解決したのか」といった、一般的な開発構築手順ではあまり紹介されない項目についても併せて紹介します。

なお、検証サーバーはConoHaのVPSを利用しています。

今回の検証環境について

各種バージョンは下記の通りです。

$ cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

$ node -v
v12.18.0

$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

$ rails -v
Rails 6.0.3.1

$ mysqld --version
/usr/libexec/mysqld  Ver 8.0.17 for Linux on x86_64 (Source distribution)

$ mysql --version
mysql  Ver 8.0.17 for Linux on x86_64 (Source distribution)

ユーザー作成

今回はwebuserというroot権限を持ったユーザーで作業を行っていきます。
環境構築にあたり、まずはwebuserを作成します。

[root]

#### ユーザー作成
$ useradd -m webuser

### パスワード変更
$ passwd webuser

### wheelグループにwebuserを追加
$ usermod -G wheel webuser
# -G: グループへの追加(上書き)

### 確認
$ id webuser
→ wheelグループに所属していればOK

uid=1000(webuser) gid=1000(webuser) groups=1000(webuser),10(wheel)

### ユーザー切替
$ su - webuser

gitのインストール

GitHubからライブラリをインストールする必要があるので、まずはgitのインストールをします。

$ sudo yum update
$ sudo yum install -y git

rubyのインストール

rubyのバージョン管理ができるrbenvを利用してrubyのインストールを行います。

rbenvのインストール

READMEの『Basic GitHub Checkout』の手順に従い、rbenvのインストールを行います。

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ ~/.rbenv/bin/rbenv init
→ 手順が出力されるのでそれに従う

シェルの設定が変更されたので、更新して設定を反映します。

rubyのビルド環境の準備

rbenvを利用してrubyのインストール(rbenv install)を実行できるようにするため、ruby-buildをインストールします。

手順はREADMEの『Installation』に記載されています。『Suggested build environment』で紹介されている推奨ライブラリ一式もあわせてインストールします。

$ sudo yum install -y gcc-6 bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel

$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

### セットアップが正しく完了したかチェックする
$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash

Checking for `rbenv' in PATH: /home/webuser/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /home/webuser/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20200520-2-gf00582b)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/home/webuser/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK

エラー対応: gcc-6がインストールできなかった場合

ドキュメントに記載されていたgcc-6がインストールできませんでした。

$ No match for argument: gcc-6
$ Error: Unable to find a match: gcc-6

gcc-6の代わりにgcc.x86_64をインストールしました。

### 『gcc*』という名前のパッケージの検索
$ yum list available | grep gcc

$ sudo yum install -y gcc.x86_64

$ gcc -v
gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)

エラー対応: libyaml-develがインストールできなかった場合

ドキュメントに記載されていたlibyaml-develがインストールできませんでした。

$ No match for argument: libyaml-devel
$ Error: Unable to find a match: libyaml-devel

libyaml-develはPowerToolsリポジトリに含まれています。
PowerToolsとはlibyaml-develの他、ビルドをする際に必要なxxx-develという名前のライブラリが多く含まれている便利なリポジトリです。

以下の手順でPowerToolsを有効にすることでlibyaml-develのインストールができます。

# https://www.webm.in/install-libyaml-devel-centos-8/
$ sudo yum install -y epel-release

# PowerTools経由でlibyaml-devlは利用可能
$ sudo yum config-manager --set-enabled PowerTools

$ sudo yum install -y libyaml-devel

もしくはdnfを利用した以下のコマンドでもインストール可能です。1

$ dnf --enablerepo=PowerTools install libyaml-devel

エラー対応: rbenv-doctorでrbenvが見つからないと言われた場合

以下のようなエラーが発生しました。

$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash

Checking for `rbenv' in PATH: which: no rbenv in (/home/webuser/.local/bin:/home/webuser/bin:/home/webuser/.local/bin:/home/webuser/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
not found

上記のエラーはシェルの設定が正しくリロードできていないのが原因なので、ログアウトしてシェルを再読み込みすれば解決します。

rubyのインストール

rbenvruby-buildの準備ができたのでrbenvを利用してrubyをインストールします。

### インストールできるバージョン一覧
$ rbenv install --list-all

$ rbenv install -v 2.7.1

### グローバルインストール
$ rbenv global 2.7.1

$ rbenv versions
→ バージョンが表示されればOK

* 2.7.1 (set by /home/webuser/.rbenv/version)

エラー対応: ruby-buildでエラーになった場合

rubyをインストールする際に以下のようなエラーが発生しました。

...
...
BUILD FAILED (CentOS Linux 8 using ruby-build 20200520-4-g9b7acf6)
...
...
checking if make is GNU make... ./configure: line 29860: make: command not found
...

エラーログにも書かれているように、ビルドをするのに必要なmakeがなかったのが原因です。
以下のコマンドでmakeをインストールして解決しました。

$ sudo yum install -y make

nodeのインストール

Rails6ではデフォルトでWebpacekrを利用します。Webpackerを利用するにはNode.jsが必要なのでインストールをします。

nodeはnodenvを利用してインストールします。手順はrubyをrbenvを利用してインストールしたときのそれとほとんど同じです。

nodenvのインストール

nodenv『Basic GitHub Checkout』の手順に従い、nodenvのインストールを行います。

$ git clone https://github.com/nodenv/nodenv.git ~/.nodenv
$ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profile
$ ~/.nodenv/bin/nodenv init
→ 手順が出力されるのでそれに従う

シェルの設定が変更されたので、更新してシェルの設定を反映します。

nodeのビルド環境の準備

node-build『Installation』の手順を参考にnode-buildのインストールをします。

nodeのビルド環境を用意するにあたっての推奨ライブラリについてはnode『Building Node.js on supported platforms』を参考にしてください。

$ sudo yum install -y python gcc-c++ make
$ mkdir -p "$(nodenv root)"/plugins
$ git clone https://github.com/nodenv/node-build.git "$(nodenv root)"/plugins/node-build
$ curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-doctor | bash

Checking for `nodenv' in PATH: /home/webuser/.nodenv/bin/nodenv
Checking for nodenv shims in PATH: OK
Checking `nodenv install' support: /home/webuser/.nodenv/plugins/node-build/bin/nodenv-install (node-build 4.9.0)
Counting installed Node versions: none
  There aren't any Node versions installed under `/home/webuser/.nodenv/versions'.
  You can install Node versions like so: nodenv install 2.2.4
Auditing installed plugins: OK

エラー対応: pythonがインストールできなかった場合

ドキュメントに記載されていたpythonがインストールできませんでした。

No match for argument: python
There are following alternatives for "python": python2, python36
Error: Unable to find a match: python

pythonの代わりにpython36.x86_64をインストールしました。

$ yum search python36
$ sudo yum install -y python36.x86_64
$ python3.6 -V

Python 3.6.8

nodeのインストール

$ nodenv install --list
$ nodenv install -v 12.18.0
$ nodenv global 12.18.0
$ nodenv versions
→ バージョンが表示されればOK

* 12.18.0 (set by /home/webuser/.nodenv/version)

yarnのインストール

Webpacekrで必要になるyarnのインストールを行います。

### 参考: https://classic.yarnpkg.com/en/docs/install/#centos-stable
$ curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$ sudo yum install -y yarn
$ yarn -v

1.22.4

MySQLの準備

MySQLのインストールを行います。

$ sudo yum install -y mysql-server
$ mysqld --version

/usr/libexec/mysqld  Ver 8.0.17 for Linux on x86_64 (Source distribution)

インストールが完了したらMySQLを起動します。

### 起動
$ sudo systemctl start mysqld.service

### ステータス確認
$ sudo systemctl status mysqld

Active: active (running)

### 常時起動にする
$ sudo systemctl enable mysqld.service

Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.

Railsアプリケーションの作成

今回は /srv配下にrails-appというアプリケーションを作成します。

### Railsアプリケーションの準備
$ cd /srv
$ sudo mkdir rails-app
$ sudo chown webuser:wheel rails-app
$ cd rails-app
$ gem install bundler

### Railsアプリの作成
$ bundle init
$ vim Gemfile
→ gem railsの行をアンコメント
$ bundle install

# https://nishinatoshiharu.com/rails-mysql-starter/
$ bundle exec rails new . -d mysql

エラー対応: bundle installでmysql2がインストールできない場合

rails newでgemをインストールする際、mysql2をインストールするところでエラーが発生しました。

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

ビルドの過程がログに出力されていたので、ビルドがうまくいっていないことがわかりました。

mysql2をインストールするにはmysql-develが必要なので以下の手順でインストールします。

$ sudo yum install -y mysql-devel

mysql-develインストール後、bundle installを再実行したら無事にインストールできました。

データベースの準備

アプリケーション側のデータベース接続設定と、データべース接続ユーザーの作成を行います。

データベース接続情報の設定

今回はwebuserというユーザーがwebpassというパスワードでデータベースに接続できるようにします。

config/database.ymldefault部分のusernamepasswordを変更します。

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: webuser
  password: webpass
  host: localhost
  socket: /var/lib/mysql/mysql.sock

development:
  <<: *default
  database: rails-app_development

test:
  <<: *default
  database: rails-app_test

production:
  <<: *default
  database: rails-app_production
  username: webuser
  password: <%= ENV['RAILS_APP_DATABASE_PASSWORD'] %>

データべース接続ユーザーの作成と権限付与

接続ユーザーであるwebuserの作成と、webuserへの権限付与を行います。

$ mysql -u root -p

### ユーザー作成
mysql> create user webuser@'localhost' identified by 'webpass';

### ユーザー一覧
mysql> select User,Host from mysql.user;
→ webuserがいればOK

+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| webuser          | localhost |
+------------------+-----------+

### webuserに権限付与
mysql> grant all on *.* to webuser@'localhost';


### webuserの権限確認
mysql> show grants for webuser@'localhost';
→ 権限が存在していればOK

### webuserでログインできるか確認
$ mysql -uwebuser -pwebpass
→ MySQLに接続できればOK

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.10 sec)

データベースの用意

開発環境用のデータベースの作成とマイグレーションを実行します。

$ bin/rails db:create

Created database 'rails_app_development'
Created database 'rails_app_test'

$ bin/rails db:migrate

ポートの開放

今回はローカルPCからVPS上で起動しているRailsアプリケーションに接続します。

Railsアプリケーションがlistenしている3000番ポートに接続できるようにするためVPSのファイアウォール設定を変更します。

### ファイアウォールの設定を確認
$ sudo firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

### 3000番ポートの開放
$ sudo firewall-cmd --add-port=3000/tcp --zone=public --permanent

### 設定を反映
$ sudo firewall-cmd --reload

### 設定確認
$ sudo firewall-cmd --list-all
→ 3000/tcpがportにあればOK

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 3000/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Railsアプリケーションの起動

$ bin/rails webpacker:install

$ bin/rails s -b 0.0.0.0
# -b 0.0.0.0: 外部からアクセスできるようにする

http://[IPアドレス]:3000/ で以下のような画面になればOKです。

サンプル画面の作成

試しにsaceffoldで簡単なアプリを作ってみます。

$ bin/rails g scaffold event title:string
$ bin/rails db:migrate

http://[IPアドレス]:3000/eventsで以下のような画面になればOKです。

まとめ

以上でRails6 + MySQL8の開発環境をCentOS8上に構築する手順について紹介を終わります。

なお、今回検証サーバーを用意するために利用したConoHa VPSは、1ヶ月に満たない利用の場合は時間単位で料金が請求されるので、数十円くらいでサーバーの勉強や検証環境が用意できるオススメのVPSです!

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!

Rubyのオススメ参考書