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:
- 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.
- 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.
- 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.
- Kodunuz adımında Dosya yükle düğmesine tıklayın ve
package.jsonileindex.jsdosyalarınızınode_modulesolmadan 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. - 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. - 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_botyazdırır ve Genel bakış sayfasındaki etiket Telegram’da çevrimiçi olur. - Bot sayfasında Telegram bölümünde Telegram’da aç düğmesine tıklayın ve botunuza
/startgö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üphane | Sürüm | Boştaki bellek | Başlangıçtan Telegram'ın yanıtına | Kurulum boyutu |
|---|---|---|---|---|
| grammY | 1.46.0 | 60 MB | 0,2 sn | 3,0 MB |
| Telegraf | 4.16.3 | 60 MB | 0,2 sn | 2,7 MB |
| node-telegram-bot-api | 2.3.0 | 63 MB | 0,2 sn | 2,4 MB |
| Yalnızca Node.js 22, kütüphanesiz | 22.23.4 | 43 MB | yok | yok |
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ı
onStartiçine konur.bot.start()yalnızca bot durduğunda döner, bu yüzdenconsole.logsatırıawait bot.start()sonrasına konursa bot çalışırken asla yazdırılmaz. grammY, Telegram'dan ilk mesajları istemeden hemen önceonStartişlevini botunuzun bilgileriyle çağırır. - Bir komuttaki hata,
bot.catchtanımlamazsanız botu durdurur. O olmadan grammYNo 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 gibibot.catchile 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 öncedeleteWebhookçağırır vedrop_pending_updates: truevermediğ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 Conflictdurumunda (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
DEBUGdeğişkeninigrammy*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-sizedeğ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
journalctlokumak. - 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.



