YENİ 📢 Sınırlı lansman teklifi: Tüm oyunlarda ilk aya %70'e varan indirim!Paketleri görün

aiogram botu 24/7 nasıl barındırılır: bot planı veya Linux VPS

Telegram botlarıUpdated Nov 6, 20269 min read

Bir aiogram botunu 24/7 barındırmak için onu bilgisayarınızda değil, hep açık kalan bir makinede çalıştırın: çökme veya yeniden başlatma sonrası botu tekrar başlatan bir systemd servisine sahip bir Linux VPS ya da kodunuzu yüklediğiniz, token'ı yapıştırdığınız ve Başlat'a bastığınız bir PlayNHost bot planı (ayda US$1,99'dan başlar, bkz. Telegram bot barındırma). Testimizde aiogram 3.31.0 ile çalışan bir bot yük yokken yaklaşık 173 MB bellek kullandı; en küçük bot planımız STARTER 0,5 GB belleğe sahip. İki yol da long polling kullanır: dp.start_polling(bot) Telegram'dan yeni mesajları ister, bu yüzden botun herkese açık bir adrese ihtiyacı yoktur. PlayNHost'taki adımlar:

  1. Telegram'da @BotFather'a /newbot gönderin ve verdiği token'ı kopyalayın.
  2. Telegram bot barındırma sayfasında bir planda Sunucu oluştur düğmesine tıklayın. Sipariş penceresinde Botunuz hangi platform için? sorusunu Telegram ile yanıtlayın ve Python'u seçin.
  3. Sunucunuzu panelde açın. Genel bakış sayfasındaki Botunuzu kurun kartı Telegram’a bağlan adımında açılır; ilk adım olan Ne çalışır şunu söylemelidir: Bu bot Python Bot çalıştırır.
  4. Telegram’a bağlan adımında token'ı yapıştırın ve Bağlan düğmesine tıklayın. Gösterilen bot adını kontrol edin ve Evet, devam düğmesine tıklayın.
  5. Kodunuz adımında Dosya yükle düğmesine tıklayarak Files bölümünü açın ve bot.py ile requirements.txt dosyalarını yükleyin ya da Git’i bağla düğmesine tıklayın.
  6. Bot sayfasında, Kod bölümünde, Giriş dosyası'nın asyncio.run(main()) çalıştıran dosya olduğunu kontrol edin (varsayılan olarak bot.py).
  7. Botu başlat düğmesine tıklayın, Console'u açın ve aiogram'ın Run polling for bot @your_bot satırını bekleyin. Genel bakış sayfasındaki etiket Telegram’da çevrimiçi olarak değişir. Botunuza /start gönderin.

İlk başlatma, pip aiogram'ı ve bağımlılıklarını kurarken daha uzun sürer. Bundan sonra yalnızca requirements dosyanız, ek paketler veya Python sürümü değiştiğinde ya da günde bir kez yeniden kurar. Ekran görüntüleriyle adım adım anlatım: Telegram botu nasıl barındırılır.

Ne ölçtük

Üç Python Telegram kütüphanesini kendi sunucularımızdan birinde, panelin bir Python botunu çalıştırdığı gibi kurulmuş tek kullanımlık konteynerlerde çalıştırdık: Python 3.12 (önerilen olarak işaretli Çalışma ortamı), aynı pip komutuyla kurulan paketler, 1 GB bellek sınırı ve bir CPU çekirdeği.

KütüphaneSürümBoşta bellekBaşlangıçtan Telegram'ın yanıtınaKurulu boyut, bağımlılıklarla
aiogram3.31.0173 MB4,3 sn33,9 MB
python-telegram-bot22.844 MB0,9 sn12,3 MB
pyTelegramBotAPI4.37.140 MB0,7 sn21,9 MB
Yalnızca Python 3.129 MB

Her bot kütüphaneyi yükledi ve sahte bir token ile Telegram'a kim olduğunu sordu (aiogram: bot.get_me()). Bellek, Telegram token'ı reddettikten 15 saniye sonra botun işlemlerinin tuttuğu miktardır; başlangıç süresi Python'un başlatılmasından kütüphanenin bu yanıtı bildirmesine kadar sürer, dolayısıyla Telegram'a gidiş geliş bir tur içerir. İkisi de bir ısınma turundan sonraki üç çalıştırmanın medyanıdır.

Bu rakamlar kütüphanenin tabanıdır: sohbet yok, çalışan handler yok, önbellekte hiçbir şey yok. Kendi kodunuz, belleğinde tuttuğu veriler (örneğin aiogram'ın bellek depolamasındaki konuşma durumları) ve hizmet verdiği sohbet sayısı bunların üstüne eklenir, bu yüzden planı botunuzun yaptığı işe göre seçin. Daha eski sayfamız PlayNHost’ta python-telegram-bot ve aiogram karşılaştırması farklı bir kurulumu ölçtü (Python 3.13, hazır kurulmuş ve başlatılmaya hazır bir bot), bu yüzden oradaki rakamlar bunlarla karşılaştırılamaz.

Minimal bir aiogram botu

/start komutunu yanıtlar, panelin verdiği token'ı okur ve bir hazır satırı yazar. Kütüphaneyi requirements.txt dosyasına koyun:

aiogram>=3,<4

Kodu da bot.py dosyasına yazın:

import asyncio
import logging
import os
import sys

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) -> None:
    await message.answer("Hello! I am running on PlayNHost.")


async def main() -> None:
    bot = Bot(os.environ["BOT_TOKEN"])
    async with bot.context():
        await bot.delete_webhook()
        await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())

BOT_TOKEN değişkenini okur; bu, aiogram'ın kendi örneklerinin kullandığı addır. Panel token'ı koduna bu adın yanı sıra TELEGRAM_BOT_TOKEN, TOKEN ve TELEGRAM_TOKEN adlarıyla da verir. INFO düzeyinde günlük tutmak, Telegram token'ı kabul ettiğinde aiogram'ın INFO:aiogram.dispatcher:Run polling for bot @your_bot ile başlayan bir satır yazdırmasını sağlar; panel Telegram’da çevrimiçi göstermek için bu satırı okur, dolayısıyla kendi print'inize gerek yoktur. delete_webhook(), polling başlamadan önce başka bir sunucudan kalan webhook'u kaldırır. async with bot.context(), main() bittiğinde, hatayla bittiğinde de, botun Telegram bağlantısını kapatır.

Token yanlışsa

Testimizde, Telegram'ın reddettiği bir token ile test botumuz şunu yazdırdı:

TelegramUnauthorizedError: Telegram server says - Unauthorized

Tam bir traceback'te sınıf aiogram.exceptions.TelegramUnauthorizedError olarak görünür. Telegram'a yapılan ilk çağrı başarısız olur (yukarıdaki botta delete_webhook(); o olmasa getMe, yani start_polling'in yaptığı çağrı), bu yüzden bot hemen 1 çıkış koduyla durur. PlayNHost'ta panel, konsolun üstünde Telegram bot token’ınızı kabul etmedi mesajını Token’ı değiştir düğmesiyle birlikte gösterir.

Düzeltmek için token'ı yeniden kopyalayın: @BotFather'da /mybots gönderin, botunuzu seçin, ardından API Token'ı seçin. Token'ı Bot sayfasında, Telegram bölümünde, Jeton alanına yapıştırın ve botu yeniden başlatın.

Diğer iki durum farklı görünür. Boşluk içeren veya botun numarasından ve gizli kısmın önündeki iki noktadan yoksun bir token, herhangi bir istekten önce başarısız olur: Bot() biçimi kontrol eder ve TokenValidationError fırlatır; mesajı Token is invalid! ile başlar. Bot zaten polling yaparken iptal edilen bir token botu durdurmaz: aiogram Failed to fetch updates - TelegramUnauthorizedError yazar ve birkaç saniyede bir yeniden dener, bu yüzden hiçbir şey yanıt vermezken işlem çalışıyor gibi görünür. Bunu fark etmenin yolu panel bannerıdır.

Bir sunucunun aiogram hakkında bilmesi gerekenler

  • Paket ve import adları: ikisi de aiogram'dır. Yanında aiohttp, pydantic, magic-filter, aiofiles ve certifi de kurulur.
  • Python sürümü: aiogram 3.31 için Python 3.10 ile 3.14 arası gerekir. Kod bölümündeki Çalışma ortamı tam olarak 3.10 ile 3.14 arasını sunar, 3.12 önerilen olarak işaretlidir.
  • aiogram 2 kodu aiogram 3'te çalışmaz: Executor kaldırıldı, bu yüzden executor.start_polling(dp) yerine await dp.start_polling(bot) yazılır. requirements.txt dosyası aiogram==2.25.2 gibi bir 2.x sürümünü sabitleyen bir eğitim, sürüm 2 kodudur; aşağıdaki soruya bakın.
  • Başka bir sunucudan kalan webhook: start_polling onu kaldırmaz ve bir webhook ayarlıyken Telegram polling'i reddeder, bu yüzden aiogram TelegramConflictError yazar ve yeniden dener. await bot.delete_webhook() satırını yukarıdaki gibi tutun ya da Bot sayfasında, Telegram bölümünde Webhook’u kaldır düğmesine tıklayın.
  • Günlük kaydı: logging.basicConfig olmadan aiogram'ın INFO satırları, hazır satırı dahil, görünmez. INFO düzeyinde ayrıca her güncelleme için bir satır yazar (Update id=... is handled); yoğun bir botta, hazır satırını koruyan logging.getLogger("aiogram.event").setLevel(logging.WARNING) satırını ekleyin.
  • Hangi güncellemeler gelir: allowed_updates geçmezseniz start_polling, Telegram'dan yalnızca handler'ınızın olduğu güncelleme türlerini ister.
  • İkinci bir kopya: aynı token ile başka bir kopya polling yaptığında Telegram 409 Conflict yanıtı verir ve aiogram çalıştığı sürece yeniden dener. Panel Botunuz başka bir yerde de çalışıyor mesajını gösterir. Bkz. Telegram botu 409 Conflict hatasını düzeltin.

Kendiniz bir Linux VPS'te barındırın

Debian veya Ubuntu'da Python'u kurun, bot için bir kullanıcı oluşturun ve aiogram'ı bir sanal ortama kurun. python3 --version çıktısının 3.10 ile 3.14 arasında olduğunu kontrol edin.

sudo apt update
sudo apt install -y python3 python3-venv
sudo useradd --system --create-home --home-dir /opt/tgbot --shell /usr/sbin/nologin tgbot
sudo cp bot.py requirements.txt /opt/tgbot/
sudo -u tgbot python3 -m venv /opt/tgbot/venv
sudo -u tgbot /opt/tgbot/venv/bin/pip install -r /opt/tgbot/requirements.txt

Token'ı yalnızca root'un okuyabildiği bir dosyaya koyun. Dosyayı sudo nano /etc/tgbot.env ile açın, tek bir satır yazın, kaydedin, ardından sudo chmod 600 /etc/tgbot.env komutunu çalıştırın:

BOT_TOKEN=123456789:your-token-from-botfather

/etc/systemd/system/tgbot.service dosyasını oluşturun:

[Unit]
Description=Telegram bot (aiogram)
Wants=network-online.target
After=network-online.target

[Service]
User=tgbot
WorkingDirectory=/opt/tgbot
EnvironmentFile=/etc/tgbot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/tgbot/venv/bin/python /opt/tgbot/bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Şimdi ve her açılışta başlatın, ardından çıktısını izleyin:

sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f

Günlük satırları olduğu anda journal'a ulaşır; PYTHONUNBUFFERED=1, eklediğiniz her print() için aynısını yapar, aksi halde Python bir terminale yazmadığında onları bir tamponda bekletir. systemctl stop tgbot, SIGTERM gönderir; start_polling bunu polling'i durdurup botun oturumunu kapatarak işler. Kodu değiştirdikten sonra sudo systemctl restart tgbot komutunu çalıştırın. Önce bilgisayarınızdaki her kopyayı durdurun, yoksa Telegram 409 Conflict yanıtı verir.

Kendi barındırmanız mı, bot planı mı

  • Yönettiğiniz bir VPS'te: sistem güncellemeleri, Python sürümü, sanal ortam, paketleri yeniden kurma, unit dosyası, journal'ı okuma ve botun yanıt vermeyi bıraktığını fark etme size aittir. Karşılığında root yetkiniz olur ve bir alan adı ile HTTPS eklerseniz aiogram'ın webhook modunu kullanabilirsiniz.
  • Bot planında panel yapar: requirements.txt değiştiğinde kurar, çökmeden sonra botu yeniden başlatır, token'ı kaydetmeden önce Telegram ile doğrular, onu koduna beş adla verir, konsolu okur ve bot yanıt vermeyi bıraktığında nedeni söyler (reddedilen bir token, ikinci bir kopya, bir webhook); token ve webhook için bir düğme de sunar. Bot planlarımız henüz herkese açık bir HTTPS adresi içermiyor, bu yüzden oradaki botlar long polling kullanır, start_polling da tam olarak bunu yapar.

Ayrıca bkz. aiogram botunda MySQL veritabanı nasıl kullanılır (aiomysql).

Sık sorulan sorular

aiogram 2 botu çalıştırabilir miyim?

Mümkünse aiogram 3'e taşıyın: aiogram'ın geçiş kılavuzu, kaldırılan Executor ile başlayarak değişiklikleri listeler. Son aiogram 2 sürümü olan 2.25.2, 6 Ekim 2023'te çıktı. Python 3.7 ile 3.10 arasını desteklenen olarak listeler ve PyPI'nin hazır paketleri yalnızca Python 3.11'e kadar sunduğu 3.9'dan eski bir aiohttp gerektirir. Taşımadan önce eski kodun çalışması gerekiyorsa aiogram==2.25.2 sürümünü requirements.txt içinde sabitleyin ve Çalışma ortamı'nı listelediği en yeni sürüm olan Python 3.10 yapın.

aiogram botum neden çalışıyor görünüyor ama hiç yanıt vermiyor?

aiogram, polling başladıktan sonra yeniden denemeye devam eder: @BotFather'da iptal edilen bir token, aynı token'ı kullanan başka bir kopya ve botta kalmış bir webhook durumunda. Failed to fetch updates ile başlayan satırlara Console'da bakın; panel bu üç durumun her birini nedenini söyleyen bir banner'a çevirir ve token ile webhook için bir düğme sunar.

aiogram'ın FSM durumları nerede tutulur?

Varsayılan bellek depolamasında bot işleminin içinde: bot yeniden başladığında, örneğin kodu değiştirdikten sonra, kaybolurlar. Onları korumak için işlemin dışında bir depolama kullanın; örneğin erişebildiğiniz bir Redis sunucusuyla aiogram'ın Redis depolaması.

Bir aiogram botunu çevrimiçi tutmak için webhook gerekir mi?

Hayır. start_polling Telegram'dan yeni mesajları istemeye devam eder, bu yüzden işlem çalıştığı sürece bot yanıt verir. Webhook kullanan bir botu taşımak için: Telegram botunuzu PlayNHost’a nasıl taşırsınız.

aiogram, STARTER (0,5 GB) dahil her PlayNHost bot planında çalışır. Planları karşılaştırın ve Sunucu oluştur düğmesine Telegram bot barındırma sayfasında tıklayın.

Botun başka bir yerde mi? Bize taşı

EN YENİ BLOG YAZILARIMIZ