SSD Nodes Learn 8GB RAM — $66/वर्ष
मार्गदर्शक Matt Connorद्वारे Matt Connor · अपडेटेड 2026-08-01

स्वतःचे खाजगी SearXNG search engine कसे चालवावे

Docker Compose वापरून स्वतःच्या VPS वर SearXNG चालवा. settings.yml, limiter, TLS सह nginx आणि scripts साठी JSON search API कॉन्फिगर करण्याची पद्धत येथे दिली आहे.

तुम्ही काय तयार करत आहात

SearXNG स्वतःच्या server वर चालवल्यास तुम्हाला स्वतःच्या 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 private असावे की public, हा मुख्य निर्णय आहे. Private instance म्हणजे फक्त तुम्ही आणि तुमचे स्वतःचे scripts त्याच्यापर्यंत पोहोचतात. Public instance म्हणजे internet वरील कोणीही त्यावर query करू शकते. या निवडीमुळे security settings बदलतात. त्यामुळे काहीही type करण्यापूर्वी हा निर्णय घ्या. Default निवड private आहे.

SearXNG instance चालवण्याचे आणखी एक कारण आहे. SearXNG instance JSON मध्ये प्रतिसाद देते. त्यामुळे तुम्ही लिहिलेल्या कोणत्याही script किंवा AI agent ला तुमच्या मालकीचे search API मिळते. त्यासाठी key, प्रत्येक query साठी billing किंवा quota-संबंधी email आवश्यक नसतो.

Docker Compose वापरून SearXNG स्थापित करा

प्रकल्प 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 .env

Compose file मध्ये दोन services परिभाषित आहेत. core हे SearXNG स्वतः आहे आणि valkey हे rate limiting तसेच अल्पकालीन state साठी वापरले जाणारे in-memory data store आहे. हे ./core-config/ ला container मधील /etc/searxng/ येथे mount करते. त्यामुळे तुम्ही configure केलेली प्रत्येक गोष्ट host वरील त्याच एका directory मध्ये राहते.

आता .env संपादित करा. दिलेल्या example मधील प्रत्येक line comment केलेली आहे. म्हणूनच container प्रत्येक address वर port 8080 वर सुरू होतो. या तीन lines uncomment करून त्यांची मूल्ये सेट करा.

SEARXNG_VERSION=latest
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080

SEARXNG_HOST=127.0.0.1 ही महत्त्वाची line आहे. ती published port 127.0.0.1:8080:8080 ऐवजी [::]:8080:8080 करते. त्यामुळे container फक्त loopback address वर प्रतिसाद देतो आणि internet त्याच्यापर्यंत थेट पोहोचू शकत नाही. हे वगळल्यास container सुरू होताच उघडा राहतो, कारण published Docker port तुमच्या firewall rules च्या आधी लागू केला जातो. हा धोका पूर्णपणे समजून घेण्यासाठी published Docker ports ufw ला bypass करतात वाचा.

तुम्ही शिकत असताना SEARXNG_VERSION=latest पुरेसे आहे. महत्त्वाच्या server वर tag निश्चित करा. July 2026 पर्यंत release tags date आधारित आहेत आणि 2026.3.25-541c6c3cb सारखे दिसतात. त्यामुळे registry मध्ये बदल झाल्यावर आपोआप upgrade होण्याऐवजी deployment तुम्ही ठरवाल तेव्हाच upgrade होईल.

settings.yml: महत्त्वाचे भाग

पहिल्यांदा सुरू करण्यापूर्वी core-config/settings.yml तयार करा. use_default_settings: true मुळे SearXNG आधी त्याचे स्वतःसोबत दिलेले default मूल्य लोड करते आणि त्यानंतर तुम्ही लिहिलेल्या keysच लागू करते. त्यामुळे तुमची फाइल लहान राहते आणि नवीन options जोडणाऱ्या upgrades नंतरही टिकते.

आधी secret तयार करा, कारण त्याची value थेट फाइलमध्ये लिहिली जाईल.

openssl rand -hex 32
use_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
    - json

secret_key session आणि token data वर स्वाक्षरी करते. सोबत दिलेले default मूल्य अक्षरशः ultrasecretkey आहे. ते तसेच ठेवल्यास हे default माहीत असलेली कोणतीही व्यक्ती ते tokens बनावट तयार करू शकते. ते एकदाच बदला आणि नंतर तसेच ठेवा. नंतर ते बदलल्यास जतन केलेली प्रत्येक preference नष्ट होते.

base_url हा शेवटी slash असलेला सार्वजनिक HTTPS address असणे आवश्यक आहे. SearXNG तयार करत असलेल्या links मध्ये तोच address लिहिते. तो localhost कडे ठेवला असल्यास, remote browser मधील "next page" link वाचकाच्या स्वतःच्या machine कडे निर्देश करेल आणि काम करणार नाही.

formats web endpoint कोणते output types तयार करेल हे ठरवते. json default list मध्ये नाही. त्यामुळे ते add करेपर्यंत JSON request ला 403 मिळतो. image_proxy: true result thumbnails तुमच्या server मार्फत पाठवते. त्यामुळे त्या images host करणाऱ्या sites ना तुमच्या visitors चे addresses दिसत नाहीत.

valkey.url hostname valkey वापरते, कारण Compose file मध्ये तोच service name आहे. Compose दोन्ही containers एका network वर ठेवते आणि त्या network मध्ये service names resolve होतात. त्याऐवजी localhost कडे निर्देश केल्यास limiter काम करणार नाही. कारण core container मध्ये localhost म्हणजे तोच container असतो.

secret plain file मध्ये आहे. त्यामुळे फाइलऐवजी तिच्या भोवतालच्या directory चे संरक्षण करा. chmod 750 /opt/searxng मुळे host वरील इतर users बाहेर राहतात. core-config/settings.yml ला mode 600 पर्यंत अधिक प्रतिबंधित करू नका. Container स्वतःचा unprivileged user म्हणून चालतो आणि त्याला वाचता न येणारी फाइल असल्यास SearXNG अजिबात सुरू होत नाही.

Stack सुरू करून त्याची तपासणी करा.

cd /opt/searxng
docker compose up -d
docker compose ps
curl -I http://127.0.0.1:8080/

docker compose ps ने दोन्ही containers ची state running असल्याचे दाखवले पाहिजे. curl ने HTTP/1.1 200 OK ला उत्तर दिले पाहिजे. काहीही उत्तर मिळाले नाही तर docker compose logs core वाचा. settings.yml मधील YAML चूक तेथे line चे नाव देणाऱ्या parse error म्हणून दिसते.

TLS सह nginx च्या मागे चालवा

कंटेनर केवळ loopback वर ऐकतो. त्यामुळे nginx मुळे तो पोहोचण्यायोग्य होतो आणि nginx मुळेच transport layer security (TLS) जोडली जाते. /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.com

पुन्हा लोड करण्यापूर्वी nginx -t, syntax is ok आणि test is successful मुद्रित करते. Certbot त्याच फाइलमध्ये बदल करून certificate सह 443 वर ऐकण्याची व्यवस्था करते आणि port 80 वरून redirect जोडते. search.example.com साठीचा DNS record आधीच या server कडे निर्देशित असणे आवश्यक आहे, कारण certificate authority HTTP द्वारे फाइल आणून मालकी सिद्ध करते. Renewal सहित संपूर्ण मार्गदर्शक Ubuntu 24.04 साठी Certbot आणि nginx मार्गदर्शकात आहे.

ही दोन forwarding headers केवळ सजावटीसाठी नाहीत. X-Forwarded-For आणि X-Real-IP शिवाय, SearXNG कडे येणाऱ्या प्रत्येक request मध्ये proxy address येतो. त्यामुळे rate limiter ला सर्व traffic करणारा एकच client दिसतो आणि वेगवेगळे visitors ओळखता येत नाहीत.

स्क्रिप्ट आणि एजंटना JSON शोध API का आवश्यक असते

json हे formats मध्ये असल्यामुळे, पृष्ठ रेंडर करणारा तोच endpoint संरचित डेटा परत करतो.

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 मिळतो. त्यासोबत answers, infoboxes आणि suggestions देखील मिळतात. सारांश तयार करणाऱ्या साधनाला, link checker ला किंवा संशोधनाच्या पुनरावृत्तीच्या प्रक्रियेला डेटा देण्यासाठी एवढे पुरेसे आहे.

Agent स्वरूपाच्या कोणत्याही प्रणालीसाठी हे महत्त्वाचे आहे. Language model ची training cutoff असते. त्यामुळे वर्तमानाविषयीच्या प्रश्नांची उत्तरे देण्यासाठी त्याला live search आवश्यक असते. Commercial search APIs प्रत्येक query साठी शुल्क आकारतात आणि rate limit कडक ठेवतात. तुम्ही आधीच वापरत असलेल्या server वर एक container चालवण्याइतका local instance चा खर्च असतो. Queries त्या server च्या बाहेर जात नाहीत. Model मध्ये tools जोडत असल्यास, हीच कारणमीमांसा VPS वर MCP servers चालवणे यालाही लागू होते. Search tool हे सहसा लोक प्रथम जोडतात.

API वापरण्यासाठी दोन नियम आहेत. Instance private ठेवा. API side ला loopback address किंवा private network वर bind करा आणि केवळ तुमच्या स्वतःच्या hosts ना त्यापर्यंत पोहोचू द्या. त्यानंतर queries मर्यादित वेगाने पाठवा. SearXNG तुमची request प्रत्यक्ष search engines कडे forward करते. त्यामुळे प्रति सेकंद शंभर queries चालवणारी script तुमचा server block करण्यास Google ला प्रवृत्त करू शकते.

लिमिटर आणि सार्वजनिक instance साठी होणारे बदल

लिमिटर हे SearXNG चे bot संरक्षण आहे. ते request headers, addresses आणि request rates वर लक्ष ठेवते आणि स्वयंचलित वाटणारी network traffic वगळते. स्थिती साठवण्यासाठी त्याला Valkey आवश्यक आहे. म्हणून Compose file मध्ये ते समाविष्ट केले आहे.

खासगी instance वर limiter: false तसेच ठेवा. तुमच्या स्वतःच्या scripts हे व्याख्येनुसार automated traffic असतात. त्यामुळे instance ज्या JSON calls साठी तयार केला आहे, त्यांनाच limiter अवरोधित करेल. त्याऐवजी access control हे reverse proxy चे काम आहे: nginx location मधील allow आणि deny ची जोडी, HTTP basic authentication किंवा तुमच्या इतर servers कडून येणारी network traffic स्वीकारणारे firewall नियम वापरा.

तुम्ही instance इतर लोकांसाठी प्रकाशित करत असल्यास, दोन्ही switches on करा.

server:
  limiter: true
  public_instance: true

अधिक सूक्ष्म नियंत्रण core-config/limiter.toml मध्ये असते. Container ते /etc/searxng/limiter.toml मधून वाचते. तुम्हाला बदलायच्या असलेल्या keys एवढ्याच लिहा. Proxy मागे असल्यास proxy घोषित करणे आवश्यक आहे. अन्यथा limiter तुमच्या nginx address ला गैरवापर करणारा एकमेव client समजेल.

[botdetection]
trusted_proxies = [
  '127.0.0.0/8',
  '::1',
]

[botdetection.ip_limit]
link_token = true

link_token = true मुळे SearXNG असा token जारी करते, जो केवळ प्रत्यक्ष browser session fetch करेल. त्यामुळे साधे scrapers बहुतांश वेळा थांबतात. सार्वजनिक instance प्रकाशित केल्यानंतर काही दिवसांतच अशा traffic ची अपेक्षा ठेवा. Engine errors चीही अपेक्षा ठेवा, कारण तुम्ही जितकी अधिक network traffic forward कराल, तितक्या लवकर upstream engines तुमच्या server address कडे CAPTCHAs पाठवू लागतील. सार्वजनिक SearXNG instance चालवणे हे सतत करावे लागणारे काम आहे. खासगी instance साठी तसे नाही. म्हणूनच 2026 मध्ये स्वतः host करण्यास उपयुक्त असलेल्या गोष्टींच्या बहुतेक छोट्या याद्यांमध्ये ते असते.

शोधांमध्ये कोणतेही निकाल का मिळत नाहीत

तुमच्या instance वर /stats उघडा. यामध्ये प्रत्येक engine चा error rate आणि response time दिलेला असतो. निकाल अपुरे वाटल्यास हे तपासण्याचे पहिले ठिकाण आहे.

"Access denied" किंवा "CAPTCHA" error दाखवणाऱ्या engine ने तुमचा server address block केलेला असतो. Data centre ranges मधील address साठी हे सामान्य आहे, कारण search engines असे address scraper चे असल्याचे गृहीत धरतात. त्यानंतर SearXNG त्या engine ला पुन्हा प्रयत्न करण्याऐवजी काही काळासाठी suspend करते. त्यामुळे एक block केलेला engine तुमच्या निकालांमधून शांतपणे वगळला जातो. तो settings.yml मध्ये disable करा किंवा हे नुकसान स्वीकारा. उर्वरित engines प्रतिसाद देत राहतात.

सर्व engines एकाच वेळी fail होत असल्यास, container मध्ये कार्यरत outbound name resolution नाही किंवा internet कडे जाण्यासाठी route नाही. हे container च्या आतून test करा.

docker compose exec core wget -qO- https://duckduckgo.com > /dev/null && echo ok

FAQ

SearXNG मुळे माझे शोध अनामिक होतात का?

तुम्ही कोण आहात हे तुम्ही ज्या engines ला query पाठवता त्यांच्यापासून ते लपवते, कारण त्यांना तुमच्या browser ऐवजी तुमचा server request करताना दिसतो. ते query तुमच्या server पासून लपवत नाही आणि तुमचा server त्या engines पासूनही लपवत नाही. एका single-user instance वर त्या address कडून येणारा सर्व traffic तुमचाच असतो. त्यामुळे तो address स्वतःच identifier बनतो. तुमच्या browser आणि तुमच्या instance मधील traffic TLS certificate मुळे सुरक्षित असतो.

JSON request ला 403 Forbidden का मिळते?

यामागे 2 कारणे असू शकतात आणि दोन्ही configuration शी संबंधित आहेत. एकतर json हे settings.yml मधील search: अंतर्गत असलेल्या formats यादीत नाही. ही default स्थिती आहे. किंवा limiter सुरू असून त्याने तुमच्या script ला bot म्हणून वर्गीकृत केले आहे. आधी format जोडा, docker compose restart core वापरून restart करा आणि पुन्हा प्रयत्न करा. तरीही त्रुटी येत असल्यास limiter: false सेट करा आणि reverse proxy वर access नियंत्रित करा.

Limiter बंद ठेवला तरी Valkey container आवश्यक आहे का?

तो चालू ठेवा. SearXNG त्याच्याशिवाय कार्य करते. मात्र त्याच्याशिवाय limiter नंतर सुरू करता येत नाही. तो इतर अल्पकालीन state देखील ठेवतो. हा container लहान आहे आणि फक्त cached data साठवतो. त्यामुळे तो काढल्याने फारच कमी जागा वाचते आणि नंतरचा पर्याय गमवावा लागतो.

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 मध्ये साठवल्या जातात. त्यामुळे manage करण्यासाठी accounts नसतात. ते उपलब्ध करून दिल्यानंतर एक आठवडा /stats monitor करा, कारण missing results तुमच्या लक्षात येण्यापूर्वीच upstream engines तुमचा server नाकारणे सुरू करतात.

#searxng#search#privacy#self-hosting#docker