aiogram Python'da Telegram bot yozish uchun eng ommabop kutubxonalardan biri. U asinxron ishlaydi, routerlar va filtrlar orqali kodni tartibli saqlashga yordam beradi va FSM yordamida ko'p bosqichli suhbatlarni qulay boshqaradi. Bot noutbukda python bot.py bilan a'lo ishlaydi, lekin kompyuter o'chishi bilan bot ham javob berishni to'xtatadi. Ushbu maqolada Namangandagi kiyim do'koni uchun yozilgan buyurtma botini aiogram 3 asosida VPS serverga joylab, uni kechayu kunduz ishlaydigan xizmatga aylantiramiz.
Nega oddiy hosting emas, VPS
Polling rejimidagi bot doimiy ishlab turadigan Python jarayonidir. Oddiy shared hosting asosan PHP saytlar uchun mo'ljallangan va unda uzoq ishlaydigan fon jarayonlari odatda cheklanadi yoki ma'lum vaqtdan keyin to'xtatiladi. Cron orqali botni qayta-qayta ishga tushirishga urinish ham ishonchli natija bermaydi. Shuning uchun bot uchun eng to'g'ri joy bu kichik VPS, unda jarayonni systemd boshqaradi va bot server qayta yuklanganda ham o'zi ko'tariladi. sayt.uz'da VPS kabinet orqali buyurtma qilinadi va bir necha daqiqada tayyor bo'ladi.
Bot kodini tayyorlash
Production uchun birinchi qoida: token kod ichida yozilmaydi. U muhit o'zgaruvchisidan o'qiladi, shunda kodni GitHub'ga yuklasangiz ham token oshkor bo'lmaydi. Quyida aiogram 3 uchun minimal, lekin to'g'ri tuzilgan bot misoli keltirilgan. Loglash yoqilgan, chunki serverda xatolarni faqat loglar orqali ko'rasiz.
import asyncio, logging, os
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message
dp = Dispatcher()
@dp.message(CommandStart())
async def start(message: Message):
await message.answer("Assalomu alaykum! Kerakli mahsulot nomini yozing.")
async def main():
bot = Bot(token=os.environ["BOT_TOKEN"])
await dp.start_polling(bot)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
asyncio.run(main())
Kutubxona versiyalarini requirements.txt faylida qayd eting. aiogram'ning 2 va 3 versiyalari o'rtasida katta farqlar bor, shuning uchun versiya chegarasini aniq yozish keyinchalik kutilmagan buzilishlarning oldini oladi: masalan, aiogram>=3.0,<4.0.
Serverda virtual muhit yaratish
Tizimdagi Python paketlariga aralashmaslik uchun bot alohida virtual muhitda ishlashi kerak. Avval bot uchun alohida foydalanuvchi yaratamiz, kodni Git orqali yuklaymiz va bog'liqliklarni o'rnatamiz. Ubuntu'da venv moduli alohida paket sifatida o'rnatilishi mumkin.
sudo apt install -y python3-venv git
sudo adduser --disabled-password bot
sudo -iu bot
git clone https://github.com/misol/shop-bot.git
cd shop-bot
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
Token va boshqa sozlamalar uchun /home/bot/shop-bot/.env faylini yarating va unga BOT_TOKEN=... qatorini yozing. So'ng chmod 600 .env bilan faylni faqat egasi o'qiy oladigan qiling. Bu fayl .gitignore ro'yxatida bo'lishi shart.
systemd xizmati: bot doimo tirik
systemd jarayonni fon rejimida ishlatadi, u yiqilsa bir necha soniyadan keyin qayta ko'taradi va server yoqilganda avtomatik ishga tushiradi. EnvironmentFile direktivasi .env faylidagi qiymatlarni muhit o'zgaruvchisi sifatida beradi, shuning uchun kodga qo'shimcha kutubxona kerak emas.
# /etc/systemd/system/shop-bot.service
[Unit]
Description=Shop Telegram bot (aiogram)
After=network-online.target
Wants=network-online.target
[Service]
User=bot
WorkingDirectory=/home/bot/shop-bot
EnvironmentFile=/home/bot/shop-bot/.env
ExecStart=/home/bot/shop-bot/.venv/bin/python bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now shop-bot
journalctl -u shop-bot -f
Yangilanish chiqarish jarayoni ham sodda: git pull, kerak bo'lsa .venv/bin/pip install -r requirements.txt va sudo systemctl restart shop-bot. Botning bir vaqtning o'zida faqat bitta nusxasi ishlashiga e'tibor bering. Agar noutbukdagi eski nusxa ham yoqiq qolsa, polling to'qnashuvi sababli aiogram TelegramConflictError xatosini chiqaradi.
FSM holatlari qayta ishga tushganda yo'qolmasin
Buyurtma boti odatda bir necha bosqichdan iborat: mahsulot, o'lcham, telefon raqami, manzil. aiogram bu bosqichlarni FSM orqali saqlaydi va standart holatda MemoryStorage ishlatiladi. Muammo shundaki, xizmat qayta ishga tushirilganda xotiradagi barcha holatlar o'chadi va yarim yo'lda qolgan mijoz boshidan boshlashga majbur bo'ladi. Production'da Redis asosidagi ombor ishlatish to'g'ri yechim.
from aiogram.fsm.storage.redis import RedisStorage
storage = RedisStorage.from_url("redis://127.0.0.1:6379/0")
dp = Dispatcher(storage=storage)
Buyurtmalarning o'zini esa doimiy bazada saqlang. Kichik do'kon uchun SQLite ham yetarli bo'lishi mumkin, lekin bir nechta jarayon yoki administrator paneli bir vaqtda yozadigan bo'lsa, PostgreSQL yoki MySQL ishonchliroq tanlov.
Webhook rejimiga o'tish
Foydalanuvchilar ko'payganda yoki bot sayt bilan bir serverda turganda webhook qulayroq bo'lishi mumkin. aiogram bunga tayyor aiohttp integratsiyasini beradi. Bot ichki portni tinglaydi, Nginx esa HTTPS so'rovlarini unga uzatadi. secret_token soxta so'rovlardan himoya qiladi.
from aiohttp import web
from aiogram.webhook.aiohttp_server import SimpleRequestHandler, setup_application
SECRET = os.environ["WEBHOOK_SECRET"]
async def on_startup(bot: Bot):
await bot.set_webhook("https://bot.example.uz/tg/webhook", secret_token=SECRET)
def main():
bot = Bot(token=os.environ["BOT_TOKEN"])
dp.startup.register(on_startup)
app = web.Application()
SimpleRequestHandler(dispatcher=dp, bot=bot, secret_token=SECRET).register(app, path="/tg/webhook")
setup_application(app, dp, bot=bot)
web.run_app(app, host="127.0.0.1", port=8081)
Nginx'da location /tg/webhook bloki proxy_pass http://127.0.0.1:8081; bilan sozlanadi, subdomen uchun esa Let's Encrypt sertifikati olinadi. systemd xizmati o'zgarmaydi, faqat ishga tushiriladigan fayl webhook versiyasiga almashtiriladi.