تشغيل 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؛ أما بقية الأدوات فتُبنى من شفرة المصدر بإضافة كلمة واحدة فقط. النموذج المحلي الصغير يفي بالغرض للأسئلة اليومية، لكنه لا يصلح للاستنتاجات المعقدة.
ما الذي ستحصل عليه في النهاية

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

لمعرفة ما يمكن لـ 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، ويتوقف عن العمل بمجرد إنشاء المالك.

يجب أن تتضمن كلمة المرور 8 أحرف على الأقل. رقم التعريف الشخصي اختياري ويُستخدم لفتح التطبيق بسرعة. إذا قمت بتعيينه، يكتب DisPatch رمز استعادة في ملفه، ويجب عليك نسخه في مكان آمن:
docker compose exec dispatch cat /data/RECOVERY-CODE.txt
الخطوة الخامسة: ربط الذكاء الاصطناعي
الخطوة الثانية من الإرشادات تبحث عن خادم نموذج على نفس الجهاز. لكن داخل Docker لا يمكنه العثور على الخدمة model تلقائياً، لذا اكتبها يدوياً:

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: اختر نفس الإجابة التي وضعتها في الخطوة الثانية بخصوص المنفذ.

<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=…؛ افتحه في متصفحك.

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.

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

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، ثم الصق المفتاح واضغط على "اختبار".

يُستمد معرّف النموذج من تنفيذ الأمر 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، وكيفية جعل نموذج لغوي يكيّف أي مشروع مع بيئتك.