Skip to main content

Installation hinter nginx

Vorbedingungen

Um eine eigene SeaXNG Instanz aufzusetzen, sind folgende Vorbedingungen nötig.

  • Ein auf Linux basierendes OS (VM)
  • Software vorinstalliert und konfiguriert
    • Docker und Docker-Compose
    • git
    • make
    • python3-venv
    • nicht vollständig
  • Einen laufenden nginx Container als Proxy
  • Letsencrypt mit einer entsprechenden Domain (z. B. search.frei.chat)

Docker Image bauen

Das Image wird aus dem aktuellen Git-Branch von SearXNG gebaut.

  1. Git Clone des aktuellen Branches nach /home/docker

    git clone https://github.com/searxng/searxng
  2. Bauen des Images

    cd /home/docker/searxng
    make docker.build
     
    Ausgabe:
    ...
    [Warning] One or more build-args [BASE_IMAGE] were not consumed
    Successfully built 520822701833
    Successfully tagged searxng/searxng:latest
    Successfully tagged searxng/searxng:1.0.0-1731-6c38bb59

    Die beiden letzten Zeilen geben das Image aus, welches in der docker-compose.yaml hinterlegt werden muss. Entweder man nimmt die "latest" Variante oder passt manuell nach jedem Build die Versionsnummer an.

Konfigurieren der SearXNG-, Filtron- und Morty-Instanzen

  1. Erstellen des Verzeichnisses searx

    mkdir /home/docker/searx
    cd /home/docker/searx
  2. Erstellen der Docker-Datei docker-compose.yaml

    vi docker-compose.yml

    In diese Datei folgenden Code einfügen.
    Die docker-compose.yaml-Datei ist aus dem Github Repo https://github.com/searxng/searxng-docker entnommen.


    version: '3.7'
     
    services:
     
      filtron:
        container_name: filtron
        image: dalf/filtron
        restart: always
        command: -listen 0.0.0.0:4040 -api 0.0.0.0:4041 -target searxng:8080
        volumes:
          - ./rules.json:/etc/filtron/rules.json:rw
        read_only: true
        cap_drop:
          - ALL
     
      searxng:
        container_name: searxng
        image: searxng/searxng:latest
        restart: always
        command: ${SEARXNG_COMMAND:-}
        volumes:
          - ./searxng:/etc/searxng:rw
        environment:
          - BIND_ADDRESS=0.0.0.0:8080
          - BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/
          - MORTY_URL=https://${SEARXNG_HOSTNAME:-localhost}/morty/
          - MORTY_KEY=${MORTY_KEY}
        cap_drop:
          - ALL
        cap_add:
          - CHOWN
          - SETGID
          - SETUID
          - DAC_OVERRIDE
     
      morty:
        container_name: morty
        image: dalf/morty
        restart: always
        command: -timeout 6 -ipv6
        environment:
          - MORTY_KEY=${MORTY_KEY}
          - MORTY_ADDRESS=0.0.0.0:3000
        logging:
          driver: none
        read_only: true
        cap_drop:
          - ALL

    Netzwerkbrücke zwischen den SearXNG- und dem nginx-Container

    Ggf. ist es notwendig für die Kommunikation eine Docker Netzwerkbrücke zu erstellen, sofern nginx ebenfalls in einem Container läuft.

    Sollte dies der Fall sein, muss jeder Container um den folgenden Eintrag erweitert werden.

    networks:
      - [NETWORK_NAME]
  3. Erstellen der Datei .env.

    vi .env

    In die Datei folgenden Code einfügen.
    Ersetzen der in [] stehenden Einträge (inkl. eckige Klammern).
    Der Wert [MORTY_KEY] durch den Wert aus dem Befehl in dem Kommentar ersetzen.

    SEARXNG_HOSTNAME=[SEARXNG_HOSTNAME]
    SEARXNG_COMMAND=-f
     
    # use openssl rand -base64 33
    MORTY_KEY=[MORTY_KEY]
  4. Die Datei rules.json aus dem Git-Repo herunterladen.
    Diese Datei enthält die Regel für den Filtron-Container. Diese Software ist eine Application-Firewall, die die Zugriffsmenge auf SearXNG reguliert.

    curl https://raw.githubusercontent.com/searxng/searxng-docker/master/rules.json -O rules.json

Konfigurieren des nginx-VHosts

Der Nginx-VHost übernimmt die Bereitstellung einer Verbindung zum Internet über eine gesicherte Verbindung (HTTPS).

Die folgende Datei muss als VHost in die sites-enabled hinzugefügt werden.
Ersetzen von der /path/to in den Klammern mit den entsprechenden Pfaden.

server {
    listen 443 ssl;
    listen [::]:443 ssl http2;
 
    server_name [SEARXNG_HOSTNAME];
    server_tokens off;
 
    root /dev/null;
 
    ssl_certificate [/path/to]/fullchain.pem;
    ssl_certificate_key [/path/to]/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate [/path/to]/chain.pem;
    ssl_session_tickets off;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_timeout 1d;
 
    gzip on;
    gzip_types text/plain application/json application/javascript text/css image/x-icon font/ttf image/gif;
 
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin";
    add_header Permissions-Policy interest-cohort=() always;
 
    proxy_cookie_path / "/; HTTPOnly; Secure";
 
    location / {
        resolver 127.0.0.11 valid=5s;
        set $backend "filtron:4040";
        proxy_pass http://$backend;
        proxy_set_header   Host             $host;
        proxy_set_header   Connection       $http_connection;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Scheme         $scheme;
        proxy_set_header   X-Script-Name    /searx;
    }
 
    location /morty {
        resolver 127.0.0.11 valid=5s;
        set $backend "morty:3000";
        proxy_pass http://$backend;
        proxy_set_header   Host             $host;
        proxy_set_header   Connection       $http_connection;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Scheme         $scheme;
        proxy_set_header   X-Script-Name    /searx/morty;
    }
 
    access_log /dev/null;
    error_log /dev/null;
}

Quellen

Weitere Informationen findet man auf der offiziellen Doku-Websiete unter: https://docs.searxng.org