Eigene Searx-Instanz unter Debian – Die Basis-Installation (Teil 1/2)

Searx ist eine in Python geschriebene „Privatsphären-respektierende, hackbare Metasuchmaschine“, die die Suchanfragen des Benutzers an eine Vielzahl von selbst definierbaren Suchmaschinen (z.B. Google, Reddit, Bandcamp, StartPage, Wikipedia, Duden, …) weiterleitet und die Ergebnisse dann für den Benutzer aufbereitet. Man bekommt mit einer Searx-Suchanfrage also nicht nur die Ergebnisse einer bestimmten Suchmaschine, sondern gleich von mehreren.

Im Gegensatz zu einer selbstgehosteten P2P-Suchmaschine wie Yacy crawlt Searx nicht selbst das Web und baut auch keinen eigenen Index auf Peer-to-Peer-Basis auf, sondern leitet die Suchanfragen des Benutzers einfach nur – wie oben beschrieben – an die vorher eingestellten Suchmaschinen weiter und bezieht von dort die Ergebnisse.

Ein Vorteil ist, dass die Links aus den Ergebnissen von z.B. Google keine Tracking-Parameter mehr enthalten, mit denen Google bei direkter Verwendung ihrer Suchmaschine im Webbrowser über JavaScript normalerweise jeden Klick auf ein Suchergebnis trackt. Anstatt dass der Webbrowser des Benutzers die Suchanfrage direkt an die Suchmaschine sendet, fungiert Searx hier als Proxy und sorgt dafür, dass auch keine Cookies mitgeschickt bzw. gespeichert werden.

Beispiel: Searx-Suchmaske im dunklen Design

Ein weiterer Vorteil ist, dass mehrere Benutzer die selbe Instanz verwenden können und eine Suchanfrage so aus Sicht der einzelnen Suchmaschinen nicht mehr so einfach einem bestimmten Nutzer zugeordnet werden kann.

Obwohl man durch die Benutzung einer selbstgehosteten Searx-Instanz schon einen großen Schritt in Richtung mehr Kontrolle über seine Daten erzielt hat, sehen die Suchmaschinen allerdings immer noch die IP-Adresse von dem Host, auf dem Searx installiert ist. Sollte man sich also dafür entscheiden, seine Searx-Instanz ausschließlich selbst zu nutzen und nicht mit einer Gruppe an Nutzern zu teilen, ist es empfehlenswert, den Datenverkehr zwischen der Searx-Instanz und den einzelnen Suchmaschinen zum Beispiel via SOCKS-Proxy durch das Tor-Netzwerk zu leiten.

In diesem Beitrag wird gezeigt, wie man eine Searx-Instanz zur Eigennutzung auf einem Debian-artigen Linux-System installieren und ausgiebig testen kann. Verzichten werde ich auf die Einrichtung von Filtron, einem Reverse-Proxy mit Filterregeln, der für den Betrieb öffentlicher Instanzen gedacht ist und unter anderem verhindern soll, dass zu viele Suchanfragen an die Suchmaschinen gestellt werden, was eine Blockierung der Searx-Instanz zur Folge haben kann.

In einem weiteren Beitrag wird gezeigt, wie man die Searx-Instanz für den Produktiveinsatz einrichtet und diese über den uWSGI-Daemon mit einem WSGI-Proxy-fähigen Webserver (Apache, nginx, ...) als Reverse-Proxy verbindet.

Schritt 1: Abhängigkeiten/Pakete installieren

Vor der Installation von Searx müssen folgende Abhängigkeiten/Pakete installiert werden:

sudo apt install python3-dev python3-babel python3-venv git build-essential libxslt-dev zlib1g-dev libffi-dev libssl-dev shellcheck

Schritt 2: Neuen Benutzer für Searx erstellen

Nachdem alle Abhängigkeiten installiert wurden, erstellt ihr einen neuen Benutzer, unter dem Searx ausgeführt werden soll. Ich nenne den Benutzer searx und nehme als Home-Verzeichnis /opt/searx. Als Login-Shell nehme ich Bash, damit wir uns für die Installation (und später für Debugging/Wartung) ganz normal mit su - searx einloggen, in das virtuelenv wechseln und die Searx-Instanz ohne uWSGI starten können.

sudo useradd --system --home-dir /opt/searx --shell /usr/bin/bash searx
sudo install -o searx -g searx -m 0755 -d /opt/searx

Nun loggt ihr euch für die Installation von Searx als searx auf dem System ein:

sudo su - searx

Schritt 3: Searx-Repository herunterladen

Nun klont ihr das Git-Repository mit dem Searx-Quellcode ins Verzeichnis ~/src:

git clone https://github.com/searx/searx.git src

Schritt 4: Python-Umgebung einrichten

Jetzt erstellt ihr über Python im Home-Verzeichnis von searx das Virtual Environment im Verzeichnis ~/env und richtet die Shell so ein, dass ihr bei der nächsten Anmeldung mit su - searx im Virtual Environment landet. In dieses Virtual Environment werden dann im nächsten Schritt die für die Searx-Instanz benötigten Python-Module installiert.

python3 -m venv env
echo ". ~/env/bin/activate" > .profile

Wenn ihr euch nun von dem searx-Konto ab- und wieder anmeldet, dann solltet ihr euch erfolgreich in der virtuellen Python-Umgebung befinden, die sich an dem veränderten Shell-Prompt erkennen lässt:

(env) searx@hostname:~$

Um die Umgebung wieder zu verlassen, müsst ihr lediglich deactivate im Terminal ausführen, welches eine vom activate-Skript definierte Shell-Funktion ist, die eure „normale“ Shell-Umgebung wiederherstellt.

Falls ihr nicht automatisch nach dem Anmelden in die virtuelle Umgebung wechseln wollt, könnt ihr den Schritt mit der .profile auch weglassen und immer manuell . ~/env/bin/activate aufrufen.

Schritt 5: Erforderliche Python-Module installieren

Aus dem zuvor erstellten Virtual Environment ruft ihr nun pip auf, um die für die Searx-Umgebung erforderlichen Module zu installieren (bzw. bereits vorhandene Module wie pip zu aktualisieren). Kombiniert geht das so:

pip install -U pip setuptools wheel pyyaml

Jetzt müssen noch die projektspezifischen Python-Module von Searx aus der src/requirements.txt installiert werden. Wechselt dazu ins ~/src-Verzeichnis mit dem Searx-Quellcode und führt folgendes pip-Kommando aus:

pip install -e .

Hinweis: Wenn ihr den Quellcode eurer Searx-Instanz regelmäßig mit git pull aktualisiert und es Änderungen an den projektspezifischen Modulen (requirements.txt) gegeben hat, dann müsst ihr das vorherige pip-Kommando erneut ausführen, damit die zuvor installierten Python-Module in eurem Virtual Environment aktualisiert werden!

Schritt 6: Searx-Konfiguration erstellen

Searx ist nun fast startbereit! Jetzt muss lediglich noch eine Konfigurationsdatei erstellt werden. Dazu wechselt ihr wieder in das Home-Verzeichnis und kopiert euch die Template-Konfigurationsdatei nach ~/settings.yml:

cp src/utils/templates/etc/searx/use_default_settings.yml settings.yml

Aus „kryptographischen Gründen“ müsst ihr vor dem Starten der Searx-Instanz den in der Template-Konfigurationsdatei enthaltenen Platzhalter-Secret-Key durch einen eigenen ersetzen. Dazu führt ihr folgendes Kommando aus (oder ihr bearbeitet die Datei von Hand und fügt etwas Zufälliges an entsprechender Stelle ein):

sed -i "s/ultrasecretkey/$(openssl rand -hex 16)/" settings.yml

Im letzten Schritt vor dem Starten von Searx müssen wir Searx über die Umgebungsvariable SEARX_SETTINGS_PATH noch mitteilen, wo denn die soeben erstellte Konfigurationsdatei zu finden ist. Aus Gründen der Einfachheit würde ich empfehlen, die Umgebungsvariable einfach direkt in der ~/.profile zu exportieren:

echo "export SEARX_SETTINGS_PATH=~/settings.yml" >> .profile

Nach einer erneuten Anmeldung im searx-Konto ist die Umgebungsvariable automatisch gesetzt und muss somit nicht jedes Mal manuell exportiert werden, wenn ihr Searx über die Shell aus dem virtualenv starten wollt.

Schritt 7: Searx-Instanz starten und ausprobieren

Nachdem alles erfolgreich durchführt wurde, kann Searx nun aus der Python-Umgebung gestartet werden.

python src/searx/webapp.py

Im Terminal solltet ihr jetzt sehen, dass Searx gestartet wurde und der Webserver auf 127.0.0.1:8888 lauscht. Als Development-Server kommt Werkzeug zum Einsatz, der hier nur dazu dient, die Installation zu testen.

 * Serving Flask app 'webapp' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)

Falls ihr Searx auf einem Remote-Server installiert habt und von eurem Desktop aus schnell die Installation testen wollt, ohne server.bind_address auf 0.0.0.0 setzen zu müssen und/oder in der Server-Firewall den Port zu öffnen, dann könnt ihr wie folgt ganz einfach eine Port-Weiterleitung über SSH von eurem Desktop zum Server aufmachen:

ssh -L 8888:127.0.0.1:8888 -N [...]

… und dann http://localhost:8888 im Webbrowser auf dem Desktop aufrufen.

Im nächsten Beitrag zum Thema geht es dann um die Installation und Konfiguration des uWSGI-Servers für den „Produktiveinsatz“ und wie man diesen über Apache und nginx als Reverse-Proxy anspricht.

Der Autor

Hi. Ich bin Thomas. Hier veröffentliche ich in unregelmäßgen Abständen mehr oder weniger interessante Beiträge über Dies und Jenes, hauptsächlich über Computer und IT. Außerdem mag ich die Linux-Kommandozeile, vor allem wenn ich darauf mit (m)einer mechanischen Tastatur herumhacken kann. 😀