SearXNG où comment avoir son propre metamoteur souverain

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 : 

  • This topic is empty.
Affichage de 1 message (sur 1 au total)
  • Auteur
    Articles
  • #12536
    nam1962nam1962
    Keymaster

      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 par docker 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-plugin

      Pour Ubuntu remplacer l’URL debian par ubuntu dans la commande echo.

      Arch, EndeavourOS, Manjaro et dérivées :

      sudo pacman -S docker docker-compose

      Dans les deux cas, activer 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, 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 Docker

      Pourquoi 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/searxng

      Cré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
      EOF

      Les blocs deploy.resources limitent la consommation CPU et RAM (à adapter selon votre matériel).
      Le label watchtower.enable est 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 -d

      Valkey é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=1

      Reprendre la main sur le dossier config (Docker l’a créé en root) :

      sudo chown -R $USER:$USER ~/docker/searxng/config

      Clé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_URL dans le compose fournit l’URL réellement utilisée au démarrage.
      Le bloc valkey: dans settings.yml est 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
      EOF

      Remplacer les trois placeholders.
      Pour la clé secrète :

      openssl rand -hex 32

      Vé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
      EOF

      Redémarrer :

      docker compose down && docker compose up -d

      Tester 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 consulter localhost:8888/stats pour 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 -d

      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 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.sh

      En 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.
      Sur localhost, 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" par bind_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

    Affichage de 1 message (sur 1 au total)
    • Vous devez être connecté pour répondre à ce sujet.