Rocky Linux 9 に Moodle 4.1 をインストールする

この内容は、以下の記事をもとに、Rockey Linux 9に最新のMoodle(4.1：2023/4/18現在） のインストール手順をまとめました。（@t-kitaさん、サポートありがとうございました）

https://qiita.com/t-kita/items/e6877430f7c8e2fe78f5

【事前準備】
■ポートの開放状況を確認
　特に、git　clone用の9418ポートが開いているか確認しておいてください。
【構築開始】
以下、Rockey Linux 9にログイン後に、rootで実行してください。
■Rocky Linux 全体の updateと再起動
```
sudo yum -y update
sudo reboot
```

■phpのインストール
```
dnf -y install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-9.rpm
dnf -y module list php
dnf -y module reset php
dnf -y module enable php:remi-8.1
dnf -y install php
```

■PHPスクリプトの作成
通常、Moodleのインストール手順は、
https://docs.moodle.org/3x/ja/Moodle%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
に記載のように、最後の仕上げにウェブブラウザを使います。
しかし、以下のような PHPスクリプトを使うと、
コマンドラインだけでMoodleをインストールできます。

moodle-inst.php を新規で開いて、
以下の内容をコピーペーストして保存してください。
```
<?php
// サーバ設定用parameterを記載
//$host = "xxx.xxx.xxx.xxx"; // set host IP address
// $host = "your.host.jp"; // or DNS hostname
//$ver = "401"; //【※各自設定】例：4.01の場合は401と記入。ただし、後で、【※1】の箇所で自動設定するので、設定不要。
//$mdpass= 'your%pass-word'; //【※各自設定】moodle admin, mysql user のPSWDを記入('&'はダメみたい)
//$adminemail = "youradminmail@foo.bar"; //【※各自設定】moodle admin のメールアドレスを記入


$md = 'moodle'; // 同一サーバ上で2つ目のMoodleをセットアップする時は変える

// Moodle 動作に必要な packages をインストール
system("dnf -y install php-opcache php-gd php-curl php-mysqlnd php-xmlrpc php-soap php-xml php-mbstring php-intl php-pec\
l-zip php-sodium php-ldap ");
system("dnf -y install httpd mod_ssl mariadb-server git");
system("firewall-cmd --add-service=http --add-service=https");
system("firewall-cmd --runtime-to-permanent");

system("systemctl enable httpd");
system("systemctl start httpd");
system("systemctl enable mariadb");
system("systemctl start mariadb");

// Download Moodle
$mdroot = "/var/www/html/${md}";
if ($md == "moodle"){
  system("cd /var/www/html/ ; git clone git://git.moodle.org/moodle.git");
}else{
  system("cd /tmp/ ; git clone git://git.moodle.org/moodle.git");
  system("mv /tmp/moodle ${mdroot}");
}

//git checkoutの前準備【※1】
// git branch -a の実行結果を読み込み、
//”MOODLE_”の文字列の後に記載されているバージョン番号のリストから、
//最新の値を抽出し、$verに格納
  system("cd $mdroot ;   git branch -a > git_branch_list.txt");
$file_path = $mdroot . '/git_branch_list.txt';
$max_version = 0;
$file_lines = file($file_path, FILE_IGNORE_NEW_LINES);
foreach ($file_lines as $line) {
  if (preg_match('/MOODLE_([0-9]+)_STABLE/', $line, $matches)) {
    $version = $matches[1];
    if ($version > $max_version) {
      $max_version = $version;
    }
  }
}
echo "最新のMoodle Stableのバージョン番号=" . $max_version　. "\n" ;
$ver = $max_version; 

//git checkout
system("cd ${mdroot}/; git checkout -b local_${ver}_STABLE origin/MOODLE_${ver}_STABLE");
system("chmod 755 ${mdroot}");

// data dir
$dataroot = "/var/www/${md}d";
system("mkdir ${dataroot}; chown apache:apache ${dataroot}/");

// DB
$dbuser = "dbu${md}";
system("mysql -u root -e \"CREATE DATABASE $md  DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; \";");
system("mysql -u root -e \"CREATE USER ${dbuser}@localhost IDENTIFIED BY '$mdpass'; \"; ");
system("mysql -u root -e \"GRANT ALL ON ${md}.* TO ${dbuser}@localhost ; \"; ");
// mysql パスワードありの場合は、 mysql -u root -pmysqlpassword -e ... と書く

// moodle directory を書き込み可能にする処理
system("chown -R apache:apache ${mdroot}");

$url = "http://${host}/${md}";  // if apache documentroot is as default

// non-interactive install command
system("cd ${mdroot}/;  sudo -u apache /usr/bin/php  admin/cli/install.php --non-interactive --agree-license --lang=ja --wwwroot=\"${url}\" --dataroot=\"${dataroot}\" --dbtype=mariadb --dbname=$md --dbuser=${dbuser} --dbpass=$mdpass --fullname=\"${md} site\" --shortname=${md} --adminpass=$mdpass --adminemail=$adminemail");

// moodle directory を書き込みできないようにする処理
system("chown -R root:root ${mdroot}");
system("chmod 644 ${mdroot}/config.php");

echo("$url でMoodleが使えます。\n adminパスワードは $mdpass です。\n 以下を crontab に追加してください: \n* * * * * php ${mdroot}/admin/cli/cron.php > /dev/null 2>&1 \n");

//補足プロセス：Let's encrypt の設定(=https接続用にSSL証明書を作成する場合はコメントアウトをはずしてください)
//system("yum -y install python3-certbot-apache"); 
//system("yum -y install certbot");
//system("certbot certonly -n --webroot -w /var/www/html -d $host -m $adminemail --agree-tos ");
//system("certbot install --apache --no-redirect");  // これがもしダメなら手動で ssl.conf を変更。
```

■moodle-inst.phpの実行
```
chmod 600 moodle-inst.php
php moodle-inst.php
```

■cronの追加
以下を crontab に追加してください。
```
* * * * * php /var/www/html/moodle/admin/cli/cron.php > /dev/null 2>&1 
```

■max_input_vars　の設定変更
/etc/php.iniを開いて、
max_input_vars = 5000 に変更して保存してください。

■https対応の作業　（http接続場合は不要）
/var/www/html/moodle/config.php を開き、
```
$CFG->wwwroot   = 'http　　の箇所を、
$CFG->wwwroot   = https　　に変更してください。
```

■SE Linuxの無効化
まず、
```
setenforce 0
```
を実行してください。次に、
/etc/selinux/config　を開いて、
```
SELINUX=enforcing　の部分を、
SELINUX=permissive　に変更して、
```
保存してください。

■php-fpmとhttpdの再起動
```
systemctl restart php-fpm
systemctl restart httpd
```

■Web上での作業
PHPスクリプトを実行すると、「XXXXXでMoodleが使えます。」と表示されますので、表示された　XXXXXにWebブラウザでアクセスするとMoodleのセットアップ画面が表示されます。
以降はその画面にしたがって操作してください。

以上でインストール手順は終了です。


■2023.10.5追記
管理者権限でログインした後に、
Security checks > Check all public / private paths
を開いたときに、いくつかのパスが公開されているといったエラーが表示される場合は、以下を実行してください。

(手順1)
https://docs.moodle.org/402/en/Apache#Hiding_internal_paths
の記載に従い、
/etc/httpd/conf.d/moodle_security.confを作って、以下を記載する。
```
<Directory "/var/www/html/moodle">
    RewriteEngine On
    RewriteRule "(\/vendor\/)" - [F]
    RewriteRule "(\/node_modules\/)" - [F]
    RewriteRule "(^|/)\.(?!well-known\/)" - [F]
    RewriteRule "(composer\.json)" - [F]
    RewriteRule "(\.lock)" - [F]
    RewriteRule "(\/environment.xml)" - [F]
    Options -Indexes
    RewriteRule "(\/install.xml)" - [F]
    RewriteRule "(\/README)" - [F]
    RewriteRule "(\/readme)" - [F]
    RewriteRule "(\/moodle_readme)" - [F]
    RewriteRule "(\/upgrade\.txt)" - [F]
    RewriteRule "(phpunit\.xml\.dist)" - [F]
    RewriteRule "(\/tests\/behat\/)" - [F]
　　RewriteRule "(\/fixtures\/)" - [F]
</Directory>
```
(手順2)
php-fpmとhttpdの再起動する。
```
systemctl restart php-fpm
systemctl restart httpd
```
(注意)
https://docs.moodle.org/402/en/Apache#Hiding_internal_paths には、
Note: Please pay attention that above rules may block loading desired/required content, e.g. SCORM-packages containing a ""vendor""-directory.　
と記載がありますので、SCORMコンテンツを利用している場合は注意が必要です。

■補足
・git checkoutの前準備【※1】について
インストールするMoodleのバージョンはMoodleのgitで管理されている最新バージョンにする必要があります。
PHPスクリプトを実行する前に調べる方法は以下の通りです：
まず、
```
git branch -a
```
を実行すると、以下のように表示されます。
```
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/MOODLE_20_STABLE
  remotes/origin/MOODLE_21_STABLE
  remotes/origin/MOODLE_22_STABLE
  remotes/origin/MOODLE_23_STABLE
  remotes/origin/MOODLE_24_STABLE
  remotes/origin/MOODLE_25_STABLE
  remotes/origin/MOODLE_26_STABLE
  remotes/origin/MOODLE_27_STABLE
  remotes/origin/MOODLE_28_STABLE
  remotes/origin/MOODLE_29_STABLE
  remotes/origin/MOODLE_30_STABLE
  remotes/origin/MOODLE_31_STABLE
  remotes/origin/master
```
【参考】
https://docs.moodle.org/3x/ja/%E7%AE%A1%E7%90%86%E8%80%85%E7%94%A8Git#.E6.8B.A1.E5.BC.B5.E6.A9.9F.E8.83.BD.E3.82.92Git.E3.83.AA.E3.83.9D.E3.82.B8.E3.83.88.E3.83.AA.E3.81.8B.E3.82.89.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB.E3.81.99.E3.82.8B

表示内容の中から、
remotes/origin/MOODLE_”の後ろの数字の最新の値（上記例では31）を取得し、
PHPスクリプトの$verに格納する必要があります。
上記PHPスクリプト(moodle-inst.php)では、【※1】で自動的に取得しています。
なお、【※1】はChatGPTに作成してもらっていました（ChatGPTの動作手順はコチラ）