بوت Discord: التشغيل والمراقبة
تشغيل بوت Discord على VPS تحت systemd، وتحديد الذاكرة، وقراءة السجلات، والتعامل مع حدود المعدل، والتحديث دون توقف.
آخر تحديث 23 أغسطس 2026
يحتفظ بوت Discord باتصال WebSocket دائم ببوابة Discord، لذا يحتاج إلى جهاز يظل قيد التشغيل. متطلباته من الموارد متواضعة، لكنه على عكس بوت Telegram يتعامل مع عمليات إعادة التشغيل بشكل أسوأ: كل عملية إعادة تشغيل تفرض اتصالًا جديدًا بالبوابة.
التثبيت
useradd -r -m -d /srv/dbot -s /usr/sbin/nologin dbot
cd /srv/dbot && sudo -u dbot git clone https://github.com/you/bot.git .
sudo -u dbot npm ci --omit=dev
install -o dbot -g dbot -m 600 /dev/null /srv/dbot/.env
ضع الرمز والمعرّفات في .env. الرمز الصادر من Discord Developer Portal يمنح صلاحية كاملة على البوت — تعامل معه كما تتعامل مع كلمة مرور.
بالنسبة لمكتبات Python الإجراء نفسه، مع بيئة افتراضية؛ راجع تطبيق Python.
الخدمة
/etc/systemd/system/dbot.service:
[Unit]
Description=Discord bot
After=network-online.target
Wants=network-online.target
[Service]
User=dbot
WorkingDirectory=/srv/dbot
EnvironmentFile=/srv/dbot/.env
ExecStart=/usr/bin/node index.js
Restart=always
RestartSec=15
MemoryMax=512M
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now dbot
RestartSec=15 بدلًا من الخمس ثوانٍ القياسية: عند انقطاع الاتصال بالبوابة، تؤدي عمليات إعادة التشغيل المتكررة إلى حظر مؤقت على الاتصالات من جانب Discord.
يمنع MemoryMax بوتًا يعاني من تسرب في الذاكرة من إسقاط الجهاز بأكمله معه — وهو أمر مهم بشكل خاص على VDS-1 بسعة 2 GB.
المراقبة
systemctl status dbot
journalctl -u dbot -f
journalctl -u dbot --since today -p err
systemctl show dbot -p NRestarts
NRestarts هو المقياس الأكثر فائدة: إذا كان العدّاد يزداد كل ساعة، فالبوت يتعطل وRestart=always يخفي ذلك.
استهلاك الذاكرة لخدمة معينة:
systemctl status dbot | grep Memory
للحصول على الصورة العامة للجهاز، راجع رسوم CPU والذاكرة وحركة المرور البيانية في «نظرة عامة» في لوحة التحكم على /hosting/vds/m/<id>.
تحديد المعدل
يفرض Discord حدودًا على استدعاءات API. العلامات هي أخطاء 429 في السجلات وأوامر «تتوقف». ما يساعد:
- لا ترسل الرسائل في حلقة دون توقف؛
- عدّل رسالة واحدة بدلًا من إرسال رسائل جديدة؛
- خزّن البيانات المرجعية مؤقتًا بدلًا من طلبها عند كل حدث؛
- استخدم طابور Redis للبث الجماعي.
التحديث
cd /srv/dbot
sudo -u dbot git pull
sudo -u dbot npm ci --omit=dev
systemctl restart dbot
journalctl -u dbot -n 50
السطر الأخير إلزامي: تأكد من أن البوت اتصل بالبوابة بدلًا من التعطل بسبب تبعية جديدة.
الأخطاء الشائعة
| العَرَض | السبب |
|---|---|
| البوت متصل لكنه لا يستجيب للأوامر | لم تُفعَّل الـ intents المطلوبة في Developer Portal |
| إعادة اتصال مستمرة | RestartSec قصير جدًا، أو تعطل في معالج حدث |
Invalid token | أُعيد توليد الرمز ولم يُحدَّث .env |
| الأوامر مكررة | نسختان من البوت تعملان — تحقق من ps aux | grep node |
| الجهاز يبدأ بالتبديل | لا يوجد MemoryMax، تسرب في الكود |
لا تشغّل البوت تحت
screenأوtmux. الجلسة تنجو من انقطاع SSH، لكن ليس من إعادة تشغيل الجهاز — وبعد شهر ستنسى أين يعمل أصلًا.