オープンバッジ発行に向けて、LTS版のMoodle 4.1をPHP8.1でUbuntu 22.04にインストール

# オープンバッジ
ここ数年なにかと話題だった「ジョブ型」から、「スキルベース雇用」に人材管理や人材育成のトレンドが移りつつあり、スキルの証明方法の１つとして、デジタルバッジ（オープンバッジ）があります。デジタルバッジは、紙ではなくデジタルデータであり、1EdTech Consortium ( 旧IMS Global Learning Consortium )により規格化され、「Open Badges v2.0」および「Open Badges v3.0」として広く普及しています。単純にバッジと表現することがあります。
## バッジとリカレント教育、リスキリング
### リスキリング
「リスキリング」は、組織主導で新しい業務で必要になる知識や技能を習得するための学習を言います。従って、主体は組織にあります。組織に所属していない場合に、リスキリングと表現することは誤りで、その場合はリカレント教育を指します。
### リカレント教育
本来は所属する企業や団体から離れて教育機関で学び直し、元の組織に戻って働くか、新たな組織で働き、再び必要に応じて組織を離れて学ぶ行動を「リカレント教育」と言います。従って、主体は労働者自身にあります。
日本の場合は、雇用上の慣習から、リカレント教育に働きながら学ぶことを含まれることがあります。
### バッジは、学んだことや習得したスキルの証明
「リスキリング」や「リカレント教育」で学んだことを証明する手段として「バッジ」が普及しています。バッジを発行するプラットフォームとして、オープンソースソフトウェアであり、多数の大学や企業で実績のある「Moodle」を選び、オープンバッジ発行について検証環境を構築することにしました。

# Moodle
Moodleには、「Open Badges v2.0」に準拠するオープンバッジを発行する機能があります。
Moodleは、LMS(学習管理システム)と呼ばれるシステムのなかで代表的なソフトウェアの１つであり、日本を含めた世界中の教育機関や企業で、2000年代から使われています。
https://moodle.org/?lang=ja
個人的には、2004年頃から数年間、e-Learningサービスを運営していた際にMoodleを活用したことがあります。それ以降も、度々Moodleでオンライン学習の仕組みを構築していたため、そこそこ縁のあるソフトウェアです。

# この記事の目的
自分でオープンバッジを発行することを考えた際に、サービス全体の運用環境としてIBM CloudやAWS等をでUbuntu 22.04環境を使うことから、2023年12月現在のLTS(長期サポート)版の「Moodle 4.1」についてインストール手順を記した備忘録的なものになります。

## バッジの発行例
動作確認のため「外部バックパック接続」をオフにした状態でバッジを発行すると、下図のようになりました。バッジの画像データは、生成AIを使って作っています。
なお、バッジ発行のために架空の「Cloud Sales 入門」という学習コースを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/3d1fbd64-4dcf-a01e-31df-e7bb4db3c120.png)

## Ubuntu 22.04 & PHP8.1環境へのMoodleインストール手順
この手順は、公式ドキュメント https://docs.moodle.org/403/en/Step-by-step_Installation_Guide_for_Ubuntu を参考に、Moodle4.1およびUbuntu22.04向けにアレンジしています。
### Moodleを動かすために必要なソフトウェアのインストール
Ubuntu22.04環境を最新の状態にします。
```
sudo apt update -y
sudo apt upgrade -y
```
次のコマンドを実行し、Moodleを動かすために必要なソフトウェアをインストールします。
```
sudo apt install -y apache2 php8.1 mariadb-server git
sudo apt install -y php8.1-mysql php8.1-iconv php8.1-mbstring php8.1-curl php8.1-tokenizer php8.1-xmlrpc php8.1-soap php8.1-ctype php8.1-zip php8.1-gd php8.1-simplexml php8.1-xml php8.1-intl
```
パソコン上で仮想マシンを使っている場合は、avahi-daemonを入れて、mDNS対応にすると、Webブラウザでセットアップする際に、http://サーバー名.local で接続できるので便利です。avahi-daemonは必要に応じてインストールしてください
```
sudo apt install -y avahi-daemon
sudo systemctl start avahi-daemon.service
sudo systemctl enable avahi-daemon.service
```
### Webサーバーの起動と自動起動設定
次のコマンドを実行し、Webサーバーとして、Apache2 を起動します。自動起動設定も行います。
```
sudo systemctl start apache2 
sudo systemctl enable apache2
```
### MoodleのパッケージをGitから取得し、DocumentRootディレクトリに配置
次のコマンドを実行します。
```
cd /opt
sudo git clone git://git.moodle.org/moodle.git
cd moodle
sudo git branch -a
```
2023年12月現在のLTS(長期サポート)版のMoodle 4.1を示す「MOODLE_401_STABLE」が表示されることを確認します。
次のコマンドを実行し、Moodle 4.1をApche2のDocumentRootに配置します。
```
sudo git branch --track MOODLE_401_STABLE origin/MOODLE_401_STABLE
sudo git checkout MOODLE_401_STABLE
sudo cp -R /opt/moodle /var/www/html/
sudo mkdir /var/moodledata
sudo chown -R www-data /var/moodledata
sudo chmod -R 777 /var/moodledata
sudo chmod -R 0755 /var/www/html/moodle
```
### PHPの設定変更「max_input_vars」
PHPの設定ファイルを変更する必要があるので、次のコマンドを実行します。
```
sudo nano /etc/php/8.1/apache2/php.ini
```
次のように変更します。
変更前
```
;max_input_vars=1000	
```
変更後
```
max_input_vars = 5000
```
nanoエディタを使っているので、Ctrl+xキーを押し、yキーを押して保存します。
Apache2をリロードします。
```
sudo systemctl reload apache2
```

### Apache2のバーチャルホスト設定
Apcahe2では、バーチャルホストと呼ばれる設定を使うことで、１つのWebサーバーで複数運用しているように見せることができます。
次のコマンドを実行して、Moodle用のバーチャルホスト設定ファイルを作成します。
```
sudo nano /etc/apache2/sites-available/moodle.conf
```
記述内容は、以下です。
```
<VirtualHost *:80>
ServerName 例 www3.mydomain.com ( ServerNameで設定したサーバー名に、http接続でアクセスします。)
DocumentRoot /var/www/html/moodle

<Directory /var/www/html/moodle>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```
上記ではポート番号80なので、http接続になります。設定を書くことでポート番号443を用いたhttps接続も可能です。
バーチャルホストの設定をファイルを読み込み、有効化します。
```
sudo a2ensite moodle
sudo systemctl reload apache2
```

### データベースの作成
先ほどインストールした「mariadb-server」を用いて、Moodleのためのデータベース、データベース用のユーザー名、データベースユーザーのパスワードを設定します。
#### mariadb-serverの起動と自動起動設定
次のコマンドを実行します。
```
sudo systemctl start mariadb
sudo systemctl enable mariadb
```
Moodleのためのデータベース、データベース用のユーザー名、データベースユーザーのパスワードを登録します。
```
sudo mysql
```
入力がデータベースに切り替わります。
```
MariaDB [(none)]>
```
次のコマンドを実行し、データベースを作ります。
```
create database moodle_db;
```
次のコマンドを実行し、作ったデータベースに、データベース操作用のユーザー名やパスワードを設定します。
```
grant all privileges on moodle_db.* to moodle_user@localhost identified by '強度の高いパスワード文字列';
```
強度の高いパスワード文字列を、パスワードの文字列に置き換えてから実行してください。最低限、大文字小文字数字で10桁くらいは必要です。
次のコマンドを実行し、手動でデータベースの権限テーブルをリロードします。
```
flush privileges;
```
データベースでの作業から離脱するため、次のコマンドを実行します。
```
exit
```

### Webブラウザを用いたセットアップ
Webブラウザを用いてセットアップするために、Moodle関連のファイルが格納されているディレクトリに書き込み権限を付与します。
```
sudo chmod -R 0777 /var/www/html/moodle
```
Webブラウザで、http://サーバー名 にアクセスします。サーバー名はバーチャルホストで設定したものと同じです。
セットアップ画面では、「Language」を日本語(ja)に変更することで日本語表示に切り替わります。以後、画面指示に従って設定を行います。
途中、次の値を求めらるので各自変更および入力します。
 - データディレクトリのパスを「/var/moodledata」に書き換えます。
 - データベースドライバを「MariaDB」に変更します。
 - データベースホスト: localhost
 - データベース名 : moodle_db
 - データベースユーザー：moodle_user
 - データベースパスワード : データベース作成の際に設定したパスワード

Moodleのセットアップを終えると、下記のようになります。例として、Digital Collegeという名称にしました。略称は、DCollegeです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/7d3a7f05-a2a2-bae6-b849-291196c76615.png)

バッジを検証したいので、コースも作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/a435d5c7-8773-6398-3bde-67fb4520ca1d.png)

画面上部の「サイト管理」から「一般」タブ」にて、コース作成やバッジの登録・管理等ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/b581cfd6-552a-67e3-bf89-d899c28c2240.png)

バッジにおけるパックパックは、様々な学習サービスで発行したバッジを個別に保管および共有するサービスのことで、初期値では「Badgr」が登録されています。初期登録されているだけで、実際にはバッジ管理者として「Badgr」側の設定が必要になっています。

# 参考資料
 - [Moodle 4.1のオンラインドキュメント](https://docs.moodle.org/401/en/Main_page)（日本語版は古いバージョンしかないため、英語で読む
 - 2023年12月現在最新版の[Moodle 4.3のオンラインドキュメント](https://docs.moodle.org/403/en/Main_page)
 - [Moodleのリリースとサポート期間について](https://moodledev.io/general/releases)
 - [Moodle 4.1におけるバッジについて](https://docs.moodle.org/401/en/Badges)
 - 2023年12月現在最新版の[Moodle 4.3におけるバッジについて]( https://docs.moodle.org/403/en/Badges)