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

grammY botu 24/7 nasıl barındırılır

Telegram botlarıUpdated Nov 6, 20269 min read

Bir grammY botunu 24/7 barındırmak için onu her zaman açık bir makinede çalıştırırsınız: durduğunda yeniden başlatan bir systemd servisi olan bir Linux VPS ya da PlayNHost üzerinde bir bot planı (ayda US$1,99'dan başlayan fiyatlarla). Bot planında panel paketlerinizi kurar, token'ı koduna verir ve bot çökerse yeniden başlatır. Testimizde bir grammY 1.46.0 botu Node.js 22 üzerinde yaklaşık 60 MB bellek kullandı. grammY'nin bot.start() işlevi long polling kullanır ve planlarımızın ihtiyacı da budur: henüz webhook için herkese açık bir HTTPS adresleri yok. PlayNHost'taki adımlar:

  1. Telegram bot barındırma sayfasında bir planın üzerinde Sunucu oluştur düğmesine tıklayın. Sipariş penceresinde Botunuz hangi platform için? sorusuna Telegram yanıtını verin ve Node.js seçin.
  2. 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 göstermelidir: Bu bot Node.js Bot çalıştırır.
  3. Telegram’a bağlan adımında @BotFather'dan aldığınız token'ı Bot token’ınızı yapıştırın alanına yapıştırın, Bağlan düğmesine tıklayın, gösterilen bot adını kontrol edin ve Evet, devam düğmesine tıklayın.
  4. Kodunuz adımında Dosya yükle düğmesine tıklayın ve package.json ile index.js dosyalarınızı node_modules olmadan yükleyin ya da Git’i bağla düğmesine tıklayın. Henüz kodunuz yok mu? Başlangıç botu oluştur sizin için küçük bir grammY botu yazar.
  5. Bot sayfasında Kod bölümünde Giriş dosyası alanının botunuzu başlatan dosya olduğunu kontrol edin (varsayılan olarak index.js). Değiştirirseniz Kaydet düğmesine tıklayın.
  6. Botu başlat düğmesine tıklayın ve Console bölümünü açın. npm ilk başlatmada grammY'yi kurar, ardından botunuz Logged in as @your_bot yazdırır ve Genel bakış sayfasındaki etiket Telegram’da çevrimiçi olur.
  7. Bot sayfasında Telegram bölümünde Telegram’da aç düğmesine tıklayın ve botunuza /start gönderin.

Botu @BotFather'da oluşturma ve panel adımları Telegram botu nasıl barındırılır yazısında anlatılıyor. Bu sayfa grammY'nin kendisiyle ilgili: bir sunucuda neye ihtiyaç duyduğu ve barındırmadan önce bilmeniz gerekenler.

Ne ölçtük

KütüphaneSürümBoştaki bellekBaşlangıçtan Telegram'ın yanıtınaKurulum boyutu
grammY1.46.060 MB0,2 sn3,0 MB
Telegraf4.16.360 MB0,2 sn2,7 MB
node-telegram-bot-api2.3.063 MB0,2 sn2,4 MB
Yalnızca Node.js 22, kütüphanesiz22.23.443 MByokyok

Nasıl: kendi düğümümüzde, 1 GB'lık bir bot planı gibi kurulmuş tek kullanımlık bir konteynerde (Node.js 22 imajı ve Node.js bot türümüzün başlatma komutu, Node'un bellek sınırı yüzde 80'de), her bot Telegram'ı sahte bir token ile çağırdı ve Telegram bunu reddetti. Bellek, bu yanıttan 15 saniye sonraki resident bellektir, başlangıç süresi çalıştırmadan yanıta kadar geçen süredir ve her değer 2. ile 4. çalıştırmaların medyanıdır.

Bunlar taban değerlerdir: henüz sohbeti ve verisi olmayan bir bot. Kendi kodunuz, belleğe aldıkları ve sohbet sayısı bunlara eklenir, dolayısıyla kütüphane 0,5 GB'lık STARTER planının küçük bir parçasıdır.

Minimal bir grammY botu

/start komutuna yanıt verir, panelin verdiği token'ı okur ve bir hazır satırı yazdırır. İki dosyayı da botunuzun ana klasörüne koyun.

package.json

{
  "name": "my-grammy-bot",
  "private": true,
  "main": "index.js",
  "dependencies": {
    "grammy": "^1.46.0"
  }
}

index.js

const { Bot, GrammyError } = require("grammy");

const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN);

bot.command("start", (ctx) => ctx.reply("Hello! I am running on PlayNHost."));

// Without this, an error in one command stops the whole bot.
bot.catch((err) => {
  console.error(`Error while handling update ${err.ctx.update.update_id}:`, err.error);
});

// bot.start() only returns when the bot stops, so the ready line goes in onStart.
bot.start({
  onStart: (me) => console.log(`Logged in as @${me.username}`),
}).catch((err) => {
  if (err instanceof GrammyError && err.error_code === 401) {
    console.log("Telegram did not accept the bot token. Paste the current one from @BotFather, then restart.");
  } else {
    console.error(err);
  }
  process.exit(1);
});

Panel token'ı koduna TELEGRAM_BOT_TOKEN olarak, ayrıca BOT_TOKEN, TOKEN, TELEGRAM_TOKEN ve TELOXIDE_TOKEN olarak da verir, bu yüzden diğer örneklerdeki process.env.BOT_TOKEN de çalışır. Logged in as @your_bot satırı, etiketi Telegram’da çevrimiçi durumuna getiren şeydir.

Token yanlışsa

Testimizde, sahte bir token ile grammY'nin bot.start() işlevi şu hatayla durdu:

GrammyError: Call to 'deleteWebhook' failed! (401: Unauthorized)

bot.start(), getMe ve deleteWebhook çağrılarını aynı anda gönderir, bu yüzden hata Telegram'ın önce reddettiği çağrıyı gösterir: bazı çalıştırmalarımızda bu Call to 'getMe' failed! (401: Unauthorized) idi. grammY reddedilen bir token'ı yeniden denemez: bot.start() hemen başarısız olur. Yukarıdaki bot bu durumu yakalar ve bunun yerine Telegram did not accept the bot token. Paste the current one from @BotFather, then restart. yazdırır, panel de Console bölümünün üstünde Telegram bot token’ınızı kabul etmedi başlıklı bir uyarı gösterir. Düzeltmek için @BotFather'a /mybots gönderin, botunuzu seçin, ardından API Token seçeneğini seçin ve token'ı yeniden kopyalayın. Bot sayfasında Telegram bölümünde Token’ı değiştir düğmesine tıklayın, token'ı yapıştırın, Token’ı kaydet düğmesine, ardından Şimdi yeniden başlat düğmesine tıklayın.

Bir sunucuda grammY hakkında bilmeniz gerekenler

  • Hazır satırı onStart içine konur. bot.start() yalnızca bot durduğunda döner, bu yüzden console.log satırı await bot.start() sonrasına konursa bot çalışırken asla yazdırılmaz. grammY, Telegram'dan ilk mesajları istemeden hemen önce onStart işlevini botunuzun bilgileriyle çağırır.
  • Bir komuttaki hata, bot.catch tanımlamazsanız botu durdurur. O olmadan grammY No error handler was set! yazdırır, polling'i durdurur ve hatayı fırlatır, böylece süreç sona erer. Panelimiz çöken botu yaklaşık bir dakika içinde yeniden başlatır, ama o zamana kadar bot çevrimdışıdır. Yukarıdaki gibi bot.catch ile hata yazdırılır ve bot çalışmaya devam eder.
  • Botta kalmış bir webhook sizin yerinize kaldırılır. bot.start(), polling'den önce deleteWebhook çağırır ve drop_pending_updates: true vermediğiniz sürece bekleyen mesajları korur. Bu, webhook kullanan bir barındırıcıdan bot taşırken önemlidir: Telegram botunuzu PlayNHost’a nasıl taşırsınız.
  • Botun başka bir kopyası bunu durdurur. 409 Conflict durumunda (aynı token başka bir yerde polling yapıyor) bot.start() yeniden denemek yerine başarısız olur. Panel Botunuz başka bir yerde de çalışıyor uyarısını gösterir: bilgisayarınızdaki veya eski barındırıcınızdaki kopyayı durdurun. Bkz. Telegram botu 409 Conflict hatasını düzeltin.
  • Başlangıçtaki ağ hataları sessizce yeniden denenir. Telegram'a ilk çağrı ağ yüzünden başarısız olursa grammY giderek uzayan bekleme süreleriyle yeniden dener (1.46.0 sürümünde denemeler arasında en çok 20 dakika) ve hiçbir şey yazdırmaz. Bu denemeleri görmek için Bot sayfasında Ortam bölümünde DEBUG değişkenini grammy* değeriyle ekleyin (Değişken ekle) ve yeniden başlatın.
  • Node.js sürümü: grammY 1.46.0, Node.js 12.20 veya 14.13.1 ve üstünü ister. Kod bölümündeki Çalışma ortamı Node.js 20, 22 (recommended), 24, 25 ve 26 sunar.
  • Bellek sınırı: başlatma betiği NODE_OPTIONS=--max-old-space-size değerini planınızın belleğinin yüzde 80'ine ayarlar, böylece sürecin geri kalanına yer kalır. Node.js başlatma betiğinin ayrıntıları: Node.js Discord botu nasıl barındırılır.

Bir Linux VPS'te kendiniz barındırın

Debian 12 veya 13'te ya da Ubuntu 24.04'te grammY için dağıtımın paketi yeterlidir (Debian 12 Node.js 18.20, Debian 13 20.19, Ubuntu 24.04 18.19 ile gelir):

sudo apt update
sudo apt install nodejs npm
node --version

Bot için bir kullanıcı oluşturun, dosyalarınızı kopyalayın ve paketleri kurun:

sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp package.json index.js /opt/mybot/
sudo chown -R mybot: /opt/mybot
cd /opt/mybot && sudo -u mybot npm install --omit=dev

Token'ı kodunuzun dışında, yalnızca root'un okuyabildiği bir dosyada tutun:

sudo sh -c 'echo "TELEGRAM_BOT_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env

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

[Unit]
Description=grammY Telegram bot
Wants=network-online.target
After=network-online.target

[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/usr/bin/node index.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

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

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

Restart=always, bir çökmeden veya process.exit(1) çağrısından sonra botu yeniden başlatır. Önce başka bir kopya varsa durdurun, yoksa Telegram ikisine de 409 Conflict yanıtı verir.

Kendi barındırmanız veya bot planı

Kendiniz yönettiğiniz bir VPS'te şunlar size aittir:

  • İşletim sistemi güncellemeleri ve güvenliği, ayrıca Node.js yükseltmeleri.
  • Her değişiklikten sonra npm install çalıştırmak, servis dosyası, token dosyası ve izinleri.
  • Botun neden durduğunu anlamak için journalctl okumak.
  • Botun verilerinin yedekleri.

Karşılığında bir VPS her şeyi çalıştırır ve ona webhook için HTTPS'li bir alan adı verebilirsiniz.

PlayNHost bot planında bunları panel sizin için yapar:

  • Bir Node.js sürüm seçici ve npm install: package.json, kilit dosyası veya Node.js sürümü değiştiğinde çalışır.
  • Kaydedilmeden önce Telegram ile doğrulanan, şifreli saklanan ve koduna verilen token.
  • Çökmeden sonra botun yeniden başlatılması. Bir dakika içinde yeniden çökerse durmuş halde kalır ve Console nedenini söyler.
  • Telegram token'ı reddettiğinde, başka bir kopya çalıştığında veya bir webhook ayarlandığında nedeni belirten, Console bölümünün üstündeki uyarılar ve Telegram bölümünde bir Webhook’u kaldır düğmesi.
  • Panelden yükleme, Git ile dağıtım ve yedekler.

Ayrıca bkz. grammY botuyla MySQL veritabanı nasıl kullanılır (mysql2).

Sık sorulan sorular

Bu, panelin başlangıç botuyla aynı mı?

Neredeyse. Bir Node.js sunucusunda Başlangıç botu oluştur, index.js ve package.json dosyalarını grammY ^1.46.0 ile yazar: /start komutuna adınızla yanıt verir, Logged in as @your_bot yazdırır, hataları bot.catch ile yakalar ve Telegram token'ı reddettiğinde sade bir satır yazdırır. İstediğiniz gibi değiştirin, sonra yeniden başlatın.

bot.start() öncesinde webhook'umu kaldırmam gerekir mi?

Hayır. bot.start() onu polling'den önce deleteWebhook ile kaldırır ve bekleyen mesajlar korunur. Eski kodunuz bir web sunucusuyla webhookCallback(bot, ...) kullanıyorsa onu bot.start() ile değiştirin: bu planların henüz webhook için herkese açık bir HTTPS adresi yok.

Yoğun bir bot için bot.start() yeterli mi?

Çoğu bot için evet. bot.start() mesajları birbiri ardına işler; grammY'nin kendi notları bunun saatte yaklaşık 5.000 mesaja uygun olduğunu söyler ve daha fazlası ya da büyük dosya aktarımları gibi uzun süren komutlar için @grammyjs/runner paketini gösterir. Runner da long polling kullanır, bu yüzden planlarımızda çalışır.

grammY'yi Node.js yerine Bun veya Deno üzerinde çalıştırabilir miyim?

Evet. Sipariş verirken Node.js yerine Bun veya Deno seçin: Telegram bot barındırma sayfamız grammY'yi ikisi için de listeler. Bu sayfadaki adımlar Node.js içindir.

grammY botunuzu gece gündüz çalıştırmaya hazır mısınız? Planları Telegram bot barındırma sayfasında görün.

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

EN YENİ BLOG YAZILARIMIZ