SSD Nodes Learn 8GB RAM — $66/سنة
الأدلة Matt Connorبقلم Matt Connor · آخر تحديث في 2026-08-01

استضافة SearXNG ذاتيًا: محرك بحث خاص بك

شغّل SearXNG على VPS خاص بك عبر Docker Compose، واضبط settings.yml وlimiter وnginx مع TLS، واستخدم واجهة JSON في سكربتاتك دون مفاتيح أو حصة.

ما الذي ستبنيه

يمنحك استضافة SearXNG ذاتيًا محرك بحث خاصًا يعمل على خادمك. SearXNG هو محرك بحث تجميعي؛ يأخذ استعلامك، ويرسله إلى محركات أخرى مثل Google وBing وDuckDuckGo وWikipedia، ثم يدمج النتائج في صفحة نتائج واحدة. لا يُنشأ ملف تعريفي ولا تُعيَّن cookie للتتبع، لأن الجهاز الوحيد الذي يحتفظ باستعلامك هو جهازك.

المكدس صغير. حاويتان، وملف إعدادات واحد، ووكيل عكسي واحد. القرار الفعلي هو ما إذا كان المثيل خاصًا، أي لا يمكن الوصول إليه إلا بواسطتك وبواسطة البرامج النصية الخاصة بك، أم عامًا، أي يمكن لأي شخص على الإنترنت إرسال استعلامات إليه. يغيّر هذا الاختيار إعدادات الأمان، لذا حدده قبل أن تكتب أي شيء. الإعداد الافتراضي هو الوضع الخاص.

هناك سبب ثانٍ لتشغيل مثيل خاص بك. يتحدث مثيل SearXNG باستخدام JSON، لذلك يحصل أي برنامج نصي أو وكيل ذكاء اصطناعي تكتبه على واجهة بحث تملكها، من دون مفتاح، أو فوترة لكل استعلام، أو رسائل بريد عن الحصة.

تثبيت SearXNG باستخدام Docker Compose

ينشر المشروع صورة حاوية وملف Compose. اسحب كليهما إلى خادم Ubuntu 24.04 جديد يحتوي مسبقًا على Docker Engine وملحق Compose. إذا لم تكن قد استخدمت Docker من قبل، فابدأ بـ أساسيات Docker Compose على VPS ثم عد إلى هنا.

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 خدمتين. core هي SearXNG نفسها، وvalkey مخزن بيانات في الذاكرة يُستخدم لتحديد معدل الطلبات ولتخزين الحالة قصيرة الأجل. يربط ./core-config/ بالمسار /etc/searxng/ داخل الحاوية، لذلك يوجد كل ما تهيئه في ذلك الدليل الواحد على المضيف.

حرّر الآن .env. كل سطر في المثال المرفق موضوع داخل تعليق، ولذلك تبدأ الحاوية بالاستماع على المنفذ 8080 على كل العناوين. أزل علامة التعليق من هذه الأسطر الثلاثة واضبط قيمها.

SEARXNG_VERSION=latest
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080

SEARXNG_HOST=127.0.0.1 هو السطر الأهم. فهو يجعل المنفذ المنشور 127.0.0.1:8080:8080 بدلًا من [::]:8080:8080، لذلك لا تستجيب الحاوية إلا على عنوان loopback ولا يستطيع الإنترنت الوصول إليها مباشرة. إذا تخطيت ذلك، تصبح الحاوية مكشوفة فور بدء تشغيلها، لأن منفذ Docker المنشور يُضاف قبل قواعد جدار الحماية. اقرأ شرح هذا الخطأ كاملًا: منافذ Docker المنشورة تتجاوز ufw.

SEARXNG_VERSION=latest مناسب أثناء التعلم. أما على خادم مهم، فثبّت الوسم. اعتبارًا من July 2026، تعتمد وسوم الإصدارات على التاريخ وتبدو مثل 2026.3.25-541c6c3cb، لذلك لا تتم ترقية النشر المثبت إلا عندما تقرر أنت ذلك، وليس عندما يتغير السجل دون علمك.

settings.yml: الأجزاء المهمة

أنشئ core-config/settings.yml قبل التشغيل الأول. يخبر use_default_settings: true ‏SearXNG بتحميل الإعدادات الافتراضية المضمّنة معه، ثم تطبيق المفاتيح التي كتبتها فقط. لذلك يبقى الملف قصيرًا ويستمر بالعمل بعد الترقيات التي تضيف خيارات جديدة.

أنشئ السر أولًا، لأن قيمته ستُكتب مباشرةً في الملف.

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 بيانات الجلسات والرموز. القيمة الافتراضية المضمّنة هي السلسلة الحرفية ultrasecretkey. إذا تركتها، يمكن لأي شخص يعرف هذه القيمة الافتراضية تزوير تلك الرموز. استبدلها مرة واحدة ثم لا تغيّرها. فتغييرها لاحقًا يلغي جميع التفضيلات المحفوظة.

يجب أن يكون base_url هو عنوان HTTPS العام، مع الشرطة المائلة النهائية. يستخدمه ‏SearXNG لكتابة الروابط التي يعرضها. إذا تركته يشير إلى localhost، فسيشير رابط "الصفحة التالية" في المتصفح البعيد إلى جهاز القارئ نفسه، ويفشل.

يحدد formats أنواع المخرجات التي ستنتجها نقطة نهاية الويب. لا يوجد json في القائمة الافتراضية، لذلك يعيد طلب JSON استجابة 403 إلى أن تضيفه. يمرّر image_proxy: true الصور المصغرة للنتائج عبر خادمك، لذلك لا ترى المواقع التي تستضيف تلك الصور عناوين زوارك.

يستخدم valkey.url اسم المضيف valkey، لأن هذا هو اسم الخدمة في ملف Compose. يضع Compose كلا الحاويتين على شبكة واحدة يمكن فيها حل أسماء الخدمات. إذا وجهته إلى localhost، يفشل محدد المعدل، لأن localhost داخل حاوية core يشير إلى تلك الحاوية نفسها.

يوجد السر في ملف عادي، لذلك احمِ الدليل المحيط به بدلًا من حماية الملف نفسه. يمنع chmod 750 /opt/searxng مستخدمي المضيف الآخرين من الوصول إليه. لا تضبط core-config/settings.yml على الوضع 600، لأن الحاوية تعمل كمستخدم غير مميّز خاص بها. وسيؤدي عدم تمكّنها من قراءة الملف إلى توقف ‏SearXNG عن التشغيل بالكامل.

شغّل المكدس وتحقق منه.

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

يجب أن يعرض docker compose ps الحاويتين كلتيهما بالحالة running. ويجب أن تستجيب curl بـ HTTP/1.1 200 OK. إذا لم تُرجع أي استجابة، اقرأ docker compose logs core، لأن خطأ YAML في settings.yml سيظهر هناك كخطأ تحليل يذكر رقم السطر.

ضع الخدمة خلف nginx مع TLS

تستمع الحاوية على loopback فقط. لذلك يجعل nginx الخدمة قابلة للوصول، ويضيف أيضًا أمان طبقة النقل (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 كتابة الملف نفسه للاستماع على 443 باستخدام شهادة، ويضيف إعادة توجيه من المنفذ 80. يجب أن يشير سجل DNS الخاص بـ search.example.com إلى هذا الخادم مسبقًا، لأن سلطة الشهادات تثبت الملكية عبر جلب ملف باستخدام HTTP. تجد الشرح الكامل، بما في ذلك التجديد، في دليل Certbot وnginx لـ Ubuntu 24.04.

رأسا التوجيه ليسا للزينة. من دون X-Forwarded-For وX-Real-IP، يصل كل طلب إلى SearXNG حاملًا عنوان الوكيل، لذلك يرى محدِّد المعدل عميلًا واحدًا ينشئ كل حركة المرور، ولا يستطيع التمييز بين الزوار.

لماذا تحتاج البرامج النصية والوكلاء إلى واجهة API للبحث بصيغة JSON

مع json في formats، تعيد نقطة النهاية نفسها التي تعرض الصفحة بيانات منظمة.

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

تحصل على كائن يحتوي على مصفوفة results، وتحمل كل خانة فيها url وtitle وcontent والمحرك الذي وفر النتيجة، بالإضافة إلى answers وinfoboxes وsuggestions. وهذا يكفي لتغذية أداة تلخيص أو مدقق روابط أو حلقة بحث.

هذا مهم لكل ما يتخذ شكل وكيل. يمتلك النموذج اللغوي تاريخًا نهائيًا لبيانات التدريب، لذلك يحتاج إلى البحث المباشر للإجابة عن أسئلة حول الوقت الحاضر. كما أن واجهات API التجارية للبحث تفرض رسومًا على كل استعلام وتفرض حدودًا صارمة على معدل الطلبات. أما النسخة المحلية فتستهلك حاوية واحدة على خادم تدفع تكلفته أصلًا، ولا تغادر الاستعلامات ذلك الخادم. إذا كنت توصل الأدوات بنموذج، فإن المنطق نفسه ينطبق على تشغيل خوادم MCP على VPS، إذ تكون أداة البحث عادةً أول أداة يضيفها المستخدمون.

هناك قاعدتان لاستخدام API. اجعل النسخة خاصة، وذلك بربط جانب API بعنوان loopback أو بشبكة خاصة، ولا تسمح بالوصول إليها إلا من مضيفيك. ثم أرسل الاستعلامات باعتدال. يمرر SearXNG طلبك إلى محركات بحث حقيقية، لذلك فإن تشغيل برنامج نصي يرسل مئة استعلام في الثانية يطلب من Google حظر خادمك.

أداة الحد من المعدل، وما يتغير عند تشغيل مثيل عام

أداة الحد من المعدل هي آلية SearXNG للدفاع ضد الروبوتات. وهي تراقب ترويسات الطلبات والعناوين ومعدلات الطلبات، وتسقط حركة المرور التي تبدو مؤتمتة. وتحتاج إلى Valkey لتخزين هذه الحالة، ولذلك يتضمنها ملف Compose.

في المثيل الخاص، أبقِ limiter: false. تُعدّ برامجك النصية الخاصة حركة مرور مؤتمتة بحكم تعريفها، ولذلك ستحظر أداة الحد من المعدل طلبات JSON التي أنشأت المثيل من أجلها تحديدًا. تكون مهمة التحكم في الوصول للوكيل العكسي بدلًا من ذلك: زوج allow وdeny في location الخاص بـ nginx، أو مصادقة HTTP الأساسية، أو جدار ناري لا يسمح إلا بالوصول من خوادمك الأخرى.

إذا نشرت المثيل ليستخدمه أشخاص آخرون، ففعّل المفتاحين.

server:
  limiter: true
  public_instance: true

توجد عناصر تحكم أدق في core-config/limiter.toml، الذي تقرؤه الحاوية من /etc/searxng/limiter.toml. اكتب المفاتيح التي تريد تغييرها فقط. عند استخدام وكيل، يجب أن تعرّف الوكيل، وإلا فستتعامل أداة الحد من المعدل مع عنوان nginx باعتباره عنوان العميل المسيء.

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

[botdetection.ip_limit]
link_token = true

يجعل link_token = true SearXNG يصدر رمزًا لا تجلبه إلا جلسة متصفح حقيقية، ما يوقف معظم أدوات الكشط البسيطة. توقّع أن تجذب هذه الأدوات إلى المثيل العام خلال أيام. وتوقّع أيضًا أخطاء من المحركات، لأن زيادة حركة المرور التي تمررها تؤدي إلى بدء المحركات المصدرية بإرجاع اختبارات CAPTCHA إلى عنوان خادمك في وقت أقرب. تشغيل مثيل SearXNG عام مهمة مستمرة. أما المثيل الخاص فلا يتطلب ذلك، ولهذا يظهر ضمن معظم القوائم المختصرة لـ الأشياء التي تستحق الاستضافة الذاتية في 2026.

لماذا لا تُرجع عمليات البحث أي نتائج

افتح /stats في مثيلك. يعرض هذا القسم كل محرك مع معدل أخطائه وزمن استجابته. وهو أول مكان تتحقق منه عندما تبدو النتائج قليلة.

المحرك الذي تظهر له أخطاء مثل "Access denied" أو "CAPTCHA" حظر عنوان خادمك. يحدث ذلك كثيرًا للعناوين الموجودة ضمن نطاقات مراكز البيانات، لأن محركات البحث تفترض أنها تخص أدوات جمع البيانات. يعلّق SearXNG المحرك المتعطل لفترة بدلًا من إعادة محاولة استخدامه. لذلك يختفي محرك محظور من نتائجك دون تنبيه واضح. عطّله في settings.yml أو اقبل فقدانه. وستظل المحركات المتبقية تستجيب.

إذا تعطلت كل المحركات في الوقت نفسه، فلن تكون الحاوية قادرة على حل أسماء النطاقات الصادرة أو لن يكون لديها مسار إلى الإنترنت. اختبر ذلك من داخل الحاوية.

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

FAQ

هل يجعل SearXNG عمليات البحث التي تجريها مجهولة؟

يخفي هويتك عن محركات البحث التي يستعلم منها، لأنها ترى أن خادمك هو الذي يرسل الطلب بدلاً من متصفحك. لكنه لا يخفي الاستعلام عن خادمك، ولا يخفي خادمك عنها. في النسخة المخصصة لمستخدم واحد، تكون كل حركة المرور من ذلك العنوان صادرةً منك، لذلك يصبح العنوان نفسه معرّفًا. وتكون حركة المرور بين متصفحك ونسختك محمية بواسطة شهادة TLS.

لماذا يعيد طلب JSON الاستجابة 403 Forbidden؟

هناك سببان، وكلاهما متعلق بالإعدادات. إما أن json مفقود من قائمة formats ضمن search: في settings.yml، وهذه هي الحالة الافتراضية، أو أن أداة تحديد المعدل مفعّلة وقد صنّفت النص البرمجي على أنه روبوت. أضف التنسيق أولاً، ثم أعد التشغيل باستخدام docker compose restart core، وحاول مرة أخرى. إذا استمر الفشل، فاضبط limiter: false وتحكم في الوصول من خلال الوكيل العكسي بدلاً من ذلك.

هل أحتاج إلى حاوية Valkey إذا أبقيت أداة تحديد المعدل متوقفة؟

اتركها قيد التشغيل. يعمل SearXNG من دونها، لكن لا يمكن تشغيل أداة تحديد المعدل لاحقًا من دونها، كما أنها تحتفظ بحالة أخرى قصيرة الأجل. الحاوية صغيرة ولا تخزن إلا بيانات مخزنة مؤقتًا، لذلك لا تؤدي إزالتها إلا إلى توفير قليل جدًا، وتحرمك من هذا الخيار.

كيف أحدّث SearXNG؟

شغّل docker compose pull ثم docker compose up -d في /opt/searxng. يعيد Compose إنشاء أي حاوية تغيّرت صورتها، ويترك دليل core-config/ من دون تغيير، لذلك يستمر settings.yml. وبما أن use_default_settings: true يدمج مفاتيحك مع القيم الافتراضية المضمنة في الإصدار، تصل الخيارات التي يضيفها المشروع upstream بقيم مناسبة بدلاً من التسبب في تعطل الملف.

هل يمكن لعدة أشخاص مشاركة نسخة واحدة؟

نعم، وفي هذه الحالة تشغّل أداة تحديد المعدل وتضبط public_instance: true. تُخزَّن التفضيلات في متصفح كل زائر، لذلك لا توجد حسابات تحتاج إلى إدارتها. راقب /stats لمدة أسبوع بعد فتح الوصول إليها، لأن محركات البحث upstream تبدأ برفض خادمك قبل وقت طويل من ملاحظتك للنتائج المفقودة.

#searxng#search#privacy#استضافة ذاتية#Docker