DockerでSearXNGを構築:HomeLab環境にプライベートなメタ検索エンジンをセルフホストする

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

プライバシー検索:選択肢の比較

商用検索エンジンにクエリを入力するたび、データは外部へ流出しています。プロバイダーはパブリックIPアドレス、ブラウザヘッダー、検索文字列を紐付けることで、広告配信用の詳細なプロファイルを作成します。HomeLab(自宅ラボ)を運用しているなら、Pi-holeなどのDNSシンクホールを導入したりファイアウォールルールを最適化したりするのと同様に、検索習慣そのものを見直すことも極めて重要です。

一般的なホームネットワーク環境におけるWeb検索のプライバシー対策は、主に次の3つのアプローチに分かれます。

  • ホスト型プライバシー検索エンジン(DuckDuckGo、Brave Search、Startpage): Googleに代わる手軽で設定不要の選択肢です。トラッキングCookieを破棄し、IPアドレスをマスキングします。ただし、サードパーティのサーバーに依存している点には変わりなく、ランキングの変更や広告スニペットの表示、さらには法的要請に伴うサイレントなログ記録といったリスクは残ります。
  • ブラウザの分離と使い捨てプロファイル: Kasm Workspacesによるエフェメラルなブラウザコンテナの起動や、一時的なWireGuardトンネル経由でのトラフィックルーティングが挙げられます。サイト間のプロファイリングを完全に遮断できる一方、メモリ消費量が大きく(セッションごとに1〜2GB)、ページ読み込みの遅延も顕著になるというデメリットがあります。
  • セルフホスト型メタ検索(Docker上のSearXNG): SearXNGは、ローカルLANとGoogle、Bing、DuckDuckGo、Wikipedia、Redditなど70以上の検索バックエンドとの間で、自前の中継プロキシとして動作します。検索プロバイダー側に認識されるのはサーバーのIPアドレスのみであり、クライアントPCやスマートフォンの情報が伝わることはありません。SearXNGが各プロバイダーからの応答を集約し、追跡トークンを除去したうえで、広告のないクリーンな検索結果をブラウザに返します。

SearXNGのセルフホストは、高速な検索応答、広告のない快適な閲覧性、そして外部へのテレメトリ送信に対する完全なコントロールを兼ね備えた、最もバランスの取れたソリューションです。

SearXNGをセルフホストするメリット・デメリット

コンテナをデプロイする前に、得られるプライバシー上の恩恵と運用上の現実的な課題を比較検討しておきましょう。

メリット

  • 複数エンジンの検索結果を統合: 単一のインデックスに依存せず、SearXNGは複数の検索エンジンへ並行してクエリを発行します。一般的なWeb検索結果に加え、GitHubリポジトリやコミュニティフォーラムのヒットも1つの画面にまとめて表示できます。
  • 広告・リダイレクトトラッカーを完全排除: 広告枠、トラッカーだらけのアフィリエイトリダイレクト、SEO記事ファームなどがHTMLレンダリング前に排除され、目的のリンク先へ直接アクセスできます。
  • ネットワーク全体への展開: サーバー上にコンテナスタックを一度構築すれば、同一サブネット内にあるスマートフォン、タブレット、PCから即座に利用可能です。
  • きめ細かな検索エンジンの制御: アップストリームの検索ソースを自由に選択できます。不要なプラットフォームを完全に無効化したり、論文、トレント、ソースコードなどの専門エンドポイントの優先順位を上げたりできます。

デメリット

  • 上位プロバイダーのレート制限とCAPTCHA: GoogleやBingなどの主要プロバイダーは、クラウドVPSのIPアドレス帯に対して厳格なアクセス制限を実施しています。自宅の固定回線IPからインスタンスを運用すれば多くのブロックを回避できますが、検索頻度が高い場合は保守的なレート制限の設定が必要です。
  • スクレイパーの定期的なメンテナンス: 検索プロバイダーがHTMLマークアップやAPIの仕様を変更すると、エンジン固有のスクレイパーが動作しなくなることがあります。パーサーを正常に保つには、月1〜2回程度SearXNGのコンテナイメージを更新する必要があります。
  • メモリ消費: 高速なレスポンスを実現するためにインメモリKVSキャッシュ(RedisまたはValkey)が必要となり、スタック全体で約80〜150MBのベースラインRAMが追加で消費されます。

推奨アーキテクチャ

安定したSearXNG環境を構築するため、Docker Composeを使って次の2つの軽量コンテナを連携させます。

  1. SearXNG Core: 外部クエリの集約、コンテンツフィルタリングの適用、フロントエンドUIのレンダリングを担うPythonアプリケーション。
  2. Valkey(またはRedis): ポート6379で動作するインメモリキャッシュ。重複する検索応答のキャッシュや一時的なユーザーセッションの保持を行い、外部への過度なリクエストを抑制してIPブロックを防ぎます。

設定ファイルをコンテナのランタイムから切り離しておくことで、将来のバージョン更新もスムーズに行えます。環境のポータビリティを保ち、構成をクリーンに維持しましょう。

プロジェクトディレクトリは以下のように構成します。

~/searxng-docker/
├── docker-compose.yml
├── searxng/
│   └── settings.yml
└── .env

導入手順:SearXNGをステップバイステップでデプロイ

ステップ1:ディレクトリとベースファイルの作成

DockerホストにSSH接続し、スタック用の専用ディレクトリを作成します。

mkdir -p ~/searxng-docker/searxng
cd ~/searxng-docker

ステップ2:暗号化キーの生成

SearXNGはセッションCookieへの署名やCSRF対策のために暗号化キーを必要とします。32バイトの16進数シークレットを生成し、ローカルの.envファイルに直接書き込みます。

echo "SEARXNG_SECRET=$(openssl rand -hex 32)" > .env

cat .envを実行し、64文字の16進数文字列が出力されることを確認してください。

ステップ3:SearXNGの設定

SearXNGは中央のYAMLファイルからランタイム設定を読み込みます。テキストエディタでsearxng/settings.ymlを作成します。

nano searxng/settings.yml

以下の本番用設定を貼り付けます。この構成では、Valkeyキャッシュコンテナとの連携、画像プロキシの有効化、主要な検索バックエンドのタイムアウト調整を行っています。

use_default_settings: true

general:
  debug: false
  instance_name: "HomeLab Search"

server:
  # コンテナ内の全インターフェースにバインド
  bind_address: "0.0.0.0"
  port: 8080
  secret_key: "ultrasecretkey" # 実行時にSEARXNG_SECRETで上書きされます
  limiter: true
  image_proxy: true
  method: "GET"

redis:
  url: redis://redis:6379/0

search:
  safe_search: 0
  autocomplete: "duckduckgo"
  default_lang: "ja"

engines:
  - name: google
    engine: google
    use_mobile_ui: false
    timeout: 3.0
  - name: duckduckgo
    engine: duckduckgo
    timeout: 3.0
  - name: bing
    engine: bing
    timeout: 3.0
  - name: wikipedia
    engine: wikipedia
    timeout: 2.0
  - name: github
    engine: github
    timeout: 3.0

ファイルを保存して閉じます(nanoの場合はCtrl + Oを押し、Enterを押した後にCtrl + Xで終了)。

ステップ4:Docker Composeスタックの定義

次に、docker-compose.ymlでサービスを定義します。

nano docker-compose.yml

以下の設定を記述します。192.168.1.50の部分は、お使いのサーバーの実際のLAN内IPアドレスに置き換えてください。

services:
  redis:
    image: valkey/valkey:8-alpine
    container_name: searxng-redis
    restart: unless-stopped
    command: valkey-server --save "" --appendonly no
    networks:
      - searxng-net
    tmpfs:
      - /var/lib/valkey
    cap_drop:
      - ALL
    cap_add:
      - SETGID
      - SETUID
      - DAC_OVERRIDE

  searxng:
    image: searxng/searxng:latest
    container_name: searxng
    restart: unless-stopped
    networks:
      - searxng-net
    ports:
      - "8080:8080"
    volumes:
      - ./searxng:/etc/searxng:rw
    environment:
      - SEARXNG_BASE_URL=http://192.168.1.50:8080/
      - SEARXNG_SECRET=${SEARXNG_SECRET}
    depends_on:
      - redis
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

networks:
  searxng-net:
    name: searxng-net

ステップ5:コンテナの起動と状態確認

デタッチモードでスタックを起動します。

docker compose up -d

両方のコンテナが正常に稼働していることを確認します。

docker compose ps

アプリケーションログを追尾し、設定の構文エラーやキー不足が発生していないかチェックします。

docker compose logs -f searxng

初期化が完了したら、Ctrl + Cを押してログ表示を抜けます。次に、Webブラウザからhttp://<サーバーのIPアドレス>:8080にアクセスします。無駄のないシンプルな検索バーが表示されれば、クエリを実行する準備は完了です。

ステップ6:ブラウザのデフォルト検索エンジンに設定する

OpenSearch規格を利用して、普段使っているブラウザにインスタンスを登録します。

  1. Firefoxの場合: SearXNGのURLにアクセスします。アドレスバーを右クリックし、「検索エンジンを追加」をクリックします。
  2. Chromium系ブラウザ(Chrome、Brave、Edgeなど)の場合: 設定 > 検索エンジン > 検索エンジンとサイト内検索の管理 を開きます。
  3. サイト内検索の横にある「追加」をクリックし、各項目を入力します。
    • 検索エンジン: SearXNG HomeLab
    • ショートカット: @sx
    • URL(検索クエリの代わりに %s を入力): http://<サーバーのIPアドレス>:8080/search?q=%s
  4. 新しく追加されたエントリの横にある3点リーダーをクリックし、「デフォルトに設定」を選択します。

これで、アドレスバーに入力した検索クエリはローカルのDockerホストへ直接ルーティングされるようになります。高速で広告もなく、一切追跡されない快適な検索結果が得られます。

Share: