Guide de déploiement

Héberger SearXNG sur un VPS : un métamoteur privé

Déployer sur un VPS Cloud →

Tutoriel

Héberger SearXNG sur un VPS : un métamoteur privé

Self-hosting10 min de lecture8 étapes

Chaque recherche envoyée à Google laisse une trace. Chaque appel à une API de recherche commerciale alourdit la facture. SearXNG règle les deux d'un coup : un métamoteur auto-hébergé qui interroge plus de 280 moteurs en amont et vous rend des résultats fusionnés — sur votre VPS, sous votre contrôle, sans coût à la requête.

Sommaire· Le problème : les API de recherche commerciales ne sont pas la réponse1/11
  1. 01Le problème : les API de recherche commerciales ne sont pas la réponse
  2. 02Ce que SearXNG apporte dès l'installation
  3. 03Architecture : deux conteneurs, moins de 512 Mo de RAM
  4. 04Héberger SearXNG sur un VPS, pas à pas
  5. 05Configuration avancée de SearXNG
  6. 06Utiliser SearXNG comme source de recherche pour agents IA
  7. 07Sécuriser et optimiser son instance
  8. 08SearXNG vs alternatives : quel moteur auto-hébergé choisir ?
  9. 09Restreindre l'accès d'une instance publique
  10. 10Dépannage : 4 erreurs fréquentes
  11. 11SearXNG, colonne vertébrale de recherche de votre pile IA

Le problème : les API de recherche commerciales ne sont pas la réponse

Vous construisez un agent IA qui doit chercher sur le web ? Vos options se résument à ceci : payer Google 5 $ par millier de requêtes, buter sur les limites de débit de l'API de Bing, ou passer par l'API non officielle de DuckDuckGo, qui casse sans préavis. Aucune ne vous laisse le contrôle, et toutes envoient vos requêtes — et celles de vos utilisateurs — vers des serveurs tiers.

Pour les équipes de développement au Maroc et dans la région MENA s'ajoute une friction : blocages régionaux, filtrage, et des résultats issus d'un moteur centré sur les États-Unis, souvent hors sujet pour une recherche locale. Un métamoteur auto-hébergé contourne tout cela.

Ce que SearXNG apporte dès l'installation

  • Plus de 280 moteurs en amont — Google, Bing, DuckDuckGo, Brave, Wikipedia, Reddit, GitHub, arXiv, YouTube, Twitter/X et des centaines d'autres, interrogés simultanément.
  • Aucun traçage — ni cookies, ni profilage, ni historique conservé. La confidentialité tient à l'architecture : c'est le moteur qui interroge les services en amont, pas vous.
  • Une API JSON — ajoutez ?format=json à une requête et récupérez des résultats exploitables par une machine. Prise en charge nativement par Open WebUI, n8n, Flowise, LangChain et CrewAI.
  • Un cache Redis — le cache de résultats partagé allège la charge en amont, et la limitation de débit prévient les abus sur les instances publiques.
  • Licence AGPL-3.0 — plus de 33 000 étoiles sur GitHub, publications en continu, image Docker mise à jour chaque semaine.

Architecture : deux conteneurs, moins de 512 Mo de RAM

SearXNG tourne en deux conteneurs Docker : le moteur Python lui-même (moins de 256 Mo de RAM) et une instance Redis (environ 30 Mo) pour le cache et la limitation de débit. Pas de base de données, pas d'état persistant au-delà du cache Redis. Avec 1 Go de RAM, SearXNG laisse largement la place à Nginx et au système ; un VPS de 2 Go est confortable pour une équipe à plusieurs utilisateurs simultanés ou un trafic d'agents IA soutenu.

Héberger SearXNG sur un VPS, pas à pas

  1. Commandez un VPS

    Choisissez un VPS Cloud ServOrbit doté d'au moins 1 Go de RAM (Ubuntu 22.04). Le provisionnement installe Docker et Docker Compose automatiquement.

  2. Créez le fichier docker-compose.yml

    Créez un répertoire /opt/searxng et placez-y ce fichier docker-compose.yml :

    services:
      redis:
        image: redis:7-alpine
        restart: unless-stopped
        command: redis-server --save "" --appendonly no
        volumes:
          - redis-data:/data
      searxng:
        image: searxng/searxng:latest
        restart: unless-stopped
        ports:
          - "127.0.0.1:8080:8080"
        volumes:
          - ./settings:/etc/searxng:rw
        environment:
          - SEARXNG_BASE_URL=https://search.votre-domaine.com/
          - SEARXNG_SECRET_KEY=CHANGER_CE_SECRET_32_CARACTERES_MIN
        depends_on:
          - redis
        cap_drop:
          - ALL
        cap_add:
          - CHOWN
          - SETGID
          - SETUID
          - DAC_OVERRIDE
    volumes:
      redis-data:

    Générez une clé secrète solide avec openssl rand -hex 32 et replacez CHANGER_CE_SECRET_32_CARACTERES_MIN.

  3. Configurez settings.yml

    Créez le dossier ./settings et copiez le fichier de configuration par défaut :

    mkdir -p /opt/searxng/settings
    docker run --rm searxng/searxng:latest cat /etc/searxng/settings.yml \
      > /opt/searxng/settings/settings.yml

    Ouvrez settings.yml et ajustez les clés essentielles :

    general:
      instance_name: "Mon SearXNG"
      debug: false
    
    search:
      safe_search: 0
      autocomplete: ""
      formats:
        - html
        - json
    
    server:
      limiter: true
      image_proxy: false
      http_protocol_version: "1.1"
    
    redis:
      url: redis://redis:6379/0

    Le bloc redis: pointe vers le conteneur Redis par son nom de service.

  4. Configurez Nginx comme reverse proxy avec TLS

    Installez Nginx et Certbot, puis créez /etc/nginx/sites-available/searxng :

    server {
        listen 80;
        server_name search.votre-domaine.com;
        return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl;
        server_name search.votre-domaine.com;
        ssl_certificate     /etc/letsencrypt/live/search.votre-domaine.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/search.votre-domaine.com/privkey.pem;
        ssl_protocols       TLSv1.2 TLSv1.3;
        location / {
            proxy_pass         http://127.0.0.1:8080;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
    }

    Activez le site, obtenez le certificat puis démarrez : certbot --nginx -d search.votre-domaine.com && ln -s /etc/nginx/sites-available/searxng /etc/nginx/sites-enabled/ && nginx -t && systemctl reload nginx.

  5. Démarrez les conteneurs

    Depuis /opt/searxng, lancez docker compose up -d. Vérifiez que les deux conteneurs sont bien Up avec docker compose ps. Les logs du moteur sont accessibles par docker compose logs -f searxng.

  6. Activez l'API JSON et testez

    L'API JSON est déjà activée si vous avez ajouté json à la liste formats dans settings.yml. Testez depuis le VPS :

    curl -s 'https://search.votre-domaine.com/search?q=SearXNG+self+hosted&format=json' \
      | jq '.results[0] | {title, url, content}'

    Vous devez obtenir un objet JSON avec title, url et content. Si l'API renvoie une erreur 403, vérifiez que formats contient bien json et redémarrez le conteneur.

  7. Activez le limiteur de débit anti-bots

    Le limiteur intégré (basé sur Redis) bloque les clients qui envoient trop de requêtes. Il est activé via limiter: true dans settings.yml. Pour renforcer la protection côté Nginx, ajoutez dans le bloc server :

    limit_req_zone $binary_remote_addr zone=searxng:10m rate=10r/m;
    # dans le location / :
    limit_req zone=searxng burst=5 nodelay;

    Cela limite chaque IP à 10 requêtes par minute, avec une tolérance de 5 en rafale.

  8. Branchez Open WebUI ou n8n

    Dans Open WebUI : Réglages → Recherche web → Fournisseur : SearXNG → URL : https://search.votre-domaine.com. Dans n8n : nœud HTTP Request → GET sur https://search.votre-domaine.com/search?format=json, en passant votre requête dans le paramètre q. Vos agents IA disposent désormais d'une recherche web privée, à jour et sans filtrage.

Configuration avancée de SearXNG

Au-delà des réglages de base, settings.yml expose des options qui transforment SearXNG en un outil sur mesure pour votre usage.

Activer ou désactiver des moteurs : sous la clé engines:, chaque moteur dispose d'un champ disabled: true pour le désactiver. Désactivez les moteurs lents ou géo-bloqués pour accélérer les réponses. Par exemple, pour ne garder que Google, Bing, Brave et Wikipedia pour les recherches générales :

engines:
  - name: google
    disabled: false
  - name: bing
    disabled: false
  - name: brave
    disabled: false
  - name: duckduckgo
    disabled: true

Format de réponse JSON pour agents IA : les résultats JSON contiennent results[].title, results[].url, results[].content (extrait), results[].engine et results[].score. Passez &categories=general,news pour filtrer par catégorie, ou &language=fr pour cibler la langue.

SafeSearch : la clé safe_search accepte 0 (désactivé), 1 (modéré) ou 2 (strict). Pour les agents IA qui indexent du contenu professionnel, 0 donne les résultats les plus larges.

Langues et régions : ajoutez &language=ar-MA à vos requêtes pour obtenir des résultats en arabe marocain, ou &language=fr-FR pour le français. La liste complète des codes langue est disponible dans le code source de SearXNG sur GitHub (fichier searx/languages.py).

Utiliser SearXNG comme source de recherche pour agents IA

L'endpoint /search?q=...&format=json de SearXNG est le point d'entrée universel pour tous les frameworks d'agents IA. Voici comment l'intégrer dans les trois environnements les plus courants.

n8n : créez un nœud *HTTP Request* en méthode GET, URL https://search.votre-domaine.com/search, avec les paramètres q (expression de la requête), format = json et optionnellement categories = general. Le nœud suivant peut être un *Code* qui extrait $json.results.slice(0,5).map(r => r.url + ' — ' + r.content) pour alimenter votre LLM.

LangChain (Python) : la communauté LangChain inclut un outil SearxSearchWrapper depuis la version 0.1 :

from langchain_community.utilities import SearxSearchWrapper

search = SearxSearchWrapper(
    searx_host="https://search.votre-domaine.com",
    k=5
)
results = search.results("actualité IA open source", num_results=5)

Open WebUI : une fois l'URL configurée dans les réglages, chaque conversation peut activer la recherche web via l'icône dédiée. Open WebUI interroge SearXNG, injecte les extraits dans le contexte du modèle et cite automatiquement les sources. Aucune clé d'API n'est nécessaire.

Format brut via curl : pour les scripts shell ou les agents minimalistes :

curl -s "https://search.votre-domaine.com/search?q=searxng+api+json&format=json" \
  | jq '[.results[:3] | .[] | {title, url, content}]'

Le résultat est un tableau JSON directement injectables dans un prompt.

Sécuriser et optimiser son instance

Une instance SearXNG ouverte sur Internet attire rapidement les crawlers et les scrapers. Voici les quatre leviers à activer.

Rate-limit Redis : avec limiter: true dans settings.yml, Redis compte les requêtes par IP sur une fenêtre glissante. Le seuil par défaut est conservateur ; vous pouvez l'ajuster dans searxng/limiter.toml dans les versions récentes de l'image Docker.

Authentification HTTP Basic : pour une instance réservée à votre équipe ou vos agents, ajoutez dans le bloc location / de Nginx :

auth_basic "SearXNG privé";
auth_basic_user_file /etc/nginx/.htpasswd;

Générez le fichier avec htpasswd -c /etc/nginx/.htpasswd utilisateur. Les agents IA passent les credentials dans l'URL : https://user:[email protected]/search?....

Cache Redis et TTL : Redis est configuré par défaut sans persistance (--save "") pour éviter l'accumulation sur disque. Pour ajuster le TTL du cache SearXNG, modifiez la clé cache: dans settings.yml — par exemple cache: {ttl: 86400} pour garder les résultats 24 heures et réduire les appels aux moteurs en amont.

Rotation du User-Agent : SearXNG fait pivoter automatiquement les User-Agents pour éviter les bannissements par les moteurs en amont. Si un moteur commence à renvoyer des CAPTCHAs, désactivez-le temporairement avec disabled: true dans settings.yml puis réactivez-le après quelques heures.

SearXNG vs alternatives : quel moteur auto-hébergé choisir ?

Faites défiler le tableau

CritèreSearXNGSearx (original)WhoogleBrave Search API
Sources agrégées280+ moteurs100+ moteursGoogle uniquementBrave uniquement
API JSON nativeOui (`?format=json`)OuiNonOui (clé requise)
RAM minimale~300 Mo (avec Redis)~200 Mo~128 MoZéro (SaaS)
Maintenance activeOui (2026)Abandonnée (archivé)Oui (2026)Oui (SaaS)
Coût par requêteZéroZéroZéro3 $ / 1 000 req.

Restreindre l'accès d'une instance publique

Si votre instance SearXNG est joignable publiquement, ajoutez une authentification HTTP Basic dans Nginx, ou posez limiter: true dans settings.yml (Redis est requis pour le limiteur). Pour un usage réservé aux agents IA, vous pouvez désactiver entièrement l'interface HTML et n'exposer que le point d'accès JSON : retirez html de formats et restreignez l'accès direct depuis un navigateur.

Dépannage : 4 erreurs fréquentes

1. 429 Too Many Requests — bannissement par un moteur en amont : Google ou Bing a détecté un volume anormal et a temporairement banni l'IP de votre VPS. Symptôme : SearXNG renvoie des résultats de tous les moteurs sauf un, ou la réponse JSON inclut 'is_onion': false mais aucun résultat Google. Solution immédiate : désactivez le moteur concerné dans settings.yml (disabled: true) et attendez 2 à 6 heures. Long terme : activez plusieurs moteurs redondants pour qu'un bannissement ne vide pas les résultats.

2. Error: Connection refused to Redis (127.0.0.1:6379) : le conteneur SearXNG tente de joindre Redis sur 127.0.0.1 au lieu du nom de service redis. Cause : la variable SEARXNG_REDIS_URL ou la clé redis.url dans settings.yml pointe vers localhost au lieu de redis://redis:6379/0. Correction : vérifiez settings.yml — la clé doit être url: redis://redis:6379/0 (nom du service Docker Compose, pas localhost).

3. 403 Forbidden sur /search?format=json : l'API JSON est désactivée. Symptôme : l'interface HTML fonctionne mais les requêtes avec &format=json renvoient 403. Solution : ouvrez settings.yml, vérifiez que formats: contient bien json, sauvegardez, puis redémarrez le conteneur avec docker compose restart searxng.

4. Instance lente (> 5 s par requête) : trop de moteurs activés simultanément ou moteurs géo-bloqués qui arrivent en timeout. Diagnostic : consultez les logs avec docker compose logs searxng | grep 'timeout\|error'. Solution : réduisez le nombre de moteurs actifs aux 5-8 les plus pertinents pour votre usage, et augmentez le timeout global dans settings.yml (request_timeout: 3.0 en secondes).

SearXNG, colonne vertébrale de recherche de votre pile IA

SearXNG s'est imposé comme le moteur de recherche web des piles IA auto-hébergées. Open WebUI, n8n, Flowise, LangChain, CrewAI et la plupart des cadres d'orchestration de modèles disposent d'une intégration native. Le schéma est toujours le même : votre modèle estime qu'il lui faut une information à jour, appelle votre point d'accès SearXNG avec une requête, reçoit un tableau JSON de résultats — titres, URL, extraits — et s'en sert pour ancrer sa réponse.

Cela lève trois irritants d'un seul déploiement : plus de facturation à la requête, plus de fuite de données vers Google ou Bing, et plus de limite de débit atteinte à 2 h du matin pendant que votre agent enchaîne un lot de recherches.

La recherche privée, sur votre serveur

Déployez SearXNG sur un VPS ServOrbit et donnez à votre équipe et à vos agents IA un point de recherche privé — sans traçage, sans clé d'API, sans facturation à la requête.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet