CentOS 9 StreamにGLPI 10をインストールする

稼働環境がだいぶ古いもののインストール時のあれやこれやが面倒でバージョンアップせずに済ませてきましたが、諸々の事情でサーバーを統合することとなり重い腰を上げた結果、色々と楽になっていたので、手順を記録しました。

# 前提
- Hyper-V上に構築します（Hyper-Vに関連する部分には触れていません）。
- Dockerコンテナは使わないで構築します。
- データベースにはMySQLを使用し、新規に同一ホスト内に構築します。

# 参照したもの

https://glpi-install.readthedocs.io/en/latest/index.html

https://qiita.com/nw-engineer/items/a402e5fecdb18e0e2e36

https://qiita.com/nw-engineer/items/07808964c946f33326de

https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html

# GLPIインストールの前に

## OSのインストール

起動イメージはもっとも小さくなるよう`latest-x86_64-boot`にしました。

http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/iso/

- ソフトウェアの選択は`Minimal Install`のみ。
- rootパスワードを設定、ユーザーは管理者になれるよう設定します。
- IPv4アドレスは手動で固定します。
- サーバー名はlocalhostのままにせず、この段階で名前を付けます。

インストールが終わったら、Windows Terminalで`ssh ユーザー名@設定したIPv4アドレス`します。

以降、`root`で作業させて頂きます。
```bash
su
rootパスワード入力
cd ~
```
## 通信の許可

firewalldの状況を確認します。

```bash
firewall-cmd --list-all
```

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

`http` `https`がありませんでした。追加します。

```bash
firewall-cmd --add-service={http,https}
firewall-cmd --list-all
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
```

# GLPIインストール

GLPI公式のほか、こちらを参考にさせて頂きました。

https://qiita.com/nw-engineer/items/a402e5fecdb18e0e2e36

https://qiita.com/nw-engineer/items/07808964c946f33326de

## GLPIリポジトリの追加

https://download.copr.fedorainfracloud.org/results/ligenix/enterprise-glpi10/ を覗いてみて、自分にあったbaseurlを。

今回は`centos-stream-9-x86_64`にするので、`centos-stream-9-$basearch`に。

```bash
vi /etc/yum.repos.d/glpi.repo
```

```/etc/yum.repos.d/glpi.repo
[copr:copr.fedorainfracloud.org:ligenix:enterprise-glpi10]
name=Copr repo for enterprise-glpi10 owned by ligenix
baseurl=https://download.copr.fedorainfracloud.org/results/ligenix/enterprise-glpi10/centos-stream-9-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://download.copr.fedorainfracloud.org/results/ligenix/enterprise-glpi10/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1
module_hotfixes=1
```
dnfを更新
```bash
dnf update
```
## インストール

リポジトリからインストールするのは初めてなので、どんなパッケージが導入されるのか知りたくて、まずは`dnf install glpi`しました。

```bash
dnf install glpi
```
```
メタデータの期限切れの最終確認: 0:03:02 時間前の 2022年12月02日 12時37分28秒 に実施しました。
依存関係が解決しました。
========================================================================================================
 パッケージ             Arch   バージョン      リポジトリー                                       サイズ
========================================================================================================
インストール:
 glpi                   noarch 10.0.5-1.el9    copr:copr.fedorainfracloud.org:ligenix:enterprise-glpi10
                                                                                                   32 M
依存関係のインストール:
 apr                    x86_64 1.7.0-11.el9    appstream                                          123 k
 apr-util               x86_64 1.6.1-20.el9    appstream                                           95 k
 apr-util-bdb           x86_64 1.6.1-20.el9    appstream                                           14 k
 centos-logos-httpd     noarch 90.4-1.el9      appstream                                          252 k
 dejavu-sans-fonts      noarch 2.37-18.el9     baseos                                             1.3 M
 fontconfig             x86_64 2.14.0-1.el9    appstream                                          297 k
 fonts-filesystem       noarch 1:2.0.5-7.el9.1 baseos                                              10 k
 freetype               x86_64 2.10.4-9.el9    baseos                                             388 k
 gd                     x86_64 2.3.2-3.el9     appstream                                          132 k
 graphite2              x86_64 1.3.14-9.el9    baseos                                              95 k
 harfbuzz               x86_64 2.7.4-8.el9     baseos                                             625 k
 httpd                  x86_64 2.4.53-7.el9    appstream                                           50 k
 httpd-core             x86_64 2.4.53-7.el9    appstream                                          1.5 M
 httpd-filesystem       noarch 2.4.53-7.el9    appstream                                           15 k
 httpd-tools            x86_64 2.4.53-7.el9    appstream                                           85 k
 jbigkit-libs           x86_64 2.1-23.el9      appstream                                           53 k
 langpacks-core-font-en noarch 3.0-16.el9      appstream                                           11 k
 libX11                 x86_64 1.7.0-7.el9     appstream                                          647 k
 libX11-common          noarch 1.7.0-7.el9     appstream                                          206 k
 libXau                 x86_64 1.0.9-8.el9     appstream                                           31 k
 libXpm                 x86_64 3.5.13-7.el9    appstream                                           59 k
 libicu                 x86_64 67.1-9.el9      baseos                                             9.6 M
 libjpeg-turbo          x86_64 2.0.90-5.el9    appstream                                          176 k
 libpng                 x86_64 2:1.6.37-12.el9 baseos                                             117 k
 libtiff                x86_64 4.4.0-5.el9     appstream                                          196 k
 libwebp                x86_64 1.2.0-3.el9     appstream                                          278 k
 libxcb                 x86_64 1.13.1-9.el9    appstream                                          243 k
 libxslt                x86_64 1.1.34-9.el9    appstream                                          243 k
 libzip                 x86_64 1.7.3-7.el9     appstream                                           64 k
 mailcap                noarch 2.1.49-5.el9    baseos                                              33 k
 nginx-filesystem       noarch 1:1.20.1-13.el9 appstream                                           12 k
 oniguruma              x86_64 6.9.6-1.el9.5   appstream                                          218 k
 php-cli                x86_64 8.0.20-3.el9    appstream                                          3.1 M
 php-common             x86_64 8.0.20-3.el9    appstream                                          681 k
 php-fpm                x86_64 8.0.20-3.el9    appstream                                          1.6 M
 php-gd                 x86_64 8.0.20-3.el9    appstream                                           44 k
 php-intl               x86_64 8.0.20-3.el9    appstream                                          152 k
 php-mbstring           x86_64 8.0.20-3.el9    appstream                                          472 k
 php-mysqlnd            x86_64 8.0.20-3.el9    appstream                                          153 k
 php-pdo                x86_64 8.0.20-3.el9    appstream                                           85 k
 php-pecl-zip           x86_64 1.19.2-6.el9    appstream                                           58 k
 php-xml                x86_64 8.0.20-3.el9    appstream                                          135 k
 xml-common             noarch 0.6.3-58.el9    appstream                                           32 k
弱い依存関係のインストール:
 apr-util-openssl       x86_64 1.6.1-20.el9    appstream                                           16 k
 glpi-marketplace       noarch 10.0.5-1.el9    copr:copr.fedorainfracloud.org:ligenix:enterprise-glpi10
                                                                                                  4.1 M
 mod_http2              x86_64 1.15.19-2.el9   appstream                                          150 k
 mod_lua                x86_64 2.4.53-7.el9    appstream                                           63 k
 php-ldap               x86_64 8.0.20-3.el9    appstream                                           43 k
 php-opcache            x86_64 8.0.20-3.el9    appstream                                          513 k
 php-pecl-apcu          x86_64 5.1.20-5.el9    appstream                                           63 k

トランザクションの概要
========================================================================================================
インストール  51 パッケージ

ダウンロードサイズの合計: 61 M
インストール後のサイズ: 346 M
これでよろしいですか? [y/N]:
```

`y`を入力し進めますと、パッケージ群のインストールが完了します。

インストール後に`php -m`などして公式マニュアルと比べたところ、

- 必須のPHP拡張機能はすべて含む
- オプションの拡張機能は`domxml`を除き含む
- `sodium`という拡張機能があるとパフォーマンスの向上が望める

ようなので、後ほど`sodium`だけ追加します。
`domxml`は必要性や入手方法がよくわからず・・・

完了したと思って他端末からインストールウィザードを開こうとすると、

> __Restricted area.__
Only local access allowed.
Check your configuration or contact your administrator.

と表示されます。追加の作業が必要なようです。

# 追加の作業

## SELinuxの設定

設定をしない場合、インストールウィザードで

> __推奨__ SELinuxモードは Enforcing
SELinux の boolean httpd_can_network_connect は off であり、一部の機能ではこれをオンにしてください。
SELinux の boolean httpd_can_network_connect_db は off であり、一部の機能ではこれをオンにしてください。
SELinux の boolean httpd_can_sendmail は off であり、一部の機能ではこれをオンにしてください。

と推されたので、SELinuxの設定をします。

```bash
setsebool -P httpd_can_network_connect on
setsebool -P httpd_can_network_connect_db on
setsebool -P httpd_can_sendmail on
```

## PHP拡張機能の追加

追加をしない場合、インストールウィザードで

> __推奨__ PHP emulated 拡張モジュール
パフォーマンスをわずかに向上させます。
以下の拡張モジュールはインストール済み : ctype, iconv, mbstring。
以下の拡張モジュールが存在しません : sodium。

と推されたので、追加します。
EPELにありますので、EPELの追加からです。

```bash
dnf install epel-release
dnf update
dnf install php-sodium
```
## PHPの設定

設定をしない場合、インストールウィザードで

> __推奨__ セッションのセキュリティー設定
セッション Cookie でセキュリティが施されていることを確認してください。
クライアント側スクリプトが cookie 値にアクセスするのを防ぐため、PHP の設定項目、"session.cookie_httponly" は、"on" に設定する必要があります。

と推されたので、設定します。
設定しても反映されない場合は、ホスト名が`localhost`のままかもしれません。

また、公式ドキュメントに

> __Configuration__
PHP configuration file (php.ini) must be adapted to reflect following variables:
memory_limit = 64M ;        // max memory limit
file_uploads = on ;
max_execution_time = 600 ;  // not mandatory but recommended
session.auto_start = off ;
session.use_trans_sid = 0 ; // not mandatory but recommended

とあるので、これも合わせて設定します。

`memory_limit`は初めから`128M`でしたので、不足するまではこのままにしようと思います。

`memory_limit`は`post_max_size`より大きくする必要があり、`post_max_size`はアップロードするファイルの制約となるため、他のPHPアプリケーションを含め、大きなファイルをアップロードする必要があれば、それを考慮し、大きくします。

`max_execution_time`は最大の処理待ち時間を秒単位で規定しますが、非力な環境ではインストールウイザードのデータベース作成処理が時間切れになり、完走できません。私の環境では'600'(10分)では足りなかったため、余裕をもって'1800'(30分)にしました。

その他の項目は初めから設定されていたこともあり、最終的に変更した箇所は、以下の通りです。
```/etc/php.ini
max_execution_time = 1800
session.auto_start = off
session.cookie_httponly = on
```

## Apacheの設定

`/etc/httpd/conf.d/glpi.conf`にGLPI用の設定が書かれていますが、インストールウィザードにアクセスできるのは`local`からのみという潔さなので、変更します。

```/etc/httpd/conf.d/glpi.conf
<Directory /usr/share/glpi/install>

    # Install is only allowed via local access (from the GLPI server).
    # Add your IP address if you need it for remote installation,
    # but remember to remove it after installation for security.

    <IfModule mod_authz_core.c>
        # Apache 2.4
        # Require local # <-- コメントアウト
        Require ip 192.168.0 # <-- インストールウィザードにアクセスできるIPアドレス(ここでは192.168.0を含むもの)を指定
    </IfModule>
    <IfModule !mod_authz_core.c>
        # Apache 2.2
        Order Deny,Allow
        Deny from All
        Allow from 127.0.0.1
        Allow from ::1
    </IfModule>
```

## Apacheの自動起動と起動

自動起動を設定します。
```bash
systemctl enable httpd.service
```
インストールウィザードを実行するため、起動します。

```bash
systemctl start httpd.service
```

# ここまでの動作確認

まだデータベースに手を付けていませんが、`dnf install glpi`だけでインストールされたパッケージの動作を確認しておきたく、ここでインストールウィザードを使ってみます。

## インストールウィザード

公式ドキュメントに従い進めます。

https://glpi-install.readthedocs.io/en/latest/install/wizard.html

ブラウザで`http://サーバー/glpi/install`にアクセス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/55585aef-cc1e-22cf-4172-ea1f2c3282d2.png)
やったー！
日本語を選択し、先に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/0bf93943-78c6-dffe-3305-93c845cc989e.png)
今回はクリーンインストールしているので、インストールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/8020f004-fccf-3a86-be34-14d3dd3194ba.png)
一通りのチェックをしてくれます。
続行すると、データベースの設定になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/46e51628-43d5-03af-ed40-50df22af5f99.png)

まだデータベースはインストールしていませんので、ここでブラウザを閉じ、終了します。
互換性の検査でなんらかの指摘があれば、直しましょう。

# データベースの構築

webインターフェースまわりに問題がなくなったら、データベースを導入します。

## MySQLインストール

```bash
dnf install mysql-server
```
記事執筆時点では、バージョンは`8.0.30-3.el9`でした。MySQL本家リポジトリじゃないけど、わりと新しいのが有難い。
```
メタデータの期限切れの最終確認: 0:00:31 時間前の 2022年12月02日 15時48分57秒 に実施しました。
依存関係が解決しました。
========================================================================================================
 パッケージ                           Arch           バージョン                 リポジトリー      サイズ
========================================================================================================
インストール:
 mysql-server                         x86_64         8.0.30-3.el9               appstream          17 M
依存関係のインストール:
 checkpolicy                          x86_64         3.4-1.el9                  appstream         347 k
 libtirpc                             x86_64         1.3.3-1.el9                baseos             93 k
 mariadb-connector-c-config           noarch         3.2.6-1.el9                appstream          11 k
 mecab                                x86_64         0.996-3.el9.3              appstream         356 k
(以下略)
```
自動起動を有効にし、起動します。
```bash
systemctl enable mysqld.service
systemctl start mysqld.service
```

## MySQLのroot設定

MySQLといえばインストール中に初期パスワードが生成されるものと思っていました。
MySQL公式ドキュメントもそれにそった手順になっています。

https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html

しかしappstreamリポジトリのMySQLは、そうではないようで。
```
grep 'temporary password' /var/log/mysql/mysqld.log
(結果なし)
```
とりあえずログインを試みます。
パスワードがわからないので、`Enter password:`と聞かれた箇所で、そのままEnterを押下しました。
```bash
mysql -uroot -p
```
```
Enter password:(そのままEnter)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.30 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
パスワードは無いようです。設定しましょう。
```SQL
ALTER USER 'root'@'localhost' IDENTIFIED BY 'パスワード';
```

## 文字コードについて

以前はインストール後の設定といえば文字コードでしたが、バージョン8では`utf8mb4`が初期値になりました。
```SQL
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb3                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

## GLPI用データベースユーザーの作成と権限付与

GLPI用ユーザーをMySQLに作成します。
```SQL
CREATE USER 'GLPI用データベースユーザー名'@'localhost' IDENTIFIED BY 'パスワード';
```
GLPI用データベース名を決め、GLPI用データベースにGLPI用ユーザーを登録します。
```SQL
GRANT USAGE ON GLPI用データベース名.* TO 'GLPI用データベースユーザー名'@'localhost';
```
GLPI用データベースに限定し、GLPI用ユーザーに対し全権限を付与します。
```SQL
GRANT ALL PRIVILEGES ON GLPI用データベース名.* TO 'GLPI用データベースユーザー名'@'localhost';
```
現段階でGLPI用データベースは存在しませんが、ユーザーの登録や権限付与はできました。

## GLPI用のデータベース作成

インストールウィザードの中で、新規に作成できました。権限を付与したときに指定したデータベース名と同じ名前にする必要があります。

もちろん、あらかじめ作成するのもありだと思います。作成しておけば、インストールウィザードの中でデータベースの選択肢として登場します。

# インストールウィザード（2回目）

ブラウザで`http://サーバー/glpi/install`にアクセス。
1回目では準備できていなかったデータベース部分を入力します。
![Setup GLPI および他 12 ページ - 個人 - Microsoft​ Edge-2022-12-02 15_46_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/f91bd99d-9fb3-eec7-0b6e-2ee3f25c46ab.png)

接続が成功すれば、データベースが選択できるようになります。
事前に決めておいたデータベース名を入力するか、事前に用意しておいたデータベースを選択します。
![Setup GLPI および他 22 ページ - 個人 - Microsoft​ Edge-2022-12-02 16_49_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/8f321458-c1ac-80b0-eac2-bad87c6721d1.png)

データベースの作成と初期化が行われます。
少し時間がかかります。
`php.ini`の`max_execution_time`が小さいと、タイムアウトしてしまいます。
![Setup GLPI および他 20 ページ - 個人 - Microsoft​ Edge-2022-12-02 16_58_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/11108c05-fc6e-1387-1c75-b3d8e7ffd99a.png)
![Setup GLPI および他 20 ページ - 個人 - Microsoft​ Edge-2022-12-02 17_03_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/5ebece69-3ef9-e176-09cc-a6aa93c978ca.png)

権限が不足しているなどでエラーになった場合は、MySQL側の設定を確認しましょう。
![Setup GLPI および他 22 ページ - 個人 - Microsoft​ Edge-2022-12-02 16_33_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/b4ba802f-22c2-4185-0128-9cab3d88878d.png)

データ収集に関する説明が表示されます。
![Setup GLPI および他 20 ページ - 個人 - Microsoft​ Edge-2022-12-02 17_04_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/270a323c-50a0-eee4-2f1a-21d6f41322cb.png)

サポートの案内が表示されます。
![Setup GLPI および他 20 ページ - 個人 - Microsoft​ Edge-2022-12-02 17_05_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/c267c029-1d88-7828-61c2-5b104afab199.png)

インストールが完了すると、初期ユーザーとパスワードが表示されます。
![Setup GLPI および他 20 ページ - 個人 - Microsoft​ Edge-2022-12-02 17_05_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/fc8d9a39-32d7-36e9-1514-67dc7b105276.png)

ログイン画面が表示されました。
![標準インターフェイス - GLPI および他 20 ページ - 個人 - Microsoft​ Edge-2022-12-02 17_05_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155025/f890effb-1dfa-7325-442b-d21a1b86d58c.png)


# 後処理

ログインに成功すると、下記のメッセージが表示されます。

> - セキュリティ上の理由から、デフォルトユーザー: glpi post-only tech normal のパスワードを変更してください
> - セキュリティの観点から、次のファイルを削除してください: install/install.php

忘れずに対処しましょう。

- 標準ユーザーはパスワードを変更したうえで、無効にする
- `install/install.php`は削除する

以上。