(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
(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
(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のバージョンが一覧で表示されます。
(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]
(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
(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
(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でコンパイルする)
①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以下
(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
(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のテストページが表示されることを確認します
(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
(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
・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">