تثبيت HarnessRouter ذاتياً لواجهة وكلاء واحدة
شغّل Codex وClaude Code وHermes خلف API واحد مستضاف ذاتياً، مع نشر Docker، وربط loopback، وتغيير تسجيل الدخول الافتراضي، والوصول عبر TLS.
ما الذي يزيله HarnessRouter
تستضيف HarnessRouter Community Edition بنفسك لوضع واجهة API واحدة أمام عدة أُطر تشغيل للوكلاء على خادم تملكه. إطار تشغيل الوكيل هو برنامج سطر الأوامر الذي يدير نموذجاً في حلقة متكررة: يحتفظ بجلسة، ويعدّل الملفات، وينفّذ الأوامر، ويرسل التقدم باستمرار إلى الجهة التي طلبت تنفيذ العمل. يؤدي Codex وClaude Code وHermes هذه المهمة، ويأتي كل منها بطريقة تثبيت خاصة، وتنسيق بيانات اعتماد خاص، ومفهوم خاص لماهية الجلسة. تشغّل HarnessRouter هذه البرامج كلها داخل حاوية واحدة، وتضع نقطة نهاية HTTP واحدة، وتسجيل دخول واحداً، ومخزن أسرار واحداً أمامها.
هذه هي الفكرة كاملة، ومن المهم توضيح تكلفتها. فأنت تضيف حاوية وتسجيل دخول ووحدة تخزين ومسار ترقية إلى خادمك، حتى تتحول عدة مكونات متحركة إلى مكوّن واحد. إذا كنت تشغّل إطار تشغيل واحداً فقط اليوم، فسيكون هذا الإعداد أسوأ من تثبيت ذلك الإطار مباشرة. ستجد هذا المفاضلة في القسم الأخير هنا، لذلك اقرأه قبل النشر.
تم التحقق من كل ما يلي باستخدام وسم الصورة 0.5.5، الذي جرى سحبه في 19 August 2026. ينشر المشروع وسوماً جديدة في معظم الأيام، لذلك تحقّق من الوسم الذي تشغّله فعلياً بدلاً من الاعتماد على هذه الصفحة بعد مرور شهر. تأتي الأوامر من الملف README للمشروع على github.com/HarnessRouter/harnessrouter.
ما هو Unified Harness Protocol فعلياً
يطبّق HarnessRouter بروتوكول Unified Harness Protocol (UHP)، المنشور على unifiedharnessprotocol.org. يصف UHP كيفية بدء منتج لمهمة على harness، ومتابعة المهمة أثناء تنفيذها، وإدارة الجلسات والملفات، والإبلاغ عن حالات الفشل. تُحدَّد إصدارات المواصفة بحسب التاريخ. الإصدار الساري في 19 August 2026 مؤرَّخ في 2026-08-11، ويصفه الموقع بأنه معيار قيد الصياغة، «مستقر بما يكفي للبناء عليه، ومُرقّم بالإصدارات بحيث يمكن تغييره بأمان».
اقرأ عبارة «معيار مفتوح» بعناية في هذا السياق. فالشركة نفسها تكتب المواصفة، وتطوّر التنفيذ المرجعي، وتدير مجموعة اختبارات المطابقة المكوّنة من 52 اختباراً، وهي التي تحدد الجهات المطابقة. هذا أمر معتاد بالنسبة إلى بروتوكول حديث إلى هذا الحد، كما أن ترخيص Apache-2.0 يتيح لك إنشاء fork لأي جزء منه. لكنه يعني أيضاً أن UHP ليس معياراً متعدد المورّدين بعد. تعامل معه على أنه بروتوكول ناشئ: مفيد ومتغير، وينبغي أن يكون بإمكان شفرتك إيقاف استخدامه من دون إعادة كتابة النظام.
ما تحتاج إليه قبل البدء
تحتاج إلى Docker ونحو 4 GB من المساحة الحرة على القرص. وتحتاج أيضاً إلى API key من موفّر نماذج تدفع له مسبقاً. يبلغ حجم سحب image نحو 700 MB، بينما تُستخدم المساحة المتبقية لواجهات CLI الخاصة بالوكلاء ومساحات العمل التي تكتب فيها. لا تتضمن image نموذجاً مضمّناً أو trial key، لذلك تفشل المهام إلى أن تربط موفّراً. يخضع HarnessRouter نفسه لترخيص Apache-2.0. أما واجهات CLI الخاصة بالوكلاء فلا يشملها هذا الترخيص، ولذلك تُجلب عند التشغيل الأول بدلاً من تضمينها في image.
استضافة HarnessRouter ذاتياً باستخدام docker run واحد
docker pull harnessrouter/harnessrouter
docker run -d --name harnessrouter \
-p 127.0.0.1:3000:3000 \
-v harnessrouter:/data \
harnessrouter/harnessrouterبعد ذلك، راقب بدء تشغيل الحاوية. يستغرق التشغيل الأول وقتاً أطول، وتوضح السجلات السبب.
docker logs -f harnessrouterستظهر أثناء التشغيل أسطر مثل هذه:
installing Claude Code (Anthropic's terms apply)…
installing Codex (Apache-2.0)…
installing Hermes (check its upstream license before use)…انتظر ظهور ready on :3000. يحدث هذا التثبيت مرة واحدة لكل volume، لذلك يستغرق كل تشغيل لاحق بضع ثوانٍ ولا يعرض أسطر تثبيت إطلاقاً.
ينتج عن عملية التنزيل هذه أمران مهمان على VPS. أولاً، يحتاج الإقلاع الأول إلى اتصال صادر بالشبكة. الصورة ليست مكتفية ذاتياً، لذلك تتوقف العملية هنا ولا تعرض ready on :3000 إذا كان الخادم خلف مرشح للاتصالات الصادرة أو لا يملك مساراً إلى الخارج. يحدث الفشل عند التشغيل الأول، وليس عند docker pull، وهذا توقيت مربك لاكتشاف المشكلة فيه. ثانياً، أنت تثبّت برامج تابعة لجهات خارجية وفق شروط تلك الجهات. يصل Claude Code وفق شروط Anthropic، بينما يخضع Hermes للشروط التي يحددها المشروع upstream، لذلك تحقّق من الشرطين قبل استخدامهما تجارياً.
ينشئ -v harnessrouter:/data volume مسمّى في Docker. توجد كل البيانات الدائمة في /data: قواعد بيانات SQLite، والملفات المخزّنة، ومخزن الأسرار، ومساحات عمل الوكلاء. يؤدي حذف ذلك الـvolume إلى حذف المثيل، بما في ذلك مفاتيح المزوّد وكل سجل للمحادثات. أنشئ نسخة احتياطية منه بعد إيقاف الحاوية، لأن نسخ قاعدة بيانات SQLite أثناء الكتابة إليها ينتج ملفاً قد لا يُفتح. وينطبق مبدأ الإيقاف ثم النسخ نفسه على كل حاوية تحفظ حالة على الخادم، مع اختلاف التفاصيل حسب الخدمة، لأن PhotoPrism وImmich يحتاج كل منهما إلى أوامر النسخ الاحتياطي الخاصة به.
docker stop harnessrouter
docker run --rm -v harnessrouter:/data -v "$PWD":/backup alpine \
tar czf /backup/harnessrouter-data.tgz -C / data
docker start harnessrouterصيغة compose والسطر الذي يجب تغييره
يحتوي المستودع على ملف compose. ينشر هذا الملف "3000:3000"، ما يعني أنه يستمع على كل واجهات الخادم. غيّر هذا السطر قبل تشغيله على خادم عام.
services:
harnessrouter:
image: harnessrouter/harnessrouter:0.5.5
ports:
- "127.0.0.1:3000:3000"
env_file:
- .env
volumes:
- harnessrouter-data:/data
restart: unless-stopped
volumes:
harnessrouter-data:تختلف نقطتان عن المنبع: عنوان الربط، واستخدام وسم إصدار مثبت بدلاً من latest. التثبيت مهم لأن 16 وسم إصدار صدر بين 9 و18 August 2026، ومن الصعب تصحيح أخطاء بيئة تشغيل agent تتغير دون تحكم منك. بعد ذلك، انسخ ملف البيئة، وقيّد صلاحياته، ثم شغّل الخدمة.
cp .env.example .env
chmod 600 .env
docker compose up -d
docker compose logs -fيحتوي .env على مفتاح مزود الخدمة بنص واضح، لذلك يُعد الوضع 600 الحد الأدنى. إذا كان الأمر الفرعي docker compose غير مألوف، فإن ورقة الغش لأوامر Docker Compose تغطي الأوامر اليومية.
Why the port is published on 127.0.0.1 and not 0.0.0.0
-p 3000:3000 publishes the port on every interface the host has. -p 127.0.0.1:3000:3000 publishes it on loopback only, which means the only way in is from the VPS itself. The container always listens on 3000 inside, so the left-hand side is the part you change. Check what you got:
docker port harnessrouter
sudo ss -ltnp | grep 3000ss printing 127.0.0.1:3000 is right. 0.0.0.0:3000 means the console is on the public internet. That is worse here than for most self-hosted apps, because the console creates harnesses, reads every transcript, runs agents, and gives those agents a shell and a real filesystem in their workspace. It also holds the provider key you connected. Anyone who reaches an unprotected console can read your work, run commands, and spend your key.
A host firewall does not save you from this. Docker publishes ports by writing its own rules into the kernel nat table, and those are evaluated before the chain ufw manages, so a published port stays reachable even when sudo ufw status lists it as denied. Test from another machine, not from the VPS, or you will test nothing. This is the same lesson as running dsh headless on port 3080: bind the service to loopback, then decide deliberately how you reach it.
غيّر تسجيل الدخول الافتراضي قبل أي شيء آخر
سجّل الدخول إلى http://localhost:3000 باستخدام اسم المستخدم harnessrouter وكلمة المرور harnessrouter. تُعرض بيانات الاعتماد هذه في README لأنها قيم مؤقتة وليست أسراراً، كما يحذّرك الحاوي منها عند كل بدء حتى تغيّرها:
using the DEFAULT password. Set HR_AUTH_PASSWORD, or change it from the profile page, before exposing this instance.غيّرها من صفحة Profile، أو حدّدها عند بدء التشغيل ضمن عملية نشر مبرمجة. يتجاوز HR_AUTH_USER وHR_AUTH_PASSWORD القيم الافتراضية.
docker run -d --name harnessrouter \
-p 127.0.0.1:3000:3000 \
-v harnessrouter:/data \
-e HR_AUTH_USER='you' \
-e HR_AUTH_PASSWORD='the-password-you-chose' \
harnessrouter/harnessrouterلا توجد رسالة بريد إلكتروني لإعادة التعيين، لأنه لا يوجد نظام حسابات ولا خادم بريد. إذا فقدت كلمة المرور، فاحذف ملف المصادقة من volume وأعد التشغيل، ثم سجّل الدخول بالقيم الافتراضية مرة أخرى.
docker stop harnessrouter
docker run --rm -v harnessrouter:/data alpine rm -f /data/selfhost-auth.json
docker start harnessrouterيعطّل HR_AUTH_DISABLED=1 بوابة تسجيل الدخول بالكامل. يقيّدها README بحالة «خادم لا يستطيع أي شخص آخر الوصول إليه». أما VPS الذي يملك عنوان IP عاماً فليس كذلك، لذا اترك البوابة مفعّلة ما لم تشغّل هذا على حاسوب محمول.
تحقّق من إصدارك، لأن الإصدارات القديمة لا تحتوي على بوابة مصادقة
هذا هو الجزء الذي يجب أخذه بجدية. أُصدرت الإصدارات 0.1.x و0.2.0 من دون أي بوابة مصادقة: أي شخص يستطيع الوصول إلى المنفذ 3000 كان داخل وحدة التحكم بالفعل. كان 0.3.0 أول إصدار يتضمن تسجيل الدخول. لا تزال تلك الوسوم القديمة منشورة وقابلة للسحب، لذلك قد يؤدي وسم قديم مُثبّت، أو ملف compose نسخه زميل، إلى إتاحة وحدة تحكم عامة من دون مصادقة على منفذ عام اليوم.
اعتباراً من 19 August 2026، أحدث وسم منشور هو 0.5.5، المؤرخ في 18 August 2026، ويشير latest إليه. تحقّق مما لديك، ثم قارنه بقائمة الوسوم على Docker Hub:
docker image ls harnessrouter/harnessrouterيجب استبدال أي إصدار أقدم من 0.3.0 الآن، لا جدولته لوقت لاحق. أما الإصدارات التي تساويه أو تتجاوزه، فلا يزال يجب تغيير كلمة مرورها، لأن كلمة المرور الافتراضية وعدم وجود كلمة مرور أمران متماثلان بالنسبة إلى من يفحص المنفذ 3000. لا تتعامل مع أرقام الإصدارات في هذه الصفحة على أنها حديثة. كانت صحيحة في التاريخ المذكور في أعلاها، وهذا المشروع يصدر إصدارات بسرعة.
ربط مزوّد
لن يعمل أي شيء حتى يتم ربط مزوّد نماذج. أضف مزوّداً من صفحة Integrations في وحدة التحكم، أو مرّره إلى docker run ضمن البيئة. القيمة بتنسيق JSON، لذلك ضعها بين علامتي اقتباس في الصدفة:
-e HR_SECRET_GLOBAL_HARNESS_CONN_ANTHROPIC='{"name":"anthropic","provider":"anthropic","api_key":"sk-ant-…"}'يحدّد .env.example متغير اتصال واحداً لكل عائلة من المزوّدين: HR_SECRET_GLOBAL_HARNESS_CONN_ANTHROPIC للواجهة الخلفية claude-code، وHR_SECRET_GLOBAL_HARNESS_CONN_OPENAI للواجهة الخلفية codex، وHR_SECRET_GLOBAL_HARNESS_CONN_CUSTOM لأي نقطة نهاية متوافقة مع OpenAI، وهي المكان المناسب للمجمّع أو لخادم الاستدلال الخاص بك. وتحدّد المتغيرات HR_SECRET_GLOBAL_HARNESS_POLICY_CLAUDE وHR_SECRET_GLOBAL_HARNESS_POLICY_CODEX وHR_SECRET_GLOBAL_HARNESS_POLICY_HERMES الاتصال الذي تستخدمه كل واجهة خلفية افتراضياً. أما HR_SECRET_KEY فهو منفصل، ولا يلزم إلا عند ربط قاعدة بيانات بوكيل.
يحدّد HR_BACKENDS الواجهات الخلفية التي يتم تحميلها، كما في HR_BACKENDS=claude,codex,hermes. توجد مشكلة معروفة ينبغي معرفتها قبل أن تواجهها: أي قيمة لا تتضمن hermes تجعل الحاوية تخرج فوراً بالحالة 1 من دون رسالة خطأ. سترى Exited (1) في docker ps -a بعد ثانية من بدء التشغيل، ولن يعرض docker logs أي معلومات مفيدة. أبقِ hermes في القائمة إلى أن يصلحها المشروع المصدر. إذا كان Hermes هو إطار التشغيل الوحيد الذي تريده، فإن تشغيل وكيل Hermes على VPS خاص به هو النشر الأبسط.
استدعِ API دون استخدام وحدة التحكم
وحدة التحكم اختيارية. تستخدم الواجهتان API نفسه، وهو يتعامل مع عقد بأسلوب Responses. سجّل الدخول أولاً للحصول على ملف تعريف ارتباط للجلسة:
curl -c hr.cookies http://localhost:3000/api/selfhost/login \
-H 'content-type: application/json' \
-d '{"username":"harnessrouter","password":"your-password"}'بعد ذلك أرسل مهمة، مع تحديد الـharness في metadata.harness_id ونموذج يقدّمه موفّر الخدمة المتصل فعلياً:
curl -s -b hr.cookies http://localhost:3000/api/harness/v1/responses \
-H 'content-type: application/json' \
-d '{"input":"Reply with exactly this and nothing else: it works.",
"metadata":{"harness_id":"codex"},
"model":"gpt-5.4-mini",
"stream":false}'يعني كائن JSON الذي يحتوي على كتلة إخراج وعدد الرموز المميّزة أن الـharness نفّذ المهمة. يؤدي تغيير harness_id من codex إلى claude إلى إرسال الطلب نفسه إلى harness مختلف. وهذا التبديل هو السبب الكامل لوجود هذا البرنامج. يتيح لك الاتصال المخصّص أعلاه توجيه harness إلى نقطة نهاية متوافقة مع OpenAI تستضيفها بالفعل، بالطريقة التي يُوصَل بها DeepSeek harness مستضاف ذاتياً على VPS.
الوصول إليه من حاسوبك المحمول دون نشر منفذ
هناك طريقتان، ولا تتطلب أيٌّ منهما فتح منفذ مباشرة على 0.0.0.0.
نفق SSH هو الخيار الأبسط والأقل تكلفة، ولا يتطلب تثبيت أي شيء على الخادم. فهو يوجّه منفذاً محلياً على جهازك إلى loopback على VPS.
ssh -N -L 3000:127.0.0.1:3000 you@your-vpsاترك هذا الأمر قيد التشغيل، وافتح http://localhost:3000 في متصفحك. إذا طبع SSH الرسالة bind: Address already in use، فهذا يعني أن برنامجاً على حاسوبك المحمول يستخدم المنفذ 3000 مسبقاً. اختر عندها منفذاً محلياً آخر باستخدام -L 3100:127.0.0.1:3000، وانتقل إلى المنفذ 3100 في المتصفح.
الـreverse proxy الذي ينهي TLS هو الحل عندما يحتاج أشخاص آخرون إلى الوصول. يحتفظ الـproxy بشهادة TLS (أمان طبقة النقل)، ثم يوجّه الطلبات إلى loopback. يقدّم README إعداداً لـCaddy:
console.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:3000 {
flush_interval -1 # agent turns stream for minutes; never buffer them
}
}السطر flush_interval -1 هو ما يغفل عنه كثيرون. يرسل Agent رموز الاستجابة لمدة دقائق، وإذا كان الـproxy يضع الاستجابة في مخزن مؤقت، فإنه يحتفظ بهذه الرموز حتى تنتهي الجولة. لذلك تبدو وحدة التحكم متوقفة، ثم تطبع كل شيء دفعة واحدة. البديل المكافئ في Nginx هو proxy_buffering off; داخل كتلة location. أياً كان الخيار الذي تستخدمه، أبقِ اسم DNS موجهاً إلى الـproxy، وأبقِ الحاوية على loopback. يوضّح مقارنة Nginx وCaddy وTraefik بوصفها reverse proxy الخيار الأنسب لخادمك.
شغّله بحساب مستخدم مستقل، وليس بحساب root
يعمل Docker daemon بحساب root، وتساوي عضوية مجموعة docker امتلاك صلاحيات root، لأنّ العضو يستطيع تشغيل حاوية تربط نظام ملفات المضيف. لذلك فإنّ «إضافة الفريق إلى مجموعة docker» تمنح صلاحيات root على الخادم الذي يحتفظ بمفتاح موفّر الخدمة.
الطريقة البسيطة: أنشئ حساب خدمة يملك ملف compose و.env، وأبقِ هذه الملفات خارج أي دليل home مشترك.
sudo adduser --disabled-password --gecos "" harness
sudo install -d -o harness -g harness -m 750 /srv/harnessrouterالطريقة الأقوى هي Docker بصلاحيات المستخدم، حيث يعمل daemon نفسه بحساب ذلك المستخدم غير المميّز. يحتاج ذلك إلى حزمة uidmap من أجل newuidmap وnewgidmap، وإلى 65536 معرّف UID فرعياً على الأقل في /etc/subuid و/etc/subgid للمستخدم. توجد uidmap في مستودع Ubuntu، لكن docker-ce-rootless-extras غير موجودة فيه؛ فهي تُصدَر من مستودع Docker الخاص عبر download.docker.com، ويضيفه تثبيت Docker engine. إذا لم تثبّت engine من ذلك المستودع، فلن يعرض grep -rl download.docker.com /etc/apt/sources.list.d/ أي نتيجة، ولن يجد التثبيت أدناه الحزمة.
sudo apt install -y uidmap docker-ce-rootless-extras
sudo loginctl enable-linger harness
sudo -iu harness
dockerd-rootless-setuptool.sh install
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
systemctl --user enable --now dockerلا يمكن الاستغناء عن loginctl enable-linger هنا. من دونه، تتوقف نسخة systemd الخاصة بالمستخدم عند إغلاق الجلسة الأخيرة، فتتوقف الحاوية عند تسجيل الخروج. تحقّق من النتيجة باستخدام docker info، الذي يعرض rootless ضمن Security Options. لا يستطيع الوضع ذي صلاحيات المستخدم ربط المنافذ التي تقل عن 1024 من دون إعداد إضافي. لا يؤثر ذلك هنا لأن المنفذ 3000 أعلى من هذا الحد. يوضّح إنشاء مستخدمين بأقل الصلاحيات على VPS كيفية إعداد الحساب نفسه.
ما الذي يتعطل، وما الذي ستراه
تتوقف الحاوية بعد ثانية من بدء تشغيلها وتكون السجلات فارغة. يعرض docker ps -a قيمة Exited (1). هذه هي مشكلة HR_BACKENDS المذكورة أعلاه: تركت قيمتك hermes. أعدها.
لا يكتمل التشغيل الأول أبداً. يتوقف السجل بعد سطر installing، ولا يظهر ready on :3000. لا يستطيع الخادم الوصول إلى الشبكة لتنزيل واجهات CLI الخاصة بالوكيل، لأنها غير موجودة في الصورة. أصلح المسار الصادر أو إعدادات الوكيل، ثم أعد التشغيل.
تُحمّل وحدة التحكم، وتفشل كل مهمة. لا يوجد أي موفر متصل. لا تتضمن الصورة نموذجاً مضمّناً أو فئة مجانية، لذلك يمكن لمثيل جديد تسجيل دخولك، لكنه لن يشغّل أي شيء.
تتجمّد وحدة التحكم أثناء الإجابة خلف وكيل. يظهر الناتج دفعة واحدة عند انتهاء الجولة. هذا سببه تخزين الاستجابة مؤقتاً. اضبط flush_interval -1 في Caddy، أو proxy_buffering off; في Nginx.
لا يمكنك الوصول إليها من حاسوبك المحمول، مع أن النفق يعمل. شغّل docker port harnessrouter على الخادم. إذا لم يطبع شيئاً، فهذا يعني أن الحاوية لا تنشر أي منفذ، ولذلك شُغّلت من دون -p.
هل يستحق التشغيل؟
يستحق التشغيل إذا كنت تستخدم فعلاً أكثر من harness واحد وتريد نقطة وصول واحدة ومخزناً واحداً لبيانات الاعتماد بدلاً من ثلاث نقاط وصول وثلاثة مخازن. ويستحق التشغيل أيضاً إذا كنت تبني منتجاً فوقه وتريد أن يكون harness قيمة إعداد بدلاً من الحاجة إلى إعادة كتابة المنتج. هذا ما يوفّره UHP، مع مراعاة حداثة البروتوكول كما ذُكر أعلاه.
لا يستحق التشغيل إذا كنت تستخدم harness واحداً. يكون تثبيت واجهة CLI الخاصة به على الخادم أقل تعقيداً، ولا توجد عملية تسجيل دخول تفصل بينك وبينه. كما أنه ليس الخيار المناسب إذا كنت تريد عدة وكلاء يتعاونون في مهمة واحدة بدلاً من API واحدة أمام عدة harnesses؛ فهذا نمط مختلف من الأدوات. راجع harness متعدد الوكلاء مثل Omnigent لهذا النمط. في كلتا الحالتين، لا تتغير قواعد النشر. اربط الخدمة على loopback، وغيّر كلمة المرور، وثبّت tag عند 0.3.0 أو إصدار أعلى، وشغّلها باستخدام مستخدم خاص بها.
FAQ
هل من الآمن نشر HarnessRouter على المنفذ 3000؟
لا. تنشئ وحدة التحكم harnesses، وتقرأ كل transcript، وتشغّل agents مع إمكانية الوصول إلى shell ونظام الملفات، وتحتفظ بمفتاح provider الذي ربطته. لذلك يكشف المنفذ المفتوح كل ذلك. انشر الخدمة على loopback باستخدام -p 127.0.0.1:3000:3000، ثم صِل إليها عبر نفق SSH أو Reverse Proxy ينهي TLS. لا يكفي جدار حماية المضيف وحده. يكتب Docker قواعده الخاصة في جدول النواة nat، لذلك يستجيب المنفذ المنشور من الإنترنت حتى عندما يعرض ufw أنه محظور. تحقّق باستخدام sudo ss -ltnp | grep 3000، الذي يجب أن يطبع 127.0.0.1:3000.
ما إصدار HarnessRouter الذي أضاف بوابة تسجيل الدخول؟
0.3.0. أُصدرت الإصدارات 0.1.x و0.2.0 من دون أي مصادقة، ولا تزال العلامتان منشورتين ويمكن سحبهما. لذلك يعتمد كل من يشغّلهما على ألّا يعثر أحد على المنفذ. اعتباراً من 19 August 2026، أحدث علامة هي 0.5.5، المؤرخة في 18 August 2026. شغّل docker image ls harnessrouter/harnessrouter لمعرفة الإصدار الموجود لديك، وقارن ذلك بقائمة العلامات على Docker Hub، لا بهذه الصفحة. غيّر كلمة المرور الافتراضية حتى في الإصدار الحالي.
لماذا تخرج الحاوية مباشرة بعد أن أضبط HR_BACKENDS؟
أي قيمة HR_BACKENDS لا تتضمن hermes تجعل الحاوية تخرج فوراً بالحالة 1 ومن دون رسالة خطأ. هذه مشكلة معروفة في README الخاص بالمشروع. يتمثل العرض في Exited (1) ضمن docker ps -a خلال ثانية أو ثانيتين، مع عدم ظهور أي شيء مفيد في docker logs. أبقِ hermes في القائمة، كما في HR_BACKENDS=claude,codex,hermes، إلى أن يصلح المشروع هذه المشكلة.
هل يحتاج HarnessRouter إلى الوصول إلى الإنترنت عند التشغيل الأول؟
نعم. تُجلب CLIs الخاصة بالـagent عند التشغيل الأول بدلاً من تضمينها في image، لأن لكل منها ترخيصها الخاص. يطبع الخادم الذي لا يملك مساراً صادراً الأسطر installing، ثم لا يصل أبداً إلى ready on :3000. يحدث التنزيل مرة واحدة لكل volume، لذلك تستغرق عمليات التشغيل اللاحقة بضع ثوانٍ ولا تحتاج إلى شبكة تتجاوز provider النموذج الذي ربطته.
فقدت كلمة مرور وحدة التحكم. كيف يمكنني تسجيل الدخول مجدداً؟
لا توجد رسالة بريد إلكتروني لإعادة الضبط، لأنه لا يوجد نظام حسابات ولا mail server. أوقف الحاوية، واحذف /data/selfhost-auth.json من volume، ثم شغّلها مجدداً. بعد ذلك سجّل الدخول باستخدام بيانات الاعتماد الافتراضية، واضبط كلمة مرور جديدة من صفحة Profile. عندما تحمل الحاوية وvolume معاً الاسم harnessrouter، يكون التسلسل هو docker stop harnessrouter، ثم docker run --rm -v harnessrouter:/data alpine rm -f /data/selfhost-auth.json، ثم docker start harnessrouter.