كتبت بوت تيليجرام بـ aiogram، اختبرته محليًا، وهو يعمل. الآن عليه أن يعيش في مكان لا ينام حين تُغلق الحاسوب المحمول. VPS صغير هو البيت الطبيعي — لكن هناك فجوة بين python bot.py في جلسة SSH وبوت يبقى مشتغلًا فعلًا عبر الأعطال وإعادات التشغيل وسقوط اتصالك.
هذه النسخة الإنتاجية: virtualenv، الرمز مُبقى خارج شيفرتك، خدمة systemd تبعث البوت من تلقاء نفسها، وإجابة واضحة البصيرة عن السؤال الذي يسأله الجميع في النهاية — استطلاع أم webhook؟
لماذا لا تُشغّله على حاسوبك المحمول فحسب
البوت يحتاج اتصالًا صادرًا ثابتًا إلى تيليجرام. حاسوبك المحمول ينام، يُعيد التشغيل للتحديثات، ويقفز بين الشبكات — كلٌّ من هذه يُسقط البوت، ويصطدم المستخدمون بجدار صمت. VPS يحمل ذلك الاتصال على مدار الساعة. ذلك هو كل سبب نقله عن آلتك، وهو السبب نفسه لأنّ بوت ديسكورد ينتمي إلى خادم أيضًا.
إن أردت أسرع مسار «أطلقه على الإنترنت» ببوت أدنى، فإنّ جولة استضافة بوت تيليجرام تغطّي ذلك. هذه القطعة تذهب أعمق درجةً: aiogram، وتعامل آمن مع الرمز، ومعرفة متى تُوسّع.
البوت، في virtualenv
ادخل عبر SSH وأبقِ البوت معزولًا في venv الخاص به — لا تثبّت الحزم على مستوى النظام، فهذا يجعل الترقيات والتنظيف فوضى لاحقًا:
sudo apt update && sudo apt install -y python3-venv
mkdir ~/tgbot && cd ~/tgbot
python3 -m venv venv && source venv/bin/activate
pip install -U aiogram
بوت aiogram 3 أدنى يقرأ رمزه من البيئة، لا من سلسلة مُضمَّنة:
# bot.py
import asyncio, logging, os
from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.filters import CommandStart
logging.basicConfig(level=logging.INFO)
dp = Dispatcher()
@dp.message(CommandStart())
async def start(m: Message):
await m.answer("Alive and running on a VPS.")
async def main():
bot = Bot(os.environ["BOT_TOKEN"])
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
أبقِ الرمز خارج شيفرتك
لا تلصق أبدًا رمز BotFather في bot.py — دفعة واحدة إلى مستودع عامّ وهو مُسرَّب. ضعه في ملف بيئة يقرؤه root بدلًا:
sudo tee /etc/tgbot.env >/dev/null <<'EOF'
BOT_TOKEN=123456:your-token-from-botfather
EOF
sudo chmod 600 /etc/tgbot.env
رمز مُسرَّب على بُعد /revoke واحد في BotFather من الإصلاح — لكن أي شيء آخر مُسرَّب على آلة مشتركة أسوأ. VPS مخصّص للبوت هو بصدق بيت أأمن للرمز من حاسوبك المحمول اليومي: إن تسرّب، تُدوّر رمزًا واحدًا، لا إعدادك كله.
الجزء الذي يُبقيه حيًّا: systemd
هذا ما يفصل بوتًا يعمل عن بوت يبقى يعمل. أنشئ الخدمة:
# /etc/systemd/system/tgbot.service
[Unit]
Description=Telegram bot (aiogram)
After=network-online.target
Wants=network-online.target
[Service]
User=botuser
WorkingDirectory=/home/botuser/tgbot
EnvironmentFile=/etc/tgbot.env
ExecStart=/home/botuser/tgbot/venv/bin/python bot.py
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
شغّله كمستخدم غير root (botuser أعلاه)، لا root — إن اختُرق البوت يومًا، تريده محتوى. ثم:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
Restart=always مع RestartSec=3 يعني أنّ عطلًا — تحديثًا سيئًا من تيليجرام، استثناءً غير معالَج، نفاد ذاكرة — يُعيد البوت في ثلاث ثوانٍ بدل تركه ميتًا حتى تلاحظ. راقبه حيًّا:
journalctl -u tgbot -f
ذلك إعداد تسجيلك كله. لا ملفّات سجلّ لتدويرها، لا أدوات إضافية — journald لديه ذلك أصلًا.
التحديث دون دراما توقّف
حين تُغيّر الشيفرة أو ترفع aiogram:
cd ~/tgbot && source venv/bin/activate
pip install -U aiogram # إن كنت ترقّي المكتبة
sudo systemctl restart tgbot
journalctl -u tgbot -n 30 --no-pager # تأكّد أنه عاد نظيفًا
إعادة التشغيل تُومض البوت لثانية أو اثنتين. لبوت استطلاع ذلك غير مرئي للمستخدمين — تيليجرام يُصفّ التحديثات ويسلّمها حالما يُعيد البوت الاتصال.
الاستطلاع مقابل webhook — النسخة الصادقة
هذا القرار الذي يُفرِط الناس في التفكير به. إليك النسخة البسيطة:
الاستطلاع (start_polling، ما تستخدمه الشيفرة أعلاه) يجعل البوت يسأل تيليجرام «أي جديد؟» على اتصال طويل الأمد. لا يحتاج سوى إنترنت صادر — بلا نطاق، بلا TLS، بلا منافذ واردة مفتوحة. يعمل جيّدًا خلف NAT. للغالبية الساحقة من البوتات، هذا صحيح وينبغي أن تتوقّف هنا.
webhook يجعل تيليجرام يدفع التحديثات إليك، ما يعني أنّ عليك كشف نقطة HTTPS عامة. ذلك يتطلّب نطاقًا ومنفذًا واردًا في المتناول — فإمّا IP عامّ مخصّص أو وكيل عكسي أمامه. إعداد أكثر، أشياء أكثر تنكسر. المردود زمن استجابة أقلّ وعبء أقلّ على نطاق واسع — آلاف المستخدمين المتزامنين، حجم تحديثات ثقيل.
القاعدة العملية: ابدأ بالاستطلاع على خطة NAT. انتقل إلى webhook فقط حين تتجاوز الاستطلاع فعلًا — وإن فعلت، فحينها يكسب IP مخصّص مكانه، لأنك تحتاج تلك النقطة HTTPS الواردة.
ما يكلّفه التشغيل
بوت الاستطلاع خفيف. يخمل على استطلاع تيليجرام الطويل ويتفاعل مع الرسائل، فالصندوق ينتظر أساسًا:
- Nano بـ 3$ (1 vCPU / 1 GB) — جيّد لمعظم البوتات، حتى الثرثارة نسبيًا.
- Micro بـ 5$ (2 vCPU / 2 GB) — حين يحتفظ البوت بقاعدة بيانات (SQLite/Postgres)، يعالج وسائط، أو يخدم كثيرًا من المستخدمين.
- أعلى فقط إن قام البوت نفسه بعمل حقيقي — معالجة صور، نموذج محلي، منطق ثقيل لكل رسالة.
التسجيل بالبريد فقط وتدفع بـ USDC أو USDT على Base أو Ethereum — بلا بطاقة، بلا هوية. البطاقة تعمل أيضًا، لكن للبوّابة حدّ أدنى ~27$، فلخطة 3$ أسلس أن تشحن رصيدًا صغيرًا مرة وتدع التجديدات تسحب منه. إنه معالج فقط، مركز بيانات واحد في ألمانيا — غير مهمّ لبوت، يجدر معرفته إن احتجت GPU أو منطقة محدّدة.
الخلاصة الصادقة
بوت تيليجرام من أرخص ما يمكنك استضافته ذاتيًا: صندوق 3$، وحدة systemd، والاستطلاع يمنحك بوتًا على الإنترنت عبر الأعطال وإعادات التشغيل دون مجالسة. الجأ إلى webhook وخطة أكبر فقط حين يفرضه النطاق فعلًا — لا لأنّ درسًا أخبرك أنّ webhooks «أفضل». خذ الصندوق الصغير، أبقِ الرمز في ملف بيئة، دع systemd يتولّى وقت التشغيل، و — قبل أي شيء — نفّذ قائمة أمان الـ VPS الجديد كي يكون الصندوق نفسه محكمًا.
مستعدّ لاستضافة بوتك؟ بوت تيليجرام بالكاد يستخدم موارد — خطة Nano (3$ شهريًا) تُشغّله على مدار الساعة دون عناء.
التعليقات
لا تعليقات بعد. كن الأول.