Rails7 + Ruby3.1サーバー構築


環境構築にあたっての前提条件

(1)linuxでの構築

windowsではbundle installで以下のエラーが発生したので、linux(今回の例はcentos7)で環境構築を行った(ネットで対応策は書いてあったがめんどくさそう)

$ bundle install

ZInfo::DataSourceNotFound: tzinfo-data is not present. Please add gem 'tzinfo-data' to your Gemfile and run bundle install

(2)バージョン

ruby
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]

rails
Rails 7.0.2.4

(3)インストール前処理

以下の作業の前にyumをアップデートしておきます

# yum -y update

(4)centos9/alma9/rocky9では以下の設定を行います

※以下の設定をしないと、ターミナルソフトでは接続できないので、windowsのコマンドラインから以下のコマンドで接続してコマンドを入力します

ssh -i "(ec2作成時に指定したキーペア)" (ユーザID)@(ec2のパブリンクIPv4アドレス)
(例)ssh -i "keypair.pem" ec2-user@99.99.99.99

①暗号ポリシーの確認

# update-crypto-policies --show
----------------------------------------------------------
DEFAULT
----------------------------------------------------------

②暗号ポリシーの変更

# update-crypto-policies --set LEGACY
----------------------------------------------------------
Setting system policy to LEGACY
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.

③変更後の暗号ポリシーの確認

# update-crypto-policies --show
----------------------------------------------------------
LEGACY
----------------------------------------------------------

④システムを再起動します

# reboot

rbenvのインストール

(1)gitをインストールします。

# yum -y install git

(2)gccをインストールします。

# yum -y install gcc

(3)rbenvを取得します。

# git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

(4)rbenvのパスを通して有効化します。

# echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# ~/.rbenv/bin/rbenv init
# echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# source ~/.bash_profile

(5)rbenvがインストールされたことを確認します。

# rbenv -v
rbenv 1.2.0-14-gc6cc0a1

補足 rootではなく、usrとかにインストールしないと後で権限がないエラー

その場合の対応(無理やり権限を付けてしまう)

chmod 751 /root
chmod 755 /root/.rbenv

ruby-buildのインストール

(1)ruby-buildを取得します。

# git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

(2)ruby-buildをインストールします。

# ~/.rbenv/plugins/ruby-build/install.sh

(3)ruby-buildがインストールできるとrbenvのpluginであるrbenv installコマンドが使用できるようになります。

# rbenv install --list-all

とするとインストール可能なRubyのバージョンが一覧で表示されます。


Rubyのインストール

(1)Rubyをインストールするのに必要なパッケージを先にインストールします。

# yum install -y openssl-devel readline-devel zlib-devel

Ruby3.2をインストールする場合には、libyamlをインストールします。

# yum install -y libyaml

libyaml-devel(libyaml-devel-0.2.5-7.el9.x86_64.rpm)はhttps://rpmfind.net/linux/rpm2html/search.php?query=libyaml-develからダウンロードし,rpmコマンドでインストールします

# rpm -ivh libyaml-devel-0.2.5-7.el9.x86_64.rpm

(2)Rubyのインストールをします。

# rbenv install 3.1.2

※Can't locate FindBin.pm in @INC (you may need to install the FindBin module) のエラーの場合、以下のモジュールをインストールします

# yum install -y perl perl-FindBin perl-open perl-YAML perl-File-HomeDir perl-Unicode-LineBreak

(3)rbenvで3.1.2を使用するように設定します。

# rbenv global 3.1.2

(4)Rubyのバージョンが表示されればインストールは成功しています。

# ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]

Node.js関連のインストール

(1)Node.js関連モジュールをインストールします(rails7のcssのコンパイルに必要=yarnってのを使うらしい、、、)

# curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -
# yum install -y nodejs
# npm install -g yarn
# npm install node-sass --save-dev

Ruby On Railsのインストール

(1)Ruby On Railsのインストールをインストールします。

# gem install rails -v=7.0.2.4 -N

(2)Railsのバージョンが表示されればインストールは成功しています。

# rails -v
Rails 7.0.2.4

(3)Bootstrap用のRailsプロジェクトを作成します。

# rails new proto1 -d postgresql --css=bootstrap

①「--css=bootstrap」を指定することで、GEMのcssbundling-railsがインストールされる (正確には、Gemfileに追加され、bundle install実行時に関連モジュールがインストールされる=このとき、上記のNode.js関連のモジュールがlinuxにインストールされていないと この関連モジュールもインストールされないので、注意)

②以下のエラーが発生する場合には、bundlerをバージョンアップする

【エラー】

[root@localhost app]# rails new protov7 -d postgresql --css=bootstrap

[8558, #$lt;Thread:0x00007f88c7263cc8 run>, #$lt;NameError: uninitialized constant Gem::Source
      (defined?(@source) && @source) || Gem::Source::Installed.new

【bundlerのバージョンアップ】

gem uninstall bundler -v2.3.7
gem install bundler -v2.3.10

(4)scaffoldでサンプルを作ってみます。

# rails g scaffold user name:string address:string

(5)yarnでcssのコンパイルを行います

# yarn build:css

Rails7での注意点

(1)link_toでのmethod="delete"は無視され、getで発行されてしまうので、button_toに変更する。またconfirmも以下のように修正する。

※classのglyphiconがbiに変更されたのは、bootstrap3をbootstrap5にバージョンアップしたことによる

【従来のRailsでのコーディング】

<%= link_to user, method: :delete, data: { confirm: '本当に削除してよろしいですか?' } do %>
    <span class="glyphicon glyphicon-trash">削除</span>
<% end %>

【Rails7でのコーディング】

<%= button_to user, {method: :delete, form: {data: {turbo_confirm: '本当に削除してよろしいですか?' }} do %>
    <i class="bi bi-trash" aria-hidden="true"> 削除
<% end %>

(2)Deviseのログアウト(destroyメソッド)実行後、ログイン画面(new画面)に遷移されないので、DeviseのSessionsControllerを継承したコントローラを作成し、 redirect処理でログイン画面(new画面)に遷移する処理を追加する

①app/controllers/users/sessions_controller.rbを新規作成

class Users::SessionsController < Devise::SessionsController
  def new
    super
  end
  def create
    super
  end
  def destroy
    signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
    redirect_to :action => :new  # => 明示的に遷移
  end
end

②app/config/routes.rbを以下の通り変更

【変更前】

 devise_for :users

【変更後】

  devise_for :users, :controllers => {
    :sessions => 'users/sessions'
  }

(3)yarnでcssのコンパイル

※rails new で--css=bootstrapを指定しない場合は、手順が違う->今回未調査 

※--css=bootstrapを指定しない場合は、RailsRoot/binにimportmapが作られている

①RailsRoot/package.jsにコンパイル用のコマンドが追加される(yarn build:cssの正体)

  "scripts": {
    "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds",
    "build:css": "sass ./app/assets/stylesheets/application.bootstrap.scss ./app/assets/builds/application.css --no-source-map --load-path=node_modules"
  }

②application.bootstrap.scssに追加するscssを記述する

@import 'bootstrap/scss/bootstrap';
@import 'bootstrap-icons/font/bootstrap-icons';
@import 'cmn';   =>cmn.scssを追加する場合(追加した後、yarn build:cssでコンパイルする)

BootStrap5での変更点

①panel/well→cardに変更

②アイコンの扱い

【従来のRailsでのコーディング】

<%= link_to user, method: :delete, data: { confirm: '本当に削除してよろしいですか?' } do %>
    <span class="glyphicon glyphicon-trash">削除</span>
<% end %>

【Rails7でのコーディング】

<%= button_to user, {method: :delete, form: {data: {turbo_confirm: '本当に削除してよろしいですか?' }} do %>
    <i class="bi bi-trash" aria-hidden="true"> 削除
<% end %>

③IEのサポート終了

対応外ブラウザ

Microsoft Edge Legacy
Internet Explorer 10、11
Firefox 60以下
Safari 10以下
iOS Safari 10以下
Chrome 60以下
Android 6以下

Postgresqlのインストール

(0)postgres ver14のリポジトリーを追加します。

centos8の場合

# yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

centos9の場合

# yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
#上記でうまくいかない場合は、以下を試します
# wget http://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
→ダウンロードできない場合は、windowsで取得して、linuxにアップロード
# sudo rpm -Uvh --nodeps pgdg-redhat-repo-latest.noarch.rpm
# yum -y install https://download.postgresql.org/pub/repos/yum/14/redhat/rhel-8.7-x86_64/postgresql14-14.7-1PGDG.rhel8.x86_64.rpm

追加されたか確認します

# cat /etc/yum.repos.d/pgdg-redhat-all.repo | grep "pgdg14]"

追加された場合、以下のように表示されます

[pgdg14]

追加されない場合、/etc/yum.repos.d/pgdg-redhat-all.repoに以下を追加します

[pgdg14]
name=PostgreSQL 14 for RHEL / Rocky $releasever - $basearch
baseurl=https://download.postgresql.org/pub/repos/yum/14/redhat/rhel-$releasever-$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
repo_gpgcheck = 1

(1-1)(centos9)postgres本体をインストールします。

# yum -y install postgresql14-server
# yum -y install postgresql14-contrib
# yum -y install postgresql14-devel
# gem install pg -v '1.4.5' -- --with-pg-config=/usr/pgsql-14/bin/pg_config
# bundle config build.pg -- --with-pg-config=/usr/pgsql-14/bin/pg_config

※ - nothing provides perl(IPC::Run) needed by postgresql14-devel-14.8-1PGDG.rhel9.x86_64 (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not onlyのエラーが発生した場合、以下の処理を行います

# dnf install epel-release
# dnf config-manager --enable crb
# dnf config-manager --set-enabled crb
# dnf --enablerepo=crb install perl-IPC-Run -y

(1-2)(centos8)postgres本体をインストールします。

# yum -y install https://download.postgresql.org/pub/repos/yum/14/redhat/rhel-8.7-x86_64/postgresql14-server-14.7-1PGDG.rhel8.x86_64.rpm 
# yum -y install https://download.postgresql.org/pub/repos/yum/14/redhat/rhel-8.7-x86_64/postgresql14-contrib-14.7-1PGDG.rhel8.x86_64.rpm
# yum -y install https://download.postgresql.org/pub/repos/yum/14/redhat/rhel-8.7-x86_64/postgresql14-devel-14.7-1PGDG.rhel8.x86_64.rpm 
# gem install pg -v '1.4.5' -- --with-pg-config=/usr/pgsql-14/bin/pg_config
# bundle config build.pg -- --with-pg-config=/usr/pgsql-14/bin/pg_config

(2)postgressqlのpathを追加します

# export PATH=$PATH:/usr/pgsql-14/bin
# source .bashrc

(3)バージョンが表示されればインストールは成功しています。

# postgres --version
postgres (PostgreSQL) 14.6

(4)インストールが完了したら、データベースを初期化します。

# postgresql-14-setup initdb

(5)設定ファイルを編集します(/var/lib/pgsql/14/data/pg_hba.conf)

修正前

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

修正後

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# ローカルネットワーク範囲を指定
host    all             all             192.168.1.1/24          password
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

(6)設定ファイルを編集します(/var/lib/pgsql/14/data/postgresql.conf)

修正前

#listen_addresses = 'localhost'		# what IP address(es) to listen on;

修正後(追加します)

#listen_addresses = 'localhost'		# what IP address(es) to listen on;
listen_addresses = '*'

(7)サービスを自動起動の登録をします

# systemctl enable postgresql-14.service

(8)サービスの起動をします

# systemctl start postgresql-14.service

(9)接続確認をします

# su - postgres
-bash-4.1#
-bash-4.1# psql
psql (14.x.x)
Type "help" for help.

(10)postgresユーザーのパスワード設定(OSユーザー)をします

# passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

(11)postgresユーザーのパスワード設定(PostgreSQLユーザー)をします

# su - postgres
-bash-4.1# psql
psql (14.x.x)
Type "help" for help.

postgres=#
postgres=# alter role postgres with password '<パスワード>';

(12)Ctrl+Dで終了し、exitでpostgreユーザからrootユーザに戻ります

(13)サービスを再起動します

# systemctl restart postgresql-14.service

Apacheのインストール(centos7の場合)

(1)インストールします

# yum -y install httpd

(2)バージョンが表示されればインストールは成功しています。

# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Mar 24 2022 14:57:57

(3)Apacheの関連モジュールをインストールします

# yum -y install libcurl-devel httpd-devel apr-devel apr-util-devel

(4)/etc/httpd/conf/httpd.confを以下の通り修正します

修正前

<Directory />
    AllowOverride none
    Require all denied
</Directory>

修正後

<Directory />
    AllowOverride none
#   Require all denied
</Directory>

(5)サービスを自動起動の登録をします

# systemctl enable httpd.service

(6)サービスの起動をします

# systemctl start httpd.service

(7)SELINUXを無効にします(/etc/sysconfig/selinux)

修正前

SELINUX=enforcing

修正後

SELINUX=disabled

(8)ファイヤーウォールを停止し、無効にします

# systemctl stop firewalld.service
# systemctl disable firewalld.service

(9)サーバーを再起動します(再起動しないとSELINUXの変更が有効にならない)

# reboot

再起動したくない場合には、現在の状態を変更してしまいます。(一時的な変更)

# setenforce 0

状態を確認します(Permissive:無効 Enforcing:有効)

# getenforce
Permissive

(10)ブラウザでサーバーのURLを入力し、apacheのテストページが表示されることを確認します


Passengerのインストール

(1)Passengerのインストールをします

# gem install passenger
# passenger-install-apache2-module

注意)passenger-install-apache2-moduleはc++コンパイラーがインストールされていないとエラーになります。 画面が黒に反転して見にくいですが、正常終了していることを確認し、c++コンパイラーがないことによるエラーの場合には gcc++をインストールします

# yum -y install gcc-c++

(2)補足 AWSでのインストール時のエラー

passenger-install-apache2-moduleでメモリーエラー「virtual memory exhausted: Cannot allocate memory rake aborted!」が発生した場合には、 以下の対応を行った後、passenger-install-apache2-moduleコマンドを再度実行します

# dd if=/dev/zero of=/tmp/swap.img bs=1M count=1024
# chmod 600 /tmp/swap.img
# mkswap /tmp/swap.img
# swapon /tmp/swap.img

Rails資産の配備

(1)/etc/httpd/conf.dにpassenger.confを以下の内容で作成します

RailsEnv production

LoadModule passenger_module /root/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/passenger-6.0.14/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /root/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/passenger-6.0.14
  PassengerDefaultRuby /root/.rbenv/versions/3.1.2/bin/ruby
</IfModule>

PassengerRestartDir /var/opt/shared/tmp
PassengerUserSwitching on

<VirtualHost *:80>
  DocumentRoot /var/opt/www

  RailsBaseURI /test_app
  <Location /test_app>
    PassengerUser apache
    PassengerRuby /root/.rbenv/versions/3.1.2/bin/ruby
  </Location>

</VirtualHost>

(2)Rails資産を/var/opt/appにアップロードします

(3)シンボリックリンクを作成します

# cd /var/opt/www
# ln -s /var/opt/app/test_app/public test_app
# cd /var/opt/app/test_app/node_modules/.bin
# ln -s ../esbuild/bin/esbuild esbuild
# cd /var/opt/app/test_app/node_modules/.bin
# ln -s ../sass/sass.js sass
# chmod 755 ../sass/sass.js

※以下(4)~(8)はRailsのプロジェクト毎に行います

(4)GEMをインストールします

# bundle install

(5)production 環境の secret_key_base を設定します

ランダム値の secret_key_base を生成

# rails secret

エディタを立ち上げ、上記で生成した値を設定

# EDITOR=vim rails credentials:edit

(6)database.ymlを修正します

config/database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  username: postgres
  password: <パスワード>
  host: localhost
  port: 5432
  template: template0

 database: xxx_production
  username: postgres
  password: <パスワード>

(7)データベース・テーブルを作成し、初期データを登録します

# rails db:create:all
# rails db:migrate RAILS_ENV=production
# rails db:fixtures:load RAILS_ENV=production

(8)javascript/cssのプリコンパイルします

# rails assets:precompile RAILS_ENV=production

(9)所有者・グループを変更します

# chown -R apache:apache /var/opt/app/test_app

Rails資産の配備における問題点

・Jqueryが使いたいが方法がわからない

・Bootstrap5アイコンがproduction モードだと表示されない

【暫定対応】application.html.erbに以下を追加

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.0/font/bootstrap-icons.css">