Bitnami Redmineで全文検索プラグインを使う

#はじめに
このページはfull_text_searchプラグインをBitnami Redmine環境に導入したい方に向けたページです。全文検索プラグインは、bitnamiでインストールされるMySQLから別のデータベースに変更する必要があり通常のプラグイン導入より遥かに難しいので、バックアップと心の準備をしっかりしてから作業をお願いします。

一気にredmineのバージョンアップやpluginの整理を実施しようとしている方は、まずはそれらの作業を完了しredmine4系が動作するのを確認してから実施してください。一見うまく動いていたようでも、書き込みできなかったり、一部の動作がうまくいかなかったりするので、きちんと動く状態にて実施してください。

特に使わないプラグインはフォルダ消すだけではダメなものがあります。Backlogsなどのデフォルトテーブルを拡張しているものがそうです。使わないものは、bundle exec rake redmine:plugins:migrate name=プラグイン名 version=0 rails_env=productionと正しい手順でアンインストールしてから、実施してください。


#環境
・windows10 pro 64bit
・bitnami-redmine-4.1.1(4系であることは必須)
これに、以下を追加します。
・[redmine_full_text_search, v1.0.3](https://github.com/clear-code/redmine_full_text_search)
・[mariadb-10.4.12-with-mroonga-10.01-winx64.zip](https://github.com/mroonga/mroonga/releases/download/v10.01/mariadb-10.4.12-with-mroonga-10.01-winx64.zip)
・[chupa-text-http-server, v1.0.4](https://github.com/ranguba/chupa-text-http-server) 
・Node.js

なお、chupa_text_serverは別のwebサーバとなります。


#手順
## 1. Mroongaの入ったデータベースへの差し替え
Bitnamiで導入されたMySQLの代わりに、互換性のあるDBであるMariaDBに差し替える手順です。ある程度の危険が伴いますので自己責任にてお願いします。


### 1.1 バックアップ
まず、MySQLのダンプファイルを作成します。C:\Bitnami\redmine-4.1.1-0 -> use_redmine.bat より、以下のように入力してデータベースのバックアップを行います。パスワードはインストール時に入力したものです。

```
> mysqldump -u root -p bitnami_redmine > backup_20200428_411.mysql
Enter Password: 
```

同じ階層に、ファイルが生成されており**0kBでないこと**を確認してください。パスワードが違うなどでデータ出ていないときもファイルが生成されるのでご注意を。

### 1.2 Mroonga付きMariaDBダウンロード
https://mroonga.org/ja/
よりMroongaがデータベース(MariaDB)とセットでzipで提供されているものをダウンロードします。

ただ公式ページは最新ではないことがあるので、GitHubより最新のリリース版をダウンロードします。
https://github.com/mroonga/mroonga/releases


### 1.3 MySQLをMariaDBに変更
動いているMySQLを停止します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/65691f03-2d13-99c7-e1de-825da8fe726d.png)

※サービス削除する必要があるかもしれませんので備考に記載しておきます。
　この手順なら恐らく不要です。

そして、既存のMySQLのフォルダをリネームし、同じ場所にMariaDBのzipを展開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/169c8fee-eccd-e32c-5698-1523d40803da.png)


### 1.4 MariaDB initファイルの移動
zipファイル展開したMariaDBのフォルダには、my.iniがdataフォルダの中に入っていますが、bitnami redmineが参照しているDBのmy.iniはmysql直下になります。iniファイルを移動してください。

(元) C:\Bitnami\redmine-4.1.1-0\mysql\data\my.ini
(移動後) C:\Bitnami\redmine-4.1.1-0\mysql\my.ini
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/69a740e7-a381-0cde-b364-193c35b122c3.png)


### 1.5 my.iniの編集
元のiniファイルのままではなんとか起動すると思いますが、以下のように変更してください。特に重要なのが、デフォルトの文字エンコーディング設定です。これがないままDBを設定してしまうと、文字化けしたり、新たにデータ投入することができなったりするので注意してください。

```C:\Bitnami\redmine-4.1.1-0\mysql\my.ini
[mysqld]
basedir=C:/Bitnami/redmine-4.1.1-0/mysql
datadir=C:/Bitnami/redmine-4.1.1-0/mysql/data
character-set-server=utf8mb4
port=3306
max_allowed_packet=32M
bind-address=127.0.0.1
default-storage-engine=INNODB

[client]
plugin-dir=C:/Bitnami/redmine-4.1.1-0/mysql/lib/plugin
default-character-set = utf8mb4
```

### 1.6 MariaDB起動
DBを起動すると、MySQl Databaseという名の**MariaDB**が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/3bdb1c13-f0ef-26fc-ee32-2e45bae6c1ab.png)

上手く起動しない場合は、my.iniの記載内容か、もしくはサービス起動時にiniファイルを認識できていないためです。
Thinが起動できないのは、2章の設定が終わっていないためです。


## 2. データ復元
### 2.1 データベース、ユーザの作成
use_redmine.bat を**管理者権限**で実行し、MariaDBにログインします。MariaDBのコマンドはMySQLと同一です。
初期設定ではrootユーザのみ存在し、パスワード等はかかっていません。次のようにコマンドを実施します。
・rootへのパスワード設定 alter
・ユーザ作成 create user
・データベース作成 create database
・権限付与 grant

```
> mysql -u root
MariaDB[(none)] > ALTER USER root@localhost IDENTIFIED BY "xxxxxxxx";
MariaDB[(none)] > CREATE USER bitnami@localhost IDENTIFIED BY "xxxxxxxx";
MariaDB[(none)] > CREATE DATABASE bitnami_redmine;
MariaDB[(none)] > GRANT ALL ON *.* TO bitnami@localhost;
MariaDB[(none)] > FLUSH PRIVILEGES;
MariaDB[(none)] > exit;
```

大文字で表記したコマンド部分は小文字でも大丈夫です。
小文字で書いた部分はそれぞれの環境で異なる部分ですので状況に応じて変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/c58b0649-6b9f-864e-b5b1-222e55c2d12b.png)




exitの前にSHOW ENGINES;で確認すると、Mroongaが動いているかどうかが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/84c27a55-20cd-49a9-6fb5-f632ebf37d3d.png)

### 2.2 config確認
C:\Bitnami\redmine-4.1.1-0\apps\redmine\htdocs\config のデータベース設定を確認します。

```database.yml
production:
  adapter: mysql2
  database: bitnami_redmine
  host: 127.0.0.1
  username: bitnami
  password: "       "
  # Use "utf8" instead of "utfmb4" for MySQL prior to 5.7.7
  encoding: utf8mb4
  port: 3306
development:
  adapter: mysql2
  database: bitnami_redmine
  host: localhost
  username: bitnami
  password: "       "
  # Use "utf8" instead of "utfmb4" for MySQL prior to 5.7.7
  encoding: utf8mb4
```

developmentの向き先もproductionと同じにしておくと設定は楽です。もちろんdevelopment相当の作業は別のredmineサーバで実施してください！



### 備考(2.1～2.2)
use_redmine.bat を**管理者権限**で実行し、MySQLサービスを削除します。

```
> sc delete redmineMySQL
```

サービス登録の場合は、

```
> sc create redmineMySQL binPath= "C:\Bitnami\redmine-4.1.1-0\mysql\bin\msqyld.exe --default-file=C:\Bitnami\redmine-4.1.1-0\mysql\my.ini redmineMySQL"
```

を実行すると、windowsのサービスとして登録されます。
--default-fileオプションでiniファイルの位置を指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/2b308b42-11fc-9749-73bd-f060332ecd34.png)


### 2.3 全文検索プラグイン保存
C:\Bitnami\redmine-4.1.1-0\apps\redmine\htdocs\pluginsへ
redmine_full_text_searchプラグインを保存してください。


### 2.4 データベース復元
再びuse_redmine.bat上で、データベースを復元します。MariaDBはMySQLと互換性がありますので単純な復元作業と同じです。
ここのパスワードは先ほど設定したものになります。

```
> cd apps/redmine/htdocs
> bundle install
> mysql -u root -p bitnami_redmine < backup_20200428_411.mysql
Enter Password: 
```

### 2.5 全文検索プラグインインストール
プラグインのインストールは通常と同じです。

```
> cd apps/redmine/htdocs
> bundle install 
> bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```






## 3. 添付ファイルの全文検索(chupa_text_http版)
添付ファイルの全文検索を行う場合は、ChupaTextというファイルの中身を解析してjson形式で返答するサーバを構築して、全文検索プラグインにそのサーバurlを教えてあげる必要があります。

既存のファイルの解析の仕方はまだ調べておりませんので、分かり次第こちらの記事を更新します。


### 3.1 chupa_textサーバのダウンロード
Docker版などあるようですが、ここでは非常に厳しい社内環境で構築される方を想定して、chupa-text-http-serverについての手順記載します。なお、4章に書くようにDocker版が推奨です。

https://github.com/ranguba/chupa-text-http-server/releases
よりzipファイルをダウンロードして展開します。C直下もしくはBitnamiフォルダがよいかと思います。ここではBitnamiフォルダに展開したとします。

### 3.2 Node.jsインストール

https://nodejs.org/ja/download/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/1d618161-4b4b-846c-75b2-6063f5dffc73.png)


Node.jsのインストールが上手くいっていない場合、ChupaTextサーバは次のようなエラーを吐きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/c84d22f3-0cd1-05cd-45dd-a4c8a9fa2ad3.png)


### 3.3 bundle installと起動確認
use_redmine.bat を*管理者権限*で実行します。bitnamiのbatファイルを流用したのは各種パスが通っていて便利であったためです。

```
> cd C:\Bitnami\chupa-text-http-server-1.0.4
> bundle install
> ruby bin/rails s
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/885bc890-7107-6c34-8043-bc81afa79a70.png)


### 3.4 プラグイン設定
添付ファイルの検索には、ChupaTextのサーバの指定が必要です。
redmineのプラグイン設定画面に行き、URLを入力してください。
以下でポートを変更しない場合：http://localhost:3000/extraction.json です  ←.json追記(後述)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/49d9af7d-9525-ad54-ce4b-8bf480926535.png)

ここで適当なファイルを登録してやると、検索窓の検索で添付ファイルの中身が解析されていることがわかります。
※ **chupa-text-http-serverはpdfに対応しておりません**

### 3.5 サービス設定(タスクスケジューラによる起動)
最後の設定として、ChupaTextサーバを常時起動にできるよう、windowsのタスクスケジューラに登録します。bitnami redmineの環境を流用させていただき、以下のファイルをテキストファイルで作成します。

``` chupatext起動.bat
CALL "C:\Bitnami\REDMIN~1.1-0\scripts\setenv.bat"
C:
cd "C:\Bitnami\chupa-text-http-server-1.0.4"

ruby bin/rails s -p 3000
```

というファイルを作成して、user_redmine.batと同じディレクトリにでも設置します。
windowsタスクスケジューラを起動し、システム起動と合わせて実行するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/85bcbc60-b439-452d-66bf-6bb7d12244d0.png)
こうすれば、windowsの起動時に手動で起動する必要はなくなります。
終了したい場合にもこちらの画面からになります。






## 4. 添付ファイルの全文検索(chupa_text_docker版)
こちらはpdfの添付ファイルも検索したい人の手順です。こちらの場合は3章の実行は不要です。
※メモリは4GB以上必要です。4GB環境はdocker割当メモリ1GB、遅延起動にてようやく動かせました。

### 4.1 docker desktop for windowsインストール
下記のサイトなどを使用してdockerをインストールしてください。
https://ops.jig-saw.com/tech-cate/docker-for-windows-install

### 4.2 chupa_text_dockerのダウンロード
https://github.com/ranguba/chupa-text-docker
よりzipファイルをダウンロードして展開します。C直下もしくはBitnamiフォルダがよいかと思います。ここではBitnamiフォルダに展開したとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/6e09f34d-d673-ef9c-7033-e48239efa7cc.png)

### 4.3 docker-composeにてサーバ立ち上げ
windows環境の方は4.1のインストールでdocker-composeがインストールされております。
docker-composeコマンドにて、chupa_textサーバをdocker内に立ち上げます。

コマンドプロンプトを管理者権限にて実行してください。

```
> cd C:\Bitnami\chupa-text-docker
> docker-compose up
```

こちらは2回目以降の起動画面ですが、無事に起動すると、青い色でchupa_text_1というように反応が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/cf395888-a190-5616-7e67-80b235ab68cd.png)

### 4.4 プラグイン設定
添付ファイルの検索には、ChupaTextのサーバの指定が必要です。
redmineのプラグイン設定画面に行き、URLを入力してください。
以下でポートを変更しない場合：http://localhost:20080/extraction.json です。

※**.jsonをつけないと、pdfの内容は解析されません。**
(logファイル見ると422エラーが出力されています　ERROR -- : [decomposer][http-server] Failed to process data in server: <c:/Bitnami/redmine-4.1.1-0/apps/redmine/htdocs/files/2020/05/200502174502_ba67d6c41572d20bd564883063da9365.pdf>(application/pdf): http://localhost:20080/extraction: 422: Unprocessable Entity)

### 4.5 サービス設定(タスクスケジューラによる起動)
4.3の起動を自動化するため、3章と同様にタスクスケジューラに登録します。

```chupatextの起動.bat
cd C:\Bitnami\chupa-text-docker
docker-compose down
docker-compose up
```


※サーバが停止が不完全で起動できないことがあるのでdocker-compose downによりサーバの停止を明示しています。


メモリ4GB程度の方は、windows起動直後の実行ではメモリ不足でdockerが起動できないと思われます。遅延時間を設定して、PCが落ち着いたところで実行されるようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/f1e524c1-8d57-eb8d-0cc0-aed93d071aec.png)


ポートを変更したい場合は、C:\Bitnami\chupa-text-dockerにある設定ファイルdocker-compose.ymlを変更してください。

```docker-compose.yml
    ports:
      - "127.0.0.1:20080:3000"
```



## 5. 全文検索プラグイン 既存データのindex作成
忘れがちなこの作業、既存のデータに対してインデックス化を行う作業です。データベースサイズに応じてそれなりの時間がかかるようです。データベースサイズが100MB程度なら数分で完了します。見積を詳細に立てたい方はリンク先のページを参照ください。

```
> cd apps/redmine/htdocs
> ruby bin/rails full_text_search:synchronize RAILS_ENV=production
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/0442c5df-d834-f99d-c31e-7ae65230e8ee.png)

### 備考
インデックス化の再実行したい場合は、一旦プラグインアンインストール＆再インストールして実行するとよいかと思います。
chupatextサーバだけが止まっている状態で添付がアップロードされる場合、ログをこまめに見ていなければ気づけないのでご注意ください。このようにredmineのproduction.logにエラーが残ります。
ERROR -- : [decomposer][http-server][connection] Failed to process data in server: http://localhost:20080/extraction.json: Errno::ECONNREFUSED: Failed to open TCP connection to localhost:20080 (No connection could be made because the target machine actively refused it. - connect(2) for "localhost" port 20080)


2022/4/20追記：
もし全文検索プラグインで、添付ファイルのみ再インデックス化を行いたい場合は、
```
ruby bin/rails full_text_search:text:extract RAILS_ENV=production
```
にて、実行できるようです！



## おわりに

Bitnami Redmineでの全文検索プラグインの導入の仕方を紹介しました。
chupatextにhttp・docker版のどちらを使うかは悩ましいところです。

ただ本記事とは関係ないですが、
・GitBucketのDBにMariaDBの使用は少々難しい
・MySQL、MariaDBよりPostgreSQLの方がレスポンスもよい
・MySQL→PostgresSQLのデータベース変換にはPGLoader(windowsの方はdocker使うはず)
ということがあり、docker版のchupa_text使う＆一気にDBもPostgreSQL化するというほうがいいかなーと思ってきています。

知見がたまったらまた記事を書きたいと思います。



### 参考ページ
Word PressとかRedmineとかに使うDBをMariaDBに！　https://dgz.jp/mariadb/
全文検索でRedmineをさらに活用！　https://www.slideshare.net/kou/redmineosaka17
Redmine 全文検索プラグインのすすめ<Full text search plugin>　https://www.slideshare.net/netazone/an-encouragement-of-redmine-full-text-search-plugin
Redmine全文検索の実際 〜333億文字を平均3秒以内に検索できる、サクサクなRedmine全文検索の作り方〜　https://speakerdeck.com/akahane92/redminequan-wen-jian-suo-sisutemufalseshi-ji

doc,docx,pdfで文字を取り出せない https://github.com/ranguba/chupa-text-docker/issues/1
compose-up時にdisco-securityが404エラーを発生する　https://github.com/ranguba/chupa-text-docker/issues/2