Blog / Tutorials / SearXNG mit Docker auf einem VPS selbst hosten
(last updated: )

SearXNG mit Docker auf einem VPS selbst hosten

SearXNG ist eine freie Metasuchmaschine, die deine Suchanfrage an mehrere Suchmaschinen sendet, die Ergebnisse zusammenführt und kein Profil von dir anlegt. Für deine eigene selbst gehostete Suchmaschine stellst du das offizielle Container-Image mit Docker Compose auf einem VPS bereit. Schalte HTTPS und eine Zugriffskontrolle davor…

12 Min. Lesezeit

SearXNG ist eine freie Metasuchmaschine, die deine Suchanfrage an mehrere Suchmaschinen sendet, die Ergebnisse zusammenführt und kein Profil von dir anlegt. Für deine eigene selbst gehostete Suchmaschine stellst du das offizielle Container-Image mit Docker Compose auf einem VPS bereit. Schalte HTTPS und eine Zugriffskontrolle davor und rechne damit, dass externe Suchmaschinen deine Anfragen drosseln. Das ist das größte Betriebsrisiko.

Was ist SearXNG? Eine selbst gehostete Metasuchmaschine

SearXNG ist eine freie Metasuchmaschine: Sie leitet jede Suchanfrage an mehrere Suchmaschinen weiter, führt die Ergebnisse auf einer Seite zusammen und verfolgt ihre Nutzer nicht oder legt Profile über sie an. Als Metasuchmaschine durchsucht oder indexiert sie das Web nicht selbst. Sie bündelt die Antworten der aktivierten Suchmaschinen und liefert sie über deinen eigenen Server aus. Deshalb läuft SearXNG als selbst gehostete Suchmaschine problemlos auf einem kleinen VPS.

Self-Hosting bringt dir drei Vorteile. Externe Suchmaschinen sehen die IP-Adresse deines Servers statt der deines Laptops, sodass Suchanfragen nicht mit deinem Browserprofil oder Konto verknüpft sind. Du entscheidest, welche Suchmaschinen abgefragt werden. Außerdem erhältst du einen JSON-Endpunkt, über den Skripte und KI-Tools ohne API-Key im Web suchen können.

Die Grenzen sind real. Die Qualität der Ergebnisse hängt von den angebundenen Suchmaschinen ab; verlangt eine davon ein CAPTCHA, fällt ein Teil der Ergebnisse weg. Deine Suchanfragen erreichen diese Suchmaschinen weiterhin und dein VPS-Anbieter sieht den Traffic. Eine private Suchmaschine ist daher nicht anonym.

Welche VPS-Größe brauchst du für eine selbst gehostete Suchmaschine?

Die Dokumentation nennt weder eine minimale RAM-Größe noch eine Mindestanzahl an CPUs, und das offizielle Compose-Template legt keine Ressourcenlimits fest. Eine persönliche Instanz braucht wenig Ressourcen. Starte deshalb klein und führe nach einigen Tagen docker stats aus, um den tatsächlichen Bedarf zu prüfen.

AnforderungEmpfehlungHinweise
Container-RuntimeDocker mit Compose-PluginPodman wird ebenfalls unterstützt; die Dokumentation empfiehlt den meisten Nutzern Docker.
Speicher für Cache und LimiterValkey 9 (Alpine-Image)Nur der Limiter benötigt ihn, das Template startet ihn aber standardmäßig.
CPU und RAM1–2 vCPU und 2 GB RAM als AusgangspunktRichtwert für die Größe; prüfe docker stats und passe sie an.
DomainEin DNS-Name, der auf den VPS verweistFür ein vertrauenswürdiges HTTPS-Zertifikat erforderlich.

SearXNG mit Docker Compose installieren

Viele Tutorials verweisen noch auf das Repository searxng-docker, dessen README es inzwischen jedoch als abgelöst kennzeichnet. Die aktuelle Methode nutzt das Compose-Template aus dem Haupt-Repository des Projekts auf GitHub. Darauf basiert diese Anleitung. Zuerst brauchst du Docker und Compose; fehlen beide, folge unserer Anleitung zum Installieren von Docker auf Ubuntu.

# Create the working directories and fetch the official compose template
mkdir -p ./metasearch/core-config/
cd ./metasearch/
BASE=https://raw.githubusercontent.com/searxng/searxng/master/container
curl -fsSL -O $BASE/docker-compose.yml -O $BASE/.env.example
cp -i .env.example .env

Das Template definiert zwei Services. Der Core-Service führt das offizielle Image von Docker Hub aus, verwendet ohne festgelegte Version in .env den Tag latest und bindet ./core-config/ als Konfigurationsverzeichnis ein. Der Service valkey stellt den Redis-kompatiblen Speicher für den Rate-Limiter bereit. Im November 2026 sieht die Struktur so aus:

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 300 1 –save 60 1000 –loglevel warning
    restart: always
    volumes:
      – valkey-data:/data/

volumes:
  core-data:
  valkey-data:

Der Standardport ist 8080: Der Container lauscht auf Port 8080 und das Template veröffentlicht ihn als Host-Port 8080. Wenn du SEARXNG_PORT in .env setzt, ändert sich der Port auf beiden Seiten. Ohne eine Host-Adresse in .env wird er auf jeder Netzwerkschnittstelle veröffentlicht. Binde ihn deshalb an localhost, damit nur dein Reverse Proxy und SSH-Tunnel darauf zugreifen können:

SEARXNG_HOST=127.0.0.1

Starte den Stack und prüfe ihn. Beim ersten Start erstellt der Container core-config/settings.yml aus einem mitgelieferten Template und ersetzt das Platzhalter-Secret durch einen zufälligen Schlüssel. Du musst also nichts von Hand erzeugen. Leite den Port über SSH weiter, um das Webinterface vor der HTTPS-Einrichtung zu öffnen:

docker compose up -d
docker compose ps

# on your own machine, then browse to http://127.0.0.1:8080
ssh -L 8080:127.0.0.1:8080 user@your-server-ip

SearXNG settings.yml konfigurieren: Secret Key, Suchmaschinen und JSON-API

Die erzeugte Datei beginnt mit use_default_settings: true und muss deshalb nur deine Änderungen enthalten. Auf einem VPS sind diese Optionen relevant:

  • Secret Key: Wird beim ersten Start erstellt. Für einen eigenen Schlüssel trägst du SEARXNG_SECRET in .env ein. openssl rand -hex 32 erzeugt einen geeigneten Wert. Halte diese Datei aus öffentlichen Repositories heraus.
  • Suchmaschinen: Überschreibe eine einzelne Suchmaschine anhand ihres Namens mit disabled: true oder false. Alternativ nutzt du use_default_settings.engines mit remove oder keep_only. Die Standardwerte ändern sich zwischen Releases; prüfe sie unter Preferences und dann Engines.
  • Basis-URL: server.base_url ist die Adresse, mit der die Instanz Links erstellt. Setze sie nach der Proxy-Einrichtung auf https://search.example.com.
  • JSON-Format: search.formats enthält standardmäßig nur html. Die Anfrage eines nicht aufgeführten Formats führt zu 403 Forbidden. Füge json hinzu, wenn Skripte oder KI-Tools die API aufrufen sollen.
  • Limiter: Setze server.limiter auf true und valkey.url auf valkey://valkey:6379/0. Der Limiter ist für öffentliche Instanzen gedacht; beachte den folgenden Hinweis zur API-Nutzung.
  • public_instance: Lass den Wert bei einer privaten Instanz auf false. True aktiviert den Image-Proxy und die Bot-Erkennung mit Link-Tokens. Außerdem verweigert die Anwendung den Start, wenn Valkey nicht erreichbar ist.

# add to core-config/settings.yml
search:
  formats:
    – html
    – json

Starte den Core-Service mit docker compose restart core neu. Die JSON-API nutzt den normalen Suchendpunkt mit einem Formatparameter: GET /search akzeptiert das Pflichtfeld q sowie die optionalen Parameter categories, language, pageno, time_range und format. Es gibt keinen API-Key. Die Zugriffskontrolle hängt daher davon ab, was du vor die Instanz schaltest. Vom Server aus:

curl -s „http://127.0.0.1:8080/search?q=docker&format=json“ | head -c 400

Eine Instanz mit aktiviertem JSON gibt ein Objekt mit einer results-Liste und einer unresponsive_engines-Liste zurück. Letztere hilft später bei der Fehlersuche. Eine reine HTML-Instanz beantwortet format=json mit 403 Forbidden. Workflow-Tools wie n8n können dieselbe URL über einen HTTP-Request-Node aufrufen; unsere Anleitung zu n8n auf einem VPS beschreibt das Hosting.

Überlege dir gut, ob du den Limiter mit der API-Nutzung kombinierst. Er stuft die Standard-User-Agents von curl, python-requests und dem Go-HTTP-Client als Bots ein und lehnt Anfragen ohne Header wie Accept-Language ab. Füge einen festen Aufrufer in core-config/limiter.toml zu pass_ip hinzu oder lass den Limiter bei einer privaten Instanz ausgeschaltet.

Instanz mit HTTPS und Zugriffsbeschränkung absichern

Eine private Instanz ist die sicherere Voreinstellung. Jede Anfrage von Personen, die eine offene Instanz finden, verlässt den Server über deine IP-Adresse. Das führt zur Drosselung, während du gleichzeitig einen öffentlichen Dienst betreibst. Schalte HTTPS und eine Anmeldung oder Allowlist davor:

  1. Lass den Port an 127.0.0.1 gebunden. Docker veröffentlicht Ports über eigene Firewall-Regeln, die UFW umgehen. Eine Bindung an alle Schnittstellen bleibt deshalb erreichbar. Unsere UFW-Anleitung erklärt die übrige Host-Firewall.
  2. Lege einen DNS-A-Record wie search.example.com an, der auf den VPS verweist.
  3. Richte einen Reverse Proxy ein, der TLS mit einem Let’s-Encrypt-Zertifikat terminiert. Nginx Proxy Manager erledigt das über ein Webinterface; normales Nginx mit Certbot funktioniert ebenfalls. Läuft der Proxy in einem Container, teilst du mit dem Core-Service ein Docker-Netzwerk und leitest Anfragen an Port 8080 des Core-Containers weiter.
  4. Verlange am Proxy eine Authentifizierung, entweder HTTP Basic Auth oder eine IP-Allowlist.
  5. Bei aktiviertem Limiter fügst du die Adresse des Proxys in limiter.toml zu trusted_proxies hinzu. Übergib außerdem die Header X-Forwarded-For und X-Real-IP, damit der Limiter die echte Client-IP sieht.
  6. Erlaube eingehend nur die Ports 22, 80 und 443 und arbeite die Checkliste zur VPS-Sicherheit ab.

Lass KI-Tools nicht über die öffentliche URL zugreifen, sondern über das interne Docker-Netzwerk.

Warum Suchmaschinen deine SearXNG-Instanz blockieren und was dagegen hilft

Diesen Teil lassen viele Tutorials aus. Es gibt keine Garantie, dass jede Suchmaschine deinem Server dauerhaft antwortet. Einige setzen zeitweise aus.

  • Warum passiert das? Laut Projektdokumentation leitet SearXNG Anfragen von Bots weiter und wird deshalb selbst als Bot eingestuft. Suchmaschinen antworten dann mit CAPTCHAs oder Sperren. IP-Bereiche von Hosting-Anbietern wecken erfahrungsgemäß mehr Misstrauen als private Internetanschlüsse; das ist Betriebserfahrung und keine dokumentierte Regel.
  • Wie reagiert die Instanz? Sie setzt die betroffene Suchmaschine aus: standardmäßig 24 Stunden nach einem Zugriffsfehler oder CAPTCHA, eine Stunde nach einer 429-Antwort, 15 Tage nach einem Cloudflare-CAPTCHA und 7 Tage nach einem Google reCAPTCHA. Wenn eine Suchmaschine einen Tag lang verschwindet, ist das erwartetes Verhalten und kein Fehler.
  • Wie findest du den Verursacher? Prüfe die Liste unresponsive_engines in einer JSON-Antwort, die Seite /stats/errors und docker compose logs -f core.
  • Was hilft? Halte die Instanz privat und das Anfragevolumen auf menschlichem Niveau. Aktiviere eine breite Auswahl an Suchmaschinen, damit der Ausfall einer einzelnen die Ergebnisse nicht leert, und begrenze automatisierte Clients. Mit outgoing.proxies kannst du ausgehenden Traffic auch über einen Proxy leiten.
  • Funktioniert das immer? Nein. Braucht eine Anwendung garantierte Ergebnisse, passt eine kostenpflichtige Such-API besser als eine Metasuchlösung, die Ergebnisse per Scraping abruft.

SearXNG als Such-Backend für MCP, OpenClaw und Open WebUI

KI-Tools, die aktuelle Webergebnisse brauchen, können die JSON-API der Instanz ohne zu verwaltenden Such-API-Key aufrufen. Bei allen drei folgenden Tools musst du zuerst das Format json aktivieren. Der Traffic sollte außerdem in einem internen Netzwerk oder SSH-Tunnel bleiben.

SearXNG MCP Server für Claude und andere MCP-Clients

Ein MCP-Server macht die Websuche zu einem Tool, das MCP-Clients wie Claude aufrufen können. Das Drittanbieterprojekt mcp-searxng steht unter der MIT-Lizenz und ist unter demselben Namen auf npm verfügbar. Der Node.js-Prozess fragt die JSON-API deiner Instanz ab. Seine einzige erforderliche Umgebungsvariable ist die URL der Instanz. Sie muss vom Ausführungsort des Clients erreichbar sein, zum Beispiel als 127.0.0.1:8080 über einen SSH-Tunnel zu deinem VPS. Füge der MCP-Konfiguration des Clients Folgendes hinzu:

{
  „mcpServers“: {
    „web-search“: {
      „command“: „npx“,
      „args“: [„-y“, „mcp-searxng“],
      „env“: { „SEARXNG_URL“: „http://127.0.0.1:8080“ }
    }
  }
}

Das Projekt benötigt eine aktuelle Node.js-Version und stellt außerdem ein Docker-Image bereit.

OpenClaw mit SearXNG

OpenClaw dokumentiert dafür ein Websuche-Provider-Plugin. Installiere es mit openclaw plugins install @openclaw/searxng-plugin, setze tools.web.search.provider auf searxng oder führe openclaw configure –section web aus. Trage anschließend unter plugins.entries.searxng.config.webSearch die Adresse deiner Instanz als baseUrl ein. Der Provider fordert format=json an, also aktiviere das Format zuerst. Agents arbeiten in Schleifen, daher solltest du tools.web.search.maxResults senken. Unser Artikel zu OpenClaw-Anwendungsfällen zeigt, was Agents mit Webzugriff erledigen.

Open WebUI mit SearXNG

Setze in Open WebUI ENABLE_WEB_SEARCH auf True, WEB_SEARCH_ENGINE auf searxng und SEARXNG_QUERY_URL auf den /search-Endpunkt deiner Instanz. Alternativ nutzt du Settings, Admin und Web Search. Senke WEB_SEARCH_RESULT_COUNT und WEB_SEARCH_CONCURRENT_REQUESTS, um die externen Suchmaschinen zu schonen. Verwende in der URL den Namen des Core-Containers und Port 8080. Diese Adresse wird nur aufgelöst, wenn Open WebUI dem Docker-Netzwerk beitritt, das Compose für diesen Stack erstellt hat. docker network ls zeigt es an. Ein 403 Forbidden in den Logs bedeutet fast immer, dass json in settings.yml fehlt.

Instanz als Standardsuchmaschine im Browser einrichten

Die Instanz veröffentlicht unter /opensearch.xml eine OpenSearch-Beschreibung, die Firefox über die Adressleiste hinzufügen kann. In Chrome und Edge fügst du eine Websitesuche mit der URL https://search.example.com/search?q=%s von Hand hinzu und legst sie als Standard fest.

Instanz aktualisieren und sichern

  • Aktualisiere die Instanz mit docker compose down, docker compose pull und docker compose up -d. Möchtest du bei einem bekannten Release bleiben, legst du in .env eine Version fest, statt latest zu verwenden. Vergleiche außerdem gelegentlich neue Kopien von docker-compose.yml und .env.example mit deinen Dateien.
  • Sichere core-config/ und .env. Darin liegen settings.yml, limiter.toml und der Secret Key. Speichere sie deshalb in einem privaten Repository oder verschlüsselten Backup. Valkey enthält nur kurzlebige Limiter-Zähler und muss nicht gesichert werden. Unser Artikel zu Backup-Strategien erklärt, wie du Wiederherstellungen planst und testest.

Warum SearXNG auf einem Contabo VPS laufen lassen?

Die Suchmaschine selbst ist klein und passt daher neben deine anderen selbst gehosteten Anwendungen auf einen einfachen Cloud VPS. Bei der Wahl des Plans geben eher RAM-hungrige Nachbarn den Ausschlag, etwa Open WebUI mit einem Model Runner oder n8n mit vielen Workflows. Hier hilft das RAM-pro-Euro-Verhältnis der Core VPS-Reihe. Ein fester Monatspreis verhindert außerdem Überraschungen auf der Rechnung, wenn der Dienst jahrelang läuft. Wähle einen Cloud VPS mit mindestens 8 GB RAM, wenn du die KI-Tools aus dieser Anleitung auf derselben Maschine hosten möchtest. Weitere Ideen findest du in unserer Liste beliebter Open-Source-Anwendungen zum Self-Hosting.

FAQ

Was ist SearXNG?

SearXNG ist eine freie Metasuchmaschine. Sie leitet deine Suchanfrage an mehrere Suchmaschinen weiter, führt die Ergebnisse auf einer Seite zusammen und verfolgt Nutzer nicht oder legt Profile über sie an. Da sie das Web nicht selbst durchsucht, kannst du sie auf deinem eigenen Server betreiben und festlegen, welche Suchmaschinen sie abfragt.

Ist SearXNG privat?

SearXNG ist insofern privat, als es kein Nutzerprofil speichert und externe Suchmaschinen die IP-Adresse deines Servers statt deiner eigenen sehen. Anonym ist es nicht: Die Suchmaschinen erhalten weiterhin deine Anfragen und dein Hosting-Anbieter sieht den Traffic. Schütze die Instanz mit einer Authentifizierung.

Wie führe ich SearXNG mit Docker aus?

Lade die offiziellen Dateien docker-compose.yml und .env.example aus dem container-Verzeichnis des Projekts herunter, kopiere das Beispiel nach .env, binde den Port an 127.0.0.1 und führe docker compose up -d aus. Der Container lauscht auf Port 8080 und erstellt beim ersten Start settings.yml mit einem zufälligen Secret Key.

Wie aktiviere ich die JSON-API von SearXNG?

Füge json zu search.formats in core-config/settings.yml hinzu, starte den Core-Container neu und rufe /search?q=term&format=json auf. Ohne diese Einstellung antwortet die Instanz mit 403 Forbidden. Es gibt keinen API-Key, also schütze den Endpunkt am Reverse Proxy oder halte ihn in einem internen Netzwerk.

Kann ich SearXNG mit MCP-Servern, OpenClaw oder Open WebUI verwenden?

Ja, alle drei greifen auf die JSON-API zu. Aktiviere json in settings.yml, trage dann bei jedem Tool die URL deiner Instanz ein und halte den Traffic in einem internen Netzwerk oder SSH-Tunnel.

Kann ich eine öffentliche SearXNG-Instanz verwenden, statt selbst eine zu hosten?

Für gelegentliche Suchen ja. Bei Skripten, Agents oder anderen Anwendungen, auf die du angewiesen bist, ist eine private Instanz die sicherere Voreinstellung: Öffentliche Instanzen werden oft gedrosselt, bei vielen ist JSON deaktiviert und ihre Betreiber können deine Suchanfragen sehen.

Hinweis: Die in diesem Artikel genannten Produktspezifikationen, Funktionen und Preise können sich ändern und je nach Region, Abrechnungszeitraum und laufenden Aktionen abweichen. Aktuelle Angaben, Preise und lokale Wechselkurse findest du auf der offiziellen Website des jeweiligen Anbieters oder der jeweiligen Marke.