تشغيل DisPatch وأدوات الذكاء الاصطناعي الخاصة بي في Docker: ملف واحد، أمر واحد

تاريخ النشر
19 أكتوبر 2026
تاريخ التحديث
19 أكتوبر 2026
بقلم
جاكوب لويد — كُتب بمساعدة الذكاء الاصطناعي بعد إنجاز المشروع
مدة القراءة
قراءة 5 دقيقة

بعبارة مبسطة: DisPatch هو تطبيق دردشة يمكنك تشغيله على جهازك والوصول إليه من أي هاتف أو حاسوب محمول في المنزل. Docker برنامج مجاني يُشغل البرامج مثل هذا داخل بيئة معزولة، لذا لا تحتاج إلى تثبيت Python أو أي شيء آخر يدويًا. هذه الصفحة ستساعدك على الوصول من الصفر إلى تطبيق دردشة ذكاء اصطناعي يعمل باستخدام ملف نصي صغير وأمر واحد، ويمكنه تشغيل نموذج ذكاء اصطناعي صغير على معالج جهازك، بحيث لا تحتاج إلى أي حساب أو مفتاح API.

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

كل الأوامر المذكورة هنا هي تلك التي نفذتها يوم 19 أكتوبر 2026. لا يوجد لدي على هذا الجهاز Docker Desktop، لذا استخدمت Podman 5.8 مع Docker Compose 5.6 على نظام لينكس. الأوامر واحدة؛ وحيثما احتاج Podman إلى شيء إضافي، سأوضح ذلك في القسم الفني في النهاية.

خلاصة الموضوع

  • ماذا ستحصل عليه: تطبيق DisPatch للدردشة الخاص، متاح للمتصفح والهاتف، بالإضافة إلى نموذج ذكاء اصطناعي صغير اختياري؛ كل ذلك يعمل داخل حاويات على جهازك.
  • ما عليك فعله: تثبيت Docker، حفظ ملف من 26 سطراً، تنفيذ docker compose up -d، ثم فتح http://localhost:8765 والإجابة على إرشادات الإعداد المكونة من ست خطوات.
  • ما تكلفته: لا شيء. حجم صورة DisPatch يبلغ 600 ميجابايت تقريباً، وصورة خادم النموذج 860 ميجابايت، بينما يبلغ حجم النموذج نفسه 2.5 جيجابايت.
  • ما لا يفعله أبداً: لا يرسل محادثاتك إلى أي مكان لم تربطه بنفسك. مع استخدام النموذج المحلي، لا يغادر جهازك سوى طلبات الطقس والبحث على الويب التي تطلبها.
  • الحقيقة الصريحة: في تاريخ 19 أكتوبر 2026، كان DisPatch هو الصورة الوحيدة من صوري المنشورة على سجل Docker؛ أما بقية الأدوات فتُبنى من شفرة المصدر بإضافة كلمة واحدة فقط. النموذج المحلي الصغير يفي بالغرض للأسئلة اليومية، لكنه لا يصلح للاستنتاجات المعقدة.

ما الذي ستحصل عليه في النهاية

DisPatch يعمل داخل المتصفح. الشخصية الافتراضية Atlas تجيب على سؤال حول كيفية زراعة الريحان على عتبة النافذة بست نصائح مرقمة. ثم، عند سؤاله عن طقس لشبونة، يظهر إشعار صغير يفيد بإجراء بحث عن الطقس، ويليه الإجابة مع درجة الحرارة الحالية والرياح وتوقعات الأسبوع. اسم النموذج المذكور أسفل كل رد هو Qwen3 4B.
DisPatch يعمل داخل Docker، يتحدث إلى نموذج ذي 4 مليارات معلمة على معالج نفس الجهاز. الإجابة المتعلقة بالطقس استندت إلى بحث مباشر؛ والإشعار الصغير يوضح ذلك.

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

نفس محادثة DisPatch على شاشة هاتف: نهاية نصائح الريحان، سؤال الطقس، إشعار بحث الطقس والإجابة من Atlas، مع صندوق رسائل وتبويبات Bots وChats وMessages في الأسفل.
نفس المحادثة على شاشة الهاتف.

لمعرفة ما يمكن لـ DisPatch فعله أكثر من ذلك (إعداد ملفات تعريف لكل أفراد العائلة، وضعية الأطفال، عمليات النسخ الاحتياطي)، راجع مقال DisPatch 3.0. هذه الصفحة تركز على كيفية تشغيله فقط.

الخطوة الأولى: تثبيت Docker

  • نظام ويندوز أو ماك: قم بتثبيت Docker Desktop ثم شغّله مرة واحدة.
  • نظام لينكس: قم بتثبيت محرك Docker وإضافة compose، إما عبر مدير الحزم الخاص بك أو وفقاً تعليمات Docker.

للتأكد من نجاح التثبيت، افتح طرفية (PowerShell في ويندوز) وأدخل docker compose version. أي رقم إصدار يعني أنك جاهز للاستخدام.

الخطوة الثانية: إنشاء مجلد وملف واحد

أنشئ مجلداً باسم dispatch ثم احفظ فيه ما يلي تحت اسم docker-compose.yml:

services:
  dispatch:
    image: ghcr.io/laserlloyd/dispatch_chat:main
    ports:
      - "8765:8765"
    volumes:
      - dispatch-data:/data
    restart: unless-stopped
    init: true
    stop_grace_period: 30s

  # اختياري: نموذج ذكاء اصطناعي صغير يعمل على معالج جهازك، دون الحاجة لحساب.
  # احذف هذا القسم إذا كنت ستستخدم Ollama أو LM Studio أو خدمة سحابية بدلاً منه.
  model:
    image: ghcr.io/ggml-org/llama.cpp:server-b11723
    command: ["-hf", "unsloth/Qwen3-4B-Instruct-2507-GGUF:Q4_K_M", "--jinja",
              "--host", "0.0.0.0", "--port", "8080", "--ctx-size", "8192"]
    environment:
      LLAMA_CACHE: /models
    volumes:
      - model-files:/models
    restart: unless-stopped

volumes:
  dispatch-data:
  model-files:

هناك خدمتان. dispatch هو تطبيق الدردشة. أما model فهو خادم llama.cpp الذي يقوم بتنزيل نموذج Qwen3 4B Instruct (حجمه 2.5 جيجابايت) عند أول تشغيل ويحتفظ به. تُخزن محادثاتك في وحدة تخزين باسم dispatch-data، وهي تبقى موجودة حتى بعد التحديثات وإعادة التشغيل.

"8765:8765" يسمح لأجهزة أخرى على شبكتك بالوصول إلى DisPatch، وهو ما تريده لدردشة عائلية. إذا كنت ترغب في استخدامه فقط على جهازك حالياً، اكتب "127.0.0.1:8765:8765" بدلاً من ذلك.

الخطوة الثالثة: تشغيله

في طرفية، داخل مجلد dispatch:

docker compose up -d
docker compose ps

في المرة الأولى، يقوم النظام بتنزيل الصورتين والنموذج، لذا انتظر بضع دقائق. على جهازي، أجاب DisPatch بعد 5 ثوانٍ من وصول صورته، بينما استغرق خادم النموذج حوالي 20 ثانية لتنزيل النموذج وتحميله على سرعة اتصالي. يجب أن تظهر كلمة Up بجانب كلا الخدمتين عند تنفيذ docker compose ps.

الخطوة الرابعة: إنشاء حسابك

افتح http://localhost:8765 في المتصفح. يظل DisPatch مغلقاً حتى يتم تعيين مالك له، وبما أنه يعمل داخل حاوية فإنه يطلب رمز إعداد لمرة واحدة. اقرأه من السجل:

docker compose logs dispatch | grep "SETUP TOKEN"

إذا لم يتوفر grep (في ويندوز)، نفذ docker compose logs dispatch ثم ابحث عن السطر الذي يبدأ بـ SETUP TOKEN:. يتغير هذا الرمز في كل مرة يتم فيها تشغيل DisPatch، ويتوقف عن العمل بمجرد إنشاء المالك.

الخطوة الأولى من إرشادات الإعداد: حسابك. اسم المستخدم Ada، كلمة مرور أُدخلت مرتين، رقم تعريف شخصي اختياري فارغ، وقسم مفتوح بعنوان 'إعداد من جهاز آخر' يحتوي على الرمز المطلوب. زر 'إنشاء حساب' في الأسفل.
الخطوة الأولى من أصل 6. اكتب اسماً وكلمة مرور، ثم افتح قسم 'إعداد من جهاز آخر؟' والصق الرمز هناك.

يجب أن تتضمن كلمة المرور 8 أحرف على الأقل. رقم التعريف الشخصي اختياري ويُستخدم لفتح التطبيق بسرعة. إذا قمت بتعيينه، يكتب DisPatch رمز استعادة في ملفه، ويجب عليك نسخه في مكان آمن:

docker compose exec dispatch cat /data/RECOVERY-CODE.txt

الخطوة الخامسة: ربط الذكاء الاصطناعي

الخطوة الثانية من الإرشادات تبحث عن خادم نموذج على نفس الجهاز. لكن داخل Docker لا يمكنه العثور على الخدمة model تلقائياً، لذا اكتبها يدوياً:

الخطوة الثانية من الإرشادات: النموذج. اكتب 'OpenAI-compatible'، العنوان http://model:8080/v1، لا تضع مفتاح API، والنموذج الافتراضي unsloth/Qwen3-4B-Instruct-2507-GGUF:Q4_K_M. تحت زر 'اختبار وحفظ' تظهر عبارة خضراء تشير إلى وجود نموذج واحد، زمن الاستجابة 14 مللي ثانية، وهو خادم متوافق مع OpenAI، ويستخدمه Atlas الآن.
اكتب 'OpenAI-compatible'، العنوان http://model:8080/v1، لا تضع مفتاح API، واسم النموذج المطلوب. يجب أن يعود زر 'اختبار وحفظ' باللون الأخضر.
المربعما يجب كتابته
النوعOpenAI-compatible
العنوانhttp://model:8080/v1
مفتاح APIاتركه فارغاً
النموذج الافتراضيunsloth/Qwen3-4B-Instruct-2507-GGUF:Q4_K_M

هل ترغب في استخدام نموذج سحابي بدلاً من ذلك؟ اختره في المربع ذاته وضَع مفتاحك. لقد جربت ذلك مع مزود سحابي متوافق مع OpenAI: عاد زر 'اختبار وحفظ' بقائمة النماذج المتاحة، وأجاب Atlas بناءً على تلك البيانات. يُخزن هذا المفتاح في بيانات DisPatch نفسه، وليس في ملف التكوين.

الخطوة السادسة: إنهاء الإعداد وتحية النظام

الخطوات المتبقية سريعة. الصوت هو إضافة منفصلة يمكنك تخطيها. قسم العائلة يضيف أفراداً آخرين (يمكنك فعل ذلك لاحقاً). شبكة الاتصال تسأل عن الأشخاص الذين يمكنهم الوصول إلى DisPatch: اختر نفس الإجابة التي وضعتها في الخطوة الثانية بخصوص المنفذ.

الخطوة السادسة: الإنجاز. علامات صح أمام حساب المالك، ربط النموذج ومن يستطيع الوصول إلى DisPatch؛ علامات ناقصة أمام الصوت والعائلة؛ دوائر مفتوحة أمام النسخ الاحتياطي المشفر ورمز الاستعادة المحفوظ. زر 'إنهاء' في الأسفل.
الخطوة الأخيرة هي قائمة توضح ما تم إنجازه وما هو اختياري.

<pاضغط على إنهاء. إذا ظلت صفحة الإعداد تعرض نموذج 'إنشاء حساب مالك' بعد ذلك، أعد تحميل الصفحة. هذه مشكلة عرضية في النسخة الحالية (تم إنشاء الحساب بالفعل؛ لكن النموذج القديم يظل ظاهراً). ثم اختر Atlas من القائمة اليسرى، اضغط على + لبدء محادثة جديدة واطرح عليه سؤالاً.

لاستخدامه من هاتف على نفس شبكة الواي فاي، افتح http://<your computer's address>:8765. التثبيت على الشاشة الرئيسية والإشعارات والميكروفون تتطلب بروتوكول HTTPS، وهو ما يشرحه القسم الفني لاحقاً.

<pهذا كل ما يتعلق بالإعداد. ما يلي هو للأشخاص الذين يرغبون في معرفة المزيد، أو حماية بياناتهم، أو إضافة أدواتي الأخرى.

كيف تتناسق هذه المكونات

يُشغَّل صورة DisPatch كمستخدم عادي (uid 1000)، وليس كمستخدم root. كل ما يكتبه يتم حفظه في /data، وهو عبارة عن وحدة التخزين dispatch-data: قاعدة بيانات SQLite، الملفات المرفوعة، الصور الشخصية، الإعدادات، بالإضافة إلى نسخه الاحتياطية التي يتم إنشاؤها كل ست ساعات. إذا أزلت الحاوية فلن يُفقد شيء؛ لكن إذا أزلت وحدة التخزين فسيُفقد كل شيء.

تتبع علامة الصورة main الفرع الرئيسي في مستودع DisPatch. العلامات المنشورة بتاريخ 2026-10-19 هي main بالإضافة إلى علامة واحدة من نوع sha-<commit> لكل عملية بناء؛ ولا توجد حالياً أي علامات تحتوي على أرقام إصدارات. إذا كنتم ترغبون في الحفاظ على الصورة دون تحديثها، فاستخدموا علامة من نوع sha- من خلال صفحة الحزمة. تتوفر صور للنظامين 64-bit Intel/AMD وARM؛ أنا قمت بتشغيل النسخة المخصصة لـ Intel/AMD.

بياناتك: احفظها، استعدها، وحدّثها بأمان

قم أولاً بإيقاف تشغيل برنامج DisPatch حتى يتم كتابة قاعدة البيانات بالكامل، ثم انسخ محتويات الحجم إلى ملف:

docker compose stop dispatch
docker run --rm -v dispatch_dispatch-data:/data:ro -v "$PWD":/backup alpine \
  tar czf /backup/dispatch-backup.tgz -C /data .
docker compose start dispatch

يقوم برنامج Compose بتسمية الحجم وفقًا لاسم المجلد؛ فالمجلد المسمى dispatch ينتج عنه اسم dispatch_dispatch-data. كما أن الأمر docker volume ls يعرض الاسم الفعلي للحجم. وقد أنتج تثبيتي التجريبي، الذي شمل عددًا قليلًا من المحادثات، ملفًا بحجم 3.7 ميجابايت.

للاستعادة على وحدة تخزين جديدة (لقد قمت باستعادتها وأطلقت نسخة ثانية من DisPatch عليها؛ نفس المالك ونفس الـ 8 رسائل):

docker volume create dispatch_dispatch-data
docker run --rm -v dispatch_dispatch-data:/data -v "$PWD":/backup:ro alpine \
  sh -c 'tar xzf /backup/dispatch-backup.tgz -C /data && chown -R 1000:1000 /data'
docker compose up -d

لا تقم بنسخ ملف chats.db بمفرده من خارج حاوية قيد التشغيل؛ فالرسائل الحديثة تظل موجودة في الملف chats.db-wal المجاور له حتى يتوقف تشغيل برنامج DisPatch.

عملية التحديث تتطلب تنفيذ أمرين. لقد نفذت أوامر docker compose down، وpull، وup -d على تثبيت يحتوي بالفعل على بيانات؛ وظل مالك الحساب وجميع الرسائل كما هم، دون ظهور أي رمز إعداد جديد.

docker compose pull
docker compose up -d

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

الإعدادات الأمنية الافتراضية، والإعداد الوحيد الذي يجب التحقق منه

  • يظل النظام مقفلاً حتى يتم إنشاء مالك له. إلى أن تُكمل الخطوة الأولى من المعالج، فإن الشبكة ترى صفحة تسجيل الدخول فقط، وإنشاء المالك يتطلب استخدام الرمز المميز الناتج عن سجل النظام.
  • الزوار الذين لا يسجلون الدخول يحصلون على طريقة العرض المقيدة. لقد فاجأني هذا أثناء الاختبار: من متصفح لم يقم بعملية تسجيل دخول قط، تمكنت من فتح Atlas والحصول على ردود. هذا جزء من تصميم DisPatch 3.0 (يُعامل الضيف كملف تعريف مقيد للأطفال، ويُسمح له بـ 200 رد يومياً)، لكن تلك الردود تستخدم اتصال الذكاء الاصطناعي الخاص بك. إذا كان DisPatch يعمل على شبكتك مع مفتاح سحابي مدفوع، فقم بتغيير الإعدادات إلى: الإعدادات → جميع الإعدادات → الأشخاص والملفات الشخصية → "جهاز لم يقم بعملية تسجيل دخول" لتصبح صفحة تسجيل الدخول فقط.
  • من يمكنه الوصول إليه يتحدد بناءً على سطر المنفذ. "8765:8765" يمثل الشبكة بأكملها؛ بينما "127.0.0.1:8765:8765" يقتصر على هذا الكمبيوتر فقط. أما الحاوية نفسها، فهي دائماً تستمع إلى جميع العناوين ضمن شبكتها الداخلية.
  • تفعيل HTTPS هو قرارك أنت. يحتوي ملف docker-compose.yml الخاص بالمستودع على بروكسي Caddy اختياري (--profile proxy) لإعداد اسم مضيف حقيقي مع شهادات أمان؛ لم أقم باختباره في هذه الجولة. إذا استخدمت nginx كبروكسي، فاحرص على إبقاء proxy_set_header Host $host;، وإلا فإن الدردشة ستُفتح لكنها لن تحدث تحديثات بعد ذلك (لأن DisPatch يتحقق من أن مصدر المتصفح يتطابق مع قيمة رأس Host).
  • خادم النماذج لا يحتوي على مفتاح. لم يتم تحديد منفذه في الملف أعلاه، لذا لا يمكن الوصول إليه إلا عبر DisPatch. لا تقم بإضافة سطر ports: إلى القسم model إلا إذا قمت أيضاً بتزويد llama.cpp بمفتاح --api-key.

الدليل الكامل لاستخدام Docker مع DisPatch، والذي يتضمن إعدادات bind mounts ومعرفات المستخدمين بالإضافة إلى تكامل الوكيل الذي لا يعمل بشكل جيد داخل الحاوية، موجود في ملف docs/deploy-docker.md ضمن المستودع.

إضافة أدواتي الأخرى

كل أداة من أدواتي الأخرى تحتوي على ملف deploy/compose/compose.yml في مستودعها. صور الحاويات الخاصة بها لم تُنشر بعد في أي سجل، لذا يجب عليك استنساخ المستودع وإضافة خيار --build. استغرقت عملية البناء دقيقة واحدة أو أقل هنا، حيث كانت الصور الأساسية مُحملة مسبقًا. لقد قمت ببناء وتشغيل كل أداة من هذه الأدوات بعد استنساخها من GitHub في تاريخ 19 أكتوبر 2026:

الأداةما هي؟الصورةالمنفذماذا قمت بفحصه؟
DisPatchتطبيق الدردشةتم نشره، حجمه 599 ميجابايت8765كل ما ذُكر أعلاه
MailForgeمساعد بريد إلكتروني لا يرسل رسائل من تلقاء نفسه أبدًاتم بناؤه، حجمه 420 ميجابايت8090يُفتح لوحة التحكم، ولا يوجد صندوق بريد متصل
InfoForge + kiwixأداة للبحث في ويكيبيديا دون اتصال بالإنترنت لتزويد الذكاء الاصطناعي بالمعلوماتتم بناؤه، حجمه 128 ميجابايت، بالإضافة إلى kiwix بحجم 66 ميجابايتلا يوجد (kiwix على المنفذ 8090)doctor و search ضمن ملف ويكيبيديا الذي حجمه 23 ميجابايت
ThemeForgeصفحة معاينة للأنماطتم بناؤه، حجمه 13.8 ميجابايت8185تُفتح الصفحة بشكل طبيعي
StudioForgeخادم تشغيل نماذج الذكاء الاصطناعي باستخدام وحدة معالجة الرسوماتتم بناؤه، حجمه 568 ميجابايت (باستخدام Vulkan)1234، 8080، 1235قام بتشغيل نموذج على وحدة معالجة الرسومات المدمجة من AMD؛ انظر أدناه
CrucibleForgeأداة لقياس أداء النماذجتم بناؤه، حجمه 129 ميجابايت8777يبدأ التشغيل ويُفتح؛ لم يتم إجراء أي اختبارات أداء
TransForgeأداة ترجمة المواقع الإلكترونيةتم بناؤهلا يوجدلم يتم اختباره في هذه الجولة

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

MailForge

يقوم MailForge بتشفير كلمات مرور صناديق البريد باستخدام كلمة مرور رئيسية تختارها أنت؛ لا يمكن استعادة هذه الكلمة المرور لذا يُفضل حفظها في مدير كلمات المرور. كما يجب توجيه المتغير LLM_BASE_URL إلى خادم النموذج الخاص بك (العنوان 192.0.2.10 في المثال يمثل هذا الخادم)، إذ أن الإعداد الافتراضي هو المنفذ رقم 1234 على مضيف Docker، وكل ما يتم الرد به من ذلك الخادم سيُستخدم لتلبية طلبات MailForge.

git clone https://github.com/LaserLloyd/MailForge.git
cd MailForge
read -rsp 'MailForge keyring passphrase: ' MAILFORGE_KEYRING_PASSWORD; export MAILFORGE_KEYRING_PASSWORD
LLM_BASE_URL=http://192.0.2.10:1234/v1 \
  docker compose -f deploy/compose/compose.yml up -d --build
docker compose -f deploy/compose/compose.yml logs app | grep "MailForge UI"

ستجد في سجلات التشغيل عنوانًا من نوع http://127.0.0.1:8090/?token=…؛ افتحه في متصفحك.

لوحة تحكم MailForge في المتصفح بعد التثبيت؛ جميع العدادات الخاصة بالرسائل الواردة وغير المقروءة والتي تحتاج إلى رد وإجراءات لازمة ومسودات الذكاء الاصطناعي تظهر كـ 0، كما توجد أزرار لكتابة رسالة وفتح صندوق البريد، بالإضافة إلى أقسام فارغة للرسائل التي تحتاج إلى رد والرسائل الحديثة، وشريط علوي يوضح أن الموافقة البشرية ضرورية وأنه لا يتم إرسال أي شيء دون تدخلك، بالإضافة إلى عدم وجود صناديق بريد مُعدّة بعد.
واجهة MailForge بعد التثبيت على Docker وقبل إضافة أي صندوق بريد.

InfoForge والويكيبيديا دون اتصال بالإنترنت

قم بوضع ملف .zim من مكتبة Kiwix في المسار deploy/compose/zims/ وأطلق عليه اسم infoforge.config.yaml (انسخه من ملف infoforge.config.example.yaml). لقد استخدمت ملف "Chemistry by Wikipedia" الصغير الذي يبلغ حجمه 23 ميجابايت للاختبار.

git clone https://github.com/LaserLloyd/InfoForge.git
cd InfoForge/deploy/compose
docker compose up -d kiwix
docker compose --profile cli build infoforge
docker compose --profile cli run --rm infoforge doctor
docker compose --profile cli run --rm infoforge search "noble gas"

عملية البحث تعمل دون الحاجة إلى أي نموذج ذكاء اصطناعي على الإطلاق:

[1] Noble Gas  (score 19.0, 4222 chars)
[2] Gas  (score 16.0, 1586 chars)
[3] Noble gas compound  (score 10.5, 2045 chars)

يتطلب الأمر استخدام infoforge ask وجود خادم نماذج ذكاء اصطناعي في الحقل base_url؛ وباستخدام عنوان افتراضي، فإن أمر doctor يجتاز جميع الاختبارات باستثناء اختبار "llm primary"، وهو أمر صحيح تمامًا.

ThemeForge

git clone https://github.com/LaserLloyd/ThemeForge.git
cd ThemeForge
docker compose -f deploy/compose/compose.yml up -d --build

بعد ذلك، افتح http://localhost:8185.

صفحة عينة من ThemeForge باستخدام لوحة الألوان Daylight: أزرار تغيير الألوان في الأعلى، ثم مفاتيح تبديل وصناديق اختيار وأزرار راديو وتبويبات في حالات التشغيل والإيقاف والاختيار والمعطلة، بالإضافة إلى صف من أنماط الأزرار وحقول نموذجية بها خطأ، وعدة عينات ألوان.
صفحة العينة الخاصة بـ ThemeForge داخل الحاوية التي حجمها 13.8 ميجابايت.

خادم نماذج الرسومات: StudioForge

StudioForge هو خادم النماذج الخاص بي. يقوم بتشغيل النماذج على بطاقة الرسومات، ويدعم عدة نماذج وعدة عملاء، ومنذ الإصدار 2.0 أصبح يتطلب حساب مالك ومفتاح API لكل عميل. لم يتم رفع صورة الحاوية الخاصة به إلى أي سجل حتى الآن، لذا سنقوم ببنائها في هذه المرحلة.

كنت أتوقع أن أذكر هنا "بطاقة NVIDIA فقط". إلا أن الكمبيوتر المصغر الذي اختبرته لا يحتوي على بطاقة NVIDIA، بل فقط معالج رسومات Radeon المدمج من AMD في معالج Ryzen AI 9 365. ومع ذلك، قمت ببناء صورة الحاوية التي تستخدم Vulkan، ثم مررت لها بطاقة الرسومات، فنجح الأمر: قام StudioForge بتنزيل محرك llama.cpp المُعد مسبقًا من GitHub عند أول تشغيل، واختبره، ثم قدم خدمة Qwen3 4B مع تحميل جميع طبقات النموذج على بطاقة الرسومات بمعدل 23 إلى 28 رمزًا في الثانية. للمقارنة، الخدمة model التي تعمل فقط على المعالج حققت مع نفس النموذج سرعة 22 رمزًا في الثانية؛ لذا على هذا المعالج تُخفف بطاقة الرسومات من عبء العمل عن المعالج أكثر مما تسرع استجاباته.

لوحة التحكم الخاصة بـ StudioForge 2.0.1، علامة التبويب Overview: بطاقة رسومات واحدة من نوع AMD Radeon المدمجة تم اكتشافها عبر Vulkan؛ حيث تُستخدم 5.68 جيجابايت من أصل 10.48 جيجابايت المتاحة؛ بالإضافة إلى محمل VRAM واحد وهو llama-server، ونموذج واحد مُحمّل هو Qwen3-4B-Instruct-2507 Q4_K_M في حالة الخمول، وقد وصل معدل إنتاج الرموز في آخر طلب إلى 22.79 رمزًا في الثانية باستخدام الإصدار b11669 من المحرك.
StudioForge يعمل داخل Docker مع بطاقة AMD المدمجة التي تم تمريرها عبر Vulkan، ويوجد نموذج واحد قيد التشغيل.
git clone https://github.com/LaserLloyd/StudioForge.git
cd StudioForge/deploy/compose
cp env.example .env
# في ملف .env: SF_BACKEND=vulkan، SF_MODELS=/path/to/your/gguf/files،
#          SF_OWNER_PASSWORD (يجب أن تكون كلمة المرور 10 أحرف أو أكثر)،
#          SF_VIDEO_GID و SF_RENDER_GID هما الأرقام المستخرجة من: getent group video render
docker compose -f compose.yml -f compose.vulkan.yml build
docker compose -f compose.yml -f compose.vulkan.yml up -d
docker compose -f compose.yml -f compose.vulkan.yml exec studioforge \
  studioforge keys create --name dispatch --scope inference

يُعيد الأمر الأخير طباعة مفتاح واحد فقط. توجد لوحة التحكم على http://localhost:8080 (اسم المستخدم هو owner، وكلمة المرور التي حددتها). بالنسبة لبطاقات NVIDIA، يُستخدم ملف compose.cuda.yml مع تعيين SF_BACKEND=cuda؛ لم أقم باختبار هذا المسار هنا، كما أن صورة الحاوية المخصصة لـ CUDA أكبر بكثير في الحجم.

دمج DisPatch مع StudioForge

يحتوي مستودع DisPatch على ملف deploy/compose/stack.yml الذي يشغل كلا الخدمتين ضمن شبكة واحدة ويقوم بإعداد اتصال DisPatch بـ StudioForge تلقائيًا. بشكل افتراضي، يحاول الملف سحب صورة StudioForge غير المتاحة للعامة؛ لذا يجب توجيهه إلى الصورة التي قمت ببنائها حديثًا. هذه هي الإعدادات التي أضفتها إلى ملف stack.env:

git clone https://github.com/LaserLloyd/DisPatch_Chat.git
cd DisPatch_Chat
cp deploy/compose/stack.env.example deploy/compose/stack.env
# أضف إلى ملف deploy/compose/stack.env:
#   DISPATCH_IMAGE=ghcr.io/laserlloyd/dispatch_chat:main
#   STUDIOFORGE_IMAGE=ghcr.io/laserlloyd/studioforge:2.0.1-vulkan
#   STUDIOFORGE_MODELS=/path/to/your/gguf/files
#   STACK_MODEL=<معرّف النموذج الذي يعرضه StudioForge>
#   SF_OWNER_PASSWORD (كلمة المرور الخاصة بالمالك والتي يجب أن تتكون من 10 أحرف على الأقل)

يخصص ملف التشغيل هذا وحدة معالجة رسومية من نوع NVIDIA. أما إذا كنت تستخدم بطاقات AMD أو Intel مع بروتوكول Vulkan، فقد استبدلت ذلك بملف ثانٍ صغير وهو stack-amd.yml:

services:
  studioforge:
    deploy: !reset {}
    devices: ["/dev/dri:/dev/dri"]
    group_add: ["39", "105"]   # أرقام مجموعات الفيديو والعرض لديك
docker compose -f deploy/compose/stack.yml -f stack-amd.yml \
  --env-file deploy/compose/stack.env up -d
docker compose -f deploy/compose/stack.yml -f stack-amd.yml \
  --env-file deploy/compose/stack.env exec studioforge \
  studioforge keys create --name dispatch --scope inference

بعد ذلك، أكمل إعدادات DisPatch كالمعتاد، ثم انتقل إلى قسم الإعدادات → الاتصالات، واضغط على "تحرير" بجانب اتصال StudioForge، ثم الصق المفتاح واضغط على "اختبار".

إعدادات DisPatch في علامة تبويب الاتصالات: يوجد اتصال باسم StudioForge على العنوان http://studioforge:1234/v1، وقد تم حفظ المفتاح المستخدم من قبل أداة Atlas، ويظهر مربع نتائج أخضر يفيد بوجود نموذجين متاحين ووقت استجابة قدره 14 مللي ثانية، بالإضافة إلى إصدار StudioForge وهو 2.0.1.
اتصال StudioForge الذي تم إعداده تلقائيًا بعد لصق المفتاح؛ وبعد ذلك استطاعت أداة Atlas الرد عبر StudioForge باستخدام وحدة معالجة الرسوميات.

يُستمد معرّف النموذج من تنفيذ الأمر curl -H "Authorization: Bearer <key>" http://localhost:1234/v1/models أو من علامة تبويب "النماذج" في لوحة التحكم. إذا كانت ملفات النماذج موجودة في مجلد تحميل من Hugging Face، فإن المعرّف هو مسار المجلد بأكمله؛ وهو طويل بعض الشيء لكنه يعمل بشكل جيد.

نقاط يجب الانتباه إليها

  • إعادة تحميل الصفحة بعد الإعداد. في النسخة التي اختبرتها، يظل نموذج "إنشاء حساب المالك" موجودًا على الشاشة حتى بعد إغلاق المعالج. الحساب قد تم إنشاؤه فعلاً؛ لذا أعد تحميل الصفحة.
  • المعالج لا يكتشف النموذج تلقائيًا. داخل بيئة Docker، يقوم البحث في الحاوية نفسها ولا يتفحص الخدمات الأخرى. يجب كتابة http://model:8080/v1.
  • النماذج الصغيرة ومشاكل الاستعلام. مع استخدام نموذج Qwen2.5 بسعة 1.5 مليار معلمة، كانت أداة Atlas تطبع أحيانًا سطرًا وهميًا يقول "البحث على الويب: ..." بدلًا من استدعاء الأداة المناسبة. أما النموذج ذو السعة 4 مليار معلمة الذي استخدمته فقد نفذ طلب الاستعلام عن الطقس بشكل صحيح في كل مرة؛ لذا يُفضل استخدام نماذج أكبر هنا.
  • رمز الاسترداد لا يظهر إلا إذا قمت بتعيين رمز PIN. عند استخدام كلمة مرور فقط، لن يظهر ملف RECOVERY-CODE.txt، رغم أن قائمة التحقق في المعالج تذكر وجوده.
  • أداتان تطلبان استخدام المنفذ 8090. كل من MailForge وkiwix الخاص بـ InfoForge يستخدمان المنفذ 8090 بشكل افتراضي على جهازي. عند تشغيلهما معًا، يجب تحديد HOST_PORT لـ MailForge أو KIWIX_PORT لـ kiwix.
  • البدء الأول لـ StudioForge يتطلب GitHub. يقوم البرنامج بتنزيل محرك llama.cpp عبر واجهة برمجة التطبيقات الخاصة بـ GitHub، والتي تسمح بـ 60 طلبًا مجهول الهوية في الساعة لكل عنوان IP. فشلت محاولتي الأولى بسبب تجاوز هذا الحد؛ مما جعل الصورة المصغرة التي تستخدم Vulkan تحاول بناء المحرك من المصدر، وهو أمر غير ممكن (لأنه لا يوجد برنامج git فيها)، فأظهرت رسالة can_serve: false. بعد إعادة التشغيل عقب انتهاء الحد المسموح به، عمل كل شيء بصورة طبيعية. وفقًا لرسائل سجلات StudioForge، فإن تعيين متغير GITHUB_TOKEN في ملف .env يرفع الحد المسموح به.
  • تنفيذ الأمر docker compose down -v يحذف جميع المحادثات. أما الأمر down العادي فلا يؤثر على البيانات.
  • مستخدمو Podman: على أنظمة Fedora وغيرها التي تستخدم SELinux، يجب إضافة :z إلى مسار المجلد الذي يُستخدم للنسخ الاحتياطي ("$PWD":/backup:z). كما أن Podman مع Docker Compose رفض تشغيل ملفات التشغيل الخاصة بالأدوات التي لا تحتوي فيها كتلة فحص الصحة على سطر test: ("يجب تحديد أمر فحص الصحة")؛ لذا قمت بإضافة الأمر المطلوب من كل ملف Dockerfile في ملف إعادة تعريف صغير. كما أن تشغيل kiwix بدون صلاحيات الجذر يتطلب تعيين KIWIX_USER=0. أما مستخدمو Docker فيمكنهم تجاهل هذه النقطة.

ما لم أختبره

  • استخدام Docker Desktop على أنظمة Windows أو Mac. لقد استخدمت Podman مع Docker Compose على نظام Linux فقط، وبنية x86-64.
  • تشغيل Ollama أو LM Studio خارج بيئة Docker على نفس الجهاز. في حالة استخدام Docker Desktop، يكون العنوان هو http://host.docker.internal:11434/v1 بالنسبة لـ Ollama، ويجب أن يقبل هذا الخادم الاتصالات القادمة من الحاوية؛ لم أتحقق من ذلك بنفسي.
  • صور StudioForge التي تدعم NVIDIA وROCm، وبناء الإضافة الصوتية (VOICE=1)، وملف إعدادات Caddy لتمكين HTTPS، بالإضافة إلى TransForge.
  • استخدام أداة InfoForge مع الأمر ask مع نموذج ما، وكذلك تشغيل اختبارات الأداء باستخدام CrucibleForge.

DisPatch على GitHub StudioForge MailForge InfoForge

مقالات ذات صلة: DisPatch 3.0: ملفات التعريف العائلية ومعالج الإعداد، DisPatch، StudioForge، وكيفية جعل نموذج لغوي يكيّف أي مشروع مع بيئتك.


← المزيد من الذكاء الاصطناعي والنماذج المحلية