fessctlで障害調査・バックアップ・辞書管理をコマンドにまとめる

Fessのクロール結果を調べるとき、障害URL、ログ、システム情報をそれぞれ管理画面で開くことがあります。fessctlの開発版では、これらをコマンドから確認できるようになりました。辞書、テーマ、プラグイン、ストレージ、検索文書を扱うコマンドも追加されています。

接続先と対象バージョンを明示する

開発ソースの実行にはPython 3.13以上が必要です。リポジトリを取得し、関連PRを含むリビジョンで依存関係を用意します。uvを使う場合の実行例です。

git clone https://github.com/codelibs/fessctl.git
cd fessctl
uv sync --no-dev

export FESS_ENDPOINT='https://fess.example.com'
export FESS_VERSION='15.9.0'
# FESS_ACCESS_TOKENには管理APIを利用できるトークンを設定する
uv run fessctl --help

以降のfessctlは、この作業ディレクトリではuv run fessctlとして実行できます。接続先の初期値はhttp://localhost:8080、対象バージョンは15.9.0、トークンは未設定です。FESS_VERSIONはサーバーのバージョンに合わせて指定してください。指定によって14系・15系のHTTPメソッド等が切り替わり、サーバー自体が更新されるわけではありません。

障害URLからログと稼働状態を調べる

fessctl failureurl list --error-count-min 3 --page 1 --size 100
fessctl failureurl get FAILURE_ID
fessctl stats --output json
fessctl systeminfo --output json
fessctl log list --output json
fessctl log download LOG_ID --dest ./fess.log

FAILURE_IDとLOG_IDには、それぞれの一覧で得たIDを指定します。障害URLの一覧は初期値が1ページ目・100件で、URLやエラー名でも絞り込めます。障害記録の削除は原因の修正や再クロールの代わりにはなりません。failureurl delete-allは絞り込み結果だけでなく全件を削除する操作です。

statsの終了コードが成功でも、検索エンジンへの接続失敗をengine.status=redとengine.exceptionで返すことがあります。監視では終了コードに加え、response.stats.engineの内容を確認します。systeminfoには環境変数や設定値が含まれるため、外部へ共有する前に内容を確認してください。

ログIDは一覧の値をそのまま使います。Fess 15.9.0ではIDに-や_が含まれるファイルを取得できない場合があります。本体のPR #3659はこれを修正していますが、15.9.0公開後のマージであり、15.9.0に含まれる修正としては扱えません。また、未知のログIDを検証エラーにするPR #3660は確認時点で未マージです。CLI側でも取得前にログ一覧とIDを照合します。

バックアップと辞書を別々に取得する

fessctl backup list
fessctl backup download fess_config.bulk --dest ./fess_config.bulk
fessctl dict list --type synonym --output json
fessctl dict synonym download DICT_ID --file ./synonym.txt

バックアップのIDはbackup listで確認します。ログとバックアップの取得では、保存先が既にある場合は--forceを指定しない限り上書きしません。途中のファイルは.partへ書き出し、成功時に保存先へ移す仕組みです。バックアップの読み取りタイムアウトはチャンクごとに60秒で、すべての規模の転送成功を保証するものではありません。

設定バックアップだけでは辞書ファイルまで揃わないため、必要な辞書も取得します。辞書APIにはCodeLibsの検索エンジンプラグインが必要で、プラグインなしのvanilla構成では利用できません。辞書IDには環境共通の初期値はありません。

辞書はsynonym、mapping、kuromoji、stopwords、protwords、stemmeroverrideに対応します。同義語の複数入力は、カンマで連結せずオプションを繰り返します。

fessctl dict synonym create DICT_ID \
  --source 'ノートPC' --source 'ラップトップ' --target 'ノートパソコン'

辞書全体を置き換えるuploadは確認を求めます。Fess 15.6.1〜15.8.0ではサーバーのmultipart PUT処理に制限があり、CLIはアップロードを拒否します。15.9.0ではmultipart POSTを使います。辞書の項目IDはファイル内の位置に基づくため、別の利用者による削除で後続IDが変わります。更新・削除の直前に項目を確認してください。辞書の保存と、検索への反映に必要な解析設定・再インデクシング等も分けて確認します。

設定変更と追加コマンドの制限を押さえる

一般設定はgeneral getで取得し、変更するキーだけをgeneral update --set KEY=VALUEで指定できます。CLIは必須項目を読み戻して送信し、マスク済みの秘密情報をそのまま送り返さないようにします。空文字を送ることと管理画面で設定を削除することは同じではなく、秘密情報の消去にも制限があります。

テーマはtheme availableで候補を確認し、theme install NAME VERSIONで導入します。テーマAPIはFess 15.9.0以降が対象です。テーマ取得・導入の待ち時間は標準クライアントの5秒から60秒へ延長されています。サーバーから配布リポジトリへの通信も必要です。

plugin installed、plugin availableによる確認や、plugin install NAME VERSIONも利用できます。プラグインの導入・削除はバックグラウンド処理なので、コマンドの成功は受付を示します。導入済み一覧とログで結果を確認し、反映にはFessを再起動します。

文書を直接扱う場合は、次のコマンドを使えます。

fessctl searchlist search 'title:マニュアル' --start 0 --size 20
fessctl documents bulk ./documents.ndjson --output json

searchlistはdoc_idで文書を指定し、bulk応答のインデックス_idとは区別します。検索位置は0始まりの--startで、サーバーの取得サイズ上限は100件です。bulkはJSON配列、documents配列を持つJSON、NDJSONに対応し、一部文書の登録に失敗すると項目ごとの結果と終了コード9を返します。入力全体を一度に送信するため、大きなファイルは分割して使います。15.8以降のチャンク化された文書の本文変更にも制限があります。

ストレージはstorage listやstorage download PATH --file FILEで扱えますが、一覧は初期値1000件まででページングはありません。サジェストはsuggest infoで状態を確認できます。削除してもSuggest Indexerの実行で元データから再生成される点には注意してください。

関連PR

Fess 15.9.0公開、Docker構成と移行前に確認すること

Fess 15.9.0が2026年10月15日に正式公開されました。検索画面の標準が静的テーマになり、検索ログ分析、検索結果のCSV・JSON出力、ユーザータグなどが加わっています。一方、既存環境の更新では、画面・検索エンジン・プラグインの構成変更を先に確認する必要があります。

Java 21とOpenSearch 3.9.0を用意する

対応する基準はJava 21、OpenSearch 3.9.0です。OpenSearchはFess本体へ内蔵されなくなったため、別のサービスとして用意します。ZIP構成では、同梱ツールで導入できます。

bin/fess-setup install opensearch

15.8系と組み合わせていたOpenSearch 3.8.0を、そのまま15.9の対応構成として扱わないでください。既存環境では設定とインデックスをバックアップし、検証環境で対応するプラグインと辞書を揃えます。日本語のかな・長音表記の正規化を既存文書にも適用する場合は、再インデクシングが必要です。

Dockerのベースとslim版を選ぶ

マージ済みのdocker-fess #97では、15.9.0向けに次の構成が追加されています。

ベース通常版タグslim版タグ
Alpine15.9.015.9.0-slim
Ubuntu Noble15.9.0-noble15.9.0-slim-noble
Amazon Linux 202315.9.0-al202315.9.0-slim-al2023

通常版とslim版では組み込みツール・プラグインが異なります。slim版を既存通常版と同等の構成として置き換えず、利用する抽出・サムネイル・連携機能を確認してください。

関連ComposeのFess参照も15.9.0へ更新されています。ただし、本記事ではレジストリーからの各タグの取得・コンテナー起動は検証していません。実際の導入前にタグの存在と、採用するCompose一式の起動を確認します。snapshotタグはこのPRで次期開発版へ変更されておらず、正式版を選ぶ場合は明示的に15.9.0を指定します。

Playwrightクロールには追加導入が必要

Fess 15.9はNode.jsとPlaywrightクローラーを本体に同梱しません。通常のDockerイメージにもPlaywrightクローラーは自動追加されません。利用する場合は、例えば次の導入が必要です。

bin/fess-setup install nodejs
bin/fess-setup install plugin fess-crawler-playwright:15.9.0

Dockerで継続運用する場合はカスタムイメージ等へ組み込みます。今回のcompose/playwrightは15.9.0-nobleを基に両方を導入する構成です。

クローラーがない状態でPlaywrightを指定しても、通常のHTTPクライアントでクロールが続き、ジョブが成功終了する場合があります。成功表示だけで判断せず、JavaScriptで生成された本文が検索できることと、fess-crawler.logの警告を確認します。HTMLのスクリーンショットを作るfess-thumbnail-playwrightは別のプラグインです。

既存設定とプラグインを棚卸しする

標準検索画面はBootstrap静的テーマです。JSP検索画面、JSPテーマの種類、管理画面のページデザイン編集は削除されているため、独自JSP画面は移行が必要です。

Groovy、S3・GCSストレージ、SAML・SPNEGO・Entra ID・OIDCのSSOはプラグインに分離されています。スクリプト種類が未設定の既存データクロール等はGroovyとして扱われるため、「JavaScriptが標準になったので既存設定も自動変換される」とは考えず、設定を確認します。Groovyを維持する場合は次のように導入します。

bin/fess-setup install plugin fess-script-groovy

ユーザータグの初期値はuser.tag.enabled=falseで、更新だけで自動的に有効になるものではありません。削除されたapi.access.token.requiredも含め、認証やAPIクライアントを検証します。各プラグインはFessと同じ15.9系の対応版を選び、古いJARとの二重配置を避けてください。

リリース情報

関連PR

Fessのログイン成功後もIP単位の試行制限を維持する

Fessのログイン試行制限で、正常なログインが同じIPアドレスの失敗履歴まで消してしまう動作を修正しました。複数のアカウントに対する失敗を、1つの有効なアカウントへのログインで繰り返しリセットできていた問題への対応です。

対象となるログイン

対象はPOST /api/v2/auth/loginと、SPNEGOプラグインのBasicフォールバックです。成功時には「IPとユーザー名」の履歴をクリアしますが、IP全体ではその成功したリクエスト1件分だけを戻します。同じIPから別ユーザー名で行った失敗は残ります。すでに有効なロックアウトを解除・短縮する変更ではありません。

設定の初期値

修正を確認した本体開発版のfess_config.propertiesでは、次の設定です。

設定初期値
theme.api.login.rate.limit.per.ip.per.minute10
theme.api.login.rate.limit.per.user.per.minute5
theme.api.login.lockout.seconds900
theme.api.login.rate.limit.max.entries100000

IP単位の制限は0以下で無効、ロックアウト時間も0以下で無効です。「ユーザー単位」はIPとユーザー名の組み合わせであり、全IPにまたがるユーザー全体の集計ではありません。検索リクエスト全般のrate.limit.*とは別の設定です。

更新時に確認すること

SPNEGO側の変更は本体のLoginRateLimiter#releaseに依存します。本体に修正がない状態でプラグインだけを取り込む組み合わせは使えません。

NATやリバースプロキシ配下では複数ユーザーの試行が同じIPとして数えられることがあります。成功したログインでも他ユーザーの失敗履歴が残るため、利用人数とクライアントIPの認識を確認し、閾値を調整してください。制限はメモリ内の処理であり、複数Fessインスタンス間で共有する仕組みを追加する変更ではありません。

関連PR