マルチテナンシー設定

概要

Fess のマルチテナンシー機能を使用すると、単一の Fess インスタンスで 複数のテナント(組織、部門、顧客など)を分離して運用できます。

仮想ホスト機能を使用することで、各テナントに対して:

  • 独立した検索UI

  • 分離されたコンテンツ

  • カスタマイズされたデザイン

を提供できます。

仮想ホスト機能

仮想ホストは、HTTPリクエストのホスト名に基づいて、異なる検索環境を提供する機能です。

仕組み

  1. ユーザーが tenant1.example.com にアクセス

  2. Fess がホスト名を識別

  3. 対応する仮想ホスト設定を適用

  4. テナント固有のコンテンツとUIを表示

仮想ホストヘッダーの設定

仮想ホスト機能を有効にするには、 virtual.host.headers プロパティを設定します。 このプロパティは fess_config.properties で定義します。

設定形式

各行に ヘッダー名:ヘッダー値=仮想ホストキー の形式で指定します:

# fess_config.properties
virtual.host.headers=Host:tenant1.example.com=tenant1\n\
Host:tenant2.example.com=tenant2

複数の仮想ホストを設定する場合は、改行区切りで記述します。

仮想ホストキーの制約

仮想ホストキーには以下の制約があります:

  • 使用可能な文字は英数字とアンダースコア( a-zA-Z0-9_ )のみです。それ以外の文字は自動的に除去されます。

  • 以下のキー名は予約語のため使用できません: admincommonerrorloginprofile

管理画面での設定

クロール設定

Webクロール設定で仮想ホストを指定することで、コンテンツを分離できます:

  1. 管理画面にログイン

  2. 「クローラー」→「ウェブ」でクロール設定を作成

  3. 「仮想ホスト」フィールドで virtual.host.headers で定義した仮想ホストキーを選択

  4. この設定でクロールされたコンテンツは、指定した仮想ホストでのみ検索可能

アクセス制御

仮想ホストとロールの組み合わせ

仮想ホストとロールベースのアクセス制御を組み合わせることで、 より細かいアクセス制御が可能です。

クロール設定で仮想ホストとパーミッションを組み合わせて設定します:

# クロール設定の仮想ホスト
tenant1

# クロール設定のパーミッション
{role}tenant1_user

ロールベース検索

詳細は ロールベース検索の設定 を参照してください。

UIカスタマイズ

各仮想ホストに対してUIをカスタマイズできます。

テーマの適用

仮想ホストごとに異なるテーマを適用:

  1. 「システム」→「デザイン」でテーマを設定

  2. 仮想ホスト設定でテーマを指定

カスタムCSS

仮想ホストごとにカスタムCSSを適用するには、管理画面の「システム」→「デザイン」でCSSファイルを編集します。仮想ホストキーに対応するビューディレクトリにカスタムテンプレートを配置することもできます。

ラベル設定

仮想ホストごとに表示するラベルを制限:

  1. ラベルタイプの設定で仮想ホストを指定

  2. 指定した仮想ホストでのみラベルが表示される

API認証

仮想ホストごとにAPIアクセスを制御:

アクセストークン

仮想ホストに紐づくアクセストークンを発行:

  1. 「システム」→「アクセストークン」でトークンを作成

  2. トークンに仮想ホストを関連付け

APIリクエスト

curl -H "Authorization: Bearer TENANT_TOKEN" \
     "https://tenant1.example.com/api/v1/search?q=keyword"

DNS設定

マルチテナンシーを実現するためのDNS設定例:

同一サーバーへのサブドメイン

# DNS設定
tenant1.example.com    A    192.168.1.100
tenant2.example.com    A    192.168.1.100

# またはワイルドカード
*.example.com          A    192.168.1.100

リバースプロキシ設定

Nginxを使用したリバースプロキシ設定例:

server {
    server_name tenant1.example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    server_name tenant2.example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

データ分離

完全なデータ分離が必要な場合は、以下のアプローチを検討:

インデックスレベルの分離

各テナントに対して別々の Fess インスタンスとインデックスを使用:

# テナント1用Fessインスタンス(fess_config.properties)
index.document.search.index=fess_tenant1.search

# テナント2用Fessインスタンス(fess_config.properties)
index.document.search.index=fess_tenant2.search

注釈

index.document.search.index はインスタンスごとに1つのみ設定可能です。 インデックスレベルの完全な分離を行うには、テナントごとに別々の Fess インスタンスを起動するか、 カスタム実装が必要です。通常のマルチテナンシーでは、仮想ホスト機能による論理的な分離で十分です。

ベストプラクティス

  1. 明確な命名規則: 仮想ホストとロールに一貫した命名規則を使用

  2. テスト: 各テナントでの動作を十分にテスト

  3. 監視: テナントごとのリソース使用状況を監視

  4. ドキュメント: テナント設定を文書化

制限事項

  • 管理画面は全テナントで共有されます

  • システム設定は全テナントに影響します

  • 一部の機能は仮想ホストに対応していない場合があります

参考情報