يسهل بوت Telegram خاص الوصول لوكيل على VPS، لكن اتصال البوابة لا يثبت أن الشخص المقصود يتلقى ردا. نبدأ بدليل بيانات Hermes Agent جديد، نسمح بمعرف Telegram رقمي واحد ونفحص ردا فعليا ووسيلة توقف متحققة. نتبع تعليمات Docker v0.22.2 و تعليمات Telegram من NousResearch، فحصت في 19 أكتوبر 2026. لم تشغل BIG CHANGE خادما أو تسحب الصورة أو تنشئ بوتا أو تستدع نموذجا لهذا الدليل.
التغيير الكبير
- ما الذي تغير: صورة Docker مثبتة بالبصمة ومتحققة الإصدار مع تركيب مخصص
/opt/dataتجعل برنامج البوابة وحالتها قابلين للتحديد. - لماذا يهم: قائمة السماح الرقمية ورد خاص حقيقي يبينان إن كان الحساب المقصود يستطيع استخدامها.
- ما ينبغي الانتباه إليه: الاقتران والمنح العامة قد يوسعان الوصول، والطلب الآمن لا يقيد أدوات الوكيل. افحص المنح والسجلات وإعادة التشغيل والتوقف.
تحتاج صلاحية إدارة Linux VPS عبر SSH، وDocker Engine عامل ووصول لاسترداد المضيف، وحساب Telegram ينشئ بوت BotFather، وحساب مزود نموذج Hermes مؤهل. طابق البنية والموارد مع صورة amd64 أو arm64 الرسمية، وراجع الوصول والفوترة قبل المعالج. نفترض Docker عاملا؛ التثبيت والجدار الناري حسب النظام والمزود. يلزم اتصال صادر بـTelegram والمزود. خصص دليل حالة خاصا وحدد من يقرأه: /opt/data يحوي بيانات الاعتماد والجلسات والسجلات. دليل Docker يسمي التركيب المصدر الدائم المعتمد للحالة.
1. ثبت الصورة قبل الإعداد
اتصل بـSSH وابق في الصدفة نفسها لهذه الأوامر. الوسم stable قد يتحرك. اسحب الصورة وسجل بصمة المستودع وتحقق من أن الصورة نفسها تبلغ الإصدار 0.22.2. توقف عند اختلافه أو غياب البصمة أو وجود بيانات سابقة أو حاوية باسم hermes. حدث التعليمات للنسخة الفعلية أو احصل على صورة موثقة مطابقة قبل الاستمرار. البصمة تثبت الصورة ولا تثبت وحدها إصدارها.
set -eu
docker info >/dev/null
docker container inspect hermes >/dev/null 2>&1 && { echo 'Container hermes already exists; stop here.'; exit 1; }
HERMES_DATA="$HOME/.hermes"
if [ -e "$HERMES_DATA" ]; then echo 'Hermes data path already exists; stop here.'; exit 1; fi
mkdir -m 700 "$HERMES_DATA"
docker pull nousresearch/hermes-agent:stable
docker image inspect nousresearch/hermes-agent:stable --format '{{json .RepoDigests}}'
IMAGE_REF="$(docker image inspect nousresearch/hermes-agent:stable --format '{{index .RepoDigests 0}}')"
if ! printf '%s\n' "$IMAGE_REF" | grep -Eq '^nousresearch/hermes-agent@sha256:[0-9a-f]{64}$'; then
echo 'No valid repository digest; stop here.'; exit 1
fi
printf 'Pinned image: %s\n' "$IMAGE_REF"
VERSION_OUTPUT="$(docker run --rm "$IMAGE_REF" --version)"
printf 'Image version: %s\n' "$VERSION_OUTPUT"
if ! printf '%s\n' "$VERSION_OUTPUT" | grep -Eq '(^|[^0-9])v?0[.]22[.]2([^0-9]|$)'; then
echo 'Image version is not 0.22.2; stop here.'; exit 1
fiset -eu يوقف تسلسل الصدفة عند تعذر Docker أو فشل السحب أو الفحص أو أمر الإصدار. تتوقف الاختبارات الصريحة أيضا عند بصمة فارغة أو إصدار مختلف. لا تكمل الإعداد بعد ذلك. احفظ قيمة nousresearch/hermes-agent@sha256:… المسجلة. الإعداد والبوابة يستخدمان IMAGE_REF، فلا يغير تحرك الوسم الحاوية خفية. هذه فحوص القارئ على VPS الفعلي؛ لا توجد بصمة متحققة في المقال. استخدم دليلا جديدا مخصصا على نظام ملفات المضيف الأصلي، ولا تشغل بوابتين على دليل البيانات نفسه.
2. أعد المزود ومرسل Telegram الخاص الواحد
شغل معالج إعداد Docker بالدليل المركب. اختر مسار نموذج يسمح به الحساب، وأكمل المصادقة وافحص المزود/النموذج. الوصول والرسوم حسب الحساب. إعداد محفوظ لا يثبت نجاح طلب النموذج.
docker run -it --rm -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" setupفي Telegram اطلب من @BotFather بوتا عبر /newbot واحتفظ بالرمز سرا. احصل على معرف Telegram الرقمي للمرسل، مثلا بطريقة التحقق المرتبطة من دليل Telegram؛ اسم المستخدم ليس معرفا. المعالج أو hermes gateway setup يكتب الرمز والقائمة. يدويا، ضع TELEGRAM_BOT_TOKEN=<private token> و TELEGRAM_ALLOWED_USERS=<your numeric ID> في $HERMES_DATA/.env الذي يظهر باسم /opt/data/.env بالحاوية. لا تضع الرمز في الأوامر أو التاريخ أو الملاحظات المشتركة أو المقال.
في $HERMES_DATA/config.yaml (/opt/data/config.yaml داخل الحاوية)، حدد سلوك الرسائل الخاصة غير المصرح بها عالميا:
unauthorized_dm_behavior: ignoreبعد خروج حاوية الإعداد، قد تنقل الصورة الرسمية ملكية $HERMES_DATA إلى UID التشغيل 10000. يقيد الإقلاع .env بالنمط 600 ويشدد ملف config.yaml الموجود إلى 640؛ والتهيئة المنشأة لأول مرة آنذاك قد تحتاج التشديد نفسه. قد لا يفتح مستخدم SSH العادي الملفات. إن لم يضبط المعالج المفاتيح، يستطيع مسؤول مضيف مخول فحص وتعديل الملفين الدقيقين عبر sudo ثم إعادة ملكية التشغيل والأنماط الخاصة. محرر مضيف كـUID 10000 قد لا يعبر $HOME المملوك لحساب الدخول؛ لذا نستخدم إدارة المضيف. على مضيف فيه sudo و vi استخدمه بعد قراءة غير سرية للمالك والنمط. لا تكمل مع UID مختلف أو ملف ناقص؛ حل الوصول أولا.
sudo stat -c '%u:%g %a %n' "$HERMES_DATA" "$HERMES_DATA/.env" "$HERMES_DATA/config.yaml"
# Expected: directory owner 10000 and mode 700; .env owner 10000 and mode 600.
# config.yaml should have owner 10000; its first-boot mode can vary.
sudo vi "$HERMES_DATA/.env"
sudo vi "$HERMES_DATA/config.yaml"
sudo chown 10000:10000 "$HERMES_DATA/.env" "$HERMES_DATA/config.yaml"
sudo chmod 700 "$HERMES_DATA"
sudo chmod 600 "$HERMES_DATA/.env"
sudo chmod 640 "$HERMES_DATA/config.yaml"
sudo stat -c '%u:%g %a %n' "$HERMES_DATA" "$HERMES_DATA/.env" "$HERMES_DATA/config.yaml"يجب أن يعرض خرج stat الأخير UID/GID 10000 للملفين ونمط الدليل 700, .env بالنمط 600 و config.yaml بالنمط 640. هذه بيانات وصفية وليست أسرارا. يستهدف chown هذين الملفين فقط، بما فيه بديل المحرر. إن غاب sudo أو vi، اتبع إدارة المضيف المخولة مع القراءة نفسها. لا تجعل الحالة مقروءة للجميع ولا تعد تعيين مستخدم الحاوية.
احفظ إعدادات المزود عند التعديل. لا ينبغي لتجاوز Telegram الخاص لـ unauthorized_dm_behavior أن يحدد pair، ولا لإعداد عام GATEWAY_ALLOWED_USERS أو GATEWAY_ALLOW_ALL_USERS توسيع الوصول. في config.yaml تحقق أيضا من أن كلا من gateway.allow_all_users والإعداد الأعلى allow_all_users ليس true، ولا يوجد مرسل إضافي في القوائم العامة أو Telegram. لا تستخدم * بالقوائم أو تضف مجموعات أو توافق رموز اقتران. الجديد يتجنب المنح الموروثة؛ إذا وجدت بيانات فتوقف وافحص دون استبدال. أبق خصوصية مجموعات BotFather مفعلة، ولا تضف البوت لمجموعة أو تجعله مسؤولا. يوضح دليل وصول البوابة أن القوائم والمنح الدائمة للاقتران مساران منفصلان. يصف دليل الأمان الخيار ignore بأنه إسقاط صامت لرسائل غير المصرح لهم.
القائمة تضبط من يبدأ محادثة لا ما يستطيع الوكيل المخول فعله. جلسات Hermes Telegram تشمل أدوات طرفية افتراضيا. راجع الأدوات وتركيبات Docker والمزود وسياسة المضيف قبل السماح. الطلب الاختباري الآمن مجرد طلب.
3. ابدأ وتحقق من الرد الأول
ابدأ حاوية مسماة واحدة من البصمة المسجلة. أمر Docker المنشور يحوي -p 8642:8642 اختياريا للـAPI؛ احذفه هنا لأن الرسالة الخاصة لا تحتاج API أو منفذ لوحة عامة. تشرف الصورة على العملية، وسياسة Docker unless-stopped تحكم إعادة الحاوية عند بدء Docker. يحفظ الدليل الإعدادات والجلسات عبر إعادة التشغيل.
docker run -d --name hermes --restart unless-stopped \
-v "$HERMES_DATA:/opt/data" "$IMAGE_REF" gateway run
if ! {
docker inspect hermes --format '{{.Image}} {{.State.Status}}' &&
[ "$(docker inspect hermes --format '{{.State.Status}}')" = running ] &&
docker logs --tail 50 hermes &&
docker exec -u hermes hermes hermes pairing list
}; then
echo 'State, logs or pairing check failed; stopping before any message.'
docker stop hermes || true
docker inspect hermes --format '{{.State.Status}}' || true
exit 1
fiأكد أن الحاوية running، افحص اتصال Telegram وأخطاء المزود بالسجلات، واقرأ الاقتران قبل الطلب. عند فشل القراءة الأولى يوقف الكود البوابة ويطبع الحالة؛ نتيجة CLI أو منح مجهولة ليست تصريحا. أكد exited قبل التحقيق ولا ترسل أو تعيد التشغيل في الغموض. يجب ألا يوجد مرسل آخر معتمد؛ إن وجد فتوقف وافحص حالة التوقف. docker exec لا يعمل على حاوية متوقفة، والدخول العادي للصورة قد يعيد بوابة كانت تعمل. في تثبيت جديد بالـUID الافتراضي، يشغل الفحص دون اتصال CLI Hermes المثبت فقط كـUID 10000 بلا شبكة وبلا تشغيل البوابة. هو تكييف للأوامر والدخول الموثقين، لا اختبار BIG CHANGE. استخدمه فقط بعد تأكيد UID العامل ومالك البيانات 10000. إذا غمضت الملكية أو UID أو الخرج أو المنح فاتركها متوقفة وحل ذلك قبل إعادة التشغيل.
if [ "$(docker exec -u hermes hermes id -u)" != 10000 ] || [ "$(stat -c %u "$HERMES_DATA")" != 10000 ]; then
echo 'Runtime UID or data owner differs; stop for a host-specific repair.'; docker stop hermes; exit 1
fi
docker stop hermes
if [ "$(docker inspect hermes --format '{{.State.Status}}')" != exited ]; then
echo 'Container is not exited; do not mount state in another container.'; exit 1
fi
docker run --rm --network none --user 10000:10000 \
--entrypoint /opt/hermes/.venv/bin/hermes \
-v "$HERMES_DATA:/opt/data" "$IMAGE_REF" pairing list
# For a listed unwanted Telegram user, read the exact numeric ID first:
printf 'Unwanted numeric Telegram user ID: '; IFS= read -r UNWANTED_ID
if ! printf '%s\n' "$UNWANTED_ID" | grep -Eq '^[0-9]+$'; then echo 'Invalid ID; leave gateway stopped.'; exit 1; fi
docker run --rm --network none --user 10000:10000 \
--entrypoint /opt/hermes/.venv/bin/hermes \
-v "$HERMES_DATA:/opt/data" "$IMAGE_REF" pairing revoke telegram "$UNWANTED_ID"
docker run --rm --network none --user 10000:10000 \
--entrypoint /opt/hermes/.venv/bin/hermes \
-v "$HERMES_DATA:/opt/data" "$IMAGE_REF" pairing listأكد غياب المعرف غير المرغوب من القائمة النهائية. افحص سرا $HERMES_DATA/.env و config.yaml بحثا عن قوائم أخرى عامة أو للمنصة، * أو إعداد السماح للجميع، وأزل المنح غير المرغوبة بالمسار الموثق. تبقى البوابة متوقفة حتى فحص كل الطرق. إزالة إدخال لا تلغي اقترانا مستقلا أو منحة عامة. بعد التحقق، docker start hermes يعيد الحاوية الأصلية عمدا؛ افحص السجلات والاقتران مجددا قبل الرسائل.
من الحساب المسموح، افتح محادثة خاصة مع البوت وأرسل طلبا آمنا مثل «أجب بتحية قصيرة». تحقق من رد حقيقي وسجله أو جلسته. الإرسال ومؤشر الكتابة والحالة واكتمال الإعداد ليست ردا. أمر Telegram /whoami يبين نطاق الرسائل النشط، لا إذن المضيف. احفظ أدلة غير حساسة فقط.
دون رد، اقرأ الحالة و docker logs --tail 50 hermes أولا. افحص الرمز والقيمة الرقمية الدقيقة لـ TELEGRAM_ALLOWED_USERS ومصادقة المزود وأهلية الاستخدام والخروج الشبكي. إذا غمضت الجولة فاقرأ المحادثة والسجلات قبل الإعادة. الإقلاع البارد قد يسقط تحديثات معلقة ومنع التكرار محدود بالذاكرة. لا ضمان لتسليم مرة واحدة بالضبط.
4. افحص إعادة التشغيل والتوقف والاسترداد
بعد انتهاء الجولة الأولى أعد الحاوية نفسها وافحص السجلات الجديدة وحالة /opt/data المحتفظ بها، ثم أرسل طلبا خاصا آمنا جديدا وتحقق من الرد. أوقف واقرأ حالة Docker. exited هو إشارة التوقف؛ صمت المحادثة لا يكفي. docker start hermes هو الاستئناف المقصود لاحقا.
docker restart hermes
docker logs --tail 50 hermes
docker inspect hermes --format '{{.State.Status}}'
# After the restarted gateway is ready, send a new private test message.
docker stop hermes
docker inspect hermes --format '{{.State.Status}}'
# Expected after stop: exited
# When intentionally resuming later: docker start hermesعند فشل البدء افحص Docker والسجلات ثم $HERMES_DATA/logs/gateways/default/current و $HERMES_DATA/logs/container-boot.log والتركيب والملكية والصورة/الإصدار المثبت. تشرح ملاحظات v0.22.2 إصلاح حيوية الإقلاع ولا تثبت ما حدث بمضيفك. لا تحذف الحالة للإصلاح. إذا تسرب الرمز فتوقف وأبطله في BotFather واستبدله سرا في الملف المركب .env ثم افحص الوصول قبل البدء. ألغ أيضا الاقتران غير المرغوب وافحص القوائم الفعلية.
قد يتقاضى VPS والنموذج رسوما منفصلة. راجع الخطة والحدود والرسوم؛ لا وعد بوقت أو حصة مجانية أو توافر. تعالج Telegram والمزود الرسائل ويحتفظ المضيف بالأسرار والحالة. هذا أول رد لمضيف وبوت واحدين. أدلة BIG CHANGE الأخرى تغطي نسخ Hermes الاحتياطي واسترداده و مهمة Hermes دورية.
المصادر وقراءات إضافية
مواد إعداد Docker, إعداد Telegram, وصول البوابة, الأمان و إصدار v0.22.2 مصادر أولية من NousResearch. يشرح البدء السريع إعداد المزود. هذه وثائق إجراء لا سجل تشغيل BIG CHANGE لخادم أو بوت.



