Joylashtirish (deployment)¶
mojogram boti bitta native jarayon. Uni ishlab chiqarishda yurgizishning ikki yo'li: long-polling, unga binary va tashqi ulanishdan boshqa hech narsa kerak emas, yoki webhook, unga ochiq HTTPS endpoint kerak.
Polling¶
Eng oddiy deploy. Kiruvchi portlar yo'q, TLS yo'q, proxy yo'q. Jarayon
Telegram'ni long-poll qiladi va yangilanishlarni o'z siklida ishlaydi. Uni
jarayonni tirik saqlaydigan istalgan vosita ostida yuriting: systemd unit,
restart: always konteyner, supervisord.
export BOT_TOKEN="123456:your-token"
pixi run mojo run -I . yourbot.mojo
Bitta jarayon yetishmasa, polling toza shardlanmaydi (ikki poller bir xil offset uchun kurashadi), shuning uchun kengaytirish kerak bo'lsa webhook'ga o'ting.
nginx orqasidagi webhook'lar¶
Webhook server bir vaqtda bitta ulanishni ishlaydi, chunki Mojo 1.0'da threadlar
yo'q. O'tkazuvchanlikni TLS'ni tugatib, ular bo'ylab round-robin qiladigan proxy
orqasida bir nechta ishchi jarayon yurgizib olasiz. deploy/ papkasida aynan shu
uchun ishlaydigan stack bor.
flowchart LR
TG([Telegram]) -->|HTTPS POST| NG[nginx<br/>TLS, round-robin]
NG --> B1[ishchi :8080]
NG --> B2[ishchi :8080]
NG --> B3[ishchi :8080]
Uni uch fayl boshqaradi:
deploy/DockerfileUbuntu image quradi, pixi va MAX/Mojo toolchain'ni o'rnatadi, paketni ko'chiradi vaexamples/webhook_bot.mojo'ni yurgizadi. Birinchi build toolchain'ni tortadi, u katta (taxminan 1 GB), shuning uchun birinchi build sekin bo'lishini kuting.deploy/nginx.conf443'da tinglaydi, TLS'ni tugatadi vabotservisiga proxy qiladi. Docker DNSbot:8080'ni har replicaga hal qiladi, shuning uchun nginx tekinga round-robin qiladi.deploy/docker-compose.ymlikkalasini bog'laydi. Bot servisida host port yo'q; unga faqat nginx yeta oladi.
Ishga tushirish¶
# TLS sertifikatingizni nginx kutadigan joyga qo'ying
mkdir -p deploy/certs
cp fullchain.pem privkey.pem deploy/certs/
export BOT_TOKEN="123456:your-token"
docker compose -f deploy/docker-compose.yml up --build --scale bot=3
--scale bot=3 uchta ishchi jarayon yurgizadi. Yukingizga qarab sonni oshiring.
Webhook'ni bir marta ro'yxatdan o'tkazish¶
Telegram qayerga POST qilishni bilishi kerak. Uni domeningizga yo'naltiring va secret token o'rnating, shunda faqat Telegram'ning so'rovlari qabul qilinadi:
curl "https://api.telegram.org/bot$BOT_TOKEN/setWebhook?\
url=https://YOUR_DOMAIN&secret_token=YOUR_SECRET"
Keyin serverni o'sha secret bilan quring. U qiymatni Telegram'ning
X-Telegram-Bot-Api-Secret-Token sarlavhasiga solishtiradi va mos kelmaganini
tashlab yuboradi:
var srv = WebhookServer(Bot(token), 8080, secret_token="YOUR_SECRET")
while True:
handle(srv.context(srv.next()))
Telegram faqat HTTPS'ga POST qiladi va haqiqiy sertifikat talab qiladi. Haqiqiy yoki Let's Encrypt sertifikatidan foydalaning; self-signed sertifikat ishlab chiqarishda qabul qilinmaydi.
Takrorlanadigan buildlar¶
Mojo 1.0'gacha, va toolchain nightly'lar orasida o'zgaradi. pixi.lock (yoki
uv.lock) ni commit qiling, shunda olti haftadan keyingi deploy siz sinagan
xuddi shu kompilyatorni hal qiladi. Lockfilesiz qayta build yangiroq nightly
tortib, buildni buzishi mumkin.
Boshlanishida curl'ni tekshirish¶
Butun transport tizimdagi curl. Docker image uni o'rnatadi, lekin biror
qo'lbola joyga deploy qilsangiz, boshlanishida curl_available()'ni bir marta
chaqiring, shunda yo'q binary birinchi API chaqiruvida emas, baland ovozda
yiqiladi:
from mojogram.http import curl_available
if not curl_available():
raise Error("curl PATH'da yo'q; mojogram'ga u HTTP uchun kerak")