phpMyFAQの導入

# 前置き

以前、phpMyFAQの3.0.12版で構築したことがありますが、各ソフトを新しくしたかったので再構築しました。
Webで散見される情報では、"Elasticsearchは6以外動作しない"と出てきますが、最新版を私が試した限り、Elasticsearch7以降でないと動きませんでした。
備忘録ですが、せっかくなので公開します。


# 導入

OS 及び、インストールプログラムの各バージョンは次の通り

<img src="https://img.shields.io/badge/AlmaLinux-9.4-orange" alt="AlmaLinux-9.4">
<img src="https://img.shields.io/badge/Apache-2.4.57-green" alt="Apache-2.4.57">
<img src="https://img.shields.io/badge/PHP-8.3.7-green" alt="PHP-8.3.7">
<img src="https://img.shields.io/badge/MariaDB-10.5.22-green" alt="MariaDB-10.5.22">
<img src="https://img.shields.io/badge/Elasticsearch-8.13-green" alt="Elasticsearch-8.13">


## Apache

インストール

``` bash
dnf install httpd
```

.htaccessで設定変更ができるようにします。

``` diff:/etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
-    AllowOverride None
+    AllowOverride All
</Directory>
```

サービス 起動

``` bash
systemctl enable httpd --now
```

## PHP
phpMyFAQの導入要件が、8.1以降となっています。
標準リポジトリの 8.2 を試したところ、モジュール(php-sodium)が入らず別に用意する必要がありました。

こちらの手順では、remiリポジトリを使います。

``` bash
dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
dnf config-manager --set-enabled remi
dnf update
```

導入できるバージョンの確認
``` bash
dnf module list php
```


PHP関連のインストール 及び サービスの開始

``` bash
dnf module install php:remi-8.3
dnf install php-gd php-curl php-fpm php-mysqlnd php-mbstring php-zip php-xml php-sodium
systemctl enable php-fpm --now
systemctl restart httpd
```


## DB

MariaDBを利用します。

``` bash
dnf install mariadb mariadb-server
```

設定の追加 (文字コード)

```  diff:/etc/my.cnf.d/mariadb-server.cnf
[mariadb]
+ character-set-server = utf8mb4
```

``` diff:/etc/my.cnf.d/client.cnf
[client-mariadb]
+ default-character-set = utf8mb4
```

サービスの登録と起動

```
systemctl enable --now mariadb
```

初期設定 （続く問答は省略）

``` bash
mysql_secure_installation
```

phpMyFAQ用のDBとユーザーの作成、権限の設定

``` sql
mysql -u root -p
create database phpmyfaq;
create user 'phpmyfaq'@'localhost' identified by 'phpmyfaqPassword';
grant all on phpmyfaq.* to 'phpmyfaq'@'localhost' with grant option;
quit;
```


## Elasticsearch

ダウンロード & インストール

``` bash
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.13.4-x86_64.rpm
rpm --install elasticsearch-8.13.4-x86_64.rpm
```

設定の変更

``` diff:/etc/elasticsearch/elasticsearch.yml
- xpack.security.enabled: true
+ xpack.security.enabled: false
+ network.host: 127.0.0.1
```

サービスの登録と起動

``` bash
systemctl daemon-reload
systemctl enable --now elasticsearch
```

インデックスを作成します。
（ phpMyFAQ の設定画面でもボタン操作でできます )
```
curl -XPUT http://127.0.0.1:9200/phpmyfaq?pretty
```

##### 閑話休題

Elasticsearch 7 も試してみました。
設定ファイルは次の追加で動作しています。

``` diff:/etc/elasticsearch/elasticsearch.yml
+ network.host: 127.0.0.1
+ http.port: 9200
+ transport.host: 127.0.0.1
+ transport.tcp.port: 9300
```


## phpMyFAQ

導入の呪文
所有権は、Apache の設定に合わせます。

``` bash
wget https://download.phpmyfaq.de/phpMyFAQ-3.2.6.zip
unzip phpMyFAQ-3.2.6.zip
cp -pR ./phpmyfaq/* /var/www/html
chown -R apache.apache /var/www/html
cp -p /var/www/html/config/elasticsearch.php{.original,}
```

設定ファイルを次の内容に変更します。

``` diff:/var/www/html/config/elasticsearch.php
  <?php
  $PMF_ES['hosts'] = ['127.0.0.1:9200'];
- $PMF_ES['index'] = '';
+ $PMF_ES['index'] = 'phpmyfaq';
+ $PMF_ES['type'] = 'faqs';
```

``` diff:/var/www/html/config/constants.php
- const DATETIME_TIMEZONE_DEFAULT = 'Europe/Berlin';
+ const DATETIME_TIMEZONE_DEFAULT = 'Asia/Tokyo');
```

http://[ IP_Address ] にブラウズして設定
※例 http://192.168.100.100 とか、サーバーのIPアドレス。

各設定の画面キャプチャ
まずは、DBへのアクセス設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/83aa5a24-78ef-9c5a-737a-ca73a7d22ad1.png)

LDAPは利用しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/cfd3f798-ea5e-dc36-5563-1c2208429db6.png)

Elasticsearch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/9db625c4-983b-203e-cd16-cb025a207eb8.png)

管理者の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/046d6136-702e-8225-a11b-802373d0b923.png)

SSLの設定をしていないので・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/bc3aceab-3cbf-8ca5-757b-36733b37609e.png)

完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/10930e24-e6e3-8eb0-14ce-d0800a9794ba.png)

もう一度 http://[ IP_Address ] にブラウズ
画面がでます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/8a10376e-a78f-fa7d-bab4-4619bb4d441a.png)

右上のログインから 設定した管理者で入ります。
ログインした後は、同じ右上のメニューに 管理が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/74693034-250a-1b39-2c9c-f9f56488d061.png)

設定画面 >> 環境設定 >> 検索
Elasticsearchを有効化にチェック ( した後に右上の保存ボタンを忘れずに )
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/848bc1d9-777d-8d94-e55f-ad37b6797015.png)

もう一度、設定メニューを読み込みなおすと、
Elasticsearchの設定が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180964/010a8569-8f46-5de4-5ec0-afb8fed97ec8.png)


# トラブルシューティング？

もし、Elasticserchが 503になったら、
次の設定をIPアドレスにすると直るかもしれません。
``` /etc/elasticsearch/elasticsearch.yml
cluster.initial_master_nodes: ["127.0.0.1"]
```

私はGmailのSMTPリレーを使いたかったのですが、
次の設定修正が必要でした。
Gmailに HELO を送るときに、送信元ドメインと不一致だと弾かれてしまいます。

```diff:/var/www/html/src/libs/symfony/mailer/Transport/Smtp/SmtpTransport.php
- private string $domain = '[127.0.0.1]';
+ private string $domain = '[example.com]';
```


# 後記
実は結構試行錯誤しました。ElasticSearchが動かないとか・・・。
なぜかキーワード検索が機能しないとか。
phpMyFAQのインストールは毎回つまづきます。
誰かの参考になれば幸いです。

MySQLで構築したphpMyFAQのバックアップを、MariaDB環境にリストアしたらエラーになった。何か違うんだろうか（調べていない）