l’Almanet doLys Gnu/Linux – Open Source – Entreprises › Forums › L’almanet doLys Open Source › SearXNG où comment avoir son propre metamoteur souverain
Mots-clés : moteur de recherche
- This topic is empty.
- AuteurArticles
- août 15, 2023 à 4:19 pm #12536
J’utilisais jusqu’ici Searx et j’ai migré vers SearXNG, son fork plus actif en développement continu (rolling).
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, un settings.yml court basé sur
use_default_settings, et une sélection de moteurs adaptée à un usage français.
L’objectif n’est pas d’activer tous les moteurs, mais d’obtenir un métamoteur local stable, lisible et peu bruité.Attention : c’est très précis et un peu fastidieux : plus pour curieux motivé ou avancé que pour quelqu’un qui veut du clef en main (dans ce cas, utilisez une instance publique https://searx.space/).
Les instances publiques partagées subissent des limitations de requêtes que votre instance personnelle n’aura pas.Résultat attendu
À la fin, vous avez une instance SearXNG locale accessible sur
localhost:8888, avec Docker, Valkey, une configuration courte, des moteurs choisis, et une maintenance simple pardocker compose pull.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’un settings.yml maintenable avec use_default_settings
- choix argumenté des moteurs utiles
- clés API gratuites nécessaires
- mise à jour et maintenance
Installer Docker
Debian, Ubuntu, Mint 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 && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-pluginPour Ubuntu remplacer l’URL
debianparubuntudans la commande echo.Arch, EndeavourOS, Manjaro et dérivées :
sudo pacman -S docker docker-composeDans les deux cas, activer et rejoindre le groupe :
sudo systemctl enable --now docker sudo usermod -a -G docker $USER newgrp dockerLe
newgrpprend effet immédiatement sans déconnexion.
Pour que ce soit permanent, se reconnecter ou redémarrer.Philosophie de l’installation
J’organise mes services Docker dans ~/docker, un sous-dossier par service.
Chaque service est autonome : son compose, sa config, ses données.
On peut tout arrêter, sauvegarder ou migrer service par service.~/docker/ ├── searxng/ │ ├── docker-compose.yml ← orchestration searxng + valkey │ └── config/ │ ├── settings.yml ← config principale (moteurs, plugins, serveur) │ ├── limiter.toml ← règles anti-bot │ └── uwsgi.ini ← serveur WSGI (généré au premier démarrage) │ ├── pihole/ │ ├── docker-compose.yml ← DNS filtrant + interface d'administration │ └── config/ │ ├── dnscrypt-proxy/ │ ├── docker-compose.yml ← chiffrement des requêtes DNS (DoH/DoT) │ └── config/ │ └── watchtower/ └── docker-compose.yml ← mise à jour automatique des images DockerPourquoi Valkey au lieu de Redis
SearXNG a besoin d’un cache pour les sessions et le rate-limiting.
Ce cache était assuré par Redis jusqu’à son changement de licence en 2024.
On utilise désormais Valkey, fork communautaire 100% compatible, maintenu par la Linux Foundation.Installer SearXNG avec Docker Compose
mkdir -p ~/docker/searxng cd ~/docker/searxngCréer le docker-compose.yml :
cat << 'EOF' > docker-compose.yml services: searxng: image: searxng/searxng:latest container_name: searxng ports: - "8888:8080" volumes: - "./config:/etc/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 labels: - "com.centurylinklabs.watchtower.enable=true" valkey: image: valkey/valkey:alpine restart: unless-stopped healthcheck: test: ["CMD", "valkey-cli", "ping"] interval: 30s timeout: 5s retries: 3 volumes: - valkey_data:/data volumes: valkey_data: networks: default: name: searxng_network EOFLes blocs
deploy.resourceslimitent la consommation CPU et RAM (à adapter selon votre matériel).
Le labelwatchtower.enableest utile si vous avez Watchtower : il mettra à jour l’image SearXNG automatiquement.Premier démarrage. SearXNG génère ses fichiers de config dans config/ :
docker compose up -dValkey émet un warning au démarrage sur
vm.overcommit_memory.
Ce réglage évite des échecs de sauvegarde mémoire en arrière-plan.
À appliquer une fois :echo 'vm.overcommit_memory = 1' | sudo tee -a /etc/sysctl.conf sudo sysctl vm.overcommit_memory=1Reprendre la main sur le dossier config (Docker l’a créé en root) :
sudo chown -R $USER:$USER ~/docker/searxng/configClés API nécessaires
Deux moteurs de cette config nécessitent une clé gratuite.
Marginalia : moteur indépendant qui indexe le web non-commercial, les blogs, les sites personnels.
Résultats complémentaires aux gros index.
Clé personnelle avec rate-limit dédié, gratuite sur demande par mail.
Envoyer un mail à contact@marginalia-search.com en expliquant l’usage (instance SearXNG personnelle).
Réponse en quelques jours.Wolframalpha : moteur de calcul et de données structurées.
Pas un moteur web : il répond aux questions de maths, physique, conversions, constantes.
Pas redondant avec le reste.
La version sans API est cassée dans les versions récentes de SearXNG.
L’API officielle est gratuite jusqu’à 2000 requêtes/mois.
Créer un compte sur developer.wolframalpha.com, créer une App ID en choisissant « Full Results API ».Quels moteurs garder dans SearXNG
Le principe : limiter la dépendance directe aux gros moteurs.
Index propres en priorité, proxies fiables quand c’est le seul moyen raisonnable.Pourquoi ne pas activer tous les moteurs ?
Plus de moteurs ne signifie pas de meilleurs résultats.
Trop de moteurs rendent SearXNG plus lent, plus fragile et plus bruité.Noyau web généraliste
- Brave Search : index propre, résultats pertinents, respectueux de la vie privée. Moteur principal.
- Startpage : proxy Google et Bing. Google direct est inutilisable dans SearXNG depuis 2023 (blocage systématique). Startpage absorbe le rate-limiting côté leur infrastructure.
- Mojeek : index propre britannique, indépendant de toute big tech. Moins exhaustif, complémentaire.
- Wiby : index du web indépendant, blogs, sites sans JavaScript. Signal/bruit excellent sur les sujets techniques ou de niche.
Pourquoi pas Bing ?
Résultats bruités sur les requêtes françaises (sites hors sujet, spam SEO).
Retiré après test.IT / code
GitHub, GitLab, Codeberg, Sourcehut, StackOverflow, AskUbuntu, SuperUser, Docker Hub, PyPI, npm, MDN, Mankier, Arch Linux Wiki, Pi-hole community, discuss.python.Science
arXiv (preprints), PubMed (biomédical), Semantic Scholar, Crossref (DOI, timeout 30s nécessaire car API lente), OpenAIRE publications et datasets (open access européen).
Le plugin Open Access DOI rewrite redirige automatiquement les DOI payants vers les versions libres quand elles existent.Images
Brave Images, Mojeek Images, Openverse (Creative Commons), Wikicommons Images.Vidéos
YouTube, PeerTube, SepiaSearch.Actualités
Brave News, Mojeek News, Wikinews.Pratique
OpenStreetMap + Photon (géolocalisation), OpenMeteo + wttr.in (météo), Currency (conversions), Wolframalpha (calcul).Web indépendant
Marginalia (sites personnels, blogs, web non-commercial).
Mwmbl (moteur communautaire open source, index crawlé collaborativement via une extension Firefox).Créer un settings.yml court avec use_default_settings
use_default_settings + keep_only : SearXNG charge ses defaults internes à jour à chaque démarrage, votre fichier ne surcharge que ce qui change.
SEARXNG_VALKEY_URLdans le compose fournit l’URL réellement utilisée au démarrage.
Le blocvalkey:danssettings.ymlest redondant mais garde le fichier lisible ; la variable d’environnement a priorité.cat > ~/docker/searxng/config/settings.yml << 'EOF' use_default_settings: engines: keep_only: # Généraliste - brave - startpage - mojeek - wiby # Encyclopédique - wikipedia - wiktionary # Images - brave.images - openverse - wikicommons.images - "mojeek images" # Vidéos - youtube - brave.videos - peertube - sepiasearch # Actualités - brave.news - "mojeek news" - wikinews # IT / Linux / code - "arch linux wiki" - github - gitlab - codeberg - sourcehut - stackoverflow - askubuntu - superuser - "docker hub" - pypi - npm - mdn - mankier - pi-hole.community - discuss.python # Science / recherche - arxiv - crossref - pubmed - "semantic scholar" - openairepublications - openairedatasets # Cartes / pratique / calcul - openstreetmap - photon - openmeteo - wttr.in - currency - wolframalpha # Web indépendant - marginalia - mwmbl 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: "startpage" autocomplete_min: 4 default_lang: "fr" ban_time_on_fail: 5 max_ban_time_on_fail: 120 suspended_times: SearxEngineAccessDenied: 86400 SearxEngineCaptcha: 86400 SearxEngineTooManyRequests: 3600 cf_SearxEngineCaptcha: 1296000 cf_SearxEngineAccessDenied: 86400 recaptcha_SearxEngineCaptcha: 604800 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: false http_protocol_version: "1.0" method: "POST" default_http_headers: X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block X-Download-Options: noopen X-Robots-Tag: noindex, nofollow Referrer-Policy: no-referrer valkey: url: valkey://valkey:6379/0 ui: static_path: "" static_use_hash: false templates_path: "" query_in_title: false infinite_scroll: 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: files: social media: engines: - name: crossref timeout: 30.0 - name: marginalia api_key: "REMPLACER_PAR_CLE_MARGINALIA" - name: wolframalpha engine: wolframalpha_api api_key: "REMPLACER_PAR_CLE_WOLFRAMALPHA" disabled: false - name: brave disabled: false weight: 1.4 - name: startpage disabled: false weight: 1.2 timeout: 6.0 - name: mojeek disabled: false weight: 1.1 - name: wiby disabled: false weight: 0.5 - name: wikipedia disabled: false weight: 0.8 - name: wiktionary disabled: false weight: 0.5 - name: codeberg disabled: false - name: gitlab disabled: false - name: sourcehut disabled: false - name: discuss.python disabled: false - name: arxiv disabled: false - name: pubmed disabled: false - name: openverse disabled: false - name: youtube disabled: false - name: peertube disabled: false - name: sepiasearch disabled: false - name: wikinews disabled: false - name: openstreetmap disabled: false - name: photon disabled: false - name: openmeteo disabled: false - name: wttr.in 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: "semantic scholar" disabled: false - name: openairepublications disabled: false - name: openairedatasets disabled: false - name: currency disabled: false - name: "docker hub" disabled: false - name: "arch linux wiki" disabled: false - name: pi-hole.community disabled: false - name: "mojeek news" disabled: false - name: brave.news disabled: false - name: brave.images disabled: false - name: brave.videos disabled: false - name: "mojeek images" disabled: false - name: wikicommons.images disabled: false - name: mwmbl disabled: false EOFRemplacer les trois placeholders.
Pour la clé secrète :openssl rand -hex 32Vérifier la syntaxe YAML avant de redémarrer :
python3 -c "import yaml; yaml.safe_load(open('config/settings.yml'))" && echo "YAML OK"Corriger le limiter.toml (le fichier généré contient des options dépréciées) :
cat > ~/docker/searxng/config/limiter.toml << 'EOF' [botdetection] ipv4_prefix = 32 ipv6_prefix = 48 [botdetection.ip_limit] filter_link_local = false link_token = false EOFRedémarrer :
docker compose down && docker compose up -dTester la qualité des résultats
Vérifier les logs au démarrage :
docker compose logs 2>&1 | grep -iE "warn|error"Le seul warning résiduel attendu concerne X-Forwarded-For : non bloquant sur une instance locale sans reverse proxy.
Taper localhost:8888 dans la barre d'adresse.
Lancer quelques requêtes et consulterlocalhost:8888/statspour voir quels moteurs répondent, leurs temps de réponse et leur fiabilité.Dans Firefox : clic sur le (+) dans la barre de recherche, puis sur la roue dentée, pour définir SearXNG comme moteur par défaut.
Mettre à jour SearXNG
cd ~/docker/searxng docker compose down docker compose pull docker compose up -dRemplacer 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 searxngLe logo est écrasé à chaque mise à jour.
Script de mise à jour avec recopie automatique, à placer dans ~/docker/searxng/searxng-maj.sh :#!/usr/bin/env python3 import subprocess, 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}") exit(1) return result run('docker compose down') run('docker compose pull') run('docker compose up -d') 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 {container_id}:{dest}searxng.png') run(f'docker cp ./searxng-custom.svg {container_id}:{dest}searxng.svg') run('docker compose restart searxng') else: print("Container non trouvé.")chmod +x searxng-maj.sh ./searxng-maj.shEn amont, j'utilise Pi-hole pour les DNS et le filtrage publicités : tuto Pi-hole + Unbound
Pour aller plus loin sur les moteurs et leurs qualités : 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 ?
Non.
SearXNG est un métamoteur : il interroge plusieurs moteurs et présente leurs résultats.
Sa qualité dépend du choix des moteurs.
Startpage, inclus dans cette config, proxifie Google sans exposer votre IP.Pourquoi utiliser Docker pour SearXNG ?
Docker isole l'installation, simplifie les mises à jour et rend la configuration facile à migrer ou sauvegarder.
Pourquoi Valkey au lieu de Redis ?
Redis a changé de licence en 2024.
Valkey est le remplacement communautaire compatible, maintenu par la Linux Foundation.
SearXNG l'utilise nativement depuis début 2025.Pourquoi ne pas activer tous les moteurs ?
Plus de moteurs ne signifie pas de meilleurs résultats.
Trop de moteurs rendent SearXNG plus lent, plus fragile et plus bruité.Pourquoi pas Google en direct ?
Google bloque activement les instances SearXNG depuis 2023, y compris les instances privées locales.
Startpage est le proxy stable (Google et Bing) qui retourne des résultats sans blocage.Faut-il un nom de domaine et HTTPS ?
Non pour un usage local.
Surlocalhost, HTTP est suffisant et sécurisé par construction.
Si vous exposez l'instance sur un serveur, ajoutez un reverse-proxy (Caddy ou Nginx Proxy Manager) devant le container Docker. C'est lui qui gère le certificat, pas Docker.Comment accéder depuis plusieurs machines du réseau local ?
Remplacer
bind_address: "127.0.0.1"parbind_address: "0.0.0.0"dans settings.yml.
Accéder ensuite via l'IP locale du serveur sur le port 8888.Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
- AuteurArticles
- Vous devez être connecté pour répondre à ce sujet.