Table des matières

Searxng

Présentation de Searxng

Searxng est un métamoteur de recherche libre, c’est-à-dire qu'il ne gère pas lui-même la recherche mais s'appuie sur des moteurs de recherches tels que bing, google, duckduckgo, etc.

Préparation

On va déployer Searxng via docker, donc il faut que docker-compose soit installé sur votre système

Installation de Searxng

Créer un répertoire Searxng et dans ce répertoire, créez le fichier docker-compose.yml avec ce contenu :

# Read the documentation before using the `docker-compose.yml` file:
# https://docs.searxng.org/admin/installation-docker.html
 
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:

Dans le même répertoire, créez le fichier .env avec le contenu suivant (vous pouvez modifier le port 8085) :

# Read the documentation before using the `docker-compose.yml` file:
# https://docs.searxng.org/admin/installation-docker.html
#
# Additional ENVs:
# https://docs.searxng.org/admin/settings/settings_general.html#settings-general
# https://docs.searxng.org/admin/settings/settings_server.html#settings-server
 
# Use a specific version tag. E.g. "latest" or "2026.3.25-541c6c3cb".
SEARXNG_VERSION=latest
 
# Listen to a specific address.
SEARXNG_HOST=[127.0.0.1]
 
# Listen to a specific port.
SEARXNG_PORT=8085

Lancez la commande suivante pour démarrer le conteneur :

sudo docker compose up -d

Configuration

Ouvrez le fichier core-config/settings.yml et modifiez-le comme suit :

# Read the documentation before extending the defaults:
# https://docs.searxng.org/admin/settings/
 
use_default_settings: true
 
server:
  secret_key: "dQmtqyS1rEuuFLQgW0xHgFSQ2CP5cZS"
  image_proxy: true
  limiter: true
valkey:
  url: valkey://valkey:6379/0

Si vous voulez rendre mon instance privée mais accessible depuis n'importe quelle IP, vous pouvez utilisez le système de jeton. Dans votre fichier settings.yml, ajoutez les lignes suivantes :

engines:
  - name: google cse
    tokens: ['MonMotDePasseSecret123!']
  - name: bing
    tokens: ['MonMotDePasseSecret123!']
  - name: duckduckgo
    tokens: ['MonMotDePasseSecret123!']

Pour pouvoir accéder à ces moteurs, vous devez coller votre token (ça peut être le même pour tous les moteurs) dans l'interface web de Searxng dans Préférences > Général > Jetons de moteur

Créez le fichier core-config/limiter.toml et collez-y le contenu suivant :

[botdetection.ip_limit]
 
# To get unlimited access in a local network, by default link-local addresses
# (networks) are not monitored by the ip_limit
filter_link_local = false
 
# activate link_token method in the ip_limit method
link_token = true

Redémarrez le conteneur :

sudo docker compose down
sudo docker compose up -d

Configuration d'Apache

On va configurer Apache2 pour pouvoir accéder à notre instance Searx via un sous domaine style searx.domaine.fr (je ne traiterai pas la gestion du nom de domaine)

Activez les modules Apache2 nécessaires :

sudo a2enmod headers proxy proxy_http ssl proxy_uwsgi

Créez le fichier de config Apache2 :

sudo nano /etc/apache2/sites-available/searx.domaine.fr.conf

Copiez-y les lignes suivantes (remplacez le nom de domaine par le vôtre ainsi que l'emplacement des fichiers SSL et le numéro de port) :

<VirtualHost *:80>
 
        ServerName searx.domaine.fr
 
        Redirect / https://searx.domaine.fr/
 
</VirtualHost>
 
 
<VirtualHost *:443>
 
        ServerName searx.domaine.fr
 
        LogLevel warn
        ErrorLog ${APACHE_LOG_DIR}/searx.error.log
 
 
        SSLEngine on
        SSLProxyEngine On
        ProxyRequests Off
        ProxyPreserveHost On
        SSLCertificateFile /etc/letsencrypt/live/domaine.fr/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/domaine.fr/privkey.pem
        AddDefaultCharset utf-8
        HostnameLookups off
        UseCanonicalName off
        ProxyBadHeader Ignore
        KeepAlive off
 
        ProxyPass / http://localhost:8085/
        <Location />
                ProxyPassReverse http://localhost:8085/
                Require all granted
        </Location>
 
        # see limiter.py
        #RequestHeader set X-Real-IP %{REMOTE_ADDR}s
        #RequestHeader append X-Forwarded-For %{REMOTE_ADDR}s
 
        # intermediate configuration
        SSLProtocol             -all +TLSv1.2 +TLSv1.3
        SSLOpenSSLConfCmd       Curves X25519:prime256v1:secp384r1
        SSLCipherSuite          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:DHE-RSA-CHACHA20-POLY1305
        SSLHonorCipherOrder     off
        SSLSessionTickets       off
 
        # enable HTTP/2, if available
        Protocols h2 http/1.1
 
        # HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)
        Header always set Strict-Transport-Security "max-age=63072000"
 
        <IfModule mod_headers.c>
                Header set X-Content-Type-Options "nosniff"
                Header set X-XSS-Protection "1; mode=block"
                Header unset X-Powered-By
                Header set Referrer-Policy: strict-origin-when-cross-origin
                Header set Permissions-Policy "accelerometer=(),battery=(),fullscreen=(self),geolocation=(),camera=(),ambient-light-sensor=(self),autoplay=(self)"
                Header set Content-Security-Policy "frame-ancestors 'self' *.domaine.fr; upgrade-insecure-requests; default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; form-action 'self'; font-src 'self'; frame-ancestors 'self'; base-uri 'self'; connect-src 'self' https://overpass-api.de; img-src *; frame-src https://www.youtube-nocookie.com https://player.vimeo.com https://www.dailymotion.com https://www.deezer.com https://www.mixcloud.com https://w.soundcloud.com https://embed.spotify.com; media-src *"
        </IfModule>
 
</VirtualHost>

Activez le fichier de configuration :

sudo a2ensite searx.nomdedomaine.fr.conf

Votre instance SearXNG est maintenant accessible à l'adresse searx.nomdedomaine.fr.