أفضل بدائل Firecrawl المستضافة ذاتيًا لـ VPS
قارن Draco وHound وFirecrawl ذاتي الاستضافة من حيث RAM والحاجة إلى متصفح headless وتوافق API، مع تثبيت v0.20.5 وربط MCP.
ما الذي يجب أن يفعله بديل Firecrawl المستضاف ذاتياً
تتمثل مهمة بديل Firecrawl المستضاف ذاتياً في أخذ URL وإرجاع الصفحة بصيغة Markdown نظيفة يستطيع الوكيل قراءتها. تفرض واجهات API المستضافة رسوماً على كل صفحة، لذلك تزداد الفاتورة كلما زادت رغبة وكيلك في الاستكشاف. ويمكن لـVPS تدفع تكلفته مسبقاً تنفيذ العمل نفسه. تختلف المشاريع حول سؤال واحد: هل يجب تشغيل headless browser، أي محرك متصفح فعلي يعمل دون نافذة، على خادمك؟
تحدد الإجابة حجم الذاكرة، وتكلفة كل صفحة، والصفحات التي تعود فارغة. يقارن هذا الدليل بين Draco وHound وإصدار Firecrawl المستضاف ذاتياً، ويثبّت أخفها بإصدار محدد، ثم يربطه بوكيل عبر MCP (بروتوكول سياق النموذج).
المشاريع الأربعة، وماهية كل مشروع فعلياً
Draco ملف ثنائي واحد مكتوب بلغة Rust، ومرخّص بموجب MIT أو Apache-2.0. نُشر الإصدار v0.20.5 في 16 July 2026. يطبع draco scrape <url> مستندات Markdown إلى stdout. ويشغّل draco serve خدمة daemon تستجيب على 127.0.0.1:3002، وهو المنفذ الذي يستخدمه Firecrawl. لا يوفّر صورة حاوية، ولا يشغّل متصفحاً.
Firecrawl self-hosted هو المحرك الذي يقف خلف المنتج المستضاف، ومرخّص بموجب AGPL-3.0. يعرّف docker-compose.yaml سبع خدمات: playwright-service وapi وredis وrabbitmq وnuq-postgres وfoundationdb وfoundationdb-init. تحصل على قائمة انتظار الزحف الفعلية، مقابل تشغيل نظام موزّع صغير.
يوجد Hound في مستودع master-fetch، ويُنشر على PyPI باسم hound-mcp، وهو مرخّص بموجب MIT، وإصداره 13.0.1 في 3 August 2026. يحتاج إلى Python 3.11 أو أحدث. وهو خادم MCP أولاً وأداة جلب ثانياً: يحاول استخدام HTTP العادي، ولا يشغّل متصفح Patchright إلا عندما تعود عملية الجلب العادية محظورة.
يوجد Trawl هنا لأن المستخدمين يصادفونه أثناء البحث عن المشاريع الأخرى، ولأنه يؤدي وظيفة مختلفة. يحل تحديات JavaScript واختبارات CAPTCHA باستخدام Firefox معدّل البصمة، بديلاً عن FlareSolverr في مكدس وسائط *arr. وليس أداة لاستخراج Markdown. يوضّح القسم التالي حول آداب الاستخدام سبب كون هذا الفرق حاسماً في تحديد ما إذا كان ينتمي إلى مكدس الوكيل لديك أصلاً.
لماذا يتسبب تجمع المتصفحات في تعطل خوادم VPS الصغيرة
كل علامة تبويب متصفح مفتوحة هي عملية عرض مستقلة تحتفظ بمستند DOM (نموذج كائن المستند) وبكومة JavaScript خاصة بها. لذلك تتناسب الذاكرة مع عدد الصفحات المفتوحة في اللحظة نفسها، لا مع عدد الصفحات التي جرى جلبها يومياً. يحدد مشروعان من هذه المشاريع هذا الاستهلاك في ملفات compose الخاصة بهما.
The data behind this chart
[
{
"label": "Firecrawl api",
"memory_limit_gb": 8
},
{
"label": "Firecrawl playwright",
"memory_limit_gb": 4
},
{
"label": "Hound (browser included)",
"memory_limit_gb": 3
}
]يحدد ملف compose الخاص بـFirecrawl حداً أقصى لذاكرة حاوية api مقداره 8 GB، ولحاوية Playwright مقداره 4 GB، مع حدود swap مطابقة. ويحدد compose الخاص بـHound مقدار 3 GB لحاوية واحدة تتضمن Chromium مضمّناً. هذه حدود قصوى اختارتها المشاريع ونشرتها، وليست قياسات لنظام خامل، كما أن Redis وRabbitMQ وPostgreSQL وFoundationDB تحتاج أيضاً إلى حصتها فوق أرقام Firecrawl.
لا يفيد تحديد حد أعلى من حجم RAM المتاح لديك. عندما تنفد موارد الخادم، ينهي قاتل نفاد الذاكرة في النواة إحدى العمليات، فتختفي الحاوية من docker compose ps من دون تسجيل خطأ في سجل التطبيق. اقرأ dmesg -T | tail بعد أي إعادة تشغيل لا تستطيع تفسيرها. خصص 8 GB لمكدس Firecrawl الكامل، وتعامل مع 4 GB باعتبارها الحد الأدنى لخادم الاختبار. يوضَح تحديد الأرقام لكل خدمة في حدود الذاكرة في Docker Compose.
هناك تفصيل آخر متعلق بالمتصفح قد يكلّفك ساعات من العمل. يخصص Docker للحاوية 64 MB من الذاكرة المشتركة في /dev/shm، ويضع Chromium مخازن عمليات العرض هناك، لذلك قد يتعطل عند معالجة الصفحات الثقيلة. يرفع مكدسا المتصفح هذا الحد: يتضمن compose الخاص بـHound السطر shm_size: "1gb". انسخ هذا السطر إلى أي image تبنيها حول Playwright.
جودة الاستخراج في الصفحات التي تعتمد بكثافة على JavaScript
في HTML الثابت، أو مدونة تُعرَض من الخادم، أو صفحة توثيق، أو مقالة إخبارية، تكون النتائج بصيغة Markdown متقاربة جداً، وتفوز الأداة الأسرع. يظهر الفرق في الصفحات التي تُعرَض من جهة العميل، حيث يكون HTML المُرسَل مجرد هيكل فارغ، ويصل النص من JavaScript بعد التحميل.
يتدرج Draco عبر مستويات. يحلل المستوى 0 والمستوى 1 HTML من دون تشغيل JavaScript إطلاقاً. يشغّل المستوى 2 JavaScript الخاص بالصفحة داخل عزل V8 ضمن العملية، وهو محرك JavaScript من دون متصفح يحيط به. يذكر README أن كود الصفحة لا يحصل هناك على روابط إمكانات المضيف. يغطي ذلك كثيراً من تطبيقات الصفحة الواحدة بجزء من ذاكرة المتصفح. عندما يواجه Draco حاجزاً لا يستطيع تجاوزه، يخرج draco scrape بالرمز 3، needs_browser. تحقّق من ذلك في البرامج النصية، لأن الملف الفارغ مع رمز خروج يساوي صفراً هو الفشل الذي يفسد سياق الوكيل بصمت:
draco scrape https://example.com > page.md
echo "exit=$?"تستخدم خدمة playwright-service في Firecrawl متصفح Chromium حقيقياً، ولذلك تعرض ما يعرضه المتصفح. لكن الإصدار المستضاف ذاتياً ليس المنتج المستضاف نفسه: توضح الوثائق أن النسخ المستضافة ذاتياً لا تصل إلى Fire Engine، ولذلك لا تتوفر فيها إمكانات منع الحظر وتدوير عناوين IP الخاصة بالخدمة السحابية، كما أن نقطتي النهاية /agent و/browser غير مدعومتين. يقع Hound بين الخيارين عن قصد. فهو يجلب المحتوى عبر HTTP ويصعّد المعالجة لكل طلب، ويُغلِق متصفحه الدافئ بعد مهلة خمول، ولذلك يبقى الخادم الهادئ قريباً من خط الأساس.
ثبّت Draco بإصدار محدد
يوثّق ملف README مُثبّتاً يعمل بسطر واحد. اقرأ ما يفعله قبل تمريره إلى shell: فهو يثبّت البرنامج في $HOME/.draco/bin/draco، ويأخذ دائماً إصدار latest، ولا يتحقق من أي توقيع أو hash. على الخادم، حدّد الإصدار وتحقق من التنزيل.
cd /tmp
curl -fsSLO https://github.com/0xchasercat/draco/releases/download/v0.20.5/draco-linux-x86-64.tar.gz
curl -fsSLO https://github.com/0xchasercat/draco/releases/download/v0.20.5/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMSيطبع ذلك draco-linux-x86-64.tar.gz: OK. يعني سطر FAILED أن وحدات البايت التي لديك ليست الوحدات التي نشرها المشروع، لذا احذفها وابدأ من جديد.
mkdir -p draco-v0.20.5
tar -xzf draco-linux-x86-64.tar.gz -C draco-v0.20.5
sudo install -m 755 "$(find draco-v0.20.5 -type f -name draco | head -n1)" /usr/local/bin/draco
draco scrape https://example.comيطبع الأمر الأخير صفحة المثال بصيغة markdown خلال أقل بكثير من ثانية. إن find ليس للزينة: فبنية الأرشيف ليست جزءاً من العقد العام للمشروع، والمُثبّت الرسمي يحدد موقع الملف التنفيذي بالطريقة نفسها.
شغّل daemon باستخدام حساب خاص به بدلاً من مستخدم تسجيل الدخول الخاص بك. اكتب /etc/systemd/system/draco.service:
[Unit]
Description=Draco fetch daemon
After=network-online.target
Wants=network-online.target
[Service]
User=draco
ExecStart=/usr/local/bin/draco serve --host 127.0.0.1 --port 3002 --max-concurrency 4
Restart=on-failure
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
[Install]
WantedBy=multi-user.targetsudo useradd --system --no-create-home --shell /usr/sbin/nologin draco
sudo systemctl daemon-reload
sudo systemctl enable --now draco
curl -s http://127.0.0.1:3002/healthيستجيب /health فور بدء daemon في الاستماع. ويعني Connection refused أنه لا يستمع، لذا اقرأ journalctl -u draco -n 50. السبب المعتاد هو وجود عملية أخرى تشغل المنفذ 3002، لأن هذا هو أيضاً المنفذ الافتراضي لـFirecrawl، ويغيّر --port أحدهما. لمزيد من التفاصيل حول ملفات الوحدات: وحدات خدمة systemd والمؤقتات.
نفّذ الآن الجلب بالطريقة التي سيستخدمها وكيلك:
curl -X POST http://127.0.0.1:3002/v1/scrape \
-H 'content-type: application/json' \
-d '{"url": "https://example.com", "formats": ["markdown"]}'أبقِ برنامج fetch بعيداً عن الإنترنت العام
تُعد واجهة fetch API التي لا تستخدم مصادقة وكيلاً مفتوحاً. يمكن لأي شخص يستطيع الوصول إلى المنفذ أن يجعل خادمك يطلب أي عنوان URL تحت عنوان IP الخاص بك، وستصل بلاغات إساءة الاستخدام إلى مزود الخدمة لديك، لا إلى ذلك الشخص. تتضمن أعلام serve الموثقة في Draco عدم استخدام مفتاح API، لذلك يجب أن توفر الشبكة الحماية. أبقِ إعداد الربط الافتراضي 127.0.0.1 عندما يعمل العامل على الخادم نفسه. وعندما يعمل العامل على خادم آخر، ضع الطرفين داخل نفق خاص؛ ويكون شبكة WireGuard VPN تستضيفها بنفسك هي الخيار المعتاد، واربط الخدمة بعنوان النفق بدلاً من 0.0.0.0. ثم تحقّق من جهاز آخر من أن عنوان IP العام لا يستجيب لأي شيء. يشرح كل من أساسيات جدار الحماية ufw وحسابات المستخدمين ذات أقل قدر من الصلاحيات نصفي هذه الحماية.
هل سيتغير رمز وكيلك؟ توافق API عملياً
يستجيب Draco لمسارات Firecrawl v1 التالية: /v1/scrape و/v1/map و/v1/crawl و/v1/batch/scrape و/v1/search، ويذكر ملف README الخاص به أنّه يقبل الحقول غير المعروفة ويتجاهلها. إذا كان وكيل يعمل مسبقاً على إرسال الطلبات إلى /v1/scrape، فكل ما يحتاج إليه هو عنوان URL أساسي جديد. انتبه إلى ما تغيّر في الجانب الآخر: تختبر صفحة الاستضافة الذاتية الخاصة بـ Firecrawl الآن باستخدام /v2/crawl، بينما تستخدم حزم SDK الحالية الإصدار v2. لذلك، يطلب عميل v2 موجّه إلى Draco مساراً لا ينشره Draco. اختبر كل استدعاء باستخدام curl قبل تعديل رمز الوكيل، واقرأ نص JSON بدلاً من الاكتفاء برمز الحالة، لأن أسماء الحقول هي موضع الاختلاف بين هذه التطبيقات.
Robots.txt وحدود معدل الطلبات والحد الذي يجب عدم تجاوزه
يقرأ Draco ملف robots.txt افتراضياً، ويعطّل --ignore-robots ذلك. وتوثّق Firecrawl الإعداد الافتراضي نفسه. اترك الخيارين كما هما. ثم حدّد معدل الطلبات بنفسك: يضع --delay فاصلة زمنية بالمللي ثانية بين الطلبات، بينما يحدّد --max-concurrency عدد المهام المتوازية، مع استخدام 8 كإعداد افتراضي للخدمة. يكون استخدام قيم من 2 إلى 4 ألطف على اتصال VPS مشترك، ونادراً ما يكون أبطأ إجمالاً، لأن الموقع الذي يبدأ بفرض حدود على معدل طلباتك يستهلك دقائق أكثر من الوقت الذي وفّرته زيادة التوازي. خزّن ما تجلبه مؤقتاً، حتى لا تكلّف إعادة تشغيل الوكيل المصدرَ شيئاً. وهذا أيضاً أرخص بند في التحكم في تكلفة وكيل الذكاء الاصطناعي عليك.
تحديات التحقق موضوع منفصل، وقد صُمّم Trawl للتعامل تحديداً مع Cloudflare Turnstile وreCAPTCHA وhCaptcha وGeeTest. تعني صفحة التحدي، بوضوح، أن الموقع يرفض حركة المرور المؤتمتة. تجاوزها يضعك في مخالفة شروط استخدام الموقع، وقد يضعك في بعض الأماكن في مخالفة القانون أيضاً؛ لذلك يغطّي هذا الدليل البنية التحتية لجلب البيانات ويتوقف عند ذلك. التقنيات نفسها التي تتجاوز صفحة التحدي هي التي يراقبها مالكو المواقع ويحظرونها، ما يجعل أي خط أنابيب يعتمد عليها هشاً ومسيئاً في الوقت نفسه. عندما يكون المصدر مهماً إلى هذا الحد، ابحث عن موجز RSS الخاص به، أو واجهة API العامة، أو تصدير جماعي للبيانات. تشغيل كل خيار من هذه الخيارات أقل تكلفة، ولا يتعطل أيٌّ منها في الأسبوع الذي يغيّر فيه الموقع صفحة التحدي.
وصّلها بعامل عبر MCP
يعمل MCP (بروتوكول سياق النموذج) كواجهة يستخدمها العامل لاستدعاء أداة. يتضمن Draco خادم MCP في الملف التنفيذي نفسه، عبر stdio:
{ "mcpServers": { "draco": { "command": "draco", "args": ["mcp"] } } }تظهر الأدوات للعامل باسم draco_scrape وdraco_search ومجموعة draco_interact_*. لا يعمل stdio إلا عندما تكون عملية العامل والملف التنفيذي على الجهاز نفسه، لأن النقل يستخدم الإدخال القياسي لتلك العملية. إذا كان العامل يعمل على مضيف آخر، فإن Hound يوفّر MCP عبر HTTP بدلاً من ذلك: ينشر hound --http --host 127.0.0.1 --port 8765 نقطة نهاية على http://127.0.0.1:8765/mcp، ويمكنك الوصول إليها عبر النفق. تجد خيارات النقل وما يجب تعريضه في تشغيل خوادم MCP على VPS.
جلب الأزواج باستخدام البحث. العامل الذي يستطيع الجلب فقط ينتظر منك تزويده بعناوين URL. أضف مثيلاً ذاتي الاستضافة من بحث SearXNG، وسيتمكن من العثور عليها بنفسه، بالطريقة نفسها التي تعمل بها مهارة البحث في المتصفح المبنية على SearXNG. بعد تشغيل البرنامج الخدمي، يصبح خدمة مشتركة لأي من عوامل الذكاء الاصطناعي ذاتية الاستضافة التي تشغّلها.
FAQ
هل أحتاج إلى متصفح يعمل دون واجهة رسومية لجلب الصفحات لوكيل ذكاء اصطناعي؟
ليس لمعظم الصفحات. تعيد الوثائق والمدونات والمقالات الإخبارية المُنشأة على الخادم محتواها كاملاً عند استخدام جلب HTTP عادي مع خطوة تحويل HTML إلى Markdown، وهذا ما يفعله Draco في مستوياته الدنيا بزمن يقارب 300 ms لكل صفحة دون متصفح، وفق أرقام المشروع نفسه. يصبح المتصفح ضرورياً للتطبيقات التي تُنشئ المحتوى على العميل، حيث تكون HTML المُرسلة مجرد هيكل فارغ. يغطي عزل V8 في Draco جزءاً كبيراً من هذه الحالات دون تشغيل عملية متصفح، ويخرج برمز 3، needs_browser، عندما يتعذر عليه ذلك.
ما مقدار RAM الذي يحتاج إليه Firecrawl المستضاف ذاتياً على VPS؟
يحدد ملف compose سقفاً قدره 8 GB لحاوية api، و4 GB لحاوية Playwright. كما يشغّل المكدس نفسه Redis وRabbitMQ وPostgreSQL وFoundationDB. خطط لتوفير 8 GB. على خادم بسعة 2 GB، ينهي قاتل نفاد الذاكرة في النواة الحاويات أثناء الحمل، وتكون أول علامة على ذلك حاوية أُعيد تشغيلها في docker compose ps من دون معلومات مفيدة في سجل التطبيق، لذا أكّد الحالة باستخدام dmesg -T | tail.
هل يُعد Draco بديلاً مباشراً لواجهة Firecrawl API؟
هو قريب من ذلك بالنسبة إلى نقاط النهاية v1. فهو يوفّر /v1/scrape و/v1/map و/v1/crawl و/v1/batch/scrape و/v1/search، ويتجاهل حقول الطلب التي لا يعرفها. لذلك يحتاج العميل المكتوب لـFirecrawl v1 عادةً إلى تغيير عنوان الأساس فقط. لكنه ليس المنتج المستضاف: لا توجد خلفه مجموعة Proxy مُدارة، كما أن مسارات Firecrawl الأحدث من v2 ليست ضمن الواجهة المتاحة. تحقّق أولاً من كل استدعاء يجريه وكيلك باستخدام curl.
هل يعني استضافة أداة الكشط ذاتياً أنني أستطيع تجاهل robots.txt؟
لا. لا يغيّر مكان تشغيل الشيفرة شيئاً مما نشره الموقع أو مما تسمح به شروطه. يحترم كل من Draco وFirecrawl ملف robots.txt افتراضياً، ويوجد خيار التجاوز للمواقع التي تملكها أو التي منحتك إذناً خطياً لكشطها. تُفرض حدود المعدل في الطرف البعيد على أي حال، لذا فإن استخدام --delay بطريقة مهذبة مع خفض التزامن يحافظ على عمل عنوان IP الخاص بك. المكدس الذي لا يعمل إلا عبر تجاوز جدار التحديات هو مكدس سيتوقف دون إنذار.