SearXNG をセルフホスト:追跡なしのメタ検索と、Open WebUI・LobeHub の Web 検索連携

Zenavo のテンプレートで自分のサーバーに SearXNG をデプロイし、JSON API を有効化して、プライベートネットワーク経由で Open WebUI や LobeHub に接続することで、検索ごとの従量課金なしで AI にリアルタイム Web 検索を追加します。

この記事は English、简体中文、繁體中文、Español、Bahasa Indonesia でもお読みいただけます。

Open WebUI や LobeHub を立ち上げたあと、多くの人が次に求めるのが**「今日のニュースや最新のドキュメントを AI に検索させたい」**という機能です。商用の検索 API(Tavily、Serper、Brave Search など)は検索回数ごとの課金が多く、公開されている SearXNG インスタンスをそのまま使うとレート制限でエラーになりがちです。

SearXNG はオープンソースのメタ検索エンジンです。独自のインデックスを持たず、Google、Bing、DuckDuckGo、Wikipedia、GitHub など数十の検索エンジンに並行して問い合わせ、重複を除いた結果を返し、検索履歴のプロファイリングも行いません。さらに、Open WebUI や LobeHub と同じ Zenavo プロジェクトに SearXNG を追加すれば、プライベートネットワーク経由で検索ごとの追加費用なしに AI へ Web 検索を組み込めます。

1. 2つのデプロイ方法:AI 専用の内部バックエンドか、自分用の検索エンジンか

まず Zenavo に Linux サーバーを接続し、用途に合わせて選びます。

  • 方法 A:Open WebUI や LobeHub 専用の検索バックエンドとして動かす(推奨) 既存の Open WebUI または LobeHub プロジェクトを開き、右上の Add Service → Templates から SearXNG を選びます。SearXNG は同じプロジェクトの内部ネットワーク(http://searxng.zenavo.internal:8080)で動くため、公開ドメインを割り当てる必要すらなく、外部から検索エンドポイントを叩かれる心配がありません。
  • 方法 B:普段ブラウザから使うプライバシー検索エンジンとしても使う SearXNG テンプレートから新規プロジェクトをデプロイし、searxng サービスの Networking タブでポート 8080 にドメイン(例:search.example.com)を割り当てます。詳しくはドメインと HTTPS をご覧ください。

テンプレートは非常に軽量です(メモリ使用量は通常 200 MB 未満)。

設定 値または用途
イメージ searxng/searxng:latest
HTTP ポート 8080
設定ボリューム /etc/searxng(初回起動時に settings.yml と limiter.toml を自動生成)
キャッシュボリューム /var/cache/searxng
SEARXNG_SECRET プロジェクト作成時に自動生成されるシークレットキー

2. JSON 出力形式を有効にする(AI 連携に必須)

SearXNG は初期状態ではブラウザ向けの HTML ページしか返さず、?format=json をリクエストすると 403 Forbidden を返します。Open WebUI や LobeHub が検索結果を取得するには JSON API を有効にする必要があります。

初回起動後にデフォルト設定が生成されたら、/etc/searxng/settings.yml を開き(コンテナターミナルまたは設定ファイル機能から編集)、search: の下にある formats: に json を追加します。

search:
  formats:
    - html
    - json

Zenavo のプライベートネットワーク経由でのみ呼び出す場合は、server: の下の limiter: false(デフォルトで無効)も確認しておくと、内部リクエストが誤ってブロックされません。保存したらコンソールで searxng サービスを Restart します。

3. Open WebUI に接続する

Open WebUI のガイドに沿ってデプロイしている場合は、次の手順で設定します。

  1. Open WebUI に管理者アカウントでログインし、Admin Panel → Settings → Web Search を開きます。
  2. Enable Web Search をオンにします。
  3. Web Search Engine で searxng を選びます。
  4. Searxng Query URL に次を入力します。
    • 同じ Zenavo プロジェクト内(推奨):http://searxng.zenavo.internal:8080/search?q=<query>
    • 別プロジェクトの公開ドメイン:https://search.example.com/search?q=<query>
  5. 保存してチャット画面に戻り、入力欄の下にある Web Search をオンにして最新の話題を質問すると、Web ページを検索してから回答してくれます。

4. LobeHub に接続する

LobeHub のガイドでデプロイしている場合は、lobehub サービスの Variable タブに次の環境変数を追加し、保存して lobehub を再起動します。

SEARCH_PROVIDERS=searxng
SEARXNG_URL=http://searxng.zenavo.internal:8080

(別の Zenavo プロジェクトで動かしている場合は、SEARXNG_URL に https://search.example.com を指定します。)再起動すると、LobeHub の Web 検索機能が自分の SearXNG インスタンス経由でページを取得するようになります。

5. バックアップとアップグレード

SearXNG 自体はユーザーデータを持たないため、保管しておくべきなのは編集した /etc/searxng/settings.yml だけです。

  1. settings.yml を変更したら、メンテナンス時間帯に Backup & Restore タブから /etc/searxng ボリュームをバックアップするか、settings.yml の内容を手元に控えておきます。
  2. 上流の検索エンジンは頻繁に HTML 構造を変更するため、テンプレートでは最新のパーサー修正を取り込めるよう searxng/searxng:latest を使っています。特定のバージョンに固定したい場合は、サービスの Settings → Source でタグを指定してください。

よくある質問

Open WebUI や LobeHub で検索すると 403 Forbidden になります。 ほとんどの場合、ステップ 2 のとおり /etc/searxng/settings.yml の search.formats に json を追加していないか、変更後に searxng サービスを再起動していないことが原因です。また、公開ドメインにボット対策を入れている場合は、同じプロジェクト内の http://searxng.zenavo.internal:8080 を使ってください。

Google など一部の検索エンジンでタイムアウトや CAPTCHA が出ることがあります。 データセンターの IP から1つの検索エンジンばかりにリクエストを送ると、上流の制限に引っかかることがあります。SearXNG の Preferences → Engines または settings.yml で、Bing、DuckDuckGo、Brave、Wikipedia など複数のエンジンを有効にしてリクエストを分散させてください。

公開ドメインを割り当てた場合、第三者に JSON API を勝手に使われないようにするには? Open WebUI や LobeHub 専用なら、公開ドメインを割り当てずに .zenavo.internal のプライベートネットワークだけで運用するのが最も安全です。ブラウザからも使いたい場合は、settings.yml で server.limiter: true を有効にするか、JSON 形式を外部に公開しない設定にしてください。

セルフホスト型モデルゲートウェイと一緒に使えますか? もちろんです。1つの Zenavo プロジェクト内に Open WebUI / LobeHub + SearXNG + Magpie(または New API / LiteLLM) をまとめて配置し、チャット画面・Web 検索・モデルルーティングをすべて1台のサーバーの内部ネットワークで完結させる構成がよく使われています。

SearXNG テンプレートをデプロイするか、既存の AI プロジェクトに SearXNG サービスを追加して、数分で従量課金なしの Web 検索を手に入れましょう。