NEU 📢 Begrenztes Startangebot: bis zu 70 % Rabatt auf deinen ersten Monat, für jedes Spiel!Tarife ansehen

So hostest du einen grammY-Bot 24/7

Telegram-Bot-HostingUpdated Nov 6, 202610 min read

Um einen grammY-Bot 24/7 zu hosten, lässt du ihn auf einem Rechner laufen, der immer an bleibt: ein Linux-VPS mit einem systemd-Dienst, der ihn neu startet, wenn er stoppt, oder ein Bot-Tarif bei PlayNHost (ab 1,99 US$ im Monat). Dort installiert das Panel deine Pakete, gibt deinem Code den Token und startet den Bot nach einem Absturz neu. In unserem Test brauchte ein grammY-1.46.0-Bot auf Node.js 22 etwa 60 MB Arbeitsspeicher. bot.start() von grammY nutzt Long Polling, und genau das brauchen unsere Tarife: Sie haben noch keine öffentliche HTTPS-Adresse für einen Webhook. Die Schritte bei PlayNHost:

  1. Klicke auf Telegram-Bot-Hosting bei einem Tarif auf Server erstellen. Beantworte im Bestellfenster Wofür ist dein Bot? mit Telegram und wähle Node.js.
  2. Öffne deinen Server im Panel. Die Karte Deinen Bot einrichten auf der Seite Übersicht öffnet sich bei Mit Telegram verbinden; der erste Schritt, Was läuft, sollte Dieser Bot führt Node.js Bot aus. anzeigen.
  3. Füge bei Mit Telegram verbinden den Token von @BotFather unter Füge deinen Bot-Token ein ein, klicke auf Verbinden, prüfe den angezeigten Bot-Namen und klicke auf Ja, weiter.
  4. Klicke bei Dein Code auf Dateien hochladen und lade deine package.json und index.js ohne node_modules hoch, oder klicke auf Git verbinden. Noch kein Code? Starter-Bot erstellen schreibt dir einen kleinen grammY-Bot.
  5. Prüfe auf der Seite Bot im Bereich Code, ob Startdatei die Datei ist, die deinen Bot startet (standardmäßig index.js). Klicke auf Speichern, wenn du sie änderst.
  6. Klicke auf Bot starten und öffne die Console. npm installiert grammY beim ersten Start, dann gibt dein Bot Logged in as @your_bot aus und der Chip auf Übersicht wechselt zu Online in Telegram.
  7. Klicke auf der Seite Bot im Bereich Telegram auf In Telegram öffnen und sende deinem Bot /start.

Wie du den Bot in @BotFather anlegst und was die Panel-Schritte bedeuten, steht in So hostest du einen Telegram-Bot. Diese Seite behandelt grammY selbst: was es auf einem Server braucht und was du vor dem Hosten wissen solltest.

Was wir gemessen haben

BibliothekVersionSpeicher ohne LastStart bis zur Antwort von TelegramInstallationsgröße
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
Node.js 22 allein, ohne Bibliothek22.23.443 MBkeinekeine

So haben wir gemessen: auf unserem eigenen Node, in einem Wegwerf-Container, der wie ein 1-GB-Bot-Tarif eingerichtet war (das Node.js-22-Image und der Startbefehl unseres Node.js-Bot-Typs, mit Nodes Speicherlimit bei 80 Prozent). Jeder Bot rief Telegram mit einem falschen Token auf, was Telegram ablehnte. Der Speicher ist der residente Speicher 15 Sekunden nach dieser Antwort, die Startzeit läuft vom Start bis zur Antwort, und jeder Wert ist der Median der Läufe 2 bis 4.

Das sind Untergrenzen: ein Bot ohne Chats und ohne Daten. Dein eigener Code, was er im Speicher hält, und die Zahl der Chats kommen dazu. Die Bibliothek macht also nur einen kleinen Teil des 0,5-GB-Tarifs STARTER aus.

Ein minimaler grammY-Bot

Er antwortet auf /start, liest den Token, den das Panel ihm gibt, und gibt eine Bereit-Zeile aus. Lege beide Dateien in den Hauptordner deines Bots.

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

Das Panel gibt deinem Code den Token als TELEGRAM_BOT_TOKEN, außerdem als BOT_TOKEN, TOKEN, TELEGRAM_TOKEN und TELOXIDE_TOKEN, sodass auch process.env.BOT_TOKEN aus anderen Beispielen funktioniert. Die Zeile Logged in as @your_bot sorgt dafür, dass der Chip zu Online in Telegram wechselt.

Wenn der Token falsch ist

In unserem Test mit einem falschen Token brach bot.start() von grammY mit diesem Fehler ab:

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

bot.start() sendet getMe und deleteWebhook gleichzeitig, deshalb nennt der Fehler den Aufruf, den Telegram zuerst abgelehnt hat: In einigen unserer Läufe war es Call to 'getMe' failed! (401: Unauthorized). grammY wiederholt einen abgelehnten Token nicht: bot.start() schlägt sofort fehl. Der Bot oben fängt diesen Fall ab und gibt stattdessen Telegram did not accept the bot token. Paste the current one from @BotFather, then restart. aus, und das Panel zeigt über der Console das Banner Telegram hat deinen Bot-Token nicht akzeptiert. So behebst du es: Sende in @BotFather /mybots, wähle deinen Bot, dann API Token, und kopiere den Token erneut. Klicke auf der Seite Bot im Bereich Telegram auf Token ersetzen, füge ihn ein, klicke auf Token speichern und dann auf Jetzt neu starten.

Was du über grammY auf einem Server wissen solltest

  • Die Bereit-Zeile gehört in onStart. bot.start() kehrt erst zurück, wenn der Bot stoppt, daher wird ein console.log nach await bot.start() nie ausgegeben, solange er läuft. grammY ruft onStart mit den Daten deines Bots auf, kurz bevor es Telegram nach den ersten Nachrichten fragt.
  • Ein Fehler in einem Befehl stoppt den Bot, wenn du kein bot.catch setzt. Ohne es gibt grammY No error handler was set! aus, beendet das Polling und wirft den Fehler, sodass der Prozess endet. Unser Panel startet einen abgestürzten Bot innerhalb von etwa einer Minute neu, aber bis dahin ist er offline. Mit bot.catch, wie oben, wird der Fehler ausgegeben und der Bot läuft weiter.
  • Ein am Bot gesetzter Webhook wird für dich entfernt. bot.start() ruft vor dem Polling deleteWebhook auf und behält die wartenden Nachrichten, außer du übergibst drop_pending_updates: true. Das ist wichtig, wenn du einen Bot von einem Host umziehst, der einen Webhook nutzte: So ziehst du einen Telegram-Bot zu PlayNHost um.
  • Eine weitere Kopie des Bots stoppt diese hier. Bei 409 Conflict (derselbe Token pollt woanders) schlägt bot.start() fehl, statt es erneut zu versuchen. Das Panel zeigt Dein Bot läuft auch noch woanders: Stoppe die Kopie auf deinem PC oder deinem alten Host. Siehe Telegram-Bot-Fehler 409 Conflict beheben.
  • Netzwerkfehler beim Start werden still wiederholt. Schlägt der erste Aufruf an Telegram wegen des Netzwerks fehl, versucht grammY es mit immer längeren Wartezeiten erneut (in Version 1.46.0 bis zu 20 Minuten zwischen den Versuchen) und gibt nichts aus. Um diese Versuche zu sehen, füge auf der Seite Bot im Bereich Umgebung die Variable DEBUG mit dem Wert grammy* hinzu (Variable hinzufügen) und starte neu.
  • Node.js-Version: grammY 1.46.0 verlangt Node.js 12.20 oder 14.13.1 und neuer. Die Laufzeitumgebung im Bereich Code bietet Node.js 20, 22 (recommended), 24, 25 und 26 an.
  • Speicherlimit: Das Startskript setzt NODE_OPTIONS=--max-old-space-size auf 80 Prozent des Speichers deines Tarifs, damit der Rest des Prozesses Platz hat. Details zum Node.js-Startskript: So hostest du einen Node.js-Discord-Bot.

Selbst auf einem Linux-VPS hosten

Unter Debian 12 oder 13 oder Ubuntu 24.04 genügt das Paket der Distribution für grammY (Debian 12 liefert Node.js 18.20, Debian 13 liefert 20.19, Ubuntu 24.04 liefert 18.19):

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

Lege einen Benutzer für den Bot an, kopiere deine Dateien und installiere die Pakete:

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

Halte den Token aus deinem Code heraus, in einer Datei, die nur root lesen kann:

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

Erstelle /etc/systemd/system/mybot.service:

[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

Starte ihn jetzt und bei jedem Boot und verfolge dann seine Ausgabe:

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

Restart=always startet den Bot nach einem Absturz oder einem process.exit(1) neu. Stoppe vorher jede andere Kopie, sonst antwortet Telegram beiden mit 409 Conflict.

Selbst hosten oder Bot-Tarif

Auf einem VPS, den du selbst verwaltest, kümmerst du dich um:

  • Betriebssystem-Updates und Sicherheit sowie Node.js-Upgrades.
  • npm install nach jeder Änderung, die Service-Datei, die Token-Datei und ihre Berechtigungen.
  • Das Lesen von journalctl, um herauszufinden, warum der Bot gestoppt hat.
  • Backups der Daten des Bots.

Dafür läuft auf einem VPS alles, und du kannst ihm eine Domain mit HTTPS für einen Webhook geben.

In einem PlayNHost-Bot-Tarif übernimmt das Panel das für dich:

  • Eine Auswahl der Node.js-Version und npm install, wenn sich package.json, die Lock-Datei oder die Node.js-Version ändern.
  • Der Token wird vor dem Speichern bei Telegram geprüft, verschlüsselt abgelegt und an deinen Code übergeben.
  • Der Bot wird nach einem Absturz neu gestartet. Stürzt er innerhalb einer Minute erneut ab, bleibt er gestoppt und die Console sagt, warum.
  • Banner über der Console, die die Ursache nennen, wenn Telegram den Token ablehnt, eine andere Kopie läuft oder ein Webhook gesetzt ist, mit einem Button Webhook entfernen im Bereich Telegram.
  • Upload, Git-Deployments und Backups direkt im Panel.

Siehe auch So nutzt du eine MySQL-Datenbank mit einem grammY-Bot (mysql2).

Häufige Fragen

Ist das dasselbe wie der Starter-Bot des Panels?

Fast. Auf einem Node.js-Server schreibt Starter-Bot erstellen die index.js und die package.json mit grammY ^1.46.0: Der Bot antwortet auf /start mit deinem Vornamen, gibt Logged in as @your_bot aus, fängt Fehler mit bot.catch ab und gibt eine klare Zeile aus, wenn Telegram den Token ablehnt. Ändere ihn nach Belieben und starte dann neu.

Muss ich meinen Webhook vor bot.start() entfernen?

Nein. bot.start() entfernt ihn mit deleteWebhook vor dem Polling, und die wartenden Nachrichten bleiben erhalten. Wenn dein alter Code webhookCallback(bot, ...) mit einem Webserver nutzte, ersetze das durch bot.start(): Diese Tarife haben noch keine öffentliche HTTPS-Adresse für einen Webhook.

Reicht bot.start() für einen stark genutzten Bot?

Für die meisten Bots ja. bot.start() verarbeitet Nachrichten nacheinander; laut grammYs eigenen Hinweisen reicht das für etwa 5.000 Nachrichten pro Stunde, und für mehr oder für Befehle, die lange dauern, etwa große Dateiübertragungen, verweist grammY auf das Paket @grammyjs/runner. Der Runner nutzt ebenfalls Long Polling und funktioniert daher in unseren Tarifen.

Kann ich grammY statt mit Node.js auch mit Bun oder Deno betreiben?

Ja. Wähle bei der Bestellung Bun oder Deno statt Node.js: Unsere Seite zum Telegram-Bot-Hosting führt grammY für beide auf. Die Schritte auf dieser Seite gelten für Node.js.

Bereit, deinen grammY-Bot rund um die Uhr laufen zu lassen? Die Tarife findest du unter Telegram-Bot-Hosting.

Läuft dein Bot schon woanders? Zieh ihn zu uns um

UNSERE NEUESTEN BLOGS