Docker Compose で作った Redmine だって Full Text Search plugin と ChupaText サーバーを連携させたい

# はじめに

[以前の記事](https://qiita.com/juno-nishizaki/items/45ff4186feb75d512306) で [Full text search plugin](https://github.com/clear-code/redmine_full_text_search) が使える Docker Compose の Redmine 環境を作ったのですが、同プラグインのオプションで添付ファイルの全文検索ができることを最近になって知りました。

オプションを有効にするためには ChupaText サーバーというものが必要です。[Docker 版の ChupaText サーバー](https://github.com/ranguba/chupa-text-docker) がありますので、今回はこれを組み込んでみました。

# 組み込みに至るまでの経緯

Docker 版の ChupaText サーバーは [docker-compose.yml](https://github.com/ranguba/chupa-text-docker/blob/master/docker-compose.yml) が用意されているので簡単に構築できるかなって甘く見ていたのですが、実際にやってみるとちょっと困ったことが起きました。

docker-compose.yml の内容を読んだところ、コンテナ側の ChupaText サーバーのポートを Docker ホスト側の 20080 番ポートにバインドする構成だということがわかりました。今回は Redmine も Docker Compose で構築しているため、Redmine のアプリケーションサーバーからどうやって Docker ホスト側のローカルアドレスにアクセスすればいいのか…結局のところわかりませんでした。

そこで、Redmine 構築用の docker-compose.yml に直接 ChupaText サーバーの設定を追加してしまえば、ChupaText サーバーが Redmine と同じ内部ネットワークに入るから簡単になるんじゃないかなと考えました。（両方の Docker Compose から接続できる共用ネットワークを作ることも考えましたが、管理が煩雑になりそうだったので今回は見送りました）

# 組み込んだ結果

## docker-compose.yml

以前 [GitHub](https://github.com/juno-nishizaki/myfav-redmine) で公開していたファイルを更新しています。

```diff:docker-compose.yml
version: "3.7"

services:

  redmine:
    build: ./redmine
    container_name: myfav-redmine
    restart: always
    depends_on:
      - db
+      - chupa-text
    ports:
      - "3000:3000"
    environment:
      TZ: Asia/Tokyo
      REDMINE_DB_POSTGRES: db
      REDMINE_DB_DATABASE: redminedb
      REDMINE_DB_USERNAME: redmineuser
      REDMINE_DB_PASSWORD: redminepassword
      REDMINE_PLUGINS_MIGRATE: "true"
    volumes:
      - "/srv/redmine/files:/usr/src/redmine/files:z"
      - "/var/log/redmine:/usr/src/redmine/log:z"

  db:
    build: ./db
    container_name: myfav-redmine-db
    restart: always
    environment:
      TZ: Asia/Tokyo
      POSTGRES_DB: redminedb
      POSTGRES_USER: redmineuser
      POSTGRES_PASSWORD: redminepassword
    volumes:
      - "dbdata:/var/lib/postgresql/data"
+
+  chupa-text-proxy:
+    image: groonga/chupa-text:proxy
+    container_name: myfav-redmine-chupa-text-proxy
+    restart: always
+    environment:
+      TZ: Asia/Tokyo
+    volumes:
+      - "/var/log/redmine-chupa-text/proxy:/var/log/squid:z"
+  chupa-text:
+    image: groonga/chupa-text:ubuntu-latest
+    container_name: myfav-redmine-chupa-text
+    restart: always
+    depends_on:
+      - chupa-text-proxy
+    environment:
+      TZ: Asia/Tokyo
+      http_proxy: http://chupa-text-proxy:3128/
+      https_proxy: http://chupa-text-proxy:3128/
+      RAILS_SERVE_STATIC_FILES: "true"
+    volumes:
+      - "/var/log/redmine-chupa-text/rails:/home/chupa-text/chupa-text-http-server/log:z"

volumes:
  dbdata:
```

* ChupaText サーバーが起動してから Redmine が起動するように依存関係を定義しました
* ChupaText サーバーおよびプロキシは [DockerHub](https://hub.docker.com/r/groonga/chupa-text) から取得するようにしました
* Docker ホスト側にポートをバインドする必要がないので省きました
* ログは `/var/log/redmine-chupa-text` に出力するようにしました（別のパスに変えても問題ないです）

##  Full text search plugin の設定

管理 > プラグイン から Full text search plugin の設定画面を開き、「ChupaTextサーバーのURL」に `http://chupa-text:3000/extraction.json` と設定します。ChupaText の README に書いている説明と、ホスト名：ポート番号が違っているので注意してください。

![clipboard-202005160243-d8us5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295482/c363d1da-096a-4eab-bc54-5bc47659e186.png)

## 検索実行

公開資料 [Redmine全文検索システムの実際](https://speakerdeck.com/akahane92/redminequan-wen-jian-suo-sisutemufalseshi-ji) をダウンロードして、チケットに添付してから検索してみました。ちゃんと、PDF 内のワードで検索されています。

![検索実行](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295482/a0b1b9c1-2049-1a50-1bb0-605e0fec6106.png)

# まだわかっていない点

* ChupaText サーバーの構築以前に登録された添付ファイルはどうやったら検索対象になるかのがわかっていません。 `full_text_search:synchronize` タスクを実行してみたりもしましたが、検索対象になってくれませんでした。
* [DMSF](https://github.com/danmunn/redmine_dmsf) の「文書管理」に登録したファイルを検索対象にする方法がわかっていません。（そもそも機能が存在していないかもです）

# 残タスク

ChupaText のログローテーションを組み込んでいません。とはいえ、README によるとホスト側の logrotate.d に [設定](https://github.com/ranguba/chupa-text-docker/blob/master/etc/logrotate.d/chupa-text) を追加しろということなので、それに従えば良いような気がします。

# おわりに

今回の組み込みにより、添付ファイルも全文検索できるようになりました。

Redmine の良いところの 1 つに、本体だけでなくプラグインにも素晴らしい機能がたくさんあることが挙げられると思います。有志のみなさんにはいつも心から感謝しています。

しかし、Redmine は構築するのが難しいので、せっかくこのような素晴らしい機能があってもセットアップすることができずにメリットを享受する機会を失っているのではないかと危惧しております。

僕がここまで積み上げてきたアウトプットが、そういった機会損失の防止に少しでもお役に立てれば幸いです。Linux に Docker Compose をインストールさえできたら、後は [README](https://github.com/juno-nishizaki/myfav-redmine/blob/master/README.md) に従えば簡単に起動できますので、是非ともお試しください。