FessのStaticテーマでログイン用パスワード欄が出ない場合の確認

FessのStaticテーマで、ログインダイアログは開くのにパスワード欄が表示されず、ログインできない問題の修正が提案されています。

11テーマ共通のダイアログを確認する

対象はBootstrapの代わりにcompat.jsのModalを使う11種類のStaticテーマです。PR #83でパスワード欄を必要な場面だけ生成する方式へ変えた後、生成のきっかけとなるshow.bs.modalイベントが発生しないため、欄がフォームへ追加されなくなっていました。

修正案では、ダイアログを開く前にshow.bs.modal、開いた後にshown.bs.modalを発生させます。最初のイベントがキャンセルされた場合は開きません。認証方式やパスワードポリシーを変更するものではなく、利用者に新しい有効化設定を求める変更でもありません。

ログイン必須の環境で特に影響が出ますが、認証必須設定を解除して回避する手順にはしません。標準Bootstrapテーマを含むすべてのログイン障害の原因がこの問題である、という説明でもありません。

Fess本体とテーマの対応を分けて選ぶ

main向けの修正案ではテーマのバージョンは15.10.1、最小Fessバージョンは15.10です。Fess 15.9で確認する場合は15.9.x向けのPR #88を含むソースを使います。たとえばDocSearchは15.9.12から15.9.13へ上がり、最小Fessバージョンは15.9のままです。全テーマが同じ15.9系パッチ番号になるわけではありません。

修正を含むチェックアウトで./scripts/package.sh docsearchを実行し、生成したZIPを管理画面「テーマ」(/admin/theme/)でアップロードして選択します。仮想ホストを使う場合は、そのテーマ割り当ても確認します。テーマの自動切り替えや新しい初期値の追加はありません。PRが未マージのため、ブランチ名や版番号だけで修正入りと判断しないでください。

更新後の確認と制限

独自に編集したテーマのファイルを控え、対応する検証環境で、ダイアログを開くとパスワード欄が出ること、ログインできること、閉じると欄が取り除かれることを確認します。ブラウザに古いJavaScriptが残る場合は再読み込みも行います。

PR #87ではFess 15.10.0-SNAPSHOTとsemanticlensでのログイン確認が報告されています。PR #88では自動テストと11テーマのバンドル検証が報告されていますが、こちらで全テーマの稼働確認を行ったものではありません。配布ZIPの公開も別途確認が必要です。

先の11テーマの記事はパスワード変更などの移植を紹介しました。今回はその後に分かったパスワード欄生成の不具合に絞った補足です。

関連PR

Fessのデータストアでroleとvirtual_hostの書き方を確認する

データストアのクロールが成功と記録されているのに、文書が検索できないことがあります。JavaScriptスクリプトでroleやvirtual_hostへ文字列・配列を渡した際、文書ID生成前に型の不一致が起きる問題への修正がマージされました。

スクリプトでは検索用のロール値を指定する

Boxの設定例も訂正され、固定ロールのスクリプトは次の形になりました。

role="Rbox-users"

管理画面の「パーミッション」欄や、対応プラグインのdefault_permissionsでは{role}box-usersのような表記を使います。一方、データストアスクリプトのroleは値がそのままインデックスへ入ります。初期の接頭辞はロールがR、グループが2、ユーザーが1です。独自に接頭辞を変更している環境では、その設定に合わせます。

role=['Rbox-users', 'Roperators']
virtual_host=['portal-a', 'portal-b']

上記はスクリプト欄の記述例です。ロールや仮想ホスト自体の登録、検索リクエスト側の設定も必要です。

文字列は1要素として扱う

修正後は、文字列を1要素のリストへ変換し、コレクション・配列・スクリプトエンジンが返すインデックス付きMapを文字列リストへそろえてから文書IDを作ります。roleとvirtual_hostの両方が対象です。新しい有効化スイッチはありません。

"Rbox-users,Roperators"という1本の文字列は、2つへ分割されません。複数指定は配列にします。null要素は除外しますが空文字列は保持し、対応しない型はフィールド名と型を含むDataStoreExceptionとして失敗処理へ渡します。既存のリスト指定は同じIDを維持します。

既存データを自動では直さない

従来はClassCastExceptionがWARNに残り、ジョブ全体の成功表示だけでは文書単位の失敗を見逃す場合がありました。修正の取り込みを確認した環境で、少量のデータから再クロールし、登録件数と実際の利用者による検索を確かめます。

誤ったロールで登録済みの文書や、登録に失敗した文書を修正だけで自動再処理する機能ではありません。再取り込みと、必要に応じた古い文書の整理が必要です。

関連PR

FioneのPython刷新案でCSVから予測APIまでの流れを確認する

FioneをPythonで書き直すPRが公開されています。CSVをアップロードし、自動でモデルを作って予測するという流れを引き継ぎながら、Fessプラグインから単独のAutoMLサーバーへ変える案です。

FessとH2Oを用意する構成から変わる

今回の修正ではFastAPIを使うWebアプリケーションと、LightGBM・XGBoost・CatBoost・ExtraTreesをOptunaで調整する独自のAutoMLエンジンを組み合わせます。メタデータはSQLite、データセットとモデルはローカルファイルまたはS3互換ストレージへ保存します。付属のCompose構成ではSeaweedFSを使い、Fess・H2O・MinIOへの依存を外します。

EasyMLでは「プロジェクト作成 → CSVアップロード → 予測する列と最大実行時間の指定 → 学習 → 予測結果サマリー → 新しいCSVの予測」という流れです。詳細表示にはリーダーボードやモデルのエクスポートがあり、REST APIは/api/v1に置かれます。

試す場合はPRのコードを取得する

DockerとCompose v2、Git、OpenSSLを用意します。正式版の手順と混同しないよう、PR #13を専用の作業コピーへ取得します。

git clone https://github.com/codelibs/fione.git fione-v2-review
cd fione-v2-review
git fetch origin pull/13/head
git switch --detach FETCH_HEAD
openssl rand -hex 16
openssl rand -hex 32

最後の2つの出力を、それぞれdocker/.envの次の項目へ設定します。実際の値をGitへ登録しないようにしてください。

FIONE_S3_ACCESS_KEY=生成した16バイトの16進数
FIONE_S3_SECRET_KEY=生成した32バイトの16進数
docker compose -f docker/compose.yaml --env-file docker/.env up -d --build --wait
docker compose -f docker/compose.yaml --env-file docker/.env logs fione

ComposeのWebポートは初期値で127.0.0.1:8080です。ログのSetup tokenを使い、ブラウザーで最初の管理者を作成します。既定の管理者パスワードはありません。ビルドキャッシュなどに約6GBのディスク容量と、別途データ用の容量が必要です。

初期値と運用上の制限

学習ジョブの同時実行数FIONE_MAX_CONCURRENT_TRAIN_JOBSは1、CSVアップロード上限FIONE_MAX_UPLOAD_BYTESは1GiBです。アプリケーションは1プロセス・1ワーカーで動かす前提で、コンテナを複数へ増やす構成にはできません。データ全体をメモリに読み込むため、ファイルサイズだけで利用可能な規模は決まりません。

学習したモデルはFione Servingで予測APIにできますが、モデルとイメージのタグをそろえる必要があります。予測API自体には認証がないため、ローカルで試すポート指定は-p 127.0.0.1:8081:8080とし、外部利用では認証を持つプロキシなどを別途用意します。公開済みイメージの利用を前提にせず、PRのコードからビルドしてください。

v1のH2Oモデル、データ、ユーザーは自動移行されません。CSVを再アップロードし、学習とユーザー作成をやり直します。独自Pythonモジュールも新しいAPIへ書き直しが必要で、アップロードしたモジュールはサンドボックスなしで動きます。

PR #14の説明可能性と、PR #15のSDK・Notebook連携は計画文書です。現段階で利用できる機能として扱わないでください。試用結果の評価には、学習に使わないテストデータも用意しておくとよいと思います。

関連PR

まだまだ、作業中ではありますが、使いやすいものにできれば良いなと考えて進めています。