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
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.
Créez le fichier docker-compose.yml
Créez un répertoire
/opt/searxnget placez-y ce fichierdocker-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 32et replacezCHANGER_CE_SECRET_32_CARACTERES_MIN.Configurez settings.yml
Créez le dossier
./settingset 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.ymlOuvrez
settings.ymlet 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/0Le bloc
redis:pointe vers le conteneur Redis par son nom de service.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.Démarrez les conteneurs
Depuis
/opt/searxng, lancezdocker compose up -d. Vérifiez que les deux conteneurs sont bienUpavecdocker compose ps. Les logs du moteur sont accessibles pardocker compose logs -f searxng.Activez l'API JSON et testez
L'API JSON est déjà activée si vous avez ajouté
jsonà la listeformatsdanssettings.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,urletcontent. Si l'API renvoie une erreur 403, vérifiez queformatscontient bienjsonet redémarrez le conteneur.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: truedanssettings.yml. Pour renforcer la protection côté Nginx, ajoutez dans le blocserver: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.
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 surhttps://search.votre-domaine.com/search?format=json, en passant votre requête dans le paramètreq. 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: trueFormat 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ère | SearXNG | Searx (original) | Whoogle | Brave Search API |
|---|---|---|---|---|
| Sources agrégées | 280+ moteurs | 100+ moteurs | Google uniquement | Brave uniquement |
| API JSON native | Oui (`?format=json`) | Oui | Non | Oui (clé requise) |
| RAM minimale | ~300 Mo (avec Redis) | ~200 Mo | ~128 Mo | Zéro (SaaS) |
| Maintenance active | Oui (2026) | Abandonnée (archivé) | Oui (2026) | Oui (SaaS) |
| Coût par requête | Zéro | Zéro | Zéro | 3 $ / 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.