From 76ea5bed8db712c40f37136caea314d537b4c7f1 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sat, 18 Apr 2026 21:10:55 +0200 Subject: [PATCH] fix(searxng): nur Brave+Mojeek abfragen, DDG-Captcha-Noise beseitigen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zwei Fixes gegen die hartnäckigen DDG-CAPTCHA-Fehler im SearXNG-Log: 1. searxng.ts fragt jetzt explizit `engines=brave,mojeek` an. Vorher wurde nur `categories=general` gesetzt — dadurch wurden alle in dieser Kategorie aktivierten Engines abgefragt, inkl. DDG (das trotz `disabled: true` weiter antwortete). 2. settings.yml nutzt `use_default_settings.engines.keep_only` statt einzelner `disabled: true`-Overrides. SearXNGs Merge-Semantik für partielle Engine-Overrides (nur name + disabled ohne engine:) greift in der aktuellen Version nicht zuverlässig, deshalb kam DDG durch. keep_only wirft alles außer brave+mojeek vor dem Laden raus — kein Captcha-/403-Log-Lärm mehr. Co-Authored-By: Claude Opus 4.7 (1M context) --- searxng/settings.yml | 52 ++++++-------------------------- src/lib/server/search/searxng.ts | 4 +++ 2 files changed, 14 insertions(+), 42 deletions(-) diff --git a/searxng/settings.yml b/searxng/settings.yml index fa096a6..250a339 100644 --- a/searxng/settings.yml +++ b/searxng/settings.yml @@ -1,4 +1,13 @@ -use_default_settings: true +# Defaults laden, aber Engine-Liste rigoros auf brave + mojeek eindampfen. +# keep_only ist robuster als einzelne `disabled: true`-Overrides: SearXNGs +# Merge-Semantik für partial overrides (nur name + disabled ohne engine:) +# greift nicht zuverlässig — DDG & Co. wurden trotzdem abgefragt. keep_only +# wirft alles andere vor dem Laden raus, kein Captcha-/403-Log-Lärm mehr. +use_default_settings: + engines: + keep_only: + - brave + - mojeek server: # Platzhalter wird beim Container-Start per os.path.expandvars aus der @@ -31,7 +40,6 @@ outgoing: ui: default_locale: de -# Quieten engines that fail on cold start and aren't useful here enabled_plugins: - 'Hash plugin' - 'Tracker URL remover' @@ -51,49 +59,9 @@ engines: api_key: "${BRAVE_API_KEY}" disabled: false - # DuckDuckGo: deaktiviert, weil DDG die Pi-IP als Bot erkannt hat und - # bei jeder Anfrage mit CAPTCHA antwortet. Brave (API) + Mojeek decken - # die Websuche zuverlässig ab — DDG-Scraping wäre nur zusätzlicher Lärm. - - name: duckduckgo - disabled: true - # Mojeek: eigener Index, seltener Rate-Limits, ergänzt Brave. - name: mojeek engine: mojeek shortcut: mjk timeout: 6.0 disabled: false - - # Video-/News-Engines abdrehen — wir wollen nur Text-Treffer für Rezeptseiten. - - name: google videos - disabled: true - - name: google news - disabled: true - - name: google images - disabled: true - - name: bing videos - disabled: true - - name: bing news - disabled: true - - name: bing images - disabled: true - - name: karmasearch videos - disabled: true - - # Startpage: hat unsere Pi-IP als Bot erkannt und blockt mit Captcha - # (1h suspended_time pro Fehler). Bringt für Rezeptsuche nichts, was - # nicht schon Brave/DDG liefern. - - name: startpage - disabled: true - - # Tor-basierte Engines brauchen einen Tor-Proxy im Container — haben - # wir nicht, also harmlos deaktivieren, um Init-Fehler loszuwerden. - - name: ahmia - disabled: true - - name: torch - disabled: true - - # Wikidata produziert beim Cold-Start einen KeyError (Init-Bug in der - # aktuellen SearXNG-Version 2026.4). Für Rezeptsuche ohne Mehrwert. - - name: wikidata - disabled: true diff --git a/src/lib/server/search/searxng.ts b/src/lib/server/search/searxng.ts index 2bc00c7..41f92b1 100644 --- a/src/lib/server/search/searxng.ts +++ b/src/lib/server/search/searxng.ts @@ -312,6 +312,10 @@ export async function searchWeb( // Nur Text-Engines abfragen — SearXNG-Video/Image-Engines (karmasearch etc.) // bringen uns für Rezeptseiten nichts und produzieren nur 403-Log-Noise. endpoint.searchParams.set('categories', 'general'); + // Explizit nur Brave (API) + Mojeek — defensiv gegen SearXNG-Merge-Quirks, + // bei denen disabled:true in partial overrides nicht greift und DDG o.ä. + // trotzdem angefragt wird. So ist uns die globale Engine-Liste egal. + endpoint.searchParams.set('engines', 'brave,mojeek'); if (pageno > 1) endpoint.searchParams.set('pageno', String(pageno)); const body = await fetchText(endpoint.toString(), {