# SearXNG où comment avoir son propre metamoteur souverain, sans résultats pollués par l’IA

- Link: https://dolys.fr/forums/topic/searxng-ou-comment-avoir-son-propre-metamoteur-souverain/
- Published: 2023-08-15T16:19:03+02:00
- Author: nam1962

SearXNG, c&rsquo;est le retour à une vraie recherche web : des résultats nombreux et exploitables, sans extrait IA imposé, sans profilage publicitaire, sans annonces sponsorisées ni mise en avant commerciale. Déployé sous Docker : outil isolé, mise à jour simple, portable sur serveur si besoin. Ce tutoriel explique comment installer SearXNG avec Docker sur Linux, avec Valkey comme cache et un settings.yml court basé sur use_default_settings. Les moteurs de recherche limitent de plus en plus les requêtes automatisées : CAPTCHA, erreur 403, 429 ou changement brutal de leur page de résultats. Une petite sélection de moteurs devient vite fragile. La configuration ci-dessous en utilise donc plusieurs en parallèle, avec des index différents et des moteurs spécialisés selon le type de recherche. Attention : c&rsquo;est précis et un peu fastidieux : plus pour curieux motivé ou avancé que pour quelqu&rsquo;un qui veut du clef en main. Dans ce cas, utilisez une instance publique sur searx.space. Résultat attendu À la fin, vous avez une instance SearXNG locale accessible sur localhost:8888, avec Docker, Valkey, une configuration maintenable, une bonne profondeur de résultats et plusieurs moteurs capables de prendre le relais lorsqu&rsquo;un autre ne répond plus. Au programme : installation de Docker sur Debian/Ubuntu et Arch ; déploiement de SearXNG avec Docker Compose ; configuration de Valkey comme cache ; création d&rsquo;un settings.yml maintenable avec use_default_settings ; moteurs généralistes et index indépendants ; recherche d&rsquo;images, vidéos, actualités, code et publications scientifiques ; Marginalia et WolframAlpha avec leurs API ; tests, statistiques et mise à jour. Installer Docker Debian et dérivées : sudo apt update sudo apt install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/debian \ $(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin Pour Ubuntu, utiliser le dépôt Docker Ubuntu à la place du dépôt Debian. Arch, EndeavourOS, Manjaro et dérivées : sudo pacman -S docker docker-compose Dans les deux cas, activer Docker et rejoindre le groupe : sudo systemctl enable --now docker sudo usermod -a -G docker $USER newgrp docker Le newgrp prend effet immédiatement sans déconnexion. Pour que ce soit permanent dans toutes les sessions, se reconnecter ou redémarrer. Philosophie de l&rsquo;installation J&rsquo;organise mes services Docker dans ~/docker, avec un sous-dossier par service. Chaque service est autonome : son Compose, sa configuration et ses données. On peut tout arrêter, sauvegarder ou migrer service par service. ~/docker/ ├── searxng/ │ ├── docker-compose.yml │ └── config/ │ └── settings.yml │ ├── pihole/ │ ├── docker-compose.yml │ └── config/ │ └── dnscrypt-proxy/ ├── docker-compose.yml └── config/ Pourquoi Valkey au lieu de Redis SearXNG utilise une base rapide pour certaines fonctions qui nécessitent un état partagé. Redis a changé de licence en 2024. Valkey est son fork communautaire compatible, maintenu sous gouvernance de la Linux Foundation. Installer SearXNG avec Docker Compose Créer l&rsquo;arborescence : mkdir -p ~/docker/searxng/config cd ~/docker/searxng Créer docker-compose.yml : cat &lt;&lt; 'EOF' &gt; docker-compose.yml services: searxng: image: searxng/searxng:latest container_name: searxng ports: - "127.0.0.1:8888:8080" volumes: - "./config:/etc/searxng" - searxng_data:/var/cache/searxng environment: - SEARXNG_BASE_URL=http://localhost:8888/ - SEARXNG_INSTANCE_NAME=doLys - SEARXNG_VALKEY_URL=valkey://valkey:6379/0 restart: unless-stopped cap_drop: - ALL cap_add: - CHOWN - SETGID - SETUID deploy: resources: limits: cpus: '1.5' memory: 2G reservations: cpus: '0.5' memory: 1G valkey: image: valkey/valkey:9-alpine command: valkey-server --save 30 1 --loglevel warning restart: unless-stopped healthcheck: test: ["CMD", "valkey-cli", "ping"] interval: 30s timeout: 5s retries: 3 volumes: - valkey_data:/data volumes: searxng_data: valkey_data: networks: default: name: searxng_network EOF Le port 8888 est publié uniquement sur 127.0.0.1 : SearXNG n&rsquo;est donc pas accessible depuis les autres machines du réseau. Le volume searxng_data conserve le cache de SearXNG et valkey_data les données de Valkey. Les blocs deploy.resources limitent la consommation CPU et RAM. À adapter selon votre matériel. Valkey peut signaler au démarrage que vm.overcommit_memory n&rsquo;est pas activé. Le réglage s&rsquo;applique une seule fois : echo 'vm.overcommit_memory = 1' | sudo tee -a /etc/sysctl.conf sudo sysctl vm.overcommit_memory=1 Clés API Deux moteurs de cette configuration utilisent une clé. Marginalia possède son propre index et fait notamment remonter des blogs, sites personnels et petits sites peu visibles dans les gros moteurs. Une clé personnelle non commerciale peut être demandée gratuitement à : contact@marginalia-search.com Indiquez simplement qu&rsquo;il s&rsquo;agit d&rsquo;une instance SearXNG personnelle. WolframAlpha sert au calcul et aux données structurées : mathématiques, physique, conversions, constantes, etc. Créer un compte sur developer.wolframalpha.com, puis créer un App ID. Dans le fichier ci-dessous, les vraies clés remplaceront : VOTRE_CLE_MARGINALIA VOTRE_CLE_WOLFRAMALPHA Ne publiez ensuite jamais votre settings.yml avec ces valeurs réelles. Quels moteurs utiliser SearXNG interroge plusieurs moteurs puis fusionne leurs réponses. Tous les moteurs web généralistes partent ici avec un poids de 1.0. Un poids supérieur influence le classement mais ne rend pas un moteur plus fiable et ne contourne ni CAPTCHA ni limitation de requêtes. Recherche générale Google CSE, Bing, Brave, Mojeek, Yandex, Yep, Seznam et Naver apportent les gros index et classements généralistes. Marginalia, Mwmbl, Wiby et SearchMySite permettent de retrouver davantage de petits sites, blogs et pages indépendantes. PrivacyWall, ResultHunter, SearchToday, Vuhuv et YaCy complètent les résultats tant qu&rsquo;ils répondent correctement. Qwant reste chargé comme dépendance technique de ses moteurs Vidéos et Actualités, mais n&rsquo;est pas activé dans la recherche générale. Wikipedia n&rsquo;est pas utilisé comme moteur. Une page Wikipedia peut naturellement apparaître si Google, Bing ou un autre moteur la considère pertinente. Images Bing Images, Google CSE Images, PrivacyWall Images, Yandex Images, Mojeek Images, Naver Images, ResultHunter Images, Brave Images, Openverse, Wikimedia Commons et Flickr. Vidéos Bing Videos, Qwant Videos, PrivacyWall Videos, Naver Videos, Vuhuv Videos, Wikimedia Commons Videos, YouTube, Dailymotion, Brave Videos, PeerTube et SepiaSearch. Actualités Bing News, Qwant News, Mojeek News, Naver News, Brave News, Reuters et Wikinews. IT / Linux / code Arch Linux Wiki, GitHub, GitLab, Codeberg, Sourcehut, StackOverflow, AskUbuntu, SuperUser, Docker Hub, PyPI, npm, MDN, Mankier et discuss.python. Science arXiv, Crossref, PubMed, Semantic Scholar, OpenAIRE Publications, OpenAIRE Datasets et OpenAlex. Cartographie, météo et outils OpenStreetMap et Photon pour la cartographie, OpenMeteo et wttr.in pour la météo, Currency pour les conversions et WolframAlpha pour les calculs et données structurées. Créer un settings.yml court avec use_default_settings use_default_settings permet de conserver les définitions internes de SearXNG au lieu de les recopier dans votre fichier. Avec keep_only, seuls les moteurs choisis sont chargés. Le bloc engines: sert à activer ceux qui sont désactivés par défaut, fournir les clés API ou modifier un réglage particulier. Créer settings.yml : cat &gt; ~/docker/searxng/config/settings.yml &lt;&lt; 'EOF' use_default_settings: engines: keep_only: # Généralistes et index concurrents - "google cse" - bing - brave # Qwant reste chargé pour qwant videos / qwant news # mais n'est pas activé en recherche générale. - qwant - mojeek - yandex - yep - seznam - naver - marginalia - mwmbl - wiby - searchmysite - privacywall - resulthunter - searchtoday - vuhuv - yacy # Images - "bing images" - "google cse images" - "privacywall images" - "yandex images" - "mojeek images" - "naver images" - "resulthunter images" - brave.images - openverse - wikicommons.images - flickr # Vidéos - "bing videos" - "qwant videos" - "privacywall videos" - "naver videos" - "vuhuv videos" - wikicommons.videos - youtube - dailymotion - brave.videos - peertube - sepiasearch # Actualités - "bing news" - "qwant news" - "mojeek news" - "naver news" - brave.news - reuters - wikinews # Technique / développement - "arch linux wiki" - github - gitlab - codeberg - sourcehut - stackoverflow - askubuntu - superuser - "docker hub" - pypi - npm - mdn - mankier - discuss.python # Science - arxiv - crossref - pubmed - "semantic scholar" - openairepublications - openairedatasets - openalex # Cartographie / météo / outils - openstreetmap - photon - openmeteo - wttr.in - currency - wolframalpha plugins: searx.plugins.calculator.SXNGPlugin: active: true searx.plugins.hash_plugin.SXNGPlugin: active: true searx.plugins.tracker_url_remover.SXNGPlugin: active: true searx.plugins.unit_converter.SXNGPlugin: active: true searx.plugins.oa_doi_rewrite.SXNGPlugin: active: true searx.plugins.self_info.SXNGPlugin: active: false general: debug: false instance_name: "doLys" privacypolicy_url: false donation_url: false contact_url: false enable_metrics: true search: safe_search: 0 autocomplete: "" autocomplete_min: 4 default_lang: "all" ban_time_on_fail: 5 max_ban_time_on_fail: 120 formats: - html server: port: 8888 bind_address: "127.0.0.1" base_url: http://localhost:8888/ limiter: false public_instance: false secret_key: "REMPLACER_PAR_OPENSSL_RAND_HEX_32" image_proxy: true http_protocol_version: "1.0" method: "POST" default_http_headers: X-Content-Type-Options: nosniff X-Download-Options: noopen X-Robots-Tag: noindex, nofollow Referrer-Policy: no-referrer valkey: url: valkey://valkey:6379/0 ui: static_path: "" templates_path: "" query_in_title: false default_theme: simple center_alignment: false default_locale: "fr" theme_args: simple_style: auto search_on_category_select: true hotkeys: default outgoing: request_timeout: 5.0 max_request_timeout: 12.0 useragent_suffix: "" pool_connections: 100 pool_maxsize: 20 enable_http2: true categories_as_tabs: general: images: videos: news: map: music: it: science: engines: # Généralistes : même poids - name: "google cse" disabled: false weight: 1.0 - name: bing disabled: false weight: 1.0 - name: brave disabled: false weight: 1.0 - name: mojeek disabled: false weight: 1.0 - name: yandex disabled: false weight: 1.0 - name: yep disabled: false weight: 1.0 - name: seznam disabled: false weight: 1.0 - name: naver disabled: false weight: 1.0 - name: mwmbl disabled: false weight: 1.0 - name: wiby disabled: false weight: 1.0 - name: searchmysite disabled: false weight: 1.0 - name: privacywall disabled: false weight: 1.0 - name: resulthunter disabled: false weight: 1.0 - name: searchtoday disabled: false weight: 1.0 - name: vuhuv disabled: false weight: 1.0 - name: yacy disabled: false weight: 1.0 # Marginalia - name: marginalia api_key: "VOTRE_CLE_MARGINALIA" filter_name: "" disabled: false inactive: false weight: 1.0 # WolframAlpha - name: wolframalpha engine: wolframalpha_api api_key: "VOTRE_CLE_WOLFRAMALPHA" disabled: false inactive: false # Science - name: crossref disabled: false timeout: 30.0 - name: openalex disabled: false - name: arxiv disabled: false - name: pubmed disabled: false - name: "semantic scholar" disabled: false - name: openairepublications disabled: false - name: openairedatasets disabled: false # Images - name: "privacywall images" disabled: false - name: "yandex images" disabled: false - name: "mojeek images" disabled: false - name: "naver images" disabled: false - name: "resulthunter images" disabled: false - name: openverse disabled: false # Vidéos - name: "qwant videos" disabled: false - name: "privacywall videos" disabled: false - name: "naver videos" disabled: false - name: "vuhuv videos" disabled: false - name: peertube disabled: false - name: youtube disabled: false - name: sepiasearch disabled: false # Actualités - name: "qwant news" disabled: false - name: "mojeek news" disabled: false - name: "naver news" disabled: false - name: wikinews disabled: false # IT / Linux / code - name: codeberg disabled: false - name: gitlab disabled: false - name: sourcehut disabled: false - name: discuss.python disabled: false - name: stackoverflow disabled: false - name: askubuntu disabled: false - name: superuser disabled: false - name: github disabled: false - name: npm disabled: false - name: pypi disabled: false - name: mdn disabled: false - name: mankier disabled: false - name: "docker hub" disabled: false - name: "arch linux wiki" disabled: false # Cartographie / météo / outils - name: openstreetmap disabled: false - name: photon disabled: false - name: openmeteo disabled: false - name: wttr.in disabled: false - name: currency disabled: false EOF Le filter_name: "" de Marginalia doit rester vide. La configuration ne surcharge volontairement pas suspended_times. SearXNG utilise ainsi les valeurs prévues par la version installée et profite de leurs évolutions lors des mises à jour. Pour créer la clé secrète : openssl rand -hex 32 Copier le résultat à la place de : REMPLACER_PAR_OPENSSL_RAND_HEX_32 Puis remplacer également : VOTRE_CLE_MARGINALIA VOTRE_CLE_WOLFRAMALPHA Démarrer SearXNG cd ~/docker/searxng docker compose up -d sleep 5 docker compose ps docker logs --tail=150 searxng SearXNG doit être accessible sur : http://localhost:8888 Docker doit afficher une publication de port de cette forme : 127.0.0.1:8888-&gt;8080/tcp Valkey peut rester quelques secondes en health: starting avant de passer à healthy. Tester les résultats La langue de recherche est réglée par défaut sur all. C&rsquo;est préférable pour les recherches techniques, scientifiques ou portant sur des noms propres : un terme comme CachyOS ne doit pas limiter les résultats aux seules pages françaises. Quelques recherches permettent déjà de vérifier le comportement : CachyOS notaire rouvez docker compose searxng Tester aussi les pages 2 et 3. SearXNG permet d&rsquo;isoler un moteur avec son raccourci : !mar CachyOS !goc CachyOS !br CachyOS !mjk CachyOS Les deux pages suivantes sont très utiles : http://localhost:8888/stats http://localhost:8888/stats/errors La première montre notamment les temps de réponse. La seconde signale les CAPTCHA, erreurs HTTP, timeouts et erreurs d&rsquo;analyse rencontrés par les moteurs. Quelques erreurs ponctuelles sont normales. Les moteurs web modifient leurs protections et leur HTML sans prévenir ; l&rsquo;intérêt de SearXNG est justement de ne pas dépendre d&rsquo;un seul d&rsquo;entre eux. Pas d&rsquo;extrait IA imposé SearXNG n&rsquo;ajoute pas de résumé génératif au-dessus de vos résultats. Les pages restent des pages de recherche : titre, URL, extrait, provenance des moteurs et résultats suivants. Cette configuration n&rsquo;active pas Wikipedia comme moteur dédié. Wikipedia peut néanmoins apparaître comme résultat normal lorsqu&rsquo;un moteur le renvoie. SearXNG n&rsquo;ajoute pas non plus de bloc publicitaire ou de résultat sponsorisé à l&rsquo;interface. Un site commercial peut évidemment apparaître lorsqu&rsquo;il correspond réellement à la requête. Définir SearXNG comme moteur de recherche Dans Firefox, ouvrir l&rsquo;instance SearXNG puis l&rsquo;ajouter aux moteurs disponibles depuis les paramètres de recherche du navigateur. Vous pouvez ensuite le définir comme moteur par défaut pour que les recherches saisies dans la barre d&rsquo;adresse passent directement par votre instance. Mettre à jour SearXNG Télécharger une nouvelle image Docker ne suffit pas : le conteneur en cours continue à utiliser l&rsquo;ancienne tant qu&rsquo;il n&rsquo;est pas recréé. Utiliser : cd ~/docker/searxng docker compose pull docker compose up -d --force-recreate docker compose ps docker logs --tail=100 searxng Pour vérifier que le conteneur utilise bien l&rsquo;image latest locale : RUNNING=$(docker inspect -f '{{.Image}}' searxng) LOCAL=$(docker image inspect searxng/searxng:latest -f '{{.Id}}') echo "Image utilisée : $RUNNING" echo "Image latest : $LOCAL" [ "$RUNNING" = "$LOCAL" ] \ &amp;&amp; echo "OK : conteneur à jour" \ || echo "Le conteneur utilise encore une ancienne image" Remplacer le logo Créer searxng-custom.png et searxng-custom.svg dans ~/docker/searxng, puis : CONTAINER=$(docker ps --filter 'name=searxng' --format '{{.ID}}') DEST=/usr/local/searxng/searx/static/themes/simple/img/ docker cp ./searxng-custom.png $CONTAINER:${DEST}searxng.png docker cp ./searxng-custom.svg $CONTAINER:${DEST}searxng.svg docker compose restart searxng Le logo placé directement dans le conteneur est écrasé lors de sa recréation. Script de mise à jour avec recopie automatique, à placer dans ~/docker/searxng/searxng-maj.sh : #!/usr/bin/env python3 import subprocess import os os.chdir(os.path.expanduser("~/docker/searxng")) def run(cmd, check=True): result = subprocess.run( cmd, shell=True, capture_output=True, text=True ) if check and result.returncode != 0: print(f"Erreur : {cmd}\n{result.stderr}") raise SystemExit(1) return result run("docker compose pull") run("docker compose up -d --force-recreate") result = run( "docker ps --filter 'name=searxng' --format '{{.ID}}'", check=False ) container_id = result.stdout.strip().split("\n")[0] if container_id: dest = "/usr/local/searxng/searx/static/themes/simple/img/" run( f"docker cp ./searxng-custom.png " f"{container_id}:{dest}searxng.png" ) run( f"docker cp ./searxng-custom.svg " f"{container_id}:{dest}searxng.svg" ) run("docker compose restart searxng") else: print("Conteneur SearXNG non trouvé.") chmod +x searxng-maj.sh ./searxng-maj.sh En amont, j&rsquo;utilise Pi-hole pour le DNS et le filtrage des publicités : tuto Pi-hole + Unbound Pour aller plus loin sur les moteurs disposant de leurs propres index : https://seirdy.one/posts/2021/03/10/search-engines-with-own-indexes/ Carte des relations entre moteurs : https://www.searchenginemap.com/ Questions fréquentes SearXNG remplace-t-il Google ? SearXNG interroge ici Google CSE avec de nombreux autres moteurs puis fusionne leurs résultats. Google devient l&rsquo;une des sources de la recherche. SearXNG génère-t-il des réponses avec une IA ? Cette configuration n&rsquo;utilise aucun moteur génératif pour résumer les résultats. SearXNG affiche les résultats transmis par les moteurs interrogés et ses propres réponses fonctionnelles, par exemple pour les conversions ou le calcul. SearXNG rend-il les recherches anonymes ? Le moteur interrogé reçoit la requête depuis l&rsquo;instance SearXNG sans recevoir directement les cookies de votre navigateur ni son contexte habituel de navigation. Il voit toutefois l&rsquo;adresse IP de sortie de l&rsquo;instance. Un moteur utilisé avec une clé API peut également associer les requêtes à cette clé. Pourquoi désactiver l&rsquo;autocomplétion ? L&rsquo;autocomplétion génère des requêtes supplémentaires pendant la frappe. Sur une instance personnelle, cela augmente inutilement le trafic vers les moteurs et peut accélérer leurs limitations. Pourquoi la langue par défaut est-elle « all » ? Les recherches techniques, scientifiques et les noms propres donnent souvent de meilleurs résultats sans filtre linguistique systématique. L&rsquo;interface reste en français et la langue peut toujours être choisie ponctuellement. Faut-il un nom de domaine et HTTPS ? Non pour un usage local. Avec : 127.0.0.1:8888:8080 Docker publie SearXNG uniquement sur la machine locale. Pour exposer l&rsquo;instance sur Internet, utilisez un reverse proxy comme Caddy ou Nginx Proxy Manager, activez HTTPS et adaptez les mécanismes de limitation à une instance publique. Comment accéder depuis plusieurs machines du réseau local ? Dans docker-compose.yml, remplacer : - "127.0.0.1:8888:8080" par : - "8888:8080" Puis recréer le conteneur : docker compose up -d --force-recreate L&rsquo;instance devient accessible via : http://IP_DU_SERVEUR:8888 Vérifiez le pare-feu de la machine avant d&rsquo;ouvrir le port à d&rsquo;autres appareils.
