SSD Nodes Learn 8GB RAM — $66/سال
تعلیمی Matt Connorتحریر: Matt Connor · اپ ڈیٹ شدہ 2026-08-01

اپنا نجی SearXNG سرچ انجن کیسے چلائیں

Docker Compose کے ذریعے اپنے VPS پر SearXNG چلائیں: settings.yml، limiter، TLS والا nginx اور JSON search API کی مکمل ترتیب، جسے آپ کے scripts بلا سکیں۔

آپ کیا بنا رہے ہیں

SearXNG کو خود میزبانی کرنے سے آپ کو ایک نجی سرچ انجن ملتا ہے جو آپ کے اپنے server پر چلتا ہے۔ SearXNG ایک metasearch engine ہے: یہ آپ کی query لیتا ہے، Google، Bing، DuckDuckGo اور Wikipedia جیسے دوسرے engines سے نتائج طلب کرتا ہے، پھر موصولہ نتائج کو ایک result page میں یکجا کرتا ہے۔ کوئی profile نہیں بنائی جاتی اور tracking cookie بھی set نہیں ہوتی، کیونکہ آپ کی query محفوظ رکھنے والی واحد machine آپ کی اپنی ہے۔

یہ stack مختصر ہے۔ دو containers، ایک settings file اور ایک reverse proxy۔ اصل فیصلہ یہ ہے کہ instance نجی ہو، یعنی صرف آپ اور آپ کے اپنے scripts اس تک پہنچیں، یا public ہو، یعنی internet پر موجود کوئی بھی شخص اسے query کر سکے۔ یہ انتخاب security settings تبدیل کرتا ہے، اس لیے کچھ بھی type کرنے سے پہلے فیصلہ کریں۔ Default جواب private ہے۔

اسے چلانے کی ایک اور وجہ بھی ہے۔ SearXNG instance JSON میں جواب دیتا ہے، اس لیے آپ کا لکھا ہوا کوئی بھی script یا AI agent اپنی ملکیت کی search API حاصل کر لیتا ہے، جس کے لیے key، فی query billing یا quota mail کی ضرورت نہیں ہوتی۔

Docker Compose کے ساتھ SearXNG انسٹال کریں

یہ پروجیکٹ ایک container image اور Compose file فراہم کرتا ہے۔ دونوں کو ایک نئے Ubuntu 24.04 server پر حاصل کریں، جس میں پہلے سے Docker Engine اور Compose plugin موجود ہوں۔ اگر 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 ایک in-memory data store ہے جو rate limiting اور مختصر مدت کے state کے لیے استعمال ہوتا ہے۔ یہ ./core-config/ کو container کے اندر /etc/searxng/ پر mount کرتا ہے، اس لیے آپ کی تمام configuration host پر اسی ایک directory میں رہتی ہے۔

اب .env میں ترمیم کریں۔ فراہم کردہ مثال کی ہر لائن comment کی گئی ہے، اسی لیے container ہر address پر port 8080 سے شروع ہوتا ہے۔ ان تین settings کو uncomment کریں اور values مقرر کریں۔

SEARXNG_VERSION=latest
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080

SEARXNG_HOST=127.0.0.1 سب سے اہم setting ہے۔ یہ published port کو 127.0.0.1:8080:8080 بناتی ہے، [::]:8080:8080 نہیں، اس لیے container صرف loopback address پر جواب دیتا ہے اور internet اس تک براہ راست نہیں پہنچ سکتا۔ اسے چھوڑنے سے container شروع ہوتے ہی exposed ہو جاتا ہے، کیونکہ published Docker port آپ کے firewall rules سے پہلے شامل کیا جاتا ہے۔ اس مسئلے کی مکمل وضاحت یہاں پڑھیں: published Docker ports ufw کو bypass کرتے ہیں۔

سیکھنے کے دوران SEARXNG_VERSION=latest مناسب ہے۔ ایسے server پر جس کی سکیورٹی اہم ہو، tag کو مقررہ value پر pin کریں۔ July 2026 تک release tags تاریخ پر مبنی ہیں اور 2026.3.25-541c6c3cb جیسے دکھائی دیتے ہیں، اس لیے pinned deployment اسی وقت upgrade ہوتا ہے جب آپ فیصلہ کریں، نہ کہ جب registry میں تبدیلی ہو۔

settings.yml: اہم حصے

پہلی بار start کرنے سے پہلے core-config/settings.yml بنائیں۔ use_default_settings: true، SearXNG کو اس کے اپنے فراہم کردہ default settings لوڈ کرنے اور پھر صرف آپ کی لکھی ہوئی keys لاگو کرنے کا پابند کرتا ہے۔ اس طرح فائل مختصر رہتی ہے اور نئی options شامل ہونے والی upgrades کے بعد بھی کام کرتی ہے۔

پہلے secret generate کریں، کیونکہ اس کی 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 لفظی string ultrasecretkey ہے۔ اگر اسے تبدیل نہ کیا جائے تو جس شخص کو یہ default معلوم ہو، وہ ان tokens کو جعلی طور پر بنا سکتا ہے۔ اسے ایک بار تبدیل کریں اور پھر نہ چھیڑیں۔ بعد میں اسے تبدیل کرنے سے تمام محفوظ preferences ختم ہو جاتی ہیں۔

base_url لازماً trailing slash کے ساتھ عوامی HTTPS address ہونا چاہیے۔ SearXNG اپنے تیار کردہ links میں یہی address لکھتا ہے۔ اگر اسے localhost پر رہنے دیں تو remote browser میں "next page" link قاری کی اپنی machine کی طرف اشارہ کرے گا اور ناکام ہو جائے گا۔

formats طے کرتا ہے کہ web endpoint کون سی output types فراہم کرے گا۔ json default list میں شامل نہیں ہے، اس لیے اسے شامل کرنے تک JSON request کا جواب 403 ہوگا۔ image_proxy: true result thumbnails کو آپ کے server کے ذریعے route کرتا ہے، اس لیے ان images کی hosting کرنے والی sites کو آپ کے visitors کے addresses نظر نہیں آتے۔

valkey.url hostname valkey استعمال کرتا ہے، کیونکہ Compose file میں یہی service name ہے، اور Compose دونوں containers کو ایک ہی 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 کو بالکل start ہونے نہیں دیتی۔

Stack start کریں اور اسے check کریں۔

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 کے طور پر ظاہر ہوتی ہے۔

nginx کے پیچھے TLS کے ساتھ چلائیں

کنٹینر صرف loopback پر سنتا ہے، اس لیے 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 میں فرق نہیں کر سکتا۔

اسکرپٹس اور agents کو JSON search API کیوں درکار ہوتی ہے

formats میں json کے ساتھ، وہی endpoint جو page کو render کرتا ہے، structured data واپس کرتا ہے۔

curl -s 'http://127.0.0.1:8080/search?q=wireguard+mtu&format=json' \
  | jq -r '.results[0:5][] | .url'

آپ کو ایک object واپس ملتا ہے جس میں results array ہوتا ہے۔ ہر entry میں url، title، content اور اسے فراہم کرنے والا engine، نیز answers، infoboxes اور suggestions شامل ہوتے ہیں۔ یہ summariser، link checker یا research loop کو data فراہم کرنے کے لیے کافی ہے۔

یہ ہر agent-based کام کے لیے اہم ہے۔ ایک language model کی training cutoff ہوتی ہے، اس لیے موجودہ حالات سے متعلق سوالات کے جواب دینے کے لیے اسے live search درکار ہوتی ہے۔ تجارتی search APIs فی query معاوضہ لیتی ہیں اور rate limit بھی سخت رکھتی ہیں۔ مقامی instance کی لاگت اس server پر صرف ایک container ہوتی ہے جس کی ادائیگی آپ پہلے ہی کر رہے ہیں، اور queries کبھی اس سے باہر نہیں جاتیں۔ اگر آپ کسی model میں tools شامل کر رہے ہیں، تو یہی منطق VPS پر MCP servers چلانے پر بھی لاگو ہوتی ہے۔ search tool عموماً وہ پہلا tool ہوتا ہے جسے لوگ شامل کرتے ہیں۔

API استعمال کرنے کے لیے دو اصول ہیں۔ instance کو private رکھیں۔ API side کو loopback address یا private network سے bind کریں، اور صرف اپنے hosts کو اس تک رسائی دیں۔ پھر queries احتیاط سے بھیجیں۔ SearXNG آپ کی request حقیقی search engines کو forward کرتا ہے، اس لیے ہر second میں 100 queries چلانے والی script دراصل Google سے آپ کے server کو block کرنے کی درخواست کر رہی ہوتی ہے۔

لمیٹر اور عوامی instance کے لیے تبدیلیاں

لمیٹر SearXNG کا bot دفاعی نظام ہے۔ یہ request headers، addresses اور request rates کی نگرانی کرتا ہے اور ایسی network traffic کو خارج کر دیتا ہے جو خودکار معلوم ہو۔ حالت محفوظ رکھنے کے لیے اسے Valkey درکار ہوتا ہے، اسی لیے Compose file میں یہ شامل ہے۔

نجی instance پر limiter: false برقرار رکھیں۔ آپ کی اپنی scripts تعریف کے مطابق خودکار network traffic ہیں، اس لیے لمیٹر عین ان JSON calls کو روک دے گا جن کے لیے آپ نے instance بنایا ہے۔ اس کے بجائے access control reverse proxy کی ذمہ داری ہے: nginx کی location میں allow اور deny کا جوڑا، HTTP basic authentication، یا ایسا firewall جو صرف آپ کے دوسرے servers سے آنے والی network traffic قبول کرے۔

اگر آپ instance کو دوسرے لوگوں کے لیے شائع کرتے ہیں تو دونوں switches آن کریں۔

server:
  limiter: true
  public_instance: true

مزید باریک کنٹرول core-config/limiter.toml میں موجود ہے، جسے container /etc/searxng/limiter.toml سے پڑھتا ہے۔ صرف وہ keys لکھیں جنہیں آپ تبدیل کرنا چاہتے ہیں۔ Proxy کے پیچھے آپ کو proxy کا اعلان کرنا ہوگا، ورنہ لمیٹر آپ کے 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 حاصل کرے گا۔ اس سے زیادہ تر سادہ scrapers رک جاتے ہیں۔ توقع رکھیں کہ عوامی instance چند دنوں میں ان کی توجہ حاصل کر لے گا۔ Engine errors کی بھی توقع رکھیں، کیونکہ آپ جتنی زیادہ network traffic آگے بھیجیں گے، upstream engines اتنی جلدی آپ کے server address کو CAPTCHAs بھیجنا شروع کر دیں گے۔ عوامی SearXNG instance مسلسل انتظامی کام ہے۔ نجی instance ایسا نہیں ہے، اسی لیے یہ 2026 میں خود میزبانی کے قابل چیزوں کی زیادہ تر مختصر فہرستوں میں شامل ہوتا ہے۔

تلاشوں پر کوئی نتیجہ کیوں نہیں آتا

اپنے instance پر /stats کھولیں۔ اس میں ہر engine کی error rate اور response time درج ہوتی ہے۔ جب نتائج کم محسوس ہوں تو سب سے پہلے اسی جگہ دیکھیں۔

جس engine کے سامنے "Access denied" یا "CAPTCHA" کی error دکھائی جائے، اس نے آپ کے server address کو block کر دیا ہے۔ Data centre ranges کے addresses کے لیے یہ عام بات ہے، کیونکہ search engines سمجھتے ہیں کہ یہ scrapers کے استعمال میں ہوتے ہیں۔ اس کے بعد SearXNG ناکام engine کو دوبارہ آزمانے کے بجائے کچھ وقت کے لیے suspend کر دیتا ہے۔ یوں ایک blocked engine خاموشی سے نتائج سے خارج ہو جاتا ہے۔ اسے settings.yml میں disable کریں یا اس کمی کو قبول کریں۔ باقی engines پھر بھی جواب دیتے رہیں گے۔

اگر تمام engines ایک ہی وقت میں ناکام ہوں، تو container میں outbound name resolution کام نہیں کر رہی یا internet تک کوئی route موجود نہیں ہے۔ اس کی جانچ container کے اندر سے کریں۔

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

FAQ

کیا SearXNG میری تلاشوں کو گمنام بناتا ہے؟

یہ ان engines سے آپ کی شناخت چھپاتا ہے جنہیں یہ query بھیجتا ہے، کیونکہ ان کے سامنے request آپ کے browser کے بجائے آپ کا server کرتا ہے۔ یہ query آپ کے server سے نہیں چھپاتا، اور نہ ہی آپ کے server کو ان engines سے چھپاتا ہے۔ ایک single-user instance میں اس address سے آنے والا تمام traffic آپ کا ہوتا ہے، اس لیے خود address شناخت کنندہ بن جاتا ہے۔ آپ کے browser اور instance کے درمیان traffic کو TLS certificate محفوظ رکھتا ہے۔

JSON request سے 403 Forbidden کیوں موصول ہوتا ہے؟

اس کی دو وجوہات ہیں، اور دونوں configuration سے متعلق ہیں۔ یا تو json، settings.yml میں search: کے تحت موجود formats فہرست میں شامل نہیں ہے، جو default حالت ہے، یا limiter فعال ہے اور اس نے آپ کے script کو bot قرار دیا ہے۔ پہلے format شامل کریں، docker compose restart core کے ساتھ restart کریں، پھر دوبارہ کوشش کریں۔ اگر پھر بھی مسئلہ برقرار رہے تو limiter: false مقرر کریں اور access کو reverse proxy پر کنٹرول کریں۔

اگر میں limiter بند رکھوں تو کیا Valkey container ضروری ہے؟

اسے چلتا رہنے دیں۔ SearXNG اس کے بغیر کام کرتا ہے، لیکن اس کے بغیر limiter کو بعد میں فعال نہیں کیا جا سکتا، اور یہ دوسری مختصر مدت کے state کو بھی محفوظ رکھتا ہے۔ container چھوٹا ہے اور صرف cached data محفوظ کرتا ہے، اس لیے اسے ہٹانے سے بہت کم بچت ہوتی ہے اور آپ بعد میں اسے فعال کرنے کا اختیار کھو دیتے ہیں۔

میں SearXNG کو کیسے update کروں؟

/opt/searxng میں docker compose pull چلائیں، پھر docker compose up -d چلائیں۔ Compose ایسے ہر container کو دوبارہ بناتا ہے جس کی image تبدیل ہوئی ہو، اور آپ کی core-config/ directory کو برقرار رکھتا ہے، اس لیے settings.yml محفوظ رہتا ہے۔ چونکہ use_default_settings: true آپ کی keys کو shipped defaults پر merge کرتا ہے، اس لیے upstream میں شامل کیے گئے options sensible values کے ساتھ آتے ہیں اور file خراب نہیں ہوتی۔

کیا کئی لوگ ایک ہی instance استعمال کر سکتے ہیں؟

ہاں، اور یہی وہ صورت ہے جس میں آپ limiter فعال کرتے ہیں اور public_instance: true مقرر کرتے ہیں۔ Preferences ہر visitor کے اپنے browser میں محفوظ ہوتی ہیں، اس لیے accounts manage کرنے کی ضرورت نہیں ہوتی۔ اسے public کرنے کے بعد ایک ہفتے تک /stats monitor کریں، کیونکہ upstream engines نتائج غائب ہونے کا آپ کو علم ہونے سے بہت پہلے آپ کے server کی requests مسترد کرنا شروع کر دیتے ہیں۔

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