Fessの全般設定にSSO関連の設定項目を追加

Fessの管理画面にある「全般」設定ページで設定できる項目を大幅に増やしました。これまでsystem.propertiesファイルを直接編集する必要があった設定を、管理画面から変更できるようにしています。

背景

Fessでは、system.propertiesで多くの設定項目を管理していますが、すべてが管理画面から設定できるわけではありませんでした。設定を変更するためにサーバー上のファイルを直接編集する必要があり、運用の手間が発生していました。今回、管理画面の全般設定に45項目を追加し、ほぼすべての設定をブラウザから変更できるようにしました。

追加した設定項目

各セクションに追加した項目は以下の通りです。

システム設定

  • 検索ファイルプロキシ: ファイルプロキシの有効/無効
  • ブラウザロケール使用: 検索時にブラウザのロケールを使用するかどうか
  • SSOタイプ: SSO認証方式の選択(none、oic、saml、spnego、entraid)

クローラー設定

  • User Agent: クローリング時に使用するユーザーエージェント文字列

LDAP設定

  • Security Authentication: LDAP認証タイプ
  • Initial Context Factory: LDAPコンテキストファクトリのクラス名

通知設定

  • 詳細検索ページ通知: 詳細検索ページに表示する通知メッセージ
  • Slack Webhook URL: Slack通知用のWebhook URL
  • Google Chat Webhook URL: Google Chat通知用のWebhook URL

OpenID Connect設定(新規セクション)

クライアントID、クライアントシークレット、認証サーバーURL、トークンサーバーURL、リダイレクトURL、スコープ、ベースURL、デフォルトグループ、デフォルトロールの9項目を設定できます。

SAML設定(新規セクション)

SPベースURL、グループ属性名、ロール属性名、デフォルトグループ、デフォルトロールの5項目を設定できます。

SPNEGO設定(新規セクション)

Kerberos設定ファイルパス、ログイン設定ファイルパス、クライアント/サーバーモジュール名、事前認証のユーザー名/パスワード、Basic認証やNTLMプロンプトの有効/無効、localhost許可、委任許可、除外ディレクトリの12項目を設定できます。

Entra ID設定(新規セクション)

クライアントID、クライアントシークレット、テナントID、Authority URL、Reply URL、State TTL、デフォルトグループ、デフォルトロール、パーミッションフィールド、ドメインサービス利用の10項目を設定できます。

セキュリティへの配慮

クライアントシークレットやパスワードなどの機密情報は、管理画面上ではマスク表示(**********)されます。値が設定済みかどうかは確認でき、新しい値を入力して更新することも可能ですが、現在の値がそのまま表示されることはありません。

まとめ

今回の変更により、SSO関連の設定を含む45項目が管理画面から設定可能になりました。サーバー上のファイルを直接編集する必要がなくなるため、運用の効率化が期待できます。

関連リンク

Fess 15.6.0のリリース

Fess 15.6.0をリリースしました。今回もかなりの修正が入っていて、マイルストーンを見てもらうと分かりますが、ボリュームのあるリリースになりました。

主なトピックとしては、まずOpenSearch 3.6に対応しました。バンドルしているkopfプラグインも合わせて更新しています。OpenSearch側のアップデートに追従しつつ、Fessとしても安定して動くように整えています。

次に、複数インスタンスでの運用を想定した分散コーディネーションの仕組みを入れました。同じクラスタに対して複数のFessを動かすときに、スケジューラやメンテナンスタスクが競合しないようにするための基盤になります。

パスワード周りも見直しており、ローカルユーザーのパスワードハッシュをBCrypt(Spring Securityの{bcrypt}形式)に切り替えました。既存のSHA-256/512/MD5ハッシュもそのまま検証可能で、次回ログイン成功時にBCryptへ透過的に移行されます(app.password.upgrade.enabled=trueがデフォルト)。ただし、BCrypt導入前のバージョンにダウングレードすると{bcrypt}でエンコードされたパスワードは検証できなくなるので、ロールバックする場合は管理者パスワードのリセットを前提にしてください。

AI関連では、これまで「AI Chat」と呼んでいた機能を「AI Search Mode」にリネームして、RAGパイプラインも大幅に作り直しました。LLMプロバイダをプラグイン化して、OpenAIのreasoningモデルやGemini 3のthinking budgetにも対応しています。スマートサマリーモードや、会話履歴のターン単位でのパッキング、クエリの再生成によるフォールバック、検索フィルタUI、Markdownレンダリング、go URL経由でのソースへの遷移など、普段使いで気になりそうなところをかなり改善しました。エラーメッセージも構造化したLlmExceptionのエラーコードとしてUIまで届くようになっています。

運用面では、ログベースの通知機能を追加しました。ERRORやWARNのログを、SlackやGoogle Chat、メールに転送できるので、既存のアラート基盤と組み合わせて使えます。加えて、プロンプトインジェクション対策や、IndexExportJobのパストラバーサル・シンボリックリンク攻撃対策、EntraIdやSPNEGO周りのログマスクなど、セキュリティ面の強化もまとめて入れています。

管理画面まわりも地味に便利になっていて、system.propertiesの設定項目をAdminの一般設定からまとめて触れるようになったり、メンテナンスページに設定インデックスの再構築アクションを追加したり、クロール設定の複製アクションを追加したりしました。通知設定も「Notice」と「Notify」に分割して整理しています。

そのほか、Servlet APIを6.0から6.1に上げて、残っていたjavaxからjakartaへの移行も完了させました。クロール周りでもRankFusionProcessorのバウンダリ修正や、相対パスのURL解決のフォールバック強化などを入れています。

今回も、コード修正からリリースノート作成、多言語ドキュメントの更新までClaude Codeにかなり助けてもらいました。開発の回転が上がっているので、引き続き細かい改善を積み上げていこうと思います。ぜひ新しいFessを使ってみてください。

Fessのスケジューラ起動APIでジョブログIDを返すようにする

Fessのスケジューラには、REST APIからジョブを起動する機能があります。しかし、これまでのAPIでは起動後にジョブの実行状況を追跡するための情報が返されていませんでした。そこで、スケジューラ起動API(PUT /api/admin/scheduler/{id}/start)のレスポンスにジョブログIDを含めるようにしました。

背景

Fessの管理APIを使ってスケジュールジョブを起動した際、そのジョブの実行ログを確認するには、ジョブログの一覧から該当するものを探す必要がありました。ジョブの起動時にログIDがわかれば、APIを通じてジョブの実行状況を直接追跡できるようになります。

変更内容

APIレスポンスの変更

PUT /api/admin/scheduler/{id}/start のレスポンスに jobLogId フィールドを追加しました。

ジョブログが有効な場合:

{
  "response": {
    "version": "14.x",
    "status": 0,
    "jobLogId": "a1b2c3d4e5f6..."
  }
}

ジョブログが無効な場合:

{
  "response": {
    "version": "14.x",
    "status": 0,
    "jobLogId": null
  }
}

仕組み

ジョブの起動リクエストを受けると、以下の流れで処理されます。

  1. ジョブログが有効な場合、32文字の16進数UUID(ハイフンなし)を事前生成する
  2. 生成したIDをパラメータとしてジョブの起動時に渡す
  3. ジョブ実行時に、渡されたIDをジョブログのドキュメントIDとして設定する
  4. APIのレスポンスにこのIDを含めて返す

launchNow() は非同期で実行されるため、APIのレスポンスが返った時点ではジョブログがまだ存在しない場合があります。IDは事前に生成されているので、ジョブが実行された際に確実にそのIDが使用されます。

主な変更ファイル

  • Constants.javaJOB_LOG_ID 定数の追加
  • ScheduledJob.java – パラメータ付きの start(Map) メソッドを追加
  • ScriptExecutorJob.java – ランタイムパラメータからジョブログIDを取得して設定
  • ApiResult.javaApiStartJobResponse クラスを追加
  • ApiAdminSchedulerAction.java – UUID生成とレスポンスへの設定

後方互換性

既存の引数なしの start() メソッドは変更されていません。管理画面やウィザードからの起動は従来通り動作します。APIレスポンスに jobLogId フィールドが追加されるのみで、破壊的変更はありません。

まとめ

この変更により、APIからジョブを起動した際にジョブログIDを取得でき、プログラムからジョブの実行状況を追跡しやすくなりました。詳細は PR #3103 を参照してください。