[{"data":1,"prerenderedAt":213},["ShallowReactive",2],{"seo-verification":3,"blog-searxng-on-a-vps-private-metasearch-for-devs-and-ai-agents-ma-en":6,"promo-bar-likely":212},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-searxng-on-a-vps-private-metasearch-for-devs-and-ai-agents-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":138,"ctaBody":139,"ctaButton":140,"ctaUrl":141,"relatedPosts":142},198,"searxng-on-a-vps-private-metasearch-for-devs-and-ai-agents",{"fr":12,"en":10,"ar":13,"es":14},"self-host-searxng-vps","استضافة-searxng-على-vps-بحث-خاص-للمطورين-ووكلاء-الذكاء","autoalojar-searxng-en-un-vps","SearXNG on a VPS: private metasearch for devs and AI agents","Deploy SearXNG on your VPS: a private, self-hosted metasearch engine querying Google, Bing and 280+ sources, with no tracking or API keys.",10,2,false,"2026-07-31T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-searxng-vps-poster.svg",{"categorySlug":34,"appSlug":35},"development","searxng","Every web search you send to Google leaves a trace. Every API call to a commercial Search API adds to your bill. SearXNG solves both problems at once: a self-hosted metasearch engine that queries 280+ upstream engines and returns merged results — on your VPS, under your control, at zero per-query cost.",[38,42,51,54,82,85,88,91,128,132,135],{"type":39,"title":40,"body":41},"h2","The problem: why commercial search APIs are not the answer","Building an AI agent that needs to search the web? Your options are: pay Google $5 per 1,000 queries, hit Bing's API rate limits, or use DuckDuckGo's unofficial API that breaks without notice. None of these give you full control, and all of them send your queries — and your users' queries — to third-party servers.\n\nFor development teams in Morocco and the MENA region, there's an additional friction: regional blocks, censorship, and the fact that results from a US-centric engine are often irrelevant to local searches. A self-hosted metasearch engine sidesteps all of this.",{"type":43,"title":44,"items":45},"ul","What SearXNG provides out of the box",[46,47,48,49,50],"**280+ upstream engines** — Google, Bing, DuckDuckGo, Brave, Wikipedia, Reddit, GitHub, arXiv, YouTube, Twitter\u002FX and hundreds more queried simultaneously.","**Zero tracking** — no cookies, no user profiling, no search history stored. Privacy by architecture: the engine sends queries to upstream services, not you.","**JSON API** — add `?format=json` to any query and get machine-readable results. Natively supported by Open WebUI, n8n, Flowise, LangChain and CrewAI.","**Redis caching** — shared result cache reduces upstream load; rate-limiting prevents abuse on public instances.","**AGPL-3.0** — 33 k+ GitHub stars, rolling releases, Docker image updated weekly.",{"type":39,"title":52,"body":53},"Architecture: two containers, under 512 MB RAM","SearXNG runs as two Docker containers: the Python engine itself (under 256 MB RAM) and a Redis instance (~30 MB) for caching and rate-limiting. No database, no persistent state beyond the Redis cache. With 1 GB of RAM, SearXNG leaves plenty of room for Nginx and the OS — a 2 GB VPS is comfortable for teams with multiple concurrent users or heavy AI agent traffic.",{"type":55,"title":56,"steps":57},"steps","Self-hosting SearXNG on a VPS: step by step",[58,61,64,67,70,73,76,79],{"title":59,"body":60},"Order a VPS","Choose a ServOrbit Cloud VPS with at least 1 GB RAM (Ubuntu 22.04). The provisioner handles Docker and Docker Compose installation automatically.",{"title":62,"body":63},"Create the docker-compose.yml file","Create a directory `\u002Fopt\u002Fsearxng` and place this `docker-compose.yml` file in it:\n\n```yaml\nservices:\n  redis:\n    image: redis:7-alpine\n    restart: unless-stopped\n    command: redis-server --save \"\" --appendonly no\n    volumes:\n      - redis-data:\u002Fdata\n  searxng:\n    image: searxng\u002Fsearxng:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    volumes:\n      - .\u002Fsettings:\u002Fetc\u002Fsearxng:rw\n    environment:\n      - SEARXNG_BASE_URL=https:\u002F\u002Fsearch.yourdomain.com\u002F\n      - SEARXNG_SECRET_KEY=CHANGE_THIS_32_CHAR_SECRET_MIN\n    depends_on:\n      - redis\n    cap_drop:\n      - ALL\n    cap_add:\n      - CHOWN\n      - SETGID\n      - SETUID\n      - DAC_OVERRIDE\nvolumes:\n  redis-data:\n```\n\nGenerate a strong secret key with `openssl rand -hex 32` and replace `CHANGE_THIS_32_CHAR_SECRET_MIN`.",{"title":65,"body":66},"Configure settings.yml","Create the `.\u002Fsettings` directory and copy the default configuration file:\n\n```bash\nmkdir -p \u002Fopt\u002Fsearxng\u002Fsettings\ndocker run --rm searxng\u002Fsearxng:latest cat \u002Fetc\u002Fsearxng\u002Fsettings.yml \\\n  > \u002Fopt\u002Fsearxng\u002Fsettings\u002Fsettings.yml\n```\n\nOpen `settings.yml` and adjust the key settings:\n\n```yaml\ngeneral:\n  instance_name: \"My SearXNG\"\n  debug: false\n\nsearch:\n  safe_search: 0\n  autocomplete: \"\"\n  formats:\n    - html\n    - json\n\nserver:\n  limiter: true\n  image_proxy: false\n  http_protocol_version: \"1.1\"\n\nredis:\n  url: redis:\u002F\u002Fredis:6379\u002F0\n```\n\nThe `redis:` block points to the Redis container by its service name.",{"title":68,"body":69},"Configure Nginx as a reverse proxy with TLS","Install Nginx and Certbot, then create `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fsearxng`:\n\n```nginx\nserver {\n    listen 80;\n    server_name search.yourdomain.com;\n    return 301 https:\u002F\u002F$host$request_uri;\n}\nserver {\n    listen 443 ssl;\n    server_name search.yourdomain.com;\n    ssl_certificate     \u002Fetc\u002Fletsencrypt\u002Flive\u002Fsearch.yourdomain.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fsearch.yourdomain.com\u002Fprivkey.pem;\n    ssl_protocols       TLSv1.2 TLSv1.3;\n    location \u002F {\n        proxy_pass         http:\u002F\u002F127.0.0.1:8080;\n        proxy_set_header   Host $host;\n        proxy_set_header   X-Real-IP $remote_addr;\n        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header   X-Forwarded-Proto $scheme;\n    }\n}\n```\n\nEnable the site and get the certificate: `certbot --nginx -d search.yourdomain.com && ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fsearxng \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F && nginx -t && systemctl reload nginx`.",{"title":71,"body":72},"Start the containers","From `\u002Fopt\u002Fsearxng`, run `docker compose up -d`. Check that both containers are `Up` with `docker compose ps`. View engine logs with `docker compose logs -f searxng`.",{"title":74,"body":75},"Enable JSON API and test","The JSON API is already enabled if you added `json` to the `formats` list in `settings.yml`. Test from the VPS:\n\n```bash\ncurl -s 'https:\u002F\u002Fsearch.yourdomain.com\u002Fsearch?q=SearXNG+self+hosted&format=json' \\\n  | jq '.results[0] | {title, url, content}'\n```\n\nYou should get a JSON object with `title`, `url` and `content`. If the API returns 403, verify that `formats` contains `json` and restart the container.",{"title":77,"body":78},"Enable the bot rate limiter","The built-in limiter (Redis-backed) blocks clients sending too many requests. Enable it via `limiter: true` in `settings.yml`. To reinforce protection at the Nginx level, add inside the `server` block:\n\n```nginx\nlimit_req_zone $binary_remote_addr zone=searxng:10m rate=10r\u002Fm;\n# inside location \u002F :\nlimit_req zone=searxng burst=5 nodelay;\n```\n\nThis limits each IP to 10 requests per minute with a burst tolerance of 5.",{"title":80,"body":81},"Connect Open WebUI or n8n","In **Open WebUI**: Settings → Web Search → Provider: SearXNG → URL: `https:\u002F\u002Fsearch.yourdomain.com`. In **n8n**: HTTP Request node → GET `https:\u002F\u002Fsearch.yourdomain.com\u002Fsearch?format=json`, passing your query in the `q` parameter. Your AI agents now have live, unfiltered, private web search.",{"type":39,"title":83,"body":84},"Advanced SearXNG configuration","Beyond the basic settings, `settings.yml` exposes options that turn SearXNG into a tool tailored for your use case.\n\n**Enable or disable engines**: under the `engines:` key, each engine has a `disabled: true` field to turn it off. Disable slow or geo-blocked engines to speed up responses. For example, to keep only Google, Bing, Brave and Wikipedia for general searches:\n\n```yaml\nengines:\n  - name: google\n    disabled: false\n  - name: bing\n    disabled: false\n  - name: brave\n    disabled: false\n  - name: duckduckgo\n    disabled: true\n```\n\n**JSON response format for AI agents**: JSON results contain `results[].title`, `results[].url`, `results[].content` (snippet), `results[].engine` and `results[].score`. Pass `&categories=general,news` to filter by category, or `&language=en` to target a language.\n\n**SafeSearch**: the `safe_search` key accepts `0` (off), `1` (moderate) or `2` (strict). For AI agents indexing professional content, `0` returns the broadest results.\n\n**Languages and regions**: add `&language=ar-MA` to get Moroccan Arabic results, or `&language=fr-FR` for French. The full list of language codes is available in the SearXNG GitHub source (file `searx\u002Flanguages.py`).",{"type":39,"title":86,"body":87},"Using SearXNG as a search source for AI agents","The `\u002Fsearch?q=...&format=json` endpoint is the universal entry point for all AI agent frameworks. Here is how to integrate it in the three most common environments.\n\n**n8n**: create an *HTTP Request* node with method GET, URL `https:\u002F\u002Fsearch.yourdomain.com\u002Fsearch`, with parameters `q` (query expression), `format` = `json` and optionally `categories` = `general`. A following *Code* node can extract `$json.results.slice(0,5).map(r => r.url + ' — ' + r.content)` to feed your LLM.\n\n**LangChain (Python)**: the LangChain community package includes a `SearxSearchWrapper` tool since version 0.1:\n\n```python\nfrom langchain_community.utilities import SearxSearchWrapper\n\nsearch = SearxSearchWrapper(\n    searx_host=\"https:\u002F\u002Fsearch.yourdomain.com\",\n    k=5\n)\nresults = search.results(\"open source AI news\", num_results=5)\n```\n\n**Open WebUI**: once the URL is configured in Settings, each conversation can activate web search via the dedicated icon. Open WebUI queries SearXNG, injects snippets into the model context and automatically cites sources. No API key required.\n\n**Raw curl for shell scripts or minimal agents**:\n\n```bash\ncurl -s \"https:\u002F\u002Fsearch.yourdomain.com\u002Fsearch?q=searxng+api+json&format=json\" \\\n  | jq '[.results[:3] | .[] | {title, url, content}]'\n```\n\nThe result is a JSON array directly injectable into a prompt.",{"type":39,"title":89,"body":90},"Securing and optimising your instance","An open SearXNG instance quickly attracts crawlers and scrapers. Here are the four levers to activate.\n\n**Redis rate limit**: with `limiter: true` in `settings.yml`, Redis counts requests per IP over a sliding window. The default threshold is conservative; you can tune it in `searxng\u002Flimiter.toml` in recent versions of the Docker image.\n\n**HTTP Basic Auth**: for an instance reserved for your team or AI agents, add inside the Nginx `location \u002F` block:\n\n```nginx\nauth_basic \"Private SearXNG\";\nauth_basic_user_file \u002Fetc\u002Fnginx\u002F.htpasswd;\n```\n\nGenerate the file with `htpasswd -c \u002Fetc\u002Fnginx\u002F.htpasswd user`. AI agents pass credentials in the URL: `https:\u002F\u002Fuser:pass@search.yourdomain.com\u002Fsearch?...`.\n\n**Redis cache and TTL**: Redis is configured by default without persistence (`--save \"\"`) to avoid disk accumulation. To adjust the SearXNG cache TTL, modify the `cache:` key in `settings.yml` — for example `cache: {ttl: 86400}` to keep results for 24 hours and reduce calls to upstream engines.\n\n**User-Agent rotation**: SearXNG automatically rotates User-Agents to avoid bans by upstream engines. If an engine starts returning CAPTCHAs, temporarily disable it with `disabled: true` in `settings.yml` and re-enable it after a few hours.",{"type":92,"title":93,"headers":94,"rows":100},"comparison","SearXNG vs alternatives: which self-hosted search engine to choose?",[95,96,97,98,99],"Criterion","SearXNG","Searx (original)","Whoogle","Brave Search API",[101,107,113,119,124],[102,103,104,105,106],"Aggregated sources","280+ engines","100+ engines","Google only","Brave only",[108,109,110,111,112],"Native JSON API","Yes (`?format=json`)","Yes","No","Yes (key required)",[114,115,116,117,118],"Minimum RAM","~300 MB (with Redis)","~200 MB","~128 MB","Zero (SaaS)",[120,121,122,121,123],"Active maintenance","Yes (2026)","Abandoned (archived)","Yes (SaaS)",[125,126,126,126,127],"Cost per query","Zero","$3 \u002F 1,000 queries",{"type":129,"title":130,"body":131},"tip","Restrict access on public instances","If your SearXNG instance is publicly reachable, add HTTP Basic Auth in Nginx or set `limiter: true` in `settings.yml` (Redis is required for the limiter). For AI-agent-only use, you can disable the HTML interface entirely and only expose the JSON endpoint — edit `formats` to remove `html` and restrict direct browser access.",{"type":39,"title":133,"body":134},"Troubleshooting: 4 common errors","**1. `429 Too Many Requests` — upstream engine ban**: Google or Bing has detected abnormal volume and temporarily banned your VPS IP. Symptom: SearXNG returns results from all engines except one, or the JSON response includes `'is_onion': false` but no Google results. Immediate fix: disable the affected engine in `settings.yml` (`disabled: true`) and wait 2–6 hours. Long term: enable multiple redundant engines so a single ban doesn't empty results.\n\n**2. `Error: Connection refused to Redis (127.0.0.1:6379)`**: the SearXNG container is trying to reach Redis on `127.0.0.1` instead of the service name `redis`. Cause: the `SEARXNG_REDIS_URL` variable or the `redis.url` key in `settings.yml` points to `localhost` instead of `redis:\u002F\u002Fredis:6379\u002F0`. Fix: check `settings.yml` — the key must be `url: redis:\u002F\u002Fredis:6379\u002F0` (Docker Compose service name, not `localhost`).\n\n**3. `403 Forbidden` on `\u002Fsearch?format=json`**: the JSON API is disabled. Symptom: the HTML interface works but requests with `&format=json` return 403. Fix: open `settings.yml`, verify that `formats:` contains `json`, save, then restart the container with `docker compose restart searxng`.\n\n**4. Slow instance (> 5 s per query)**: too many engines enabled simultaneously or geo-blocked engines timing out. Diagnosis: check logs with `docker compose logs searxng | grep 'timeout\\|error'`. Fix: reduce active engines to the 5–8 most relevant for your use case, and increase the global timeout in `settings.yml` (`request_timeout: 3.0` in seconds).",{"type":39,"title":136,"body":137},"SearXNG as the search backbone for your AI stack","SearXNG has become the de facto web search backend for self-hosted AI stacks in 2026. Open WebUI, n8n, Flowise, LangChain, CrewAI and most LLM orchestration frameworks have native SearXNG integration. The pattern is always the same: your LLM decides it needs current information, calls your SearXNG endpoint with a query, gets back a JSON array of results with titles, URLs and snippets, and uses those to ground its response.\n\nThis eliminates three pain points in one deployment: no per-query billing, no data leakage to Google or Bing, and no rate limit surprises at 2 AM when your agent is running a research batch.","Private search, on your own server","Deploy SearXNG on a ServOrbit VPS and give your team and AI agents a private, uncensored search endpoint — no tracking, no API keys, no per-query billing.","Deploy SearXNG","\u002Fapplications\u002Fdevelopment\u002Fsearxng",[143,166,188],{"id":144,"slug":145,"slugs":146,"title":150,"excerpt":151,"readTime":152,"views":144,"isPinned":19,"noindex":19,"publishedAt":153,"updatedAt":154,"category":155,"categories":160,"featuredImage":30,"bgImage":31,"posterImage":162,"relatedSolution":163},1,"how-to-host-open-webui-on-a-vps",{"fr":147,"en":145,"ar":148,"es":149},"heberger-open-webui","كيفية-استضافة-open-webui-على-خادم-vps","como-alojar-open-webui-en-un-vps","How to Host Open WebUI on a VPS","A complete guide to deploying Open WebUI on your own VPS. Keep control of your data, avoid cloud API costs, and access your LLMs from a clean web interface.",9,"2026-06-01T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":144,"name":156,"slug":157,"color":158,"icon":159},"Artificial Intelligence","intelligence-artificielle","bg-purple-500\u002F10 text-purple-400","ia",[161],{"id":144,"name":156,"slug":157,"color":158,"icon":159},"\u002Fblog\u002Fcovers\u002Fheberger-open-webui-poster.svg",{"categorySlug":164,"appSlug":165},"artificial-intelligence","open-webui",{"id":167,"slug":168,"slugs":169,"title":173,"excerpt":174,"readTime":175,"views":176,"isPinned":19,"noindex":19,"publishedAt":177,"updatedAt":154,"category":178,"categories":182,"featuredImage":30,"bgImage":31,"posterImage":184,"relatedSolution":185},3,"install-n8n-on-vps-with-docker-complete-2026-guide",{"fr":170,"en":168,"ar":171,"es":172},"installer-n8n-vps","تثبيت-n8n-على-vps-مع-docker-دليل-شامل-2026","instalar-n8n-en-vps-con-docker","Install n8n on VPS with Docker: complete 2026 guide","Deploy n8n on VPS with Docker, reverse proxy and HTTPS. Covers V8 crash, 502 nginx, npm migration and execution security (GHSA-vrv8-j27g-g7cr advisory, August 2026).",19,4,"2026-06-05T00:00:00+00:00",{"id":18,"name":179,"slug":180,"color":181,"icon":180},"Automation","automatisation","bg-brand-action\u002F10 text-brand-action",[183],{"id":18,"name":179,"slug":180,"color":181,"icon":180},"\u002Fblog\u002Fcovers\u002Finstaller-n8n-vps-poster.svg",{"categorySlug":186,"appSlug":187},"automation-workflows","n8n",{"id":189,"slug":190,"slugs":191,"title":195,"excerpt":196,"readTime":197,"views":167,"isPinned":19,"noindex":19,"publishedAt":198,"updatedAt":199,"category":200,"categories":206,"featuredImage":30,"bgImage":31,"posterImage":208,"relatedSolution":209},67,"hosting-meilisearch-on-a-vps",{"fr":192,"en":190,"ar":193,"es":194},"heberger-meilisearch-vps","استضافة-meilisearch-على-خادم-vps","alojar-meilisearch-en-un-vps","Hosting Meilisearch on a VPS","Host Meilisearch on your VPS: an instant, fault-tolerant and typo-tolerant search engine. A Docker, master key and SSL guide.",5,"2026-04-14T00:00:00+00:00","2026-09-08T22:00:01+00:00",{"id":201,"name":202,"slug":203,"color":204,"icon":205},6,"Databases","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[207],{"id":201,"name":202,"slug":203,"color":204,"icon":205},"\u002Fblog\u002Fcovers\u002Fheberger-meilisearch-vps-poster.svg",{"categorySlug":210,"appSlug":211},"databases","meilisearch",true,1794270480183]