NIEUW 📢 Beperkte lanceeractie: tot 70% korting op je eerste maand, voor elke game!Bekijk pakketten

Een grammY-bot 24/7 hosten

Telegram-bothostingUpdated Nov 6, 202610 min read

Om een grammY-bot 24/7 te hosten, laat je hem draaien op een machine die altijd aan staat: een Linux-VPS met een systemd-service die hem opnieuw start als hij stopt, of een botplan bij PlayNHost (vanaf US$1.99 per maand), waar het paneel je pakketten installeert, je code het token geeft en de bot opnieuw start als hij crasht. In onze test gebruikte een grammY 1.46.0-bot ongeveer 60 MB geheugen op Node.js 22. bot.start() van grammY gebruikt long polling, en dat hebben onze plannen nodig: ze hebben nog geen openbaar HTTPS-adres voor een webhook. De stappen bij PlayNHost:

  1. Klik op Telegrambot-hosting bij een plan op Server aanmaken. Beantwoord in het bestelvenster Voor welk platform is je bot? met Telegram en kies Node.js.
  2. Open je server in het paneel. De kaart Je bot instellen op Overzicht opent bij Verbinden met Telegram; de eerste stap, Wat er draait, hoort Deze bot draait Node.js Bot. te zeggen.
  3. Plak bij Verbinden met Telegram het token van @BotFather onder Plak je bottoken, klik op Verbinden, controleer de getoonde botnaam en klik op Ja, doorgaan.
  4. Klik bij Je code op Bestanden uploaden en upload je package.json en index.js zonder node_modules, of klik op Git koppelen. Nog geen code? Starterbot maken schrijft een kleine grammY-bot voor je.
  5. Controleer op de pagina Bot, in het deel Code, of Startbestand het bestand is dat je bot start (standaard index.js). Klik op Opslaan als je het wijzigt.
  6. Klik op Bot starten en open Console. npm installeert grammY bij de eerste start, daarna print je bot Logged in as @your_bot en de chip op Overzicht verandert in Online in Telegram.
  7. Klik op de pagina Bot, in het deel Telegram, op Openen in Telegram en stuur je bot /start.

Hoe je de bot in @BotFather maakt en wat de stappen in het paneel doen, staat in Een Telegram-bot hosten. Deze pagina gaat over grammY zelf: wat het op een server gebruikt en wat je moet weten voordat je het host.

Wat we hebben gemeten

BibliotheekVersieGeheugen in rustStart tot antwoord van TelegramInstallatiegrootte
grammY1.46.060 MB0,2 s3,0 MB
Telegraf4.16.360 MB0,2 s2,7 MB
node-telegram-bot-api2.3.063 MB0,2 s2,4 MB
Alleen Node.js 22, zonder bibliotheek22.23.443 MBgeengeen

Hoe: op onze eigen node, in een wegwerpcontainer ingericht als een botplan van 1 GB (de Node.js 22-image en het startcommando van ons Node.js-bottype, met de geheugenlimiet van Node op 80 procent), riep elke bot Telegram aan met een nep-token, dat Telegram weigerde. Het geheugen is het resident geheugen 15 seconden na dat antwoord, de starttijd loopt van de start tot het antwoord, en elk getal is de mediaan van run 2 tot 4.

Dit zijn ondergrenzen: een bot zonder chats en nog zonder data. Je eigen code, wat die in het geheugen bewaart en het aantal chats komen erbovenop, dus de bibliotheek is maar een klein deel van het STARTER-plan van 0,5 GB.

Een minimale grammY-bot

Hij antwoordt op /start, leest het token dat het paneel hem geeft en print een klaarregel. Zet beide bestanden in de hoofdmap van je bot.

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);
});

Het paneel geeft je code het token als TELEGRAM_BOT_TOKEN, en ook als BOT_TOKEN, TOKEN, TELEGRAM_TOKEN en TELOXIDE_TOKEN, dus process.env.BOT_TOKEN uit andere voorbeelden werkt ook. De regel Logged in as @your_bot zorgt dat de chip verandert in Online in Telegram.

Als het token fout is

In onze test stopte bot.start() van grammY met een nep-token met deze fout:

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

bot.start() stuurt getMe en deleteWebhook tegelijk, dus de fout noemt de aanroep die Telegram als eerste weigerde: in sommige van onze runs was dat Call to 'getMe' failed! (401: Unauthorized). grammY probeert een geweigerd token niet opnieuw: bot.start() mislukt meteen. De bot hierboven vangt dat geval af en print in plaats daarvan Telegram did not accept the bot token. Paste the current one from @BotFather, then restart., en het paneel toont de melding Telegram heeft je bottoken niet geaccepteerd boven Console. Om het te verhelpen stuur je in @BotFather /mybots, kies je je bot, dan API Token, en kopieer je het token opnieuw. Klik op de pagina Bot, in het deel Telegram, op Token vervangen, plak het, klik op Token opslaan en daarna op Nu herstarten.

Wat je moet weten over grammY op een server

  • De klaarregel hoort in onStart. bot.start() keert pas terug als de bot stopt, dus een console.log na await bot.start() wordt nooit geprint zolang hij draait. grammY roept onStart aan met de gegevens van je bot vlak voordat het Telegram om de eerste berichten vraagt.
  • Een fout in een commando stopt de bot als je geen bot.catch instelt. Zonder print grammY No error handler was set!, stopt het polling en gooit het de fout, waardoor het proces eindigt. Ons paneel start een gecrashte bot binnen ongeveer een minuut opnieuw, maar tot die tijd is hij offline. Met bot.catch, zoals hierboven, wordt de fout geprint en gaat de bot door.
  • Een webhook die op de bot is blijven staan, wordt voor je verwijderd. bot.start() roept deleteWebhook aan voordat het pollt en bewaart de wachtende berichten, tenzij je drop_pending_updates: true meegeeft. Dat is van belang als je een bot verhuist van een host die een webhook gebruikte: Een Telegram-bot verhuizen naar PlayNHost.
  • Een andere kopie van de bot stopt deze. Bij 409 Conflict (hetzelfde token pollt elders) mislukt bot.start() in plaats van het opnieuw te proberen. Het paneel toont Je bot draait ook ergens anders: stop de kopie op je pc of je oude host. Zie Telegram-bot 409 Conflict oplossen.
  • Netwerkfouten bij het starten worden stilletjes opnieuw geprobeerd. Als de eerste aanroep naar Telegram door het netwerk mislukt, probeert grammY het opnieuw met steeds langere wachttijden (tot 20 minuten tussen pogingen in versie 1.46.0) en print het niets. Om die pogingen te zien, voeg je op de pagina Bot, in het deel Omgeving, de variabele DEBUG met de waarde grammy* toe (Variabele toevoegen) en herstart je.
  • Node.js-versie: grammY 1.46.0 vraagt Node.js 12.20 of 14.13.1 en nieuwer. De Runtime in het deel Code biedt Node.js 20, 22 (recommended), 24, 25 en 26.
  • Geheugenlimiet: het startscript zet NODE_OPTIONS=--max-old-space-size op 80 procent van het geheugen van je plan, zodat de rest van het proces ruimte heeft. Details over het Node.js-startscript: Een Node.js Discord-bot hosten.

Zelf hosten op een Linux-VPS

Op Debian 12 of 13, of Ubuntu 24.04, is het pakket van de distributie genoeg voor grammY (Debian 12 levert Node.js 18.20, Debian 13 levert 20.19, Ubuntu 24.04 levert 18.19):

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

Maak een gebruiker voor de bot, kopieer je bestanden en installeer de pakketten:

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

Houd het token buiten je code, in een bestand dat alleen root kan lezen:

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

Maak /etc/systemd/system/mybot.service aan:

[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

Start hem nu en bij elke boot, en volg daarna de uitvoer:

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

Restart=always start de bot opnieuw na een crash of een process.exit(1). Stop eerst elke andere kopie, anders antwoordt Telegram beide met 409 Conflict.

Zelf hosten of een botplan

Op een VPS die je zelf beheert, doe je:

  • Updates en beveiliging van het besturingssysteem, en Node.js-upgrades.
  • npm install draaien na elke wijziging, het servicebestand, het tokenbestand en de rechten ervan.
  • journalctl lezen om te ontdekken waarom de bot stopte.
  • Back-ups van de gegevens van de bot.

Daarvoor in de plaats draait een VPS alles, en je kunt hem een domein met HTTPS geven voor een webhook.

Op een PlayNHost-botplan doet het paneel dit voor je:

  • Een keuze voor de Node.js-versie, en npm install als package.json, het lockbestand of de Node.js-versie verandert.
  • Het token, gecontroleerd bij Telegram voordat het wordt opgeslagen, versleuteld bewaard en aan je code gegeven.
  • De bot opnieuw starten na een crash. Crasht hij binnen een minuut opnieuw, dan blijft hij gestopt en zegt Console waarom.
  • Meldingen boven Console die de oorzaak noemen als Telegram het token weigert, een andere kopie draait of een webhook is ingesteld, met een knop Webhook verwijderen in het deel Telegram.
  • Uploaden, Git-deploys en back-ups vanuit het paneel.

Zie ook Een MySQL-database gebruiken met een grammY-bot (mysql2).

Veelgestelde vragen

Is dit hetzelfde als de starterbot van het paneel?

Bijna. Op een Node.js-server schrijft Starterbot maken index.js en package.json met grammY ^1.46.0: hij antwoordt op /start met je voornaam, print Logged in as @your_bot, vangt fouten af met bot.catch en print een duidelijke regel als Telegram het token weigert. Pas hem aan zoals je wilt en herstart.

Moet ik mijn webhook verwijderen vóór bot.start()?

Nee. bot.start() verwijdert hem met deleteWebhook voordat het pollt, en de berichten die wachtten blijven bewaard. Als je oude code webhookCallback(bot, ...) met een webserver gebruikte, vervang dat dan door bot.start(): deze plannen hebben nog geen openbaar HTTPS-adres voor een webhook.

Is bot.start() genoeg voor een drukke bot?

Voor de meeste bots wel. bot.start() verwerkt berichten een voor een; volgens de eigen notities van grammY is dat geschikt voor ongeveer 5.000 berichten per uur, en voor meer, of voor commando's die lang duren, zoals grote bestandsoverdrachten, verwijzen ze naar het pakket @grammyjs/runner. De runner gebruikt ook long polling, dus hij werkt op onze plannen.

Kan ik grammY op Bun of Deno draaien in plaats van Node.js?

Ja. Kies bij het bestellen Bun of Deno in plaats van Node.js: onze pagina over Telegrambot-hosting vermeldt grammY voor beide. De stappen op deze pagina zijn voor Node.js.

Klaar om je grammY-bot dag en nacht te laten draaien? Bekijk de plannen op Telegrambot-hosting.

Draait je bot al ergens anders? Verhuis hem naar ons

ONZE NIEUWSTE BLOGS