SSD Nodes Learn Hosting plans →
ガイド Matt Connor著者 Matt Connor

SearXNG の settings.yml 設定と反映方法【Docker Compose】

Docker Compose で動かす SearXNG の settings.yml で変える項目(safe_search、default_lang、formats、engines)と反映手順、.env で 8080 を 127.0.0.1 に限定する方法を公式構成に沿って解説。

settings.yml はどこにあり、変更はいつ反映されるのか

公式の Docker Compose 構成では、SearXNG の設定ファイル settings.yml はホスト側の ./core-config/settings.yml にあり、コンテナ内では /etc/searxng/settings.yml として見えています。初回の docker compose up -d のときにコンテナがテンプレートから自動生成するので、自分で新規作成する必要はありません。ファイルを編集しただけでは何も変わらず、docker compose restart core で SearXNG のプロセスを再起動したときに初めて読み直されます。一方、ポート 8080 を 127.0.0.1 だけに限定する、公開 URL を教える、といった Compose 側の変更は settings.yml ではなく .env に書き、docker compose up -d でコンテナを作り直して反映します。

この記事は SearXNG を VPS に Docker Compose で立てる手順 の翌日に読むものとして書いています。インストールは済んでいて、「settings.yml のどのキーを変えればいいのか」「変えたあと何をすれば効くのか」の二つに絞って説明します。名前について一言だけ触れておくと、SearXNG は元になった searx に NG (Next Generation、次世代) を付けたもので、公式に決められたカタカナ表記はありません。文章の中では SearXNG とそのまま書くのが無難です。

前提: 2026年9月時点の公式 Compose 構成

まず、手元の構成が現行のものかを確認してください。日本語の解説記事の多くは searxng/searxng-docker リポジトリと uwsgi.ini を前提にしていますが、そのリポジトリは 2026年9月16日時点で GitHub 上でアーカイブ済みです。現行の公式手順 (docs.searxng.org の「Installation container」ページ) は、本体リポジトリの container/ ディレクトリにある docker-compose.yml.env.example を取得して使います。

mkdir -p ./searxng/core-config/
cd ./searxng/
curl -fsSL \
    -O https://raw.githubusercontent.com/searxng/searxng/master/container/docker-compose.yml \
    -O https://raw.githubusercontent.com/searxng/searxng/master/container/.env.example
cp -i .env.example .env

取得した docker-compose.yml は、2026年9月16日時点で次の内容です。

name: searxng

services:
  core:
    container_name: searxng-core
    image: docker.io/searxng/searxng:${SEARXNG_VERSION:-latest}
    restart: always
    ports:
      - ${SEARXNG_HOST:+${SEARXNG_HOST}:}${SEARXNG_PORT:-8080}:${SEARXNG_PORT:-8080}
    env_file: ./.env
    volumes:
      - ./core-config/:/etc/searxng/:Z
      - core-data:/var/cache/searxng/

  valkey:
    container_name: searxng-valkey
    image: docker.io/valkey/valkey:9-alpine
    command: valkey-server --save 30 1 --loglevel warning
    restart: always
    volumes:
      - valkey-data:/data/

volumes:
  core-data:
  valkey-data:

読み取るべき点は四つあります。

  • 設定ディレクトリはホストの ./core-config/ で、コンテナの /etc/searxng/ にマウントされます。同じドキュメントページの docker run の例では ./config/./data/ という名前を使っていますが、この記事は Compose 側の ./core-config/ で統一します。
  • 永続データ (/var/cache/searxng/、favicon のキャッシュなど) は core-data という名前付きボリュームです。docker compose down -v を打つと、これと valkey-data が両方消えます。
  • サービス名は corevalkey です。以降のコマンドに出てくる core はこの名前です。
  • Web サーバーは uWSGI ではなく Granian です。イメージの entrypoint は最後に exec /usr/local/searxng/.venv/bin/granian searx.webapp:app を実行します。uwsgi.ini を編集する手順が出てくる記事は旧構成のものなので、そのまま当てはめないでください。

:Z は SELinux のラベル付けの指定で、Ubuntu のように SELinux を使わないホストでは無視されます。SELinux が enforcing の Rocky Linux や Fedora のホストでは、この指定がないとマウント先の読み書きが拒否されることがあるので、消さずに残してください。

イメージのタグを日付付きで固定する

.env を開き、バージョンを固定します。latest のままにすると docker compose pull のたびに違うコードが動き、設定キーの既定値が変わっても気づけません。

SEARXNG_VERSION=2026.9.15-ca4965040
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080

2026.9.15-ca4965040 は、2026年9月16日に Docker Hub の searxng/searxng で存在を確認したタグです。タグは「日付-コミットハッシュ」の形式で、ほぼ毎日新しいものが増えるので、試す時点で Docker Hub のタグ一覧から新しい日付を選び直してください。SEARXNG_HOSTSEARXNG_PORT の意味は後半で説明します。ここまで書いたら docker compose up -d で起動します。

初回起動で生成される settings.yml の中身

起動時に entrypoint は /etc/searxng/settings.yml の有無を確認し、なければテンプレートをコピーします。docker compose logs core の先頭近くに次の行が出ます。

... INFORMATION
... "/etc/searxng/settings.yml" does not exist, creating from template...

生成されるファイルは本体リポジトリの container/settings.template.yml そのもので、2026年9月16日時点では次の内容です。ultrasecretkey の部分は、コピー直後に sed でランダムな英数字に置き換えられます。

use_default_settings: true

server:
  secret_key: "ultrasecretkey"
  image_proxy: true

つまり初期状態で明示的に決まっているのは「秘密鍵」と「画像プロキシを有効にする」の二つだけで、それ以外はすべて SearXNG 本体の既定値です。日本語の記事でよく見る safe_search: 2limiter: true を含む長いテンプレートは、旧構成や本体の utils/templates/ にある別のテンプレートのもので、この Compose 構成では生成されません。

secret_keyultrasecretkey のままにすると、SearXNG は起動を拒否します。ログには次の文字列が出ます。

server.secret_key is not changed. Please use something else instead of ultrasecretkey.

ホスト側で ls -ln core-config/ を実行すると、ファイルの所有者は UID 977 (コンテナ内の searxng ユーザー) になっています。編集には sudo が必要です。所有者は変えないでください。

編集を反映する手順と確認方法

手順は「編集、YAML 検証、再起動、ログ確認、/config で確認」の五つです。

sudo nano core-config/settings.yml
docker compose exec core /usr/local/searxng/.venv/bin/python -c 'import yaml; yaml.safe_load(open("/etc/searxng/settings.yml")); print("yaml ok")'
docker compose restart core
docker compose logs --tail 30 core

2 行目は、コンテナ内の Python (SearXNG が使う PyYAML が入っています) に編集後のファイルを構文だけ読ませています。yaml ok と出れば再起動して大丈夫です。トレースバックが出た場合は、表示された行番号のインデントを直してから再起動してください。この検証は再起動の前に打つことが重要です。壊れたファイルで再起動して SearXNG が起動に失敗すると、docker compose exec の相手がいなくなるからです。

再起動後のログには、どの設定ファイルを読んだかが 1 行で出ます。

merge the default settings ( /usr/local/searxng/searx/settings.yml ) and the user settings ( /etc/searxng/settings.yml )

代わりに load the default settings from ... と出ていたら、ユーザー設定が読まれていません。マウント先が違うか、ファイル名が settings.yml でないかのどちらかです。

値が本当に変わったかは /config エンドポイントで確認できます。現在の主要な設定を JSON で返すので、ブラウザのキャッシュや Cookie に惑わされません。

sudo apt install -y jq
curl -sS http://127.0.0.1:8080/healthz
curl -sS http://127.0.0.1:8080/config | jq '{version, safe_search, default_locale, autocomplete, default_theme}'

/healthzOK を返します。/configversion に含まれる日付とハッシュが .env で固定したタグと同じなら、意図したイメージが動いています。以降の各セクションでも、変更後はこの jq の絞り込みを変えて確認します。

use_default_settings: true が意味すること

生成されたファイルの 1 行目 use_default_settings: true は、「本体に同梱された searx/settings.yml を土台にして、このファイルに書いたキーだけ上書きする」という宣言です。ドキュメントの言葉では、ユーザー設定が「既定の設定に依存できる」状態になります。これがあるので、変えたいキーだけを書けば済みます。この行を消すと、すべての項目を自分で書く必要があります。

engines: セクションだけは特別で、リストの各要素が name をキーにして既定のエンジン定義とマージされます。既定のエンジンを丸ごと消したい場合や、特定のエンジンだけ残したい場合は、use_default_settings を真偽値ではなくマッピングにします。

use_default_settings:
  engines:
    remove:
      - google
use_default_settings:
  engines:
    keep_only:
      - duckduckgo
      - wikipedia

remove は既定のリストからそのエンジンを削除し、keep_only は列挙したエンジン以外を全部削除します。エンジンを一時的に止めたいだけなら、後述の disabled: true のほうが安全です。ユーザーが設定画面から再び有効にできる余地が残るからです。

もう一つ知っておくべきなのは、環境変数で上書きできるキーの範囲です。本体の settings_defaults.py を読むと、環境変数に対応しているのは general.debugserver: 配下の portbind_addresslimiterpublic_instancesecret_keybase_urlimage_proxymethod、そして valkey.url だけです。search:ui: のキーには対応する環境変数がありません。safe_searchdefault_lang.env に書いても何も起きないので、これらは必ず settings.yml に書きます。

ドキュメント (settings_search ページ) に載っている既定値のうち、この読者に関係するものを抜き出すと次のようになります。

search:
  safe_search: 0
  autocomplete: "duckduckgo"
  autocomplete_min: 4
  default_lang: ""
  formats:
    - html

safe_search0 (None、フィルタなし)、1 (Moderate)、2 (Strict) の三段階で、既定は 0 です。ここで決めるのはインスタンスの既定値で、ユーザーは設定画面から自分の値に変えられます。家族や職場で使うなら 1 にしておくと、初めて開いた人の結果も穏当になります。

autocomplete は入力補完のバックエンドで、既定は "duckduckgo" です。ドキュメントに列挙されている選択肢は 360search、baidu、bing、brave、dbpedia、duckduckgo、google、kagi、mwmbl、naver、privacywall、quark、qwant、seznam、sogou、startpage、swisscows、wikipedia、yandex で、空文字にすると補完を止められます。補完は入力途中の文字列を外部に送る機能なので、プライバシーを優先するなら空文字が正解です。使う場合は、本体の settings.yml にある autocomplete_min: 4 (補完を始める最小文字数) を 2 に下げると日本語で使いやすくなります。4 文字はひらがなや漢字の検索語にはかなり長いからです。

default_lang は検索結果の言語です。ここはドキュメントと本体で書き方が違います。settings_search ページの例では "" で、「空にするとブラウザの情報から検出する」と書かれています。一方、本体リポジトリの searx/settings.yml は 2026年9月16日時点で "auto" を既定値にしています。どちらも「固定しない」という意味で、日本語に固定したいときだけ値を書きます。使えるコードは本体の searx/sxng_locales.py にあるもので、日本語は ja (地域なし) と ja-JP (日本) の二つです。

search:
  default_lang: "ja"

英語の技術文書もよく引く人は、ここを固定せずに検索語の先頭に :ja:en を付けて切り替えるほうが便利です。固定すると、英語の検索語にも日本語の結果が優先されます。

formats は Web から取得できる結果の形式で、既定は html だけです。ドキュメントの説明は「形式を消すとその形式へのアクセスを拒否する。小文字で書く。html、csv、json、rss」です。json を足すのは、Open WebUI や自作のエージェントが JSON API を叩く場合だけにしてください。それ以外の用途では html のままにしておけば、スクレイピングに使われる面積が減ります。json を足したあとの使い方と Open WebUI 側の設定は SearXNG の JSON API を Open WebUI から使う方法 にまとめてあります。

search:
  formats:
    - html
    - json

json がないのに format=json を付けて呼ぶと、SearXNG は flask.abort(403) を返します。本文のない 403 Forbidden で、エラーメッセージは付きません。

curl -sS -o /dev/null -w '%{http_code}\n' 'http://127.0.0.1:8080/search?q=test&format=json'

formatsjson を足して docker compose restart core したあとは、同じコマンドが 200 を返し、-o /dev/null を外せば JSON が流れてきます。

同じセクションにある ban_time_on_failmax_ban_time_on_failsuspended_times は、エンジンがエラーを返したときに SearXNG がそのエンジンを何秒止めるかの設定です。秒数の既定値は settings_search ページの例と本体の searx/settings.yml で食い違っているので、手元のイメージの値を docker compose exec core grep -A8 suspended_times /usr/local/searxng/searx/settings.yml で確認してください。CAPTCHA で止まる仕組みと対処は SearXNG のエンジンが CAPTCHA で止まるときの直し方、429 で止まる場合は SearXNG のレート制限と 429 エラーの原因 が詳しいので、秒数を変える前にそちらを読んでください。

ui: セクション: 表示言語とテーマ

ui:
  default_locale: "ja"
  default_theme: simple
  theme_args:
    simple_style: auto
  query_in_title: false

default_locale は画面の表示言語で、既定は "" です。ドキュメントの説明は「空ならブラウザの言語から検出する。frende のような ISO 言語コードを指定できる」です。search.default_lang (検索結果の言語) とは別のキーなので、日本語の画面で英語の結果を検索する、という組み合わせもできます。

default_themesimple が既定で、2026年9月時点で本体に同梱されているテーマはこれだけです。見た目は theme_args.simple_styleautolightdarkblack から選びます。auto はブラウザのダークモード設定に従います。

query_in_title は結果ページの <title> に検索語を含めるかどうかで、既定は false です。本体のコメントにあるとおり、true にするとブラウザの履歴にページタイトルとして検索語が残るので、共有パソコンでは false のままにします。

変更後は curl -sS http://127.0.0.1:8080/config | jq '{default_locale, default_theme}' で反映を確認します。ブラウザで見るときは、以前に設定画面を開いていると Cookie に保存された個人設定が優先されるので、シークレットウィンドウで開いてください。

engines: セクション: 有効化と無効化

エンジンの設定は name をキーにして既定の定義にマージされるので、変えたいキーだけを書きます。有効と無効は disabled で切り替えます。ドキュメントの説明では、disabled: true は「既定では無効にするが削除はしない。ユーザーが設定画面から手動で有効にできる」という意味です。

engines:
  - name: google
    disabled: false
  - name: bing
    disabled: false
  - name: brave
    disabled: true

ここで一つ、日付を付けて書いておくべき事実があります。2026年9月16日時点の本体 searx/settings.yml では、googlebing の一般検索エンジンが disabled: true になっています。以前のバージョンの感覚で「Google は最初から有効」と思っていると、結果がいつもと違う理由が分かりません。固定したタグの中身は次のコマンドで確認できます。

docker compose exec core grep -A3 -- '- name: google$' /usr/local/searxng/searx/settings.yml
docker compose exec core grep -A3 -- '- name: bing$' /usr/local/searxng/searx/settings.yml

disabled: true が出たら、上の YAML のように disabled: false で明示的に有効にします。有効にしたエンジンが実際に応答するかは別の問題で、Google は自動アクセスを CAPTCHA で止めることがあります。その場合の見え方と対処は前述の CAPTCHA の記事に譲ります。

日本語の検索でどのエンジンが役に立つかは、自分のインスタンスで測る

「日本語に強いエンジンはどれか」という問いには、他人の記事の断言ではなく、自分のインスタンスの結果で答えるべきです。同じエンジンでも、VPS の IP アドレスの所在地、CAPTCHA の頻度、検索語の種類で結果が大きく変わります。測る手順は三段階です。

第一に、/config でエンジンごとの言語対応を見ます。各エンジンの languages は、そのエンジンに言語指定として渡せるコードの一覧です。

curl -sS http://127.0.0.1:8080/config | jq -r '.engines[] | select(.enabled) | .name'
curl -sS http://127.0.0.1:8080/config | jq -r '.engines[] | select(.languages | index("ja")) | .name'

1 行目が今有効なエンジン、2 行目が ja を言語として受け付けるエンジンです。languages が空のエンジンは言語を指定できないだけで、日本語の検索語に答えないという意味ではありません。

第二に、エンジンを一つずつ指定して同じ検索語を投げ、返ってきた件数とエラーを見ます。検索語の先頭に !go のようなショートカット (bang) を付けると、そのエンジンだけで検索できます。ショートカットは /configshortcut に出ています。この確認には formatsjson が必要なので、測定のあいだだけ足して、終わったら消してください。

curl -sS --get http://127.0.0.1:8080/search \
  --data-urlencode 'q=!ddg 確定申告 期限' \
  --data-urlencode 'language=ja' \
  --data-urlencode 'format=json' | jq '{n: (.results | length), engines: ([.results[].engine] | unique), unresponsive: .unresponsive_engines}'

n が結果の件数、unresponsive がエラーで応答しなかったエンジンとその理由です。!ddg!go!bi!br!wp に変えて、地名や制度名のような日本固有の検索語を数種類試してください。件数が 0 で unresponsive に名前が出るエンジンは、日本語が弱いのではなく、あなたの VPS からのアクセスを拒否しています。

第三に、数日使ったあとで http://127.0.0.1:8080/stats を開きます。general.enable_metrics が既定の true なら、エンジンごとの応答時間、結果件数、エラー率が記録されています。ここで結果が少なくエラーが多いエンジンを disabled: true にすると、体感の速さが上がります。応答を待つエンジンが減るからです。

server: セクションと SEARXNG_* 環境変数の優先順位

settings_server ページの例から、この読者に関係するキーだけを抜き出します。

server:
  base_url: false
  secret_key: "ultrasecretkey"
  limiter: false
  public_instance: false
  image_proxy: false

secret_key は、ドキュメントの説明では「暗号用途に使う」値です。初回起動で生成されたランダム文字列をそのまま使ってください。.envSEARXNG_SECRET=... を書けばそちらが優先されますが、.env を Git に入れる構成なら Compose の .env と秘密情報の分け方 を先に読んでください。

base_url は、ドキュメントの説明では「SearXNG が配置されている基底 URL。正しい内向きリンクを作るために使う」値です。リバースプロキシの後ろで https://search.example.com/ として公開しているのに設定しないと、SearXNG が生成する絶対 URL (OpenSearch の記述ファイルなど) がプロキシの内側のアドレスを指します。ここは settings.yml に書くより .envSEARXNG_BASE_URL=https://search.example.com/ と書くほうが、Compose 側の設定と同じファイルにまとまります。

limiter はボット対策のレート制限で、既定は false です。ドキュメントには「Limiter は valkey: データベースを必要とする」と明記されています。true にするときは valkey.url を Compose のサービス名に向けます。ドキュメントは「ホスト名を valkey または searxng-valkey に更新する」と書いているので、どちらでも届きます。

server:
  limiter: true

valkey:
  url: valkey://valkey:6379/0

limiter.toml の書き方、public_instance: true で何が変わるか、リバースプロキシ越しの本物の IP アドレスの渡し方は、公開インスタンス向けの話としてまとまった記事があります。この記事では繰り返さないので、外に公開するなら 公開 SearXNG インスタンスの堅牢化手順 を読んでください。

環境変数と settings.yml のどちらが勝つか

本体の searx/settings.yml には、各キーのコメントに Is overwritten by ${SEARXNG_BASE_URL} のような注記があります。この注記のとおり、対応する環境変数が設定されていれば、settings.yml に何が書いてあっても環境変数の値が使われます。優先順位は「環境変数、次に settings.yml、最後に本体の既定値」です。Compose 構成では env_file: ./.env によって .env の全行がコンテナの環境変数になるので、.env に書いた SEARXNG_BASE_URLsettings.ymlbase_url より強い、と覚えておいてください。真偽値のキー (SEARXNG_LIMITER など) は truefalse10onoff の文字列を受け付けます。

SEARXNG_SETTINGS_PATH は、settings.yml の場所そのものを指定する環境変数です。ドキュメントによれば、SearXNG は最初に SEARXNG_SETTINGS_PATH に指定された完全パス、次に /etc/searxng/settings.yml を探し、どちらもなければ本体同梱のファイルを使います。コンテナでは ./core-config//etc/searxng/ にマウントされているので、二番目の規則で見つかります。この変数を設定する必要があるのは、pip や git で直接インストールした環境で /etc/searxng/ 以外に置きたい場合だけです。コンテナで別のパスを指定しても、entrypoint がテンプレートをコピーする先は /etc/searxng/settings.yml のままなので、混乱するだけです。

Compose 側で変えるもの: 127.0.0.1 バインド、ポート、Valkey

「docker-compose.yml を編集する」という問いには、実は docker-compose.yml を直接編集しない答えがあります。現行の Compose ファイルは変えたくなる値をすべて ${...}.env から読むように書かれているので、.env を編集すれば済みます。docker-compose.yml を書き換えないでおけば、公式が新しい版を出したときに curl で上書きするだけで追従できます。

8080 を 127.0.0.1 だけに限定する

ports: の行は ${SEARXNG_HOST:+${SEARXNG_HOST}:}${SEARXNG_PORT:-8080}:${SEARXNG_PORT:-8080} です。SEARXNG_HOST が空なら 8080:8080 に展開され、Docker はホストのすべてのインターフェースで待ち受けます。Docker はこのとき iptables の規則を自分で書くので、ufw で 8080 を閉じていても外から届きます。.envSEARXNG_HOST=127.0.0.1 を書くと 127.0.0.1:8080:8080 に展開され、ホストの内側からしか届かなくなります。リバースプロキシ (Caddy や nginx) を同じホストに置く構成なら、これが正しい値です。

.env を変えたあとは restart ではなく up -d です。docker compose restart は既存のコンテナをそのまま再起動するだけで、ポートの割り当ては作成時に固定されているからです。up -d は Compose ファイルと .env を読み直し、差分があるコンテナを作り直します。

docker compose up -d
docker compose config | grep -A6 'ports:'
docker compose ps
ss -ltnp | grep 8080

docker compose config.env を展開したあとの最終形を表示します。ports: の下に host_ip: 127.0.0.1published: "8080" が出ていれば .env は読まれています。docker compose ps の PORTS 列は 127.0.0.1:8080->8080/tcpss の出力は 127.0.0.1:8080 になります。0.0.0.0:8080*:8080 が残っていたら、コンテナが作り直されていません。

SEARXNG_PORT を変えるときは、ホスト側とコンテナ側の両方が変わることに注意してください。ports: の展開が ${SEARXNG_PORT}:${SEARXNG_PORT} なのに加えて、.envenv_file でコンテナにも渡り、entrypoint が export GRANIAN_PORT="$SEARXNG_PORT" で Granian の待ち受けポートも同じ値にするからです。「ホストは 8888、コンテナは 8080」という組み合わせにしたい場合だけ、docker-compose.ymlports: を直接 127.0.0.1:8888:8080 に書き換えます。

Valkey サービスは触らなくてよい

valkey サービスは limiter を使うときのデータベースです。limiter: false のままでも起動していて害はなく、メモリを少し使うだけです。止めたいなら docker compose stop valkey で止まりますが、あとで limiter: true にしたときに valkey.url の接続先がいなくて原因探しに時間を取られるので、動かしたままにしておくことを勧めます。名前付きボリューム valkey-data--save 30 1 の設定でスナップショットを保存する先で、docker compose down では残り、down -v で消えます。

よくある失敗とその原因

編集したのに何も変わらない。 一番多いのは、別のディレクトリの settings.yml を編集しているケースです。docker compose config | grep -A3 'type: bind'source: の絶対パスを見て、自分が開いたファイルと一致するか確認してください。次に多いのは restart を忘れているケースで、ログに merge the default settings ... and the user settings の行が新しい時刻で出ているかを見ます。

.env を変えて restart した。 ポートや SEARXNG_BASE_URLup -d でないと反映されません。上で説明したとおりです。

format=json が 403 になる。 search.formatsjson がありません。docker compose exec core grep -A3 formats /etc/searxng/settings.yml で自分のファイルの formats を見てください。既定の html だけの状態では、ドキュメントの言うとおり JSON へのアクセスは拒否されます。

YAML のインデント違いで起動しない。 use_default_settings: true の下にキーを書くとき、search:server: はインデントなしの先頭に置き、その中のキーは半角スペース 2 つで字下げします。タブは使えません。再起動の前に、先ほどの yaml.safe_load の検証コマンドを習慣にしてください。

docker compose pull したら設定の意味が変わった。 latest を使っていると起きます。タグを固定し、上げるときは Docker Hub で新しいタグを選び、.envSEARXNG_VERSION を書き換えてから docker compose pull && docker compose up -d を実行してください。設定ファイルは ./core-config/ に残るので、イメージを変えても消えません。

FAQ

settings.yml を編集したのに SearXNG に反映されないのはなぜですか?

SearXNG は設定ファイルを起動時に一度だけ読むので、編集後に docker compose restart core を実行するまで古い設定のまま動きます。再起動してもだめなら、編集したファイルの場所を疑ってください。docker compose config | grep -A3 'type: bind' で表示される source: の絶対パスが、コンテナの /etc/searxng/ にマウントされている本物です。再起動後のログに merge the default settings ( ... ) and the user settings ( /etc/searxng/settings.yml ) と出ていれば、ファイルは読まれています。load the default settings from と出ていたら読まれていません。

docker-compose.yml のポート 8080 を 127.0.0.1 だけに限定するには?

docker-compose.yml は編集せず、同じディレクトリの .envSEARXNG_HOST=127.0.0.1 を書き、docker compose up -d でコンテナを作り直します。公式の Compose ファイルは ports:${SEARXNG_HOST:+${SEARXNG_HOST}:}${SEARXNG_PORT:-8080}:${SEARXNG_PORT:-8080} と書いているので、この変数だけで 127.0.0.1:8080:8080 に展開されます。docker compose restart ではポートの割り当ては変わりません。docker compose ps の PORTS 列が 127.0.0.1:8080->8080/tcp になっていれば成功です。

format=json を付けると 403 Forbidden が返るのはなぜですか?

search.formatsjson が含まれていないからです。既定値は html だけで、含まれない形式を要求されると SearXNG は flask.abort(403) で本文のない 403 を返します。settings.ymlsearch:formats: [html, json] を書いて docker compose restart core すると、同じ URL が 200 と JSON を返すようになります。JSON が必要なのは Open WebUI やエージェントから使うときだけなので、用がなければ html だけに戻してください。

SEARXNG_BASE_URL と settings.yml の base_url はどちらが優先されますか?

環境変数 SEARXNG_BASE_URL が優先されます。本体の searx/settings.ymlbase_url の行には Is overwritten by ${SEARXNG_BASE_URL} とコメントがあり、対応する環境変数があれば settings.yml の値は使われません。公式の Compose 構成は env_file: ./.env.env の全行をコンテナに渡すので、.envSEARXNG_BASE_URL=https://search.example.com/ と書くのが一番短い方法です。同じ仕組みで上書きできるのは server: 配下の一部と general.debugvalkey.url だけで、search:ui: のキーには環境変数がありません。

SearXNG はどう読みますか?

公式に決められた読み方やカタカナ表記はありません。名前の成り立ちは、元になったメタ検索エンジン searx に NG (Next Generation、次世代) を付けたものです。searx 自体も公式の発音表記を持たないので、日本語の文章では無理にカタカナにせず SearXNG とそのまま書くのが無難です。