وثائق المطوّرين
العربية

تشغيل الخادم

الإدارة والإعدادات

صفحة الإدارة، وإيصال رموز التسجيل (SMS والبريد الإلكتروني)، وقيم إعدادات الخادم، والنسخ الاحتياطي والأمان — مرجع للمشغّلين.

يحتوي الخادم على صفحة إدارة تُفتح في المتصفح. ترى فيها حالة الخادم، وتحدد كيف تُوصَل رموز التسجيل وتسجيل الدخول، وتدير المستخدمين والبوتات. وهذا المستند مرجع يجمع في مكان واحد صفحةَ الإدارة وقيمَ إعدادات الخادم. وإن كان التثبيت هو خطوتك الأولى فراجع تثبيت الخادم. وبما أن واجهة صفحة الإدارة باللغة الكورية حالياً، نذكر بجانب أسماء التبويبات والأزرار والإعدادات اسمها الكوري كما يظهر على الشاشة.

فتح صفحة الإدارة

صفحة الإدارة هي /admin/ على منفذ HTTP الإداري (8080 في تكوين الإنتاج)، ولا تُفتح إلا من الخادم نفسه (127.0.0.1). ويدخل المشغّل إليها عبر نفق SSH.

# على حاسوبك (اتركه يعمل)
ssh -N -L 8080:127.0.0.1:8080 <user>@<server>
# في المتصفح: http://localhost:8080/admin/

# الرمز المميّز (على الخادم)
sudo cat /srv/pabal/pabal_server/data/admin-token

أدخل الرمز المميّز واضغط فتح (열기). يتذكر المتصفح الرمز، ويمكنك مسحه بزر مسح الرمز المميّز (토큰 지우기) أعلى اليمين. ولتحديد الرمز بنفسك مرّر TELEGRAM_ADMIN_TOKEN (16 حرفاً على الأقل) — وعندها لا يُكتب الملف.

ما يظهر في كل تبويب

التبويبالمحتوىالتحديث
لوحة المعلومات (대시보드)الأشخاص والجلسات والاتصالات النشطة الآن، وعدد الأشخاص والبوتات والمجموعات والرسائل والصور والملفات، ومدة التشغيل والمنافذ وقاعدة البيانات، وJVM، وفحص الحالة. وإذا كانت أرقام الاختبار مفعّلة يظهر شريط تحذير5 ثوانٍ
رموز التسجيل (가입 코드)الرموز المنتظرة (الرقم، وطريقة الإيصال، وحالة الإرسال، والرمز، والوقت المتبقي، وعدد المحاولات الخاطئة) والسجل الأخير. نسخ الرمز وإلغاؤه3 ثوانٍ
المستخدمون (사용자)كل الحسابات — رقم الهاتف، وبريد تسجيل الدخول (قابل للتعديل)، وحالة الاتصال، وعدد الأجهزة المسجّل دخولها، وعدد الرسائل. تسجيل الخروج من جميع الأجهزة (모든 기기 로그아웃)، وحظر الرقم (번호 차단)، وحذف الحساب (계정 삭제، مع ملاحظة عن طريقة التحقق من هوية صاحب الطلب — لا يبقى من الحساب المحذوف إلا معرّفه id والملاحظة)10 ثوانٍ
البوتات (봇)البوتات المنشأة عبر BotFather — منشئها، وقائمة أوامرها، وطريقة اتصالها (MTProto · استطلاع HTTP · عنوان webhook وسبب الفشل)، وعدد التحديثات المنتظرة10 ثوانٍ
الصوت (음성)البوتات الصوتية — حالة البوابة والترحيل والسياسة، ومفتاح الإيقاف الطارئ، والإطلاق العام، والسماح بنص المحادثة، والمكالمات الجارية وقطعها، والسماح للبوتات وإيقافها، والمُختبِرون، والحدود (أدناه)5 ثوانٍ
البلاغات (신고)ما وصل عبر «الإبلاغ» في التطبيق — نسخة من المحتوى وقت الإبلاغ (تُقرأ حتى بعد أن يحذفه المرسل). الحذف (삭제؛ من طرفَي المحادثة، ومن كل الأعضاء إن كانت مجموعة)، وإيقاف الحساب (계정 정지؛ تسجيل الخروج من كل الأجهزة، ولا يمكن تسجيل الدخول أو التسجيل من جديد)، وقائمة الحسابات الموقوفة. رقم الحساب الذي حُذف وهو موقوف لا يمكن التسجيل به من جديد مدة سنة واحدة بعد الحذف (افتراضياً) — ويمكن إطالتها عند الإيقاف، أو لاحقاً من منع التسجيل من جديد (재가입 막기) في القائمة: إلى تاريخ انتهاء أبعد (يُعتمد الأبعد بين السنة والتاريخ المختار — ولا تُقصَّر أبداً) أو مدة غير محددة (واجهة الإدارة: POST /admin/api/reports/<id>/suspend {"userId": …, "blockSignupUntil": "2028-01-01"} أو "blockSignupForever": true؛ وللتغيير لاحقاً POST /admin/api/suspensions/<id>/block-signup، والجسم الفارغ يعيد الافتراضي). ويمكن رؤية البلاغات التي انتهت معالجتها أيضاً. ويُمحى البلاغ الذي انتهت معالجته مع نسخته بعد 3 سنوات من يوم معالجته (تعرض بطاقته التاريخ)؛ وإذا بدأ نزاع أو تحقيق أو دعوى، فإن الحفظ (보존) يبقيه حتى يُرفع (واجهة الإدارة: POST /admin/api/reports/<id>/hold، و/release لرفع الحفظ)10 ثوانٍ
مركز الدعم (고객센터)المحادثات الواردة إلى @PabalSupport. اختر محادثة ورُدّ، فيذهب الرد إلى تلك المحادثة باسم بوت الدعم10 ثوانٍ
الإعدادات (설정)قواعد التسجيل وتسجيل الدخول، وحساب مراجعة التطبيق، وSMS، والبريد الإلكتروني (SMTP)، وحظر أرقام الهواتف، ومعلومات المشغّل المنشورة على الموقعحفظ يدوي
المعرّفات المحجوزة (예약 아이디)أسماء مستخدمين محجوبة لا يستطيع أحد أخذها — البحث، والإضافة، وتنزيل القائمة (.txt)، والمعرّفات التي يحجبها الخادم افتراضياً. والاسم الذي يستخدمه أحد بالفعل لا يُنتزع منه وإن حُجزمرة عند الفتح
التخزين (저장소)مجلد البيانات وعنوان قاعدة البيانات (مع إخفاء كلمة المرور)، وعدد الصور والملفات وحجمها، وعدد تدفقات التخزين (streams) حسب النوع10 ثوانٍ

الإجراءات الخطرة (تسجيل الخروج والحظر وإلغاء الرمز) لا تُنفَّذ إلا بالضغط مرتين.

رموز التسجيل وتسجيل الدخول

عندما يُدخل شخص رقم هاتفه في التطبيق، ينشئ الخادم رمزاً ويرسله بالطريقة المختارة في تبويب الإعدادات (설정).

طريقة الإيصالإلى أين يذهب الرمزشاشة التطبيق
صفحة الإدارة (관리 화면)تبويب رموز التسجيل (가입 코드). ينسخه المشغّل ويبلّغه بنفسهالرقم ← «أرسلنا الرمز» ← الرمز (والاسم إذا كان الرقم جديداً)
SMSرسالة نصية عبر أحد الخيارات: Twilio · Solapi · webhookمثل صفحة الإدارة
البريد الإلكتروني (이메일)رسالة بريد عبر SMTPالرقم ← إدخال البريد الإلكتروني ← «أرسلنا الرمز إلى بريدك الإلكتروني» ← الرمز
  • في طريقة البريد الإلكتروني يمكن للتسجيل الجديد استخدام أي عنوان، ويصبح ذلك العنوان بريد تسجيل الدخول للحساب. أما الحسابات الموجودة فلا تستلم الرمز إلا على بريد تسجيل الدخول المسجّل لها — وهذا يمنع أحداً من إدخال عنوانه مع رقم غيره والدخول. والحسابات الموجودة التي ليس لها بريد تسجيل دخول يُرسل إليها الرمز بدلاً من ذلك عبر SMS (إن كان مضبوطاً) أو عبر صفحة الإدارة. ويمكنك إضافة بريد تسجيل الدخول من تبويب المستخدمين (사용자).
  • يتم الإرسال في الخلفية، فينتقل التطبيق فوراً إلى شاشة الرمز. وتظهر نتيجة الإرسال (النجاح أو الفشل وسببه) في تبويب رموز التسجيل.
  • لا يتم التسجيل (إدخال الاسم) إلا بعد إدخال الرمز الصحيح. والرموز الخاطئة لا تُقبل إلا بعدد المحاولات المسموح، وبعدها يُرفض حتى الرمز الصحيح.
  • تغيير رقم الحساب (الإعدادات ← رقم الهاتف في التطبيق) مغلق افتراضياً، ويعرض التطبيق خطأً. وعند تفعيل السماح بتغيير الرقم يذهب الرمز إلى الرقم الجديد برسالة قصيرة فقط أياً كانت طريقة الإرسال (ولا يظهر في تبويب رموز التسجيل حتى مع إظهار الرموز — فمن يُسلَّم إليه هناك قد لا يكون صاحب الرقم)، وبنصّ خاص به هو نص تغيير الرقم في إعدادات الرسائل القصيرة (번호 바꾸기 문구؛ الافتراضي [파발] 번호 바꾸기 확인 코드: {code}). وتسري مهلة إعادة الإرسال والحد اليومي على الرقم الجديد وعلى الحساب معاً؛ وتُرفض الأرقام المحظورة أو الموقوفة، والأرقام التي يملكها حساب آخر، عند طلب الرمز ومرة أخرى عند الانتقال. ولا يصلح الرمز إلا لذلك الحساب وذلك الرقم، ولا يُستعمل إلا مرة واحدة؛ ويبقى رمز تسجيل الدخول الذي ينتظر به شخص آخر ذلك الرقم كما هو. وبعد الانتقال لا يعود الرقم القديم يُدخل إلى ذلك الحساب.

الإعدادات — التسجيل وتسجيل الدخول

البندالمعنىالافتراضي
السماح بالتسجيلات الجديدة (새 가입 허용)إذا عُطّل فلا يسجّل الدخول إلا أصحاب الحسابات الموجودة، وتُرفض الأرقام الجديدة بـ«رقم غير صالح»مفعّل
طريقة إيصال الرمز (코드 전달 방식)صفحة الإدارة / SMS / البريد الإلكترونيصفحة الإدارة
عرض الرمز في صفحة الإدارة (관리 화면에 코드 표시)يعرض الرمز في تبويب رموز التسجيل حتى في طريقتي SMS والبريد الإلكتروني (احتياطاً لفشل الإرسال)مفعّل
أرقام الاختبار (+99966…) (테스트 번호)حسب إعداد الخادم / تفعيل / تعطيل. عطّلها في الإنتاجحسب إعداد الخادم
عدد خانات الرمز · مدة الصلاحية (코드 자릿수 · 유효 시간)5 أو 6 خانات · من 1 إلى 60 دقيقة5 خانات · 5 دقائق
الفاصل بين الطلبات · الحد اليومي (재요청 간격 · 하루 최대)عدد الثواني قبل أن يستطيع الرقم نفسه استلام رمز جديد (من 0 إلى 3600) · أقصى عدد من الطلبات خلال 24 ساعة (من 1 إلى 1000)60 ثانية · 10 مرات
عدد المحاولات الخاطئة المسموح (틀린 입력 허용 횟수)إذا تجاوزها المستخدم يُقفل ذلك الرمز (من 1 إلى 20)5 مرات
السماح بتغيير الرقم (번호 바꾸기 허용)يمكن للحساب المسجَّل دخوله أن ينتقل إلى رقم آخر عبر «تغيير الرقم» في التطبيق. لا يمكن تفعيله إلا بعد إعداد الرسائل القصيرةمعطّل

الإعدادات — SMS

المزوّدالقيم المطلوبةملاحظات
Webhook (웹훅)عنوان الاستلام (https://…)، وترويسة Authorization (اختيارية)يرسل الخادم POST {"phone":"+8210…","code":"12345","text":"…"}، والاستجابة 2xx تعني النجاح. لتوصيله بخادم رسائل خاص بك أو بخدمة أخرى
TwilioAccount SID، وAuth Token، ورقم المُرسِل أو Messaging Service SIDالعالم كله، بما في ذلك الأرقام الدولية
Solapi (CoolSMS سابقاً)API Key، وAPI Secret، ورقم المُرسِلرسائل داخل كوريا. ورقم المُرسِل يجب أن يكون مسجّلاً مسبقاً في Solapi. وتُرسل أرقام +82 بالصيغة 010…

يمكنك وضع {code} (الرمز) و{minutes} (مدة الصلاحية) في نص الرسالة. والنص الافتراضي: [파발] 인증 코드: {code} (أي «[Pabal] رمز التحقق: {code}»). وبعد الحفظ تحقق منه بـالإرسال التجريبي (테스트 발송).

الإعدادات — البريد الإلكتروني (SMTP)

الخدمةالخادم · المنفذ · الأماناسم المستخدم · كلمة المرور
Gmailsmtp.gmail.com · 587 · STARTTLSعنوان Gmail · كلمة مرور التطبيق (حساب Google ← الأمان ← التحقق بخطوتين ← كلمات مرور التطبيقات)
Naversmtp.naver.com · 587 · STARTTLSالمعرّف · كلمة المرور (فعّل استخدام POP3/SMTP من إعدادات البريد)
مُرحِّل البريد الداخلي في المؤسسةعنوان المُرحِّل · 25 · بلافارغ

يجب أن يكون عنوان المُرسِل عنواناً يسمح حساب SMTP بالإرسال منه. ويُستخدم {code} و{minutes} في الموضوع والنص أيضاً.

إدارة المستخدمين

  • تسجيل الخروج من جميع الأجهزة (모든 기기 로그아웃): يقطع كل تسجيلات الدخول (مفاتيح المصادقة) لذلك الحساب. ويُستخدم مع المستخدمين الذين فقدوا أجهزتهم.
  • حظر الرقم (번호 차단): لا يستطيع ذلك الرقم استلام الرموز، ويُسجَّل خروج حسابه من جميع الأجهزة فوراً. وهو مطابق لقائمة حظر أرقام الهواتف في تبويب الإعدادات.
  • بريد تسجيل الدخول (로그인 이메일): ضروري في طريقة البريد الإلكتروني كي يسجّل الحساب الموجود دخوله عبر البريد.
  • حذف الحساب (계정 삭제): للمستخدم الذي طلب حذف حسابه، بعد التأكد من أنه صاحبه. يحذف تماماً ما يحذفه حذف الحساب داخل التطبيق، ولا يمكن التراجع عنه. لا يُنفَّذ إلا بعد إعادة كتابة معرّف الحساب أو رقم هاتفه، وترك ملاحظة عن مصدر الطلب وكيف جرى التحقق من الهوية. تُحفَظ الملاحظة مع المعرّف والتاريخ (وتُحذف منها أرقام الهواتف وعناوين البريد الإلكتروني واسم الحساب واسم المستخدم). وإذا جاء طلب بالبريد الإلكتروني من غير بريد تسجيل الدخول المسجَّل للحساب، فإن النافذة نفسها ترسل رمزاً برسالة نصية إلى رقم الحساب؛ أدخِل الرمز الذي يعيده صاحب الطلب بالبريد الإلكتروني. لا يمكن هنا حذف البوتات ولا حسابات الخادم نفسه.
  • @BotFather بوت موجود داخل الخادم، فلا يخضع لتسجيل الخروج.

إدارة البوتات

في تبويب البوتات (봇) ترى طريقة اتصال كل بوت — هل هو متصل عبر MTProto، وهل استدعى getUpdates عبر HTTP خلال الدقيقة الأخيرة، وما عنوان webhook الخاص به، وهل يفشل الآن (مع السبب). وإذا ظلّ عدد التحديثات المنتظرة يزداد، فبرنامج البوت متوقف أو أن webhook يفشل. أما حذف البوت وإعادة إصدار رمزه المميّز فيقوم بهما منشئ البوت لدى @BotFather.

تبويب الصوت

هنا تدير البوتات الصوتية (البوتات التي يرد فيها نموذج صوتي بالذكاء الاصطناعي عندما يتصل بها شخص — راجع البوتات الصوتية). يظهر التبويب حتى لو لم تكن ميزة الصوت مفعّلة على الخادم، وتخبرك خانة الحالة بما ينقص. وطريقة التفعيل في تثبيت الخادم — البوتات الصوتية. يُحدَّث التبويب كل 5 ثوانٍ.

الخانةما تراه وما يمكنك فعله
الأرقام في الأعلىالمكالمات الجارية · الوقت المستخدم اليوم (الحد اليومي للخادم، والوقت المحجوز للمكالمات الجارية) · البوابات المتصلة · البوتات التي فعّلت الصوت (البوتات المسموح لها) · المُختبِرون (هل تم الإطلاق العام أم لا)
الحالةرابط البوابة (العنوان، أو «معطّل (لا يوجد سرّ للرابط)» — 꺼짐 (링크 비밀 없음))، وترحيل المكالمات (TURN؛ وإن لم يوجد: «كل مكالمات البوتات مشغولة» — 모든 봇 통화가 통화 중)، وهل في سياسة الخصوصية قسم bot-calls (وإن لم يوجد: «لا يستقبل أي بوت» — 어떤 봇도 받지 않음)، والموافقات المنتظرة، وعدد المكالمات التي انتهت بإشارة انشغال، لكل سبب (مثلاً: 워치가 못 거는 모드 — وضع لا تستطيع الساعة الاتصال به، أي الاتصال من Apple Watch ببوت يستخدم الأدوات · MCP · مفتاح المالك · وضع الصوت الخام · نص المحادثة لمالكه، WATCH_NOT_YET)
مفتاح الإيقاف الطارئإيقاف كل المكالمات الصوتية (모든 음성 통화 멈추기): بمجرد الضغط يسري على هذا الخادم — تنتهي كل مكالمات البوتات الجارية، ولا تُقبل مكالمات جديدة، ولا يظهر زر الاتصال لأي بوت. ثم يُحفظ فيبقى كما هو حتى بعد إعادة تشغيل الخادم (وإذا فشل الحفظ يظهر تحذير). ويُلغى بـإعادة فتح المكالمات الصوتية (음성 통화 다시 열기)
الإطلاق العامقبل الإطلاق العام لا يستطيع الاتصال بالبوتات الصوتية إلا المُختبِرون أدناه. ولفتحها للجميع اكتب في الخانة 공개합니다 (أي «أُطلِقها للعموم») كما هي تماماً ثم اضغط الإطلاق للجميع (모두에게 공개) (ويُرفض ذلك إذا كان مفتاح جهة الاستلام في الخادم TELEGRAM_VOICE_RECIPIENTS هو …@unset الذي لم تُحدَّد فيه منطقة المعالجة — فعليك أولاً إصدار نسخة من التطبيق تتضمن المنطقة). وللتراجع اضغط العودة إلى المُختبِرين فقط (시험자만으로 되돌리기). أما إتمام المراجعة القانونية والحصول على ردّ مكتوب من المزوّد (Google) قبل الإطلاق فأمر يقدّره المشغّل — والشيفرة لا تمنعه
البواباتلكل بوابة متصلة: المعرّف، والمكالمات التي تتولاها / السعة، وجهة إرسال الصوت (google.vertex.gemini-live@us-central1 وغيرها)، والميزات (tools·byok·transcripts·stream …)، والمحرّك، وboot
نص المحادثة · مفتاح المالكالسماح بنص المحادثة: اكتب في الخانة 대화 기록을 허용합니다 (أي «أسمح بنص المحادثة») ثم اضغط السماح بنص المحادثة (대화 기록 허용). لا تسمح به قبل المراجعة القانونية. وعند التعطيل يتوقف فوراً، وتُهمَل نصوص المكالمات الجارية وما لم تأخذه البوتات بعد. أما الاحتفاظ بالمحادثة الذي يختاره المتصل فلا علاقة له بهذا السماح، وليس له مفتاح في صفحة الإدارة — بل يفعّله قسم bot-calls-keep-text في سياسة الخصوصية (تثبيت الخادم — الاحتفاظ بالمحادثة). مفتاح المالك: هل يقبله الخادم وسبب عدم قبوله، ومعرّف المفتاح الرئيسي، وعدد البوتات التي لها مفتاح (ولا يظهر المفتاح نفسه في أي مكان)
المكالمات الجاريةمعرّف المكالمة، والبوت، والمتصل (الاسم · المعرّف)، والحالة، والمدة المنقضية / الحد الأقصى، والبوابة، وعدد استعلامات الأدوات المفتوحة. قطع (끊기) (يلزم الضغط مرتين للتنفيذ)
البوتات الصوتيةالبوتات التي يمكنها استخدام الصوت: البوتات المسموح لها فقط (허용한 봇만، الافتراضي) أو كل البوتات المنشأة عبر @BotFather (@BotFather 로 만든 모든 봇). السماح (허용) بمعرّف البوت أو باسم المستخدم (@). الجدول: البوت، ومنشئه، والحالة (مفعّل · معطّل · هل يستقبل ولماذا، والإيقاف، وعنوان إرسال الصوت إن كان في وضع الصوت الخام، والأدوات وعدد الردود · الأخطاء · تجاوزات المهلة)، والصوت · اللغة، والحدود، ومكالمات اليوم. وما يمكنك فعله: السماح (허용) · إلغاء السماح (허용 취소)، والمراجعة ثم السماح مجدداً (확인하고 다시 허용)، والإيقاف (멈추기) (السبب إلزامي، 200 حرف، ويراه مالك البوت، وتنتهي المكالمات الجارية) · إعادة الفتح (다시 열기)، وعرض الإعدادات (설정 보기)
عرض إعدادات البوتالنص الأصلي للتعليمات والتحية (للمراجعة)، وتعريفات الأدوات وزمن استجابة كل أداة (p50 · p95)، ووجهة استعلامات الأدوات، ونسخة القواعد التي وُوفق عليها، وتطبيق فحص انتحال الشخصية أو الإعفاء منه، والتغييرات الأخيرة، والمكالمات · المدة · المكالمات الفائتة · المرفوضة لكل شهر
المُختبِرونالإضافة كمُختبِر (시험자로 넣기) · الإزالة (빼기) بمعرّف المستخدم أو باسم المستخدم (مع @ أو بدونها، ولا فرق بين الأحرف الكبيرة والصغيرة) (لا يصحّ ذلك للبوتات ولا لحسابات الخادم نفسه). ومن أُضيف عبر إعداد الخادم TELEGRAM_VOICE_TESTERS يظهر بعلامة «الخادم» (서버) ولا يمكن إزالته من هنا
الحدودالجدول أدناه + أسماء تُضاف إلى فحص انتحال الشخصية (사칭 검사에 더할 이름) (اسم في كل سطر). وعند الحفظ تُعرض البوتات التي لم تعد تستطيع استقبال المكالمات
المكالمات من البوتاتالمفتاح العام: اكتب 봇이 거는 전화를 켭니다 كما هي في الخانة ثم فعّل — بعد المراجعة القانونية فقط (يُرفض ما دام callme.legal_review في نافذة الإذن ليس done، والاستثناء لخوادم التطوير والاختبار هو TELEGRAM_VOICE_CALLME_UNREVIEWED). وعند الإطفاء تتلقى الطلبات الجديدة 503 فوراً. والبلدان (الافتراضي 82، و999 على خوادم الاختبار فقط)، والحدود (خادم الإنتاج لا يحفظها أبداً أكثر تساهلاً من الحد الأدنى)، وجدول البوتات التي فعّلها مالكوها (حالة المراجعة، والتجميد بسبب الرمز المميّز، والإيقاف التلقائي، وطلبات اليوم)، وتفاصيل البوت (الاسم، و@اسم المستخدم، والصورة، والتعليمات، والتحية، والأدوات، والصوت، واللغة، والوضع، والأغراض، واسم المالك، وoutboundReviewHash الخاص به) مع السماح·سحب السماح، ورفع الإيقاف التلقائي، وعدد مرات الرفض في كل مرحلة من الفحص

السماح مراجعةٌ. في وضع «البوتات المسموح لها فقط» يعني السماح لبوت أنك سمحت بتعليماته وتحيته وأدواته الحالية (وبعنوان الصوت الخام في وضع الصوت الخام). فإذا غيّر مالك البوت أياً منها ظهر في جدول البوتات «تغيّرت التعليمات أو التحية — لا يستقبل المكالمات إلا بعد المراجعة والسماح مجدداً» (지시문·인사말이 바뀜 — 확인하고 다시 허용해야 전화를 받습니다)، ولا يستقبل ذلك البوت المكالمات حتى تضغط المراجعة ثم السماح مجدداً (확인하고 다시 허용). ويسري الأمر نفسه على البوت الذي ليست لغته الكورية أو الإنجليزية حتى في وضع «كل البوتات المنشأة عبر @BotFather» — لأن الفحص الآلي للقواعد عند الحفظ لا يقرأ إلا الكورية والإنجليزية. ويظهر لمثل هذا البوت في الجدول «بوت ليست لغته الكورية أو الإنجليزية (لا يقرؤه الفحص الآلي للقواعد): اقرأ التعليمات والتحية من فضلك — لا يستقبل المكالمات إلا بعد المراجعة والسماح مجدداً» (한국어·영어가 아닌 봇 (자동 규칙 검사가 읽지 못함): 지시문·인사말을 읽어 주세요 — 확인하고 다시 허용해야 전화를 받습니다)، فليقرأ التعليماتِ والتحيةَ شخصٌ يجيد تلك اللغة، ثم اسمح للبوت.

الحدالافتراضيالنطاق
أقصى مدة للمكالمة الواحدة (ثانية)600من 60 إلى 3600، وبحد أقصى إعداد الخادم TELEGRAM_VOICE_MAX_SECONDS
المكالمات المتزامنة للبوت الواحد2من 1 إلى 100، وبحد أقصى إعداد الخادم TELEGRAM_VOICE_BOT_CONCURRENCY
عدد مكالمات الشخص الواحد في الساعة20من 1 إلى 200
مكالمات الشخص الواحد في اليوم (دقيقة)60من 1 إلى 600
مكالمات البوت الواحد في اليوم (دقيقة)60من 1 إلى 6000
مكالمات مالك البوت الواحد في اليوم (دقيقة)120من 1 إلى 6000
مكالمات الخادم كله في اليوم (دقيقة)300من 1 إلى 100000
أقصر مكالمة تُقبل (ثانية)60من 30 إلى 300 — إذا كان الوقت المتبقي أقل من ذلك فلا تُقبل
تقييد الحسابات الجديدة (يوم)7من 0 إلى 90 (0 = معطّل) — ويُستثنى المُختبِرون، ومن أرسل إليه البوت رسالة قبل يوم أو أكثر
  • يُحسب اليوم وفق المنطقة الزمنية للخادم (TELEGRAM_VOICE_TIME_ZONE، الافتراضي Asia/Seoul). وعند قبول مكالمة يحدد الخادم مدتها القصوى ضمن ما تبقى من ذلك اليوم ويحجزها في كل الحدود، وعند انتهائها لا يُحتسب إلا عدد الثواني الفعلي بحسب ساعة الخادم. أما المكالمات التي تُستقبل بمفتاح مالك البوت فلا تستهلك إلا حدود المتصل.
  • لا يستطيع مالك البوت ضبط مدة المكالمة الواحدة (الافتراضي 300 ثانية) وعدد المكالمات المتزامنة لبوته إلا ضمن هذه الحدود.
  • تُسجَّل كل الإجراءات (مفتاح الإيقاف الطارئ، والإطلاق العام، والسماح، والإيقاف، والقطع، والحدود …) في سجل النشاط في تبويب رموز التسجيل (가입 코드) بالبادئة 음성: … (أي «الصوت: …»).
  • مقاييس جودة المكالمات الصوتية (الوقت حتى أول صوت، والوقت حتى التوقف عند المقاطعة، وزمن رد الأدوات وغيرها) ليست في هذا التبويب، بل في /metrics على منفذ الإدارة فقط (الأسماء التي تبدأ بـ voice. في JSON، وبـ voice_ في صيغة Prometheus /metrics?format=prometheus). ولا تتضمن أشخاصاً ولا بوتات ولا كلاماً، بل مجاميع فقط.

ويمكنك القيام بالأمور نفسها عبر واجهة الإدارة البرمجية (وكلها تتطلب Authorization: Bearer <token>): GET /admin/api/voice، وGET /admin/api/voice/bots/<id>، وبـPOST: voice/kill {"on": true}، وvoice/launch {"launched": true, "confirm": "…"}، وvoice/transcripts {"allowed": true, "confirm": "…"}، وvoice/testers·voice/testers/remove {"userId": …}، وvoice/gate {"botGate": "ALLOWLIST"}، وvoice/bots/allow·voice/bots/disallow {"botId": …}، وvoice/bots/<id>/suspend {"reason": "…"}·…/lift·…/name-exempt، وvoice/calls/<id>/end، أما الحدود فعبر /admin/api/settings/voice. والمكالمات من البوتات: voice/outbound {"on": true, "confirm": "…"}، وvoice/outbound/settings {"countries": […], "limits": {…}}، وGET /admin/api/voice/outbound/bots/<id>، وvoice/outbound/bots/allow {"botId": …, "expect": "<outboundReviewHash>"}·voice/outbound/bots/disallow، وvoice/outbound/bots/<id>/lift.

متغيرات البيئة

يقرأ الخادم ملف الإعدادات (server-config.json) ثم يستبدل قيمه بقيم متغيرات البيئة. وبما أن ملف Compose الخاص بالإنتاج يحدد القيم أدناه، يكفي عادةً تعديل .env وحده.

المتغيرالمعنىالقيمة في Compose الإنتاج
TELEGRAM_PORTمنفذ MTProtoMTPROTO_PORT (8443)
TELEGRAM_HOSTالعنوان الذي يستمع عليه MTProto0.0.0.0
TELEGRAM_PUBLIC_HOSTعنوان الخادم الذي يُبلَّغ به التطبيق (help.getConfig)PUBLIC_IP
TELEGRAM_WEB_PORTمنفذ الموقع والوثائق وBot API وصفحة الإدارة8080
TELEGRAM_WEB_HOSTالعنوان الذي يستمع عليه ذلك المنفذ. الافتراضي 127.0.0.10.0.0.0 (داخل الحاوية، ولا يُنشر على المضيف إلا على 127.0.0.1)
TELEGRAM_PUBLIC_URLعنوان الموقع. يُستخدم للروابط (me_url_prefix) وروابط الدعوة وأمثلة الوثائق وصور المعاينةhttps://DOMAIN/
TELEGRAM_DATA_DIRمكان الصور والملفات وadmin-token وoperations.json/app/data
TELEGRAM_RSA_KEYمسار مفتاح RSA الخاص بالخادم (إن لم يوجد يُنشأ في البداية، والمفتاح العام في .pub)/app/keys/private.pem
TELEGRAM_DC_IDرقم DC لهذا الخادم. يجب أن يطابق الـ DC الذي تتخذه التطبيقات موطناً لها (‏2 في كل تطبيقات Telegram) — وإلا فلن يبدأ تنزيل الصور والملفات أبداًDC_ID (2)
TELEGRAM_DB_TYPEmemory · h2 · postgresqlpostgresql
TELEGRAM_DB_URL، TELEGRAM_DB_USERNAME، TELEGRAM_DB_PASSWORDاتصال JDBCjdbc:postgresql://pabal-postgres:5432/pabal، pabal، POSTGRES_PASSWORD
TELEGRAM_DB_MAX_POOL_SIZEعدد اتصالات قاعدة البيانات20
TELEGRAM_ADMIN_TOKENالرمز المميّز لصفحة الإدارة (إذا تُرك فارغاً يُنشأ في data/admin-token)ADMIN_TOKEN
TELEGRAM_MAX_FILE_SIZEأكبر ملف يمكن إرساله (2GB · 512MB · عدد البايتات). وتُكتب الأجزاء على القرص فور وصولها، فالحدّ هنا على القرص لا على الذاكرةMAX_FILE_SIZE (2GB)
TELEGRAM_TEST_NUMBERSأرقام الاختبار +99966…. للتطوير فقطfalse
TELEGRAM_WEBHOOK_ALLOW_LOCALيسمح لـ webhook البوتات باستخدام http:// والعناوين الداخلية. للتطوير فقط(غير محدد = false)
TELEGRAM_FCM_CREDENTIALSمسار ملف مفتاح حساب الخدمة في Firebase للإشعارات الفورية على Android. إذا تُرك فارغاً تتوقف الإشعارات الفورية (تثبيت الخادم — الخطوة 10)FCM_CREDENTIALS (فارغ)
TELEGRAM_FCM_PROJECT_IDفقط عند الإرسال إلى مشروع Firebase غير project_id المذكور في ملف المفتاحFCM_PROJECT_ID (فارغ)
TELEGRAM_PUSH_PREVIEWSإذا كانت false تعرض الإشعارات الفورية المرسل فقط دون محتوى الرسالةPUSH_PREVIEWS (true)
TELEGRAM_TURN_HOST، TELEGRAM_TURN_PORT، TELEGRAM_TURN_SECRETترحيل المكالمات (TURN) — حيث يلتقي تطبيقان على شبكتين مختلفتين. إن تُرك السرّ فارغاً فالاتصال مباشر فقط (تثبيت الخادم — ترحيل المكالمات)TURN_HOST (فارغ: DOMAIN)، TURN_PORT (3478)، TURN_SECRET (فارغ)
TELEGRAM_APNS_KEY، TELEGRAM_APNS_KEY_ID، TELEGRAM_APNS_TEAM_ID، TELEGRAM_APNS_TOPIC، TELEGRAM_APNS_MIN_BUILD، TELEGRAM_APNS_VOIP_MIN_BUILDالإشعارات الفورية على iPhone ‏(APNs) — مسار ملف المفتاح، ومعرّف المفتاح (فارغ: يُؤخذ من اسم الملف)، والفريق الذي وقّع التطبيق، ومعرّف الحزمة (bundle ID)، وأدنى إصدار يُرسل إليه، وأول إصدار تظهر فيه شاشة مكالمة CallKit. بلا مفتاح تتعطّل إشعارات iPhone (تثبيت الخادم — الخطوة 11)APNS_* (بلا مفتاح، فارغ — من اسم الملف، 4Z8R468M2D، me.pabal.ios، 4، فارغ)
TELEGRAM_STATIC_MAPS_KEY، TELEGRAM_STATIC_MAPS_PER_DAY، TELEGRAM_STATIC_MAPS_PER_USER_HOURصور الخرائط في رسائل الموقع — مفتاح Google Maps Static API، وعدد الصور الجديدة التي تُجلب في اليوم، وعدد ما يستطيع شخص واحد التسبب في جلبه في الساعة. بلا مفتاح تتعطّل صور الخرائط (تثبيت الخادم — صور الخرائط)STATIC_MAPS_* (بلا مفتاح، 300، 120)
JAVA_OPTSخيارات JVM (الذاكرة)القيمة من .env

متغيرات البيئة — البوتات الصوتية

في الإنتاج يضبط الملف الإضافي deploy/docker-compose.voice.yml بعض هذه المتغيرات من قيم .env — الرابط والترحيل والمنطقة الزمنية والحدود والمُختبِرين والإصدارات الدنيا — وتُضاف البقية ميزةً ميزةً بعد مراجعة كل منها (تثبيت الخادم — البوتات الصوتية). أما إعدادات VOICE_* الخاصة بالبوابة (pabal-voice) ففي voice/README.md داخل المستودع.

المتغيرالافتراضيالمعنى
TELEGRAM_VOICE_LINK_SECRET_FILE—سرّ الرابط بطول 32 بايت (64 خانة hex)، وهو نفسه عند البوابة. وإذا غاب أو كان خاطئاً يتعطل الصوت
TELEGRAM_VOICE_LINK_HOST، TELEGRAM_VOICE_LINK_PORT127.0.0.1، 8095المكان الذي يستمع عليه الرابط. إن لم يكن loopback فيلزم TELEGRAM_VOICE_LINK_ANY_ADDRESS=true، والعناوين العامة مرفوضة دائماً
TELEGRAM_VOICE_LINK_ANY_ADDRESS—تصريح بأن «هذه الشبكة لا يستخدمها إلا الخادم والبوابة»
TELEGRAM_VOICE_TURN_HOST، TELEGRAM_VOICE_TURN_PORT—عنوان الترحيل الذي يُعطى للبوابة (عنوان الخادم في الشبكة المحلية). ويُتجاهل إن كان loopback
TELEGRAM_VOICE_MAX_SECONDS600أطول مكالمة يسمح بها هذا الخادم (من 60 إلى 3600)
TELEGRAM_VOICE_BOT_CONCURRENCY2سقف المكالمات المتزامنة للبوت الواحد (ولا يستطيع المشغّل ومالك البوت إلا خفضه)
TELEGRAM_VOICE_TIME_ZONEAsia/Seoulأساس الحدود اليومية والشهرية
TELEGRAM_VOICE_TESTERS—قائمة معرّفات المستخدمين المُختبِرين (تُضم إلى القائمة في صفحة الإدارة). و* لخوادم الاختبار فقط
TELEGRAM_VOICE_RECIPIENTSgoogle.vertex.gemini-live@us-central1جهة الاستلام التي تذكرها نافذة التأكيد في التطبيق. ويجب أن تطابق جهة البوابة كي تُسلَّم إليها المكالمة
TELEGRAM_VOICE_MIN_BUILD_DESKTOP، _ANDROID، _IOS، _WATCHOS1، 62151، 5، 1أول بناء من التطبيق يتضمن نافذة التأكيد فعلاً (في سطح المكتب: الرقم بعد الوسم pabal-bc). وإذا تغيّرت جهة الاستلام فأصدر بناءً جديداً ثم ارفع هذه القيم. وفي سطح المكتب ارفعه إلى 2 عند أول موافقة على نافذة تأكيد بلغة غير الكورية والإنجليزية
TELEGRAM_VOICE_MIN_SHEET_VERSION1أدنى نسخة مقبولة من نافذة التأكيد
TELEGRAM_VOICE_TOOL_RESULT_BYTES16384أقصى حجم لردّ الأداة (من 1024 إلى 16384)
TELEGRAM_VOICE_KEYS_MASTER_FILE، TELEGRAM_VOICE_KEYS_PREVIOUS_MASTER_FILE—المفتاح الرئيسي الذي يغلّف مفاتيح المالكين وأسرار الصوت الخام، والمفتاح القديم أثناء الاستبدال. ضعهما في مجلد بصلاحيات 700 خارج النسخ الاحتياطية
TELEGRAM_VOICE_OWN_KEYS_APPS_READY—لا تجعله true إلا بعد أن يعرض التطبيق نافذة التأكيد (النسخة 2) للبوتات ذات مفتاح المالك. وقبل ذلك لا يقبل الخادم مفاتيح المالكين
TELEGRAM_VOICE_OWN_KEY_MIN_SHEET_VERSION، TELEGRAM_VOICE_TRANSCRIPT_MIN_SHEET_VERSION2، 1نسخة نافذة التأكيد اللازمة لمكالمات مفتاح المالك ولإعلان نص المحادثة (ولا يخفض خادم الإنتاج نسخة مفتاح المالك إلى ما دون 2)
TELEGRAM_VOICE_STREAM_MIN_BUILD_DESKTOP، _ANDROID، _IOS0 (لا يوجد)أول بناء من التطبيق يتضمن نافذة تأكيد الصوت الخام. وإذا كان 0 فلا يستطيع أحد الاتصال ببوتات الصوت الخام
TELEGRAM_VOICE_STREAM_MIN_SHEET_VERSION2نسخة نافذة تأكيد الصوت الخام
TELEGRAM_VOICE_STREAM_DENY_ADDRESSES—عناوين هذا النشر التي يجب ألّا يصل إليها عنوان الصوت الخام (يُضاف المضيف العام ومضيف الموقع تلقائياً)
TELEGRAM_WATCH_API_PORT، _HOST، _ANY_ADDRESS، TELEGRAM_WATCH_AUDIO_URL، TELEGRAM_WATCH_ALLOW_PLAIN، TELEGRAM_WATCH_SESSION_DAYS، TELEGRAM_WATCH_AUTH_PER_MINUTE—، 127.0.0.1، —، —، —، 7، 30واجهة Apple Watch البرمجية وعنوان نقطة دخول الصوت (تثبيت الخادم — نقطة دخول Apple Watch). وALLOW_PLAIN للتطوير فقط
TELEGRAM_VOICE_EVIDENCE_KEY_DIR—مجلد المفتاح المستخدم لسجلات أذونات المكالمات من البوتات (أدلة HMAC). 700، خارج المجلدات التي يُحتفظ لها بنسخ احتياطية. يُنشأ ويُستبدل بـscripts/voice-evidence-key.py. ومن دونه لا يستطيع أحد تفعيل الإذن. مع Docker Compose لا يصل المتغير إلى الخادم إذا وُضع في .env وحده — عند تفعيل المكالمات من البوتات أضفه إلى pabal-server في deploy/docker-compose.voice.yml، ضمن environment (المسار داخل الحاوية) وvolumes (المجلد على المضيف)
TELEGRAM_VOICE_OUTBOUND_MIN_BUILD_DESKTOP، _ANDROID، _IOS، _WATCHOS0 (لا شيء)أول إصدار من التطبيق فيه نافذة الإذن. الإصدارات الأقدم لا تستطيع تفعيل الإذن ولا ترنّ فيها مكالمات البوتات. و0 يعني أن تلك المنصة بلا إصدار
TELEGRAM_VOICE_CALLME_DEVICE_AGE_SECONDS86400المدة بعد تسجيل الدخول التي يستطيع بعدها الجهاز تفعيل الإذن (بالثواني). خوادم الاختبار فقط يمكنها تغييرها (خادم الإنتاج يحذّر ويتجاهلها)
TELEGRAM_VOICE_KEEP_TEXT_UNREVIEWED—يعرض على الساعة نص خانة الاحتفاظ بالمحادثة قبل مراجعته القانونية. لخادم الاختبار الداخلي فقط
TELEGRAM_MCP_*، TELEGRAM_MCP_APPS_READY—مكوّنات MCP (يضعها deploy/docker-compose.mcp.yml). ويُستخدم TELEGRAM_MCP_EGRESS_OWN_ADDRESSES (عناوين Pabal العامة) حتى من دون MCP، كي لا تتجه طلبات webhook والأدوات إلى Pabal نفسه
TELEGRAM_VOICE_BOTS، TELEGRAM_VOICE_NOTICE_CHECK=off، TELEGRAM_VOICE_STREAM_ALLOW_PRIVATE—لخوادم الاختبار فقط (عند TELEGRAM_TEST_NUMBERS=true فقط): السماح للبوتات المدرجة (المعرّف · ‎@الاسم، و* لكل البوتات) · تخطي التحقق من الأقسام القانونية · السماح بالعناوين الخاصة في عنوان الصوت الخام
TELEGRAM_VOICE_CALLME_UNREVIEWED، TELEGRAM_VOICE_DEV_ECHO_OUTBOUND، TELEGRAM_VOICE_TEST_DIAL، TELEGRAM_VOICE_TEST_DIAL_USERS—لخوادم الاختبار والتطوير فقط: يمكن تشغيل مفتاح المكالمات من البوتات قبل المراجعة القانونية (خوادم التطوير والاختبار) · بوابة الصدى تُجري مكالمات البوتات (خوادم التطوير، TELEGRAM_TEST_MODE) · الاتصال التجريبي في واجهة الإدارة البرمجية والحسابات التي يمكنه أن يرنّ لها (حتى 20 إضافة إلى أرقام الاختبار +99966، خوادم الاختبار). وخادم الإنتاج يحذّر ويتجاهلها

ملفات البيانات

الملفالمحتوىالصلاحيات
keys/private.pemمفتاح RSA الخاص بالخادم. لا يُخرج إلى أي مكان أبداً600
keys/private.pem.pubالمفتاح العام. يُستخدم في بناء التطبيق وفي /docs/server-key.pem—
keys/firebase-service-account.json(اختياري) المفتاح السري لـ Firebase للإشعارات الفورية على Android. إذا تسرّب فاحذفه من وحدة تحكم Firebase وأنشئ مفتاحاً جديداً600
data/admin-tokenالرمز المميّز لصفحة الإدارة600
data/operations.jsonقيم تبويب الإعدادات (설정) — قواعد التسجيل، والقيم السرية لـ SMS وSMTP، والأرقام المحظورة، وإعدادات تبويب الصوت (مفتاح الإيقاف الطارئ · الإطلاق العام · المُختبِرون · البوتات المسموح لها · الحدود)600
keys/voice-link.secret(البوتات الصوتية) سرّ الرابط نفسه الذي تستخدمه البوابة400
/etc/pabal/voice/voice-master.key(البوتات الصوتية) المفتاح الرئيسي الذي يغلّف مفاتيح مالكي البوتات وأسرار وضع الصوت الخام. خارج مجلد البيانات، ولا يدخل في النسخ الاحتياطية600 (المجلد 700)
data/media/الصور والملفات الأصلية—
جدول events في PostgreSQLالحسابات والمحادثات والرسائل وتسجيلات الدخول والبوتات وإعدادات webhook — سجل كل التغييرات—

ملاحظات أمنية

  • لا تفتح منفذ الإدارة مباشرة على الإنترنت. وفي تكوين الإنتاج يحجب Caddy مسارات الإدارة مثل /admin و/health و/metrics بإعادة 404.
  • كل طلبات بيانات الإدارة تتطلب Authorization: Bearer <token>، ولا تستطيع صفحات المواقع الأخرى قراءتها.
  • القيم السرية لـ SMS وSMTP موجودة في operations.json فقط، ولا تُظهر الشاشة وواجهة API إلا أنها «محفوظة». وإذا تركت خانة القيمة السرية فارغة وحفظت تبقى القيمة السابقة كما هي.
  • لا تُطبع الرموز المميّزة والقيم السرية في السجلات، وتُسجَّل أرقام الهواتف مع إخفاء جزء منها. ولا تُسجَّل أيضاً عناوين Bot API (التي تتضمن الرمز المميّز).
  • لا يُسجَّل الرمز المميّز للجهاز في الإشعارات الفورية إلا على شكل بصمة، ولا يُسجَّل في السجلات محتوى ملف مفتاح Firebase ولا محتوى الإشعارات.
  • بما أن مفاتيح المصادقة موجودة في قاعدة البيانات، فمن يستطيع الوصول إلى قاعدة البيانات يستطيع فك تشفير حركة المستخدمين. فاحمِ قاعدة البيانات والنسخ الاحتياطية بقدر ما تحمي مفتاح RSA.

القيود

  • الرموز المنتظرة والسجل الأخير موجودة في الذاكرة، فتضيع عند إعادة تشغيل الخادم (ويكفي أن يطلب المستخدم الرمز من جديد في التطبيق).
  • يجب التحقق من الإرسال الفعلي لكل مزوّد SMS بحسابك لديه. فالخادم يبني الطلبات وفق وثائق كل مزوّد.
  • ما ليس متاحاً بعد: حذف البوتات قسراً، والاطلاع على الرسائل، وعرض السجلات، والرسوم البيانية، وإحصاءات الإشعارات الفورية (تُراجَع الإشعارات الفورية من سجلات الخادم).