SearXNG-ஐ உங்கள் சொந்த VPS-ல் private search ஆக இயக்குவது
Docker Compose மூலம் SearXNG-ஐ VPS-ல் இயக்குங்கள்: settings.yml, limiter, nginx TLS மற்றும் key இல்லாமல் scripts அழைக்கும் JSON search API ஆகியவற்றை அமைக்கலாம்.
நீங்கள் உருவாக்குவது
SearXNG-ஐ நீங்களே hosting செய்வதன் மூலம், உங்கள் சொந்த server-ல் இயங்கும் தனிப்பட்ட search engine கிடைக்கும். SearXNG ஒரு metasearch engine ஆகும். இது உங்கள் query-ஐப் பெற்று, Google, Bing, DuckDuckGo மற்றும் Wikipedia போன்ற பிற engines-க்கு அனுப்புகிறது. பின்னர் கிடைக்கும் முடிவுகளை ஒரே result page-ல் இணைக்கிறது. எந்த profile-மும் உருவாக்கப்படாது. எந்த tracking cookie-யும் அமைக்கப்படாது. ஏனெனில் உங்கள் query-ஐ சேமிக்கும் ஒரே machine உங்களுடையது.
இந்த stack சிறியது. இரண்டு containers, ஒரு settings file, ஒரு reverse proxy ஆகியவை மட்டுமே தேவை. இந்த instance தனிப்பட்டதா அல்லது public-ஆக உள்ளதா என்பதே முக்கியமான முடிவு. தனிப்பட்டது என்றால், நீங்களும் உங்கள் சொந்த scripts-ம் மட்டுமே அதை அணுகும். public என்றால், internet-ல் உள்ள யாரும் அதில் query செய்ய முடியும். இந்தத் தேர்வு security settings-ஐ மாற்றும். ஆகவே எதையும் type செய்வதற்கு முன் இதை முடிவு செய்யுங்கள். இயல்புநிலைத் தேர்வு private.
இதை இயக்குவதற்கு இன்னொரு காரணமும் உள்ளது. SearXNG instance JSON-ஐப் பயன்படுத்துகிறது. எனவே நீங்கள் எழுதும் எந்த script அல்லது AI agent-க்கும், நீங்களே கட்டுப்படுத்தும் search API கிடைக்கும். key தேவையில்லை. ஒவ்வொரு query-க்கும் கட்டணம் இல்லை. quota தொடர்பான mail-களும் இல்லை.
Docker Compose மூலம் SearXNG-ஐ நிறுவுதல்
இந்த project ஒரு container image மற்றும் Compose file-ஐ வெளியிடுகிறது. Docker Engine மற்றும் Compose plugin ஏற்கனவே நிறுவப்பட்டுள்ள புதிய Ubuntu 24.04 server-க்கு இரண்டையும் பதிவிறக்கவும். Docker உங்களுக்கு புதிதாக இருந்தால், முதலில் VPS-ல் Docker Compose அடிப்படைகள் என்பதைப் படித்து, பின்னர் இங்கு திரும்பவும்.
sudo install -d -o "$USER" -g "$USER" -m 750 /opt/searxng
cd /opt/searxng
mkdir -p core-config
curl -fsSL \
-O https://raw.githubusercontent.com/searxng/searxng/master/container/docker-compose.yml \
-O https://raw.githubusercontent.com/searxng/searxng/master/container/.env.example
cp -i .env.example .envCompose file இரண்டு services-ஐ வரையறுக்கிறது. core என்பது SearXNG சேவை, valkey என்பது rate limiting மற்றும் குறுகியகால state-க்கு பயன்படுத்தப்படும் memory-இல் உள்ள data store. இது ./core-config/-ஐ container-க்குள் /etc/searxng/-ல் mount செய்கிறது. எனவே நீங்கள் கட்டமைக்கும் அனைத்தும் host-ல் உள்ள அந்த ஒரே directory-யில் இருக்கும்.
இப்போது .env-ஐத் திருத்தவும். வழங்கப்பட்ட example-ல் ஒவ்வொரு வரியும் comment செய்யப்பட்டிருக்கும். அதனால் container ஒவ்வொரு address-லுமே port 8080-ல் தொடங்குகிறது. இந்த மூன்று அமைப்புகளின் comment-ஐ நீக்கி, மதிப்புகளை அமைக்கவும்.
SEARXNG_VERSION=latest
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080SEARXNG_HOST=127.0.0.1 முக்கியமான அமைப்பாகும். இது published port-ஐ [::]:8080:8080-க்கு பதிலாக 127.0.0.1:8080:8080 ஆக மாற்றுகிறது. இதனால் container loopback address-ல் மட்டுமே பதிலளிக்கும்; internet-ல் இருந்து அதை நேரடியாக அணுக முடியாது. இதைத் தவிர்த்தால், container தொடங்கும் உடனேயே அது வெளிப்படும். காரணம், published Docker port, உங்கள் firewall rules-க்கு முன்னதாகச் சேர்க்கப்படுகிறது. இந்தச் சிக்கலை முழுமையாகப் படிக்கவும்: published Docker ports, ufw-ஐத் தவிர்த்து இயங்கும்.
நீங்கள் கற்றுக்கொள்ளும் போது SEARXNG_VERSION=latest போதுமானது. முக்கியமான server-ல் tag-ஐ குறிப்பிட்ட மதிப்பில் நிலைநிறுத்தவும். July 2026 நிலவரப்படி, release tags தேதி அடிப்படையிலானவை; அவை 2026.3.25-541c6c3cb போல இருக்கும். எனவே registry-யில் மாற்றம் ஏற்பட்டவுடன் அல்ல, நீங்கள் முடிவு செய்யும் போது deployment upgrade ஆகும்.
settings.yml: முக்கியமான பகுதிகள்
முதல் start-க்கு முன் core-config/settings.yml-ஐ உருவாக்கவும். use_default_settings: true, SearXNG-ன் சொந்த shipped defaults-ஐ ஏற்றி, நீங்கள் எழுதிய keys-ஐ மட்டும் அதன் மேல் பயன்படுத்தச் செய்கிறது. இதனால் உங்கள் file சுருக்கமாக இருக்கும். புதிய options சேர்க்கப்படும் upgrades-க்குப் பிறகும் அது செயல்படும்.
முதலில் secret-ஐ உருவாக்கவும். அதன் value நேரடியாக file-க்குள் செல்லும்.
openssl rand -hex 32use_default_settings: true
general:
instance_name: "search.example.com"
server:
base_url: "https://search.example.com/"
secret_key: "paste-the-openssl-output-here"
limiter: false
public_instance: false
image_proxy: true
valkey:
url: valkey://valkey:6379/0
search:
safe_search: 0
autocomplete: "duckduckgo"
formats:
- html
- jsonsecret_key, session மற்றும் token data-ஐ sign செய்கிறது. Shipped default என்பது ultrasecretkey என்ற literal string ஆகும். அந்த default-ஐ அறிந்த எவரும் அந்த tokens-ஐ forge செய்ய முடியும். அதை ஒருமுறை replace செய்து, பின்னர் மாற்றாமல் விடவும். பின்னர் மாற்றினால் சேமிக்கப்பட்ட அனைத்து preferences-மும் நீக்கப்படும்.
base_url என்பது trailing slash உடைய public HTTPS address ஆக இருக்க வேண்டும். SearXNG உருவாக்கும் links-க்குள் எழுதப்படும் address இதுவாகும். அதை localhost-ஐ நோக்கி வைத்தால், remote browser-ல் "next page" link, வாசகரின் சொந்த machine-ஐ நோக்கி point செய்து fail ஆகும்.
formats, web endpoint உருவாக்கும் output types-ஐ தீர்மானிக்கிறது. json default list-ல் இல்லை. எனவே அதை add செய்யும் வரை JSON request 403-ஐ return செய்யும். image_proxy: true, result thumbnails-ஐ உங்கள் server வழியாக route செய்கிறது. இதனால் அந்த images-ஐ host செய்யும் sites-க்கு உங்கள் visitors-ன் addresses தெரியாது.
valkey.url, valkey என்ற hostname-ஐ பயன்படுத்துகிறது. Compose file-ல் service name இதுவாக இருப்பதால் இது சரியாகும். Compose, இரண்டு containers-ஐ ஒரே network-ல் வைக்கிறது; அங்கு service names resolve ஆகும். அதை localhost-ஐ நோக்கி point செய்தால் limiter fail ஆகும். ஏனெனில் core container-க்குள் localhost என்பது அந்த container-ஐ குறிக்கும்.
Secret ஒரு plain file-ல் இருப்பதால், file-ஐ மட்டும் அல்லாமல் அதைச் சுற்றியுள்ள directory-யையும் protect செய்யவும். chmod 750 /opt/searxng, பிற host users அதற்குள் நுழைவதைத் தடுக்கிறது. core-config/settings.yml-ஐ mode 600 ஆகக் குறைக்க வேண்டாம். Container, தனிப்பட்ட unprivileged user ஆக இயங்குகிறது. அதனால் படிக்க முடியாத file இருந்தால் SearXNG முழுமையாக start ஆகாது.
Stack-ஐ start செய்து சரிபார்க்கவும்.
cd /opt/searxng
docker compose up -d
docker compose ps
curl -I http://127.0.0.1:8080/docker compose ps, இரண்டு containers-மும் running state-ல் இருப்பதைக் காட்ட வேண்டும். curl, HTTP/1.1 200 OK-க்கு பதிலளிக்க வேண்டும். எந்தப் பதிலும் இல்லையெனில் docker compose logs core-ஐப் பார்க்கவும். settings.yml-ல் உள்ள YAML பிழை, line-ஐக் குறிப்பிடும் parse error ஆக அங்கு தோன்றும்.
TLS உடன் nginx-ன் பின்னால் அமைக்கவும்
Container loopback-ல் மட்டும் listen செய்கிறது. எனவே, அதை அணுகக்கூடியதாக மாற்றுவது nginx ஆகும். Transport Layer Security (TLS)-ஐ சேர்ப்பதும் nginx-ன் பணியாகும். /etc/nginx/sites-available/searxng-ஐ எழுதவும்.
server {
listen 80;
server_name search.example.com;
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;
}
}sudo ln -s /etc/nginx/sites-available/searxng /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d search.example.comReload செய்வதற்கு முன், nginx -t ஆனது syntax is ok மற்றும் test is successful-ஐ print செய்கிறது. Certbot அதே file-ஐ மாற்றி, certificate உடன் port 443-ல் listen செய்யுமாறு அமைக்கிறது. மேலும் port 80-லிருந்து redirect-ஐ சேர்க்கிறது. search.example.com-க்கான DNS record ஏற்கனவே இந்த server-ஐச் சுட்டிக்காட்ட வேண்டும். ஏனெனில், HTTP வழியாக file-ஐ fetch செய்வதன் மூலம் certificate authority ownership-ஐச் சரிபார்க்கிறது. Renewal உட்பட முழுமையான வழிமுறை Ubuntu 24.04-க்கான Certbot மற்றும் nginx வழிகாட்டியில் உள்ளது.
இந்த இரண்டு forwarding headers வெறும் அலங்காரம் அல்ல. X-Forwarded-For மற்றும் X-Real-IP இல்லாமல், SearXNG-க்கு வரும் ஒவ்வொரு request-உம் proxy address-ஐக் கொண்டிருக்கும். எனவே rate limiter, அனைத்து traffic-ஐயும் ஒரே client அனுப்புவதாகக் கருதும். Visitors-ஐத் தனித்தனியாக அடையாளம் காண முடியாது.
scripts மற்றும் agents ஏன் JSON search API-ஐப் பயன்படுத்துகின்றன
json உடன் formats அமைக்கப்பட்டால், பக்கத்தை வழங்கும் அதே endpoint structured data-ஐத் திருப்பி வழங்கும்.
curl -s 'http://127.0.0.1:8080/search?q=wireguard+mtu&format=json' \
| jq -r '.results[0:5][] | .url'url, title, content மற்றும் அதை வழங்கிய engine ஆகியவற்றைக் கொண்ட results array-உடன் ஒரு object கிடைக்கும். அதனுடன் answers, infoboxes மற்றும் suggestions ஆகியவையும் இருக்கும். இது summariser, link checker அல்லது research loop-க்கு தரவை வழங்குவதற்குப் போதுமானது.
Agent சார்ந்த எந்தப் பயன்பாட்டிற்கும் இது முக்கியம். Language model-க்கு training cutoff இருப்பதால், நிகழ்காலத்தைப் பற்றிய கேள்விகளுக்குப் பதிலளிக்க live search தேவைப்படுகிறது. Commercial search APIs ஒவ்வொரு query-க்கும் கட்டணம் வசூலிப்பதுடன், rate limit-ஐக் கடுமையாகப் பயன்படுத்துகின்றன. நீங்கள் ஏற்கனவே கட்டணம் செலுத்தும் server-ல் ஒரு container இயங்குவது குறைந்த செலவாகும். Queries அந்த server-ஐ விட்டு வெளியேறாது. Model-க்கு tools-ஐ இணைக்கும்போது, இதே காரணத்தால் VPS-ல் MCP servers-ஐ இயக்குதல் பயன்படுத்தப்படுகிறது. Search tool பொதுவாக மக்கள் முதலில் சேர்ப்பதாக இருக்கும்.
API-ஐப் பயன்படுத்துவதற்கு இரண்டு விதிகள் உள்ளன. Instance-ஐ private-ஆக வைத்திருங்கள். API பக்கத்தை loopback address அல்லது private network-க்கு bind செய்து, உங்கள் சொந்த hosts மட்டுமே அதை அணுக அனுமதிக்கவும். அதன் பிறகு, குறைந்த வேகத்தில் query செய்யுங்கள். SearXNG உங்கள் request-ஐ உண்மையான search engines-க்கு forward செய்கிறது. ஆகவே, ஒரு script ஒரு வினாடிக்கு நூறு queries அனுப்பினால், உங்கள் server-ஐ Google block செய்யும் நிலையை உருவாக்குகிறது.
limiter, மற்றும் public instance-க்கான மாற்றங்கள்
limiter என்பது SearXNG-ன் bot பாதுகாப்பு அமைப்பு. இது request headers, addresses மற்றும் request rates ஆகியவற்றைக் கண்காணிக்கிறது. Automated traffic போலத் தோன்றும் network traffic-ஐ இது கைவிடுகிறது. அந்த நிலையைச் சேமிக்க Valkey தேவைப்படுகிறது. அதனால்தான் Compose file அதையும் சேர்த்து வெளியிடுகிறது.
Private instance-ல் limiter: false-ஐ வைத்திருக்கவும். உங்கள் சொந்த scripts வரையறையின்படி automated traffic ஆகும். எனவே, instance-ஐ உருவாக்கியதற்கான JSON calls-ஐ limiter தடுக்கக்கூடும். அதற்குப் பதிலாக access control-ஐ reverse proxy கவனிக்க வேண்டும். nginx location-ல் உள்ள allow மற்றும் deny இணை, HTTP basic authentication, அல்லது உங்கள் பிற servers-ஐ மட்டும் அனுமதிக்கும் firewall ஆகியவற்றைப் பயன்படுத்தலாம்.
மற்றவர்களுக்காக instance-ஐ வெளியிடப் போனால், இரண்டு switches-ஐயும் இயக்கவும்.
server:
limiter: true
public_instance: trueமேலும் துல்லியமான கட்டுப்பாடு core-config/limiter.toml-ல் உள்ளது. Container இதை /etc/searxng/limiter.toml-ல் படிக்கிறது. மாற்ற வேண்டிய keys-ஐ மட்டும் எழுதவும். Proxy-க்குப் பின்னால் instance இருந்தால், proxy-ஐ அறிவிக்க வேண்டும். இல்லையெனில், limiter உங்கள் nginx address-ஐ abusive client-ன் address ஆகக் கருதும்.
[botdetection]
trusted_proxies = [
'127.0.0.0/8',
'::1',
]
[botdetection.ip_limit]
link_token = truelink_token = true, உண்மையான browser session மட்டும் பெறக்கூடிய token-ஐ SearXNG உருவாக்குமாறு செய்கிறது. இதனால் பெரும்பாலான எளிய scrapers தடுக்கப்படுகின்றன. Public instance வெளியிடப்பட்ட சில நாட்களுக்குள் அவற்றின் traffic வரத் தொடங்கும் என்று எதிர்பார்க்கவும். Engine errors-ஐயும் எதிர்பார்க்கவும். நீங்கள் அதிக network traffic-ஐ forward செய்தால், upstream engines உங்கள் server address-க்கு CAPTCHAs-ஐ அனுப்பத் தொடங்கும். Public SearXNG instance-ஐ தொடர்ந்து நிர்வகிக்க வேண்டும். Private instance-க்கு இது தேவையில்லை. அதனால்தான் 2026-ல் self-hosting செய்யத் தகுந்தவற்றின் குறுகிய பட்டியல்களில் இது பெரும்பாலும் இடம்பெறுகிறது: 2026-ல் self-hosting செய்யத் தகுந்தவை.
தேடல்கள் ஏன் எந்த முடிவையும் வழங்கவில்லை
உங்கள் instance-இல் /stats-ஐத் திறக்கவும். இது ஒவ்வொரு engine-இன் error rate மற்றும் response time-ஐப் பட்டியலிடுகிறது. Results குறைவாகத் தோன்றும்போது முதலில் பார்க்க வேண்டிய இடம் இதுவாகும்.
"Access denied" அல்லது "CAPTCHA" errors உடன் காட்டப்படும் engine உங்கள் server address-ஐத் தடுத்துள்ளது. Data centre ranges-இல் உள்ள addresses-க்கு இது பொதுவானது. ஏனெனில் அவை scrapers-க்கு சொந்தமானவை என்று search engines கருதுகின்றன. அதன் பிறகு, தோல்வியடைந்த engine-ஐ மீண்டும் முயற்சிப்பதற்குப் பதிலாக SearXNG குறிப்பிட்ட காலத்துக்கு அதை suspend செய்கிறது. இதனால் தடுக்கப்பட்ட ஒரு engine உங்கள் results-இலிருந்து அமைதியாக விலகுகிறது. அதை settings.yml-இல் disable செய்யவும் அல்லது அந்த இழப்பை ஏற்கவும். மீதமுள்ள engines தொடர்ந்து பதிலளிக்கும்.
எல்லா engines-உம் ஒரே நேரத்தில் தோல்வியடைந்தால், container-இல் செயல்படும் outbound name resolution இல்லை அல்லது internet-க்கு route இல்லை. இதை container-க்குள் இருந்து test செய்யவும்.
docker compose exec core wget -qO- https://duckduckgo.com > /dev/null && echo okFAQ
SearXNG எனது தேடல்களை அநாமதேயமாக்குமா?
அது கேள்விகளை அனுப்பும் engines-இலிருந்து உங்கள் அடையாளத்தை மறைக்கிறது. ஏனெனில், அவை உங்கள் browser-க்குப் பதிலாக உங்கள் server அந்த request-ஐ அனுப்புவதாகக் காண்கின்றன. ஆனால் அது query-யை உங்கள் server-இலிருந்து மறைக்காது. உங்கள் server-ஐ அந்த engines-இலிருந்தும் மறைக்காது. ஒரே user பயன்படுத்தும் instance-இல், அந்த address-இலிருந்து வரும் அனைத்து traffic-மும் உங்களுடையதாக இருக்கும். எனவே, அந்த address-மே identifier ஆகிவிடும். உங்கள் browser மற்றும் instance இடையிலான traffic, TLS certificate மூலம் பாதுகாக்கப்படுகிறது.
JSON request ஏன் 403 Forbidden எனத் திருப்பி அனுப்பப்படுகிறது?
இதற்கு 2 காரணங்கள் உள்ளன. இரண்டும் configuration தொடர்பானவை. settings.yml இல் உள்ள search:-ன் கீழ் இருக்கும் formats list-இல் json இல்லை. இதுவே default நிலை. அல்லது limiter இயக்கப்பட்டு, உங்கள் script-ஐ bot என வகைப்படுத்தியிருக்கலாம். முதலில் format-ஐச் சேர்த்து, docker compose restart core மூலம் restart செய்யுங்கள். பின்னர் மீண்டும் முயற்சிக்கவும். தொடர்ந்து தோல்வியடைந்தால், limiter: false-ஐ அமைத்து reverse proxy-யில் access-ஐக் கட்டுப்படுத்துங்கள்.
limiter-ஐ இயக்காமல் வைத்திருந்தால் Valkey container தேவைப்படுமா?
அதை இயக்கத்தில் வைத்திருங்கள். அது இல்லாமலும் SearXNG இயங்கும். ஆனால் Valkey இல்லாமல் limiter-ஐ பின்னர் இயக்க முடியாது. மேலும், அது குறுகிய காலத்திற்கு பயன்படும் பிற state-களையும் வைத்திருக்கும். இந்த container சிறியது. இது cached data-வை மட்டுமே சேமிக்கிறது. எனவே, அதை அகற்றுவதால் மிகக் குறைவாகவே சேமிப்பு கிடைக்கும். ஆனால் பின்னர் limiter-ஐ இயக்கும் வாய்ப்பை இழப்பீர்கள்.
SearXNG-ஐ எவ்வாறு update செய்வது?
/opt/searxng இல் docker compose pull-ஐ இயக்கி, பின்னர் docker compose up -d-ஐ இயக்குங்கள். Image மாறியுள்ள எந்த container-ஐயும் Compose மீண்டும் உருவாக்கும். உங்கள் core-config/ directory-யை அது மாற்றாது. எனவே, settings.yml தொடர்ந்து இருக்கும். use_default_settings: true, shipped defaults-ன் மீது உங்கள் keys-ஐ merge செய்வதால், upstream-ல் சேர்க்கப்பட்ட options, file-ஐ செயலிழக்கச் செய்யாமல் பொருத்தமான values-உடன் கிடைக்கும்.
ஒரே instance-ஐ பலர் பகிர்ந்து பயன்படுத்தலாமா?
ஆம். அத்தகைய பயன்பாட்டில்தான் limiter-ஐ இயக்கி public_instance: true-ஐ அமைக்க வேண்டும். Preferences ஒவ்வொரு visitor-ன் சொந்த browser-இல் சேமிக்கப்படுகின்றன. எனவே, நிர்வகிக்க accounts எதுவும் தேவையில்லை. அதை வெளிப்படுத்திய பிறகு ஒரு வாரத்திற்கு /stats-ஐ monitor செய்யுங்கள். ஏனெனில், missing results இருப்பதை நீங்கள் கவனிப்பதற்கு முன்பே upstream engines உங்கள் server-ன் requests-ஐ நிராகரிக்கத் தொடங்கிவிடும்.