استضافة بوت Discord على مدار الساعة - دليل شامل

دليل خطوة بخطوة لاستضافة بوت Discord الخاص بك في بيئة الإنتاج على مدار الساعة على VPS، باستخدام PM2 (Node.js) وsystemd (Python).

تقديم

هل برمجت بوت Discord باستخدام discord.js أو discord.py؟ لكي يعمل على مدار الساعة، تحتاج إلى VPS. إليك الخطوات المتبعة.

الخطوة 1: اختيار VPS وطلبه

يكفي VPS من الفئة الأساسية (1 vCPU، و1-2 Go RAM، وSSD) لمعظم بوتات Discord. لدى By-Hoster، احسب نحو 4,99 € شهريا.

  1. انتقل إلى منطقة العملاء في By-Hoster
  2. اختر «VPS Linux» ← توزيعة Ubuntu 22.04 LTS
  3. أكد الطلب وادفع، ويُسلَّم الـ VPS خلال 60 ثانية عبر البريد الإلكتروني مع وصول SSH

الخطوة 2: الاتصال عبر SSH والتحضير

  1. اتصل عبر SSH: ssh root@votre-ip
  2. حدّث النظام: apt update && apt upgrade -y
  3. أنشئ مستخدما غير root: adduser botuser && usermod -aG sudo botuser
  4. ثبّت Node.js 20 LTS: curl -fsSL https://deb.nodesource.com/setup_20.x | bash && apt install -y nodejs (لـ Node) أو Python 3: apt install -y python3 python3-pip python3-venv (لـ Python)

الخطوة 3: نشر البوت

  1. ارفع الشيفرة عبر Git: git clone https://github.com/vous/votre-bot.git
  2. ثبّت الاعتماديات: npm install (Node) أو pip install -r requirements.txt (Python)
  3. أنشئ ملف .env يحتوي على رمز Discord (token)، ولا تُدرجه أبدا في Git
  4. اختبر بالتشغيل اليدوي: node bot.js أو python bot.py

الخطوة 4: إبقاء البوت يعمل على مدار الساعة

بالنسبة إلى Node.js: استخدم PM2.

  1. ثبّت PM2: npm install -g pm2
  2. شغّل البوت: pm2 start bot.js --name discord-bot
  3. اضبط التشغيل التلقائي عند إعادة التشغيل: pm2 startup && pm2 save
  4. عرض السجلات: pm2 logs discord-bot

الخطوة 5: تأمين VPS بوت Discord

يعد بوت Discord المكشوف على الإنترنت هدفا مفضلا لهجمات التخمين العنيف على SSH وفحص المنافذ ومحاولات الاستغلال. تكفي ثلاثة إجراءات تحصين للقضاء على 99 % من التهديدات: مصادقة SSH بالمفتاح فقط، وجدار حماية UFW مقيد، وfail2ban لصد هجمات القاموس.

  1. عطل تسجيل الدخول عبر SSH بكلمة المرور: أنشئ مفتاحا على جهازك (ssh-keygen -t ed25519)، وانسخه إلى الـ VPS (ssh-copy-id botuser@votre-ip)، ثم عدل /etc/ssh/sshd_config واضبط PasswordAuthentication no + PermitRootLogin no. أعد التحميل: systemctl restart sshd
  2. تفعيل UFW (جدار حماية Ubuntu): ufw default deny incoming && ufw default allow outgoing && ufw allow ssh && ufw enable. ينشئ بوت Discord اتصالات صادرة (نحو gateway.discord.gg)، ولا حاجة إلى أي منفذ وارد
  3. تثبيت fail2ban: apt install -y fail2ban && systemctl enable --now fail2ban. يحظر تلقائيا أي عنوان IP يحاول أكثر من 5 تسجيلات دخول فاشلة عبر SSH خلال 10 دقائق (حظر لمدة ساعة واحدة افتراضيا)
  4. التحديثات الأمنية التلقائية: apt install -y unattended-upgrades && dpkg-reconfigure --priority=low unattended-upgrades. تُثبَّت التصحيحات الحرجة (CVE) دون تدخل
  5. خزن رمز Discord في ملف .env خارج المستودع: أضف .env إلى ملف .gitignore، وحمله باستخدام dotenv (Node) أو python-dotenv (Python). لا ترفع رمزك أبدا إلى GitHub، إذ يلغي Discord الرموز المسربة في غضون ثوان

استكشاف الأخطاء: بوت Discord يتعطل، ماذا أفعل؟

نادرا ما يعود توقف البوت في بيئة الإنتاج إلى عطل في الـ VPS، ففي 90 % من الحالات يكون السبب خطأ في التطبيق (رمز منتهي الصلاحية، استثناء غير معالج، تجاوز الذاكرة، حد المعدل في Discord). إليك قائمة التشخيص التي يجب اتباعها بالترتيب.

  • التحقق من حالة العملية: pm2 status (Node) أو systemctl status mon-bot (Python). ابحث عن «online» / «active (running)». إذا ظهر «errored» / «failed»، فانتقل إلى النقطة التالية
  • اقرأ السجلات الحديثة: pm2 logs discord-bot --lines 100 أو journalctl -u mon-bot -n 100 --no-pager. من سجلات Discord المعتادة التي يجب التعرف عليها: DiscordAPIError[401] = رمز غير صالح أو ملغى، DiscordAPIError[429] = تجاوز حد الطلبات، UnhandledPromiseRejection = استثناء غير متزامن غير معالج
  • رمز غير صالح (401 Unauthorized): أنشئ رمزا جديدا على discord.com/developers/applications ← Bot ← Reset Token. حدث ملف .env ثم نفذ pm2 restart discord-bot
  • إيقاف البوت بسبب نفاد الذاكرة (OOM-killed): تحقق باستخدام dmesg | grep -i "killed process". إذا تأكد ذلك، فإما أن في شيفرتك تسربا للذاكرة (ذاكرة مؤقتة تكبر بلا حدود)، وإما أن موارد الـ VPS غير كافية، فرقّه إلى 4 Go RAM
  • البوت غير متصل لكن العملية نشطة: على الأرجح قطع Discord اتصال WebSocket. فعّل autoReconnect: true في discord.js (افتراضيا) أو أنشئ معالجا on('disconnect') يعيد تنفيذ client.login()
  • فرض إعادة تشغيل نظيفة: يعيد pm2 restart discord-bot --update-env تحميل الشيفرة ومتغيرات البيئة معا. للبدء من الصفر تماما: pm2 delete discord-bot && pm2 start bot.js --name discord-bot
  • المراقبة المستمرة: اضبط pm2 install pm2-logrotate (لتجنب امتلاء القرص) وwebhook في Discord عبر pm2-discord-webhook لتنبيهك إذا تعطل البوت أكثر من 3 مرات خلال 5 دقائق

للمزيد: إضافة قاعدة بيانات إلى البوت

يحتاج بوت Discord الجاد إلى تخزين دائم للبيانات: إعدادات لكل خادم، وإحصاءات المستخدمين، واقتصاد افتراضي، وذاكرة تخزين مؤقت لأوامر slash، والإشراف (التحذيرات، الكتم). ثلاثة خيارات حسب حاجتك: PostgreSQL للبيانات العلائقية الموثوقة، وMongoDB للمخططات المرنة، وRedis للتخزين المؤقت السريع ولوحات الصدارة.

  • PostgreSQL (موصى به لـ 80 % من البوتات): apt install -y postgresql postgresql-contrib. أنشئ قاعدة بيانات: sudo -u postgres createdb monbot. مثالي مع Prisma ORM (Node): npm i @prisma/client prisma ثم عرف نماذجك في schema.prisma ونفذ npx prisma migrate dev. آمن من حيث الأنواع، مع ترحيلات مرقمة الإصدارات، ومثالي لبيانات مثل guilds/users/warnings
  • MongoDB (للمخططات المتطورة): apt install -y mongodb-org ثم systemctl enable --now mongod. استخدم Mongoose (Node): npm i mongoose. عملي لتخزين إعدادات JSON متداخلة (إعدادات الخادم مع قوائم الأدوار والقنوات المخصصة وغيرها) دون تحديد مخطط صارم مسبقا
  • Redis (تخزين مؤقت + لوحات صدارة فورية): apt install -y redis-server. استخدم ioredis (Node) أو redis-py (Python). مثالي لـ: التخزين المؤقت لأوامر slash (TTL ساعة واحدة)، وعد نقاط XP في sorted set (ZADD leaderboard 1500 user_id ثم ZREVRANGE leaderboard 0 9 WITHSCORES لأفضل 10)، وتحديد معدل الطلبات لمكافحة الرسائل المزعجة لكل مستخدم
  • مثال Prisma مبسط (Node + PostgreSQL): model Guild { id String @id; prefix String @default("!"); xpEnabled Boolean @default(true); warnings Warning[] } ثم في البوت: const guild = await prisma.guild.upsert({ where: { id: msg.guildId }, update: {}, create: { id: msg.guildId } }). يحفظ البوت إعدادات كل خادم بشكل دائم
  • أفضل الممارسات: انسخ قاعدة بياناتك احتياطيا يوميا (pg_dump monbot > backup.sql عبر cron)، ولا تكشف PostgreSQL/MongoDB أبدا على عنوان IP العام (UFW يرفض كل شيء باستثناء SSH)، واستخدم مجمع اتصالات لتجنب إغراق قاعدة البيانات عند توسع البوت

الأسئلة الشائعة

لبوت بسيط: 1 Go RAM كحد أدنى. لبوت مع قاعدة بيانات وعدة مئات من الخوادم: 2-4 Go RAM. يكفي VPS المبتدئ من By-Hoster بسعر 4,99 €/شهريًا لـ 90% من البوتات.

نعم، بشرط أن تكون قد أعددت pm2 startup (Node) أو خدمة systemd (Python). يُعاد تشغيل البوت تلقائيًا بعد إعادة التشغيل.

PM2 مدير عمليات لـ Node.js مزود بلوحة تحكم مدمجة وسجلات ملونة ومراقبة فورية للمعالج والذاكرة وميزة clustering، وهو مثالي لـ discord.js. أما systemd فهو مدير الخدمات الأصلي في Linux: أدنى مستوى لكنه شامل (Node وPython وGo وRust). بالنسبة إلى Python مع discord.py/aiogram، يفضل عادة systemd لأن PM2 مصمم لـ Node.