aiogram ile bir Telegram botu yazdın, yerelde test ettin ve çalışıyor. Şimdi dizüstünü kapatınca uyumayan bir yerde yaşaması gerekiyor. Küçük bir VPS doğal evi — ama bir SSH oturumundaki python bot.py ile çökmeler, yeniden başlatmalar ve bağlantının kopması boyunca gerçekten ayakta kalan bir bot arasında bir uçurum var.
Bu, üretim sürümü: bir virtualenv, kodundan uzak tutulan token, botu kendi kendine dirilten bir systemd servisi ve herkesin sonunda sorduğu soruya net bir cevap — polling mi webhook mi?
Neden dizüstünde çalıştırmamalısın
Bir botun Telegram'a istikrarlı bir dışa dönük bağlantısı gerekir. Dizüstün uyur, güncellemeler için yeniden açılır ve ağlar arasında zıplar — bunların her biri botu düşürür ve kullanıcılar bir sessizlik duvarına toslar. Bir VPS o bağlantıyı günün her saati tutar. Onu makinenden taşımanın bütün nedeni budur ve aynı neden bir Discord botunun da bir sunucuya ait olmasının nedenidir.
Minimal bir botla mümkün olan en hızlı "çevrim içine al" yolunu istiyorsan, Telegram botu barındırma anlatımı bunu kapsar. Bu yazı bir kademe daha derine iner: aiogram, güvenli token yönetimi ve ne zaman ölçeklendireceğini bilmek.
Bot, bir virtualenv içinde
SSH ile bağlan ve botu kendi venv'inde izole tut — paketleri sistem geneline kurma, bu sonradan yükseltmeleri ve temizliği bir kâbusa çevirir:
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
Token'ını sabit-kodlanmış bir dizeden değil, ortamdan okuyan minimal bir aiogram 3 botu:
# 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())
Token'ı kodundan uzak tut
BotFather token'ını asla bot.py içine yapıştırma — herkese açık bir depoya tek bir push ve sızdı demektir. Bunun yerine yalnızca root'un okuyabileceği bir env dosyasına koy:
sudo tee /etc/tgbot.env >/dev/null <<'EOF'
BOT_TOKEN=123456:your-token-from-botfather
EOF
sudo chmod 600 /etc/tgbot.env
Sızan bir token, BotFather'da bir /revoke ile düzeltilir — ama paylaşımlı bir makinede sızan başka herhangi bir şey daha kötüdür. Bot için ayrılmış bir VPS, token için günlük dizüstünden dürüstçe daha güvenli bir evdir: sızarsa tüm kurulumunu değil, tek bir token'ı döndürürsün.
Onu ayakta tutan kısım: systemd
Çalışan bir botu, çalışır kalan bir bottan ayıran şey budur. Servisi oluştur:
# /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
Onu root olarak değil, root olmayan bir kullanıcı olarak (yukarıda botuser) çalıştır — bot bir gün ele geçirilirse onu kutuda sıkışmış istersin. Sonra:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
RestartSec=3 ile Restart=always, bir çökmenin — Telegram'dan kötü bir güncelleme, işlenmemiş bir istisna, bir OOM — botu sen fark edene dek ölü bırakmak yerine üç saniyede geri getirmesi demektir. Onu canlı izle:
journalctl -u tgbot -f
Bütün loglama kurulumun bu. Döndürülecek log dosyası yok, ekstra araç yok — journald zaten hallediyor.
Kesinti dramı olmadan güncelleme
Kodu değiştirdiğinde veya aiogram'ı yükselttiğinde:
cd ~/tgbot && source venv/bin/activate
pip install -U aiogram # kütüphaneyi yükseltiyorsan
sudo systemctl restart tgbot
journalctl -u tgbot -n 30 --no-pager # temiz geri geldiğini doğrula
Yeniden başlatma botu bir iki saniye kırpar. Bir polling botu için bu kullanıcılara görünmez — Telegram güncellemeleri kuyruğa alır ve bot yeniden bağlanınca teslim eder.
Polling vs webhook — dürüst sürüm
İnsanların fazla düşündüğü karar bu. İşte sade hâli:
Polling (start_polling, yukarıdaki kodun kullandığı) botun uzun ömürlü bir bağlantı üzerinden Telegram'a "yeni bir şey var mı?" diye sormasını sağlar. Dışa dönük internetten başka hiçbir şeye ihtiyacı yoktur — alan adı yok, TLS yok, açık gelen port yok. NAT arkasında gayet iyi çalışır. Botların ezici çoğunluğu için bu doğrudur ve burada durmalısın.
Webhook ise Telegram'ın güncellemeleri sana itmesini sağlar; bu da herkese açık bir HTTPS ucunu açığa çıkarman gerektiği anlamına gelir. Bu, bir alan adı ve erişilebilir bir gelen port gerektirir — yani ya özel bir herkese açık IP ya da önünde bir ters vekil. Daha çok kurulum, bozulacak daha çok şey. Ödülü, büyük ölçekte daha düşük gecikme ve daha az ek yüktür — binlerce eşzamanlı kullanıcı, ağır güncelleme hacmi.
Pratik kural: bir NAT planında polling ile başla. Webhook'a yalnızca polling'i gerçekten aştığında geç — ve geçersen, o zaman bir özel IP yerini hak eder, çünkü o gelen HTTPS ucuna ihtiyacın vardır.
Çalıştırma maliyeti
Bir polling botu hafiftir. Telegram'ın uzun-yoklamasında boşta bekler ve mesajlara tepki verir, yani kutu çoğunlukla bekler:
- 3 $ Nano (1 vCPU / 1 GB) — çoğu bot için, oldukça gevezeleri bile dahil, gayet iyi.
- 5 $ Micro (2 vCPU / 2 GB) — bot bir veritabanı (SQLite/Postgres) tuttuğunda, medya işlediğinde ya da çok kullanıcıya hizmet verdiğinde.
- Yalnızca botun kendisi gerçek iş yaparsa daha yüksek — görüntü işleme, yerel bir model, ağır mesaj-başına mantık.
Kayıt yalnızca e-posta ile olur ve Base veya Ethereum üzerinde USDC ya da USDT ile ödersin — kart yok, kimlik yok. Kart da çalışır ama giriş rampasının ~27 $ minimumu vardır, yani 3 dolarlık bir plan için küçük bir bakiyeyi bir kez yükleyip yenilemeleri oradan çektirmek daha pürüzsüzdür. Yalnızca CPU'dur, Almanya'da tek bir veri merkezi — bir bot için önemsiz, GPU veya belirli bir bölge gerekiyorsa bilmeye değer.
Dürüst sonuç
Bir Telegram botu, kendin barındırabileceğin en ucuz şeylerden biridir: 3 dolarlık bir kutu, bir systemd birimi ve polling, sen dadılık etmeden çökmeler ve yeniden açılmalar boyunca çevrim içi kalan bir bot verir. Webhook'a ve daha büyük bir plana yalnızca ölçek gerçekten zorladığında uzan — bir öğretici sana webhook'ların "daha iyi" olduğunu söylediği için değil. Küçük kutuyu al, token'ı bir env dosyasında tut, çalışma süresini systemd'ye bırak ve — her şeyden önce — kutunun kendisini kilitlemek için yeni-VPS güvenlik kontrol listesini uygula.
Kendininkini barındırmaya hazır mısın? Bir Telegram botu kaynakları neredeyse hiç kullanmaz — Nano planı (3 $/ay) onu hiç uğraşmadan 7/24 çalıştırır.
Yorumlar
Henüz yorum yok. İlk olun.