FessをWindowsにインストールする

ちょっとしたファイルシステム（共有フォルダなど）を全文検索できるサーチエンジンとしては、古くは[Namazu](http://www.namazu.org/index.html.ja)が一世風靡した時代もあったのですが、さすがに現代的でないので、今回は[Fess](https://fess.codelibs.org/ja/)をインストールしてみます。
バージョンはFess 12.1.1、インストール先はWindows 10 64bit版です。

基本的には

1. Javaです。
2. debとrpmとzipが配布されていますが、Windowsにインストールできるのはzipだけです。
3. GUIなインストーラーはありません。batファイルの、正直ちょーっとイケてない感じの、インストーラーが付属します。
4. ElasticsearhはFess本体に組み込まれているものを使う方法と、別途インストールする方法があります。本稿では前者、Fess本体に組み込まれているElasticsearhを使う方法を採用します。

こんなところです。ではレッツゴー。

#事前準備

Javaは既にインストール済みであるものとします。まだの人は[こちら](https://www.java.com/ja/download/manual.jsp)へどうぞ。ちなみに筆者はJava8 Update 161を使っております。Java9以降で動作するかは分かりません。。。すみません。

まずは環境変数``JAVA_HOME``を例えば``C:\Program Files\Java\jre1.8.0_161``みたいな感じで設定します。この環境変数は、インストーラーを改造するのでない限り、必須です。

#ダウンロードして展開する

Fess本体は[ここ](https://fess.codelibs.org/ja/downloads.html)から取ってきます。本稿執筆時点での最新バージョンは12.1.1です。

これを適当なディレクトリ、例えば``C:\fess-12.1.1``あたりに展開します。

#普通に実行する

サービスとして登録するのではなく、単なるプロセスとしてFessを実行するには、``bin``ディレクトリにある``fess.bat``を実行します。この状態でポート8080で立ち上がりますので、ブラウザから http://localhost:8080/ にアクセスするとFessが動いています。

#Fessをサービスとして登録する

この作業をする前に決めておくことがあります。それは、Fessをどのアカウントで動かすかです。Fessが動作するアカウント上で環境変数``JAVA_HOME``が設定されている必要があります。

まずは コマンド プロンプト を「管理者として実行」し、Fessの``bin``ディレクトリに入ります。ここで``service.bat``をコマンドラインオプションなしで実行すると、簡単なUsageが表示されます。

```
C:\fess-12.1.1\bin>service.bat

Usage: service.bat install|remove|start|stop|manager [SERVICE_ID]
```

次に、以下のコマンドを入力します。

```
service.bat install
```

これでサービス登録されるのですが__ここで注意！__``service.bat start``へ進む前にやるべきことがあります。

サービス管理ツールを開き（手順としては スタートボタン→Windows管理ツール→サービス）、__Fess (fess-service-x64)__ を選択し、プロパティを開きます。ここで ログオン タブを選択すると、__ローカル システム アカウント__が選択されていますので、これを __アカウント__ に変更し、Fessを動かすアカウントとパスワードを入力します。ここがローカル システム アカウントのままだと、環境変数``JAVA_HOME``が設定されていないためFessが動きません。何らかの理由で動いたとしても、セキュリティ上お勧めできません。

ここまできたら、プロパティシートの 全般 タブから 開始 ボタンを押してスタートです。または、コマンドラインから``service.bat start``でもOKです。この状態でブラウザから http://localhost:8080/ にアクセスするとFessが動いています。

さらに、常時起動したい場合は、 スタートアップの種類 を 自動 にします。

#Q&A

__Q. 動かんぞ！__
A. ``logs``ディレクトリの下にログができますので、頑張って解読して下さい。
私が経験したところでは、Fessを実行するアカウントは一アカウントに統一する必要があります。そうでないと内部ファイルの所有者が複数混在になってしまい、全ての内部ファイルにアクセスできるアカウントが一つもない状態に陥って動作しなくなります。

__Q. 公式の [Windowsサービスへの登録](https://fess.codelibs.org/ja/12.1/config/windows-service.html) に書いてある通りにインストールすればいいんじゃないのか？__
A. 公式のは、Fess本体に組み込まれているElasticsearchではなく別途インストールする前提の手順になっています。~~また、後述する間違い（``fess.bat``→``fess.in.bat``）があります。~~

__Q. ポート番号を8080から別のに変更したい。__
A. ``fess.in.bat``を書き換えます。
~~公式の [システム関連の設定](https://fess.codelibs.org/ja/12.1/config/system.html) には~~

>~~Windows 環境であれば bin\fess.bat の~~
>
>```
>set FESS_JAVA_OPTS=%FESS_JAVA_OPTS% -Dfess.port=8080
>```
>
>~~を変更します。~~

~~と書いてありますが、この記述は正確ではありません。正しくは``fess.bat``ではなく``fess.in.bat``です。~~→この間違いは直ったようです。

~~また、 [Windowsサービスへの登録](https://fess.codelibs.org/ja/12.1/config/windows-service.html) の~~

>~~Fess の検索画面、管理画面のデフォルトのポート番号は 8080 になっています。80 番に変更する場合は c:\opt\fess\bin\fess.bat の fess.port を変更します。~~

~~も、同様に``fess.bat``ではなく``fess.in.bat``です。~~→この間違いも直ったようです。

__Q. 環境変数``JAVA_HOME``を設定したくない。または、``JAVA_HOME``とは別の場所にインストールされているJVMを使いたい。__
A. ``fess.bat``か``service.bat``を書き換えます。
``fess.bat``の場合は、先頭のほうに

```
SET JAVA_HOME=C:\Program Files\Java\jre1.8.0_161
```

こんな行を追加すれば行けます。``service.bat``の場合は、さらにこれに加えて、166行目の二か所の``%%``を``%``に書き換えます。diff形式にすると以下のような感じです。

```diff
--- service.bat 2018-03-18 16:00:14.000000000 +0900
+++ service.new.bat    2018-04-16 22:42:54.382083400 +0900
@@ -1,5 +1,6 @@
 @echo off
 SETLOCAL enabledelayedexpansion
+SET JAVA_HOME=C:\Program Files\Java\jre1.8.0_161

 TITLE Fess Service

@@ -163,7 +164,7 @@
        )
 )

- "%EXECUTABLE%" //IS//%SERVICE_ID% --Startup %FESS_START_TYPE% --StopTimeout %FESS_STOP_TIMEOUT% --StartClass org.codelibs.fess.FessBoot --StopClass org.codelibs.fess.FessBoot --StartMethod main --StopMethod shutdown --Classpath "%FESS_CLASSPATH%" --JvmSs %JVM_SS% --JvmMs %JVM_XMS% --JvmMx %JVM_XMX% --JvmOptions %JVM_OPTS% ++JvmOptions %FESS_PARAMS% %LOG_OPTS% --PidFile "%SERVICE_ID%.pid" --DisplayName "%SERVICE_DISPLAY_NAME%" --Description "%SERVICE_DESCRIPTION%" --Jvm "%%JAVA_HOME%%%JVM_DLL%" --StartMode jvm --StopMode jvm --StartPath "%FESS_HOME%" %SERVICE_PARAMS% ++StartParams start
+ "%EXECUTABLE%" //IS//%SERVICE_ID% --Startup %FESS_START_TYPE% --StopTimeout %FESS_STOP_TIMEOUT% --StartClass org.codelibs.fess.FessBoot --StopClass org.codelibs.fess.FessBoot --StartMethod main --StopMethod shutdown --Classpath "%FESS_CLASSPATH%" --JvmSs %JVM_SS% --JvmMs %JVM_XMS% --JvmMx %JVM_XMX% --JvmOptions %JVM_OPTS% ++JvmOptions %FESS_PARAMS% %LOG_OPTS% --PidFile "%SERVICE_ID%.pid" --DisplayName "%SERVICE_DISPLAY_NAME%" --Description "%SERVICE_DESCRIPTION%" --Jvm "%JAVA_HOME%%JVM_DLL%" --StartMode jvm --StopMode jvm --StartPath "%FESS_HOME%" %SERVICE_PARAMS% ++StartParams start

 if not errorlevel 1 goto installed
 echo Failed installing '%SERVICE_ID%' service
```

__Q. Cygwinから起動したい。__
A. シェルスクリプト``bin/fess``のソースコードを読んで行くと、一見Cygwinに対応しているっぽい書きっぷりになっているのですが、試してみたところ正常に動きませんでした。batファイルを使うしかないようです。

以上！幸運を祈る。