Ko'pchilik Python botini birinchi marta serverga joylaganda uni SSH orqali python3 bot.py buyrug'i bilan ishga tushiradi va hammasi ishlayotganini ko'rib xursand bo'ladi. Ammo terminal oynasi yopilishi bilan yoki SSH ulanish uzilishi bilan bot ham to'xtaydi. Undan keyin nohup yoki screen sinab ko'riladi, lekin server qayta yuklanganda yoki bot xato bilan yiqilganda uni hech kim qayta ishga tushirmaydi. Botni haqiqatan ham kecha-kunduz ishlatish uchun uni operatsion tizim boshqaradigan xizmatga aylantirish kerak.
Nega oddiy hosting bunga mos emas
Oddiy shared hosting asosan PHP saytlar uchun mo'ljallangan: so'rov keladi, skript ishlaydi va tugaydi. Doimiy ishlab turadigan jarayonlar bunday muhitda odatda resurs cheklovlari yoki tizim tomonidan to'xtatiladi, cron orqali "tirik ushlash" urinishlari ham ishonchli natija bermaydi. Shuning uchun 24/7 ishlashi kerak bo'lgan bot uchun root huquqi bor VPS eng to'g'ri tanlov hisoblanadi. VPS'da siz o'zingiz systemd xizmatini yaratasiz va bot tizim bilan birga ishga tushadi.
Botni tayyorlash: alohida foydalanuvchi va virtual muhit
Botni root nomidan ishlatish xavfsizlik nuqtai nazaridan yomon odat. Yaxshisi, bot uchun alohida tizim foydalanuvchisi yaratib, kodni uning papkasiga joylashtiring. Kutubxonalarni tizim Python'iga emas, virtual muhitga o'rnating, shunda boshqa loyihalar bilan versiya to'qnashuvi bo'lmaydi.
sudo adduser --system --group --home /opt/mybot mybot
sudo -u mybot python3 -m venv /opt/mybot/venv
sudo -u mybot /opt/mybot/venv/bin/pip install -r /opt/mybot/requirements.txt
Bot tokeni kabi maxfiy ma'lumotlarni kod ichiga yozmang. Ularni alohida .env faylda saqlang va faylga faqat bot foydalanuvchisi o'qiy oladigan huquq bering. Bu token tasodifan GitHub'ga yuklanib ketishidan ham himoya qiladi.
sudo nano /opt/mybot/.env
# BOT_TOKEN=123456:ABC...
sudo chown mybot:mybot /opt/mybot/.env
sudo chmod 600 /opt/mybot/.env
systemd xizmatini yaratish
systemd zamonaviy Linux tizimlarida xizmatlarni boshqaruvchi asosiy vosita. U jarayonni ishga tushiradi, yiqilsa qayta ko'taradi, server yuklanganda avtomatik yoqadi va barcha chiqishni jurnalga yozadi. Buning uchun bitta unit fayl yozish kifoya.
sudo nano /etc/systemd/system/mybot.service
[Unit]
Description=Telegram bot (mybot)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/opt/mybot/.env
ExecStart=/opt/mybot/venv/bin/python -u bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Bu yerda Restart=always bot qaysi sabab bilan to'xtamasin, besh soniyadan keyin uni qayta ishga tushiradi. -u bayrog'i Python chiqishini buferlamaydi, shuning uchun loglar jurnalda darhol ko'rinadi. Fayl tayyor bo'lgach, systemd'ga yangi xizmat haqida xabar beriladi va u yoqiladi.
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
systemctl status mybot
Loglarni kuzatish
Bot nima qilayotganini bilish uchun alohida log fayl yaratish shart emas, chunki systemd barcha chiqishni jurnalga yig'adi. Quyidagi buyruqlar oxirgi yozuvlarni ko'rsatadi yoki yangi yozuvlarni jonli kuzatib boradi. Kodni yangilaganingizdan keyin xizmatni qayta ishga tushirish ham bitta buyruq bilan bajariladi.
journalctl -u mybot -n 100
journalctl -u mybot -f
sudo systemctl restart mybot
PM2 bilan ishlatish varianti
PM2 aslida Node.js uchun yaratilgan jarayon menejeri, lekin u Python skriptlarini ham bemalol boshqaradi. Agar serverda allaqachon Node.js loyihalari PM2 orqali ishlayotgan bo'lsa, barcha jarayonlarni bitta ro'yxatda ko'rish qulay. PM2 o'rnatish uchun serverda Node.js va npm bo'lishi kerak.
sudo npm install -g pm2
cd /opt/mybot
pm2 start bot.py --name mybot --interpreter /opt/mybot/venv/bin/python
pm2 save
pm2 startup
pm2 startup buyrug'i ekranga bitta sudo buyrug'ini chiqaradi, uni nusxalab bajarish kerak, aks holda server qayta yuklanganda PM2 o'zi ishga tushmaydi. pm2 save esa joriy jarayonlar ro'yxatini saqlab qo'yadi. Keyinchalik pm2 logs mybot bilan loglarni, pm2 restart mybot bilan qayta ishga tushirishni boshqarasiz.
systemd yoki PM2: qaysi birini tanlash
| Mezon | systemd | PM2 |
|---|---|---|
| Qo'shimcha o'rnatish | Kerak emas, tizimda bor | Node.js va npm kerak |
| Loglar | journalctl | pm2 logs, ~/.pm2/logs |
| Bir nechta jarayonni ko'rish | systemctl list-units | pm2 list, pm2 monit |
| Kimga qulay | Faqat Python loyihalari | Node.js bilan aralash serverlar |
Faqat bitta yoki ikkita Python bot bo'lsa, systemd ortiqcha bog'liqliksiz eng sodda va ishonchli yo'l. PM2 esa ko'p loyihani bitta panel orqali kuzatishni xohlaganlar uchun qulay.
Amaliy misol: Toshkentdagi gul do'koni boti
Faraz qilaylik, Toshkentdagi gul do'koni buyurtmalarni Telegram bot orqali qabul qiladi va har bir buyurtmani misol.uz saytidagi bazaga yozadi. Bot oldin dasturchining noutbukida ishlagan va kechasi noutbuk yopilganda buyurtmalar yo'qolgan. Botni kichik VPS'ga ko'chirib, yuqoridagi systemd xizmati bilan ishga tushirgandan keyin u server bilan birga yonadi, tarmoq uzilib xato bersa, besh soniyada qayta ko'tariladi. Do'kon egasi muammo bo'lganda journalctl -u mybot orqali aniq xato matnini ko'rib, dasturchiga yuboradi.
Tez-tez uchraydigan xatolar
- Unit faylda nisbiy yo'l yozish:
ExecStartichida doim to'liq yo'ldan foydalaning. - Virtual muhit o'rniga tizim Python'ini ko'rsatish, natijada kutubxona topilmaydi degan xato chiqadi.
- Bitta botni ham systemd, ham PM2 orqali bir vaqtda ishga tushirish: Telegram bunda ikki nusxa so'rovlari to'qnashuvi haqida xato beradi.
- Fayl o'zgargandan keyin
daemon-reloadqilishni unutish.
Bot uchun server kerak bo'lsa, sayt.uz kabinetidan VPS buyurtma qilib, unda yuqoridagi sozlamalarni bir necha daqiqada bajarishingiz mumkin. Asosiysi, bot terminalga emas, tizimga bog'langan bo'lishi kerak.