<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Self-Hosted on Wojciech Marusiak IT Blog</title>
        <link>https://www.wojcieh.net/tags/self-hosted/</link>
        <description>Recent content in Self-Hosted on Wojciech Marusiak IT Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Wed, 30 Sep 2026 10:00:00 +0200</lastBuildDate><atom:link href="https://www.wojcieh.net/tags/self-hosted/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Private &amp; Self-Hosted AI Web Search: Integrating SearXNG with Open WebUI for Local RAG</title>
        <link>https://www.wojcieh.net/private-ai-web-search-searxng-open-webui/</link>
        <pubDate>Wed, 30 Sep 2026 10:00:00 +0200</pubDate>
        
        <guid>https://www.wojcieh.net/private-ai-web-search-searxng-open-webui/</guid>
        <category>SearXNG</category>
        <category>Open WebUI</category>
        <category>Docker</category>
        <category>RAG</category>
        <category>Privacy</category>
        <category>Self-Hosted</category>
        <category>AI &amp; LLM Ops</category>
        <category>Homelab &amp; Containers</category>
        <description>&lt;p&gt;&lt;img src=&#34;https://www.wojcieh.net/images/uploads/2026/09/private-ai-web-search-searxng-open-webui.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Private &amp; Self-Hosted AI Web Search with SearXNG and Open WebUI&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Enabling real-time web browsing in local AI chat interfaces transforms large language models from static knowledge bases into dynamic research assistants. However, relying on default search providers like DuckDuckGo frequently breaks when running in containerized homelabs or cloud datacenters.&lt;/p&gt;
&lt;p&gt;In this guide, I explain why datacenter search gets blocked and how to deploy a private &lt;strong&gt;SearXNG&lt;/strong&gt; instance to provide reliable, rate-limit-free search grounding for &lt;strong&gt;Open WebUI&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-problem-with-datacenter-web-search&#34;&gt;The Problem with Datacenter Web Search
&lt;/h2&gt;&lt;p&gt;When Open WebUI queries search engines via DuckDuckGo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DuckDuckGo aggressively rate-limits or outright blacklists IP ranges belonging to hosting providers, VPSs, and residential VPN endpoints (e.g., Cloudflare tunnels or VPS proxies).&lt;/li&gt;
&lt;li&gt;The user sees generic &lt;code&gt;RAG search error: 403 Forbidden&lt;/code&gt; or empty context cards.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-solution-self-hosted-searxng-meta-search-engine&#34;&gt;The Solution: Self-Hosted SearXNG Meta-Search Engine
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;SearXNG&lt;/strong&gt; is a privacy-respecting, hackable metasearch engine that aggregates results from more than 70 search services (Google, Bing, Wikipedia, DuckDuckGo, Reddit, GitHub, etc.) while obfuscating client requests.&lt;/p&gt;
&lt;h3 id=&#34;1-docker-compose-deployment&#34;&gt;1. Docker Compose Deployment
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;searxng&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;searxng/searxng:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;llm-searxng&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;SEARXNG_BASE_URL=http://llm-searxng:8080/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UWSGI_WORKERS=4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UWSGI_THREADS=4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/mnt/appdata/searxng:/etc/searxng&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;frontend&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro-Tip on Port Management:&lt;/strong&gt; Avoid exposing SearXNG directly on host ports like &lt;code&gt;8080:8080&lt;/code&gt; without checking for port collisions (&lt;code&gt;ss -tulpn | grep 8080&lt;/code&gt;). In our homelab architecture, we keep SearXNG inside the internal Docker &lt;code&gt;frontend&lt;/code&gt; bridge network, accessible only to Open WebUI!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-configuring-open-webui&#34;&gt;2. Configuring Open WebUI
&lt;/h3&gt;&lt;p&gt;In Open WebUI:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Admin Panel&lt;/strong&gt; → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Web Search&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Search Engine&lt;/strong&gt; to &lt;code&gt;searxng&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Searxng Query URL&lt;/strong&gt; to:
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://llm-searxng:8080/search?q=&amp;lt;query&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Configure RAG extraction:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAG Top K:&lt;/strong&gt; &lt;code&gt;5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAG Template:&lt;/strong&gt; Include current timestamp and domain source citations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, when you ask your model: &lt;em&gt;&amp;ldquo;What happened in tech today?&amp;rdquo;&lt;/em&gt;, Open WebUI queries SearXNG across multiple search engines in parallel, extracts the raw HTML text, and feeds it directly into your model&amp;rsquo;s context window!&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
