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

Telegram.Bot-Bot (.NET) 24/7 hosten: so geht es auf einem VPS oder Bot-Tarif

Telegram-Bot-HostingUpdated Nov 6, 202612 min read

Um einen Telegram.Bot-Bot (.NET) 24/7 zu hosten, lässt du ihn auf einem Rechner laufen, der immer an bleibt: auf einem Linux-VPS mit einem systemd-Dienst, der ihn neu startet, wenn er stoppt, oder in einem Bot-Tarif bei PlayNHost Telegram-Bot-Hosting (ab 1,99 US$ im Monat), wo du dein C#-Projekt hochlädst, den Token von @BotFather einfügst und auf Start drückst. In unserem Test brauchte ein Bot mit Telegram.Bot 22.10.3.3 etwa 61 MB Speicher unter .NET 8. Telegram.Bot empfängt Nachrichten per 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 der Seite Telegram-Bot-Hosting bei einem Tarif auf Server erstellen. Beantworte im Bestellfenster Wofür ist dein Bot? mit Telegram und wähle C# (.NET).
  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 .NET Bot aus. anzeigen.
  3. Füge bei Mit Telegram verbinden den Token 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 Bot.csproj und Program.cs in den Hauptordner hoch, ohne die Ordner bin und obj, oder klicke auf Git verbinden.
  5. Lass auf der Seite Bot im Bereich Code die Laufzeitumgebung auf .NET 8 (recommended) und das Feld Startdatei leer.
  6. Klicke auf Bot starten und öffne die Console. Der Server baut dein Projekt, dann gibt dein Bot Logged in as @your_bot aus, und der Chip auf der Seite Ü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 wie die Schritte im Panel aussehen, steht in So hostest du einen Telegram-Bot, und den .NET-Bot-Typ allgemein (beide Upload-Wege, Build-Fehler) erklärt So hostest du einen C#-Discord-Bot (.NET). Diese Seite behandelt Telegram.Bot selbst: was die Bibliothek auf einem Server braucht und was du vor dem Hosting wissen solltest.

Was wir gemessen haben

BibliothekVersionSpeicher ohne LastStart bis zur Antwort von Telegram, mit BuildProgrammstart bis zur Antwort von Telegram
Telegram.Bot22.10.3.361 MB1,5 s0,3 s
.NET 8 allein, ohne Bibliothekkeine24 MB1,3 s (Build und Start, kein Aufruf)keine

So haben wir gemessen: auf unserem eigenen Node, in einem Wegwerf-Container, der wie ein Bot-Tarif mit 1 GB eingerichtet war (das .NET-8-Image und der Startbefehl unseres .NET-Bot-Typs, der bei jedem Start dotnet publish ausführt), rief der Bot mit einem falschen Token Telegrams getMe auf, was Telegram ablehnte. Der Speicher ist der residente Speicher 15 Sekunden nach dieser Antwort, die erste Zeitspalte reicht vom Beginn des Builds bis zur Antwort, die zweite vom Programmstart, und jeder Wert ist der Median der Läufe 2 bis 4. Der allererste Build, der auch das Paket herunterlädt, dauerte 5 Sekunden.

Das sind Untergrenzen: noch keine Chats, keine Daten und noch kein Polling. Dein eigener Code, was er im Speicher hält, und die Zahl der Chats kommen obendrauf. Um den Build bei jedem Start zu sparen, kannst du statt des Projekts die Dateien hochladen, die du auf deinem eigenen Rechner veröffentlicht hast (siehe die oben verlinkte C#-Anleitung). Vergleiche die Zahlen mit den Tarifen auf Telegram-Bot-Hosting und wähle danach, was dein Bot tut.

Ein minimaler Telegram.Bot-Bot

Er antwortet auf /start, liest den Token aus TELEGRAM_BOT_TOKEN (das Panel gibt ihn deinem Code unter diesem Namen und außerdem als BOT_TOKEN, TOKEN, TELEGRAM_TOKEN und TELOXIDE_TOKEN) und gibt eine Bereit-Zeile aus. Zwei Dateien im Hauptordner:

Bot.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Telegram.Bot" Version="22.10.3.3" />
  </ItemGroup>
</Project>

Program.cs

using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Types;

const string TokenRefused = "Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart.";

string? token = Environment.GetEnvironmentVariable("TELEGRAM_BOT_TOKEN");
if (string.IsNullOrWhiteSpace(token))
{
    Console.WriteLine("No TELEGRAM_BOT_TOKEN found. Paste your bot token on the Bot page, then restart.");
    return 1;
}

var bot = new TelegramBotClient(token);

User me;
try
{
    me = await bot.GetMe();
}
catch (ApiRequestException e) when (e.ErrorCode == 401)
{
    Console.WriteLine(TokenRefused);
    return 1;
}

// Long polling only: remove a webhook left on the bot. Messages that wait are kept.
await bot.DeleteWebhook();

// Without an OnError handler, polling errors never reach the console. Set it before OnMessage.
bot.OnError += async (exception, source) =>
{
    if (exception is ApiRequestException { ErrorCode: 401 })
    {
        Console.WriteLine(TokenRefused);
        Environment.Exit(1);
    }
    Console.WriteLine($"Polling error ({source}): {exception.Message}");
    await Task.Delay(TimeSpan.FromSeconds(5));
};

// Setting OnMessage starts polling in the background.
bot.OnMessage += async (message, type) =>
{
    if (message.Text?.StartsWith("/start") == true)
    {
        await bot.SendMessage(message.Chat, "Hello! I am running on PlayNHost.");
    }
};

Console.WriteLine($"Logged in as @{me.Username}");
await Task.Delay(Timeout.Infinite);
return 0;

Bei jedem Start führt der Server dotnet publish für Bot.csproj aus und startet Bot.dll. Die Konsole zeigt [PlayNHost] Building your bot (the first build downloads packages and can take a minute), dann [PlayNHost] Starting your bot, dann Logged in as @your_bot, die Zeile, die den Chip auf Online in Telegram umschaltet. Stoppe vorher jede Kopie, die du auf deinem Rechner mit dem echten Token laufen lässt, sonst bekommen die beiden Kopien 409 Conflict-Fehler von Telegram.

Wenn der Token falsch ist

In unserem Test schlug GetMe() von Telegram.Bot mit einem falschen Token mit diesem Fehler fehl:

ApiRequestException: Unauthorized

Der Bot oben fängt diese Ablehnung (Fehlercode 401) vor und während des Pollings ab und gibt stattdessen Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart. aus, dann beendet er sich mit Exit-Code 1. Das Panel liest diese Zeile und zeigt über der Console das Banner Telegram hat deinen Bot-Token nicht akzeptiert. Zum Beheben sendest du in @BotFather /mybots, wählst deinen Bot, dann API Token und kopierst 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 Telegram.Bot auf einem Server wissen solltest

  • Versionen: Telegram.Bot 22.10.3.3 erschien am 9. Okt. 2026. Es zielt auf .NET Standard 2.0 und .NET 6, und die README empfiehlt .NET 8 oder neuer, deshalb baut jede Laufzeitumgebung, die das Panel anbietet (.NET 6, 8, 9 oder 10), es; .NET 8 (recommended) passt zu net8.0 oben.
  • Die Methodennamen haben in Version 22 das Async verloren. Es heißt jetzt GetMe() und SendMessage(); Tutorials mit GetMeAsync oder SendTextMessageAsync wurden für ältere Versionen geschrieben, diese Namen gibt es in 22.10.3.3 nicht, und ihr Code lässt sich deshalb nicht bauen. Der Build-Fehler steht direkt über [PlayNHost] The build failed. Read the errors above, fix them and press Start. in der Console.
  • Das Setzen von OnMessage startet das Polling. Sobald du einen Handler zu OnMessage (oder OnUpdate) hinzufügst, fragt der Client Telegram im Hintergrund ab, und zwar für jeden Update-Typ. Füge den OnError-Handler zuerst hinzu, wie oben.
  • Ohne OnError bleiben Fehler unsichtbar. Wenn eine Abfrage fehlschlägt, übergibt Telegram.Bot den Fehler an OnError; ohne Handler schreibt es ihn in die Trace-Ausgabe von .NET, die nicht in der Konsole ankommt. Ein Bot, dessen Token widerrufen wurde oder den eine andere Kopie mit 409 Conflict verdrängt, scheint dann zu laufen und antwortet nicht. Der Handler oben gibt jeden Fehler aus, und weil Telegrams eigener Text in der Meldung steht, kann das Panel Dein Bot läuft auch noch woanders oder Für deinen Bot ist ein Webhook gesetzt anzeigen.
  • Nach einem Fehler bremsen. Die Polling-Schleife fragt nach einer fehlgeschlagenen Anfrage sofort wieder an; sie wartet nur so lange, wie dein OnError-Handler braucht. Das Task.Delay von 5 Sekunden oben verhindert, dass aus einem dauerhaften Fehler eine Flut von Anfragen wird. Telegrams eigene 429 Too Many Requests-Antworten werden für dich wiederholt, wenn Telegram um höchstens 60 Sekunden Wartezeit bittet: Standardmäßig wird eine Anfrage insgesamt bis zu 3-mal versucht.
  • Ein Webhook wird nicht für dich entfernt. Polling bei gesetztem Webhook scheitert mit 409 Conflict: can't use getUpdates method while webhook is active. Der Bot oben ruft vor dem Polling DeleteWebhook() auf, wodurch wartende Nachrichten erhalten bleiben; du kannst auch im Bereich Telegram auf Webhook entfernen klicken. Ein eigener Webhook braucht eine öffentliche HTTPS-Adresse, die unsere Tarife noch nicht enthalten. Wenn du von einem Webhook-Host umziehst: So ziehst du einen Telegram-Bot zu PlayNHost um.
  • Warte nicht mit Console.ReadLine(). Der erste Bot in der Anleitung der Bibliothek läuft, bis du Enter drückst. Auf einem Server drückt niemand Enter, und unter systemd ist die Eingabe des Programms standardmäßig leer, sodass ReadLine() sofort zurückkehrt und der Bot endet. Warte mit await Task.Delay(Timeout.Infinite), wie oben.
  • Abstürze: Wenn sich der Bot beendet, wie der Bot oben bei einem abgelehnten Token, startet das Panel ihn sofort neu und baut ihn vorher noch einmal. Stoppt er danach innerhalb einer Minute erneut, bleibt er gestoppt, und die Console nennt den Grund. Siehe Telegram-Bot-Fehler 409 Conflict beheben für die zwei Arten von 409.

Selbst auf einem Linux-VPS hosten

Baue den Bot auf einem VPS auf deinem eigenen Rechner und lasse nur das Ergebnis auf dem Server laufen. Veröffentliche ihn mit dem .NET-8-SDK:

dotnet publish Bot.csproj -c Release -o publish

Unter Ubuntu 24.04 ist die .NET-8-Runtime in Ubuntus eigenen Paketen enthalten:

sudo apt update
sudo apt install dotnet-runtime-8.0
dotnet --list-runtimes

Lege einen Benutzer für den Bot an und kopiere den Ordner publish auf den Server (zum Beispiel mit scp -r), dann in dessen Ordner:

sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp -r publish/. /opt/mybot/
sudo chown -R mybot: /opt/mybot

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=Telegram.Bot Telegram bot
Wants=network-online.target
After=network-online.target

[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/usr/bin/dotnet /opt/mybot/Bot.dll
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 5 Sekunden nach einem Ende oder Absturz neu, aber nicht, nachdem du ihn mit systemctl stop gestoppt hast. Zum Aktualisieren veröffentliche erneut, kopiere die neuen Dateien über die alten und führe sudo systemctl restart mybot aus. Unter Debian ist .NET nicht in den eigenen Paketen der Distribution; die Installationsanleitung von Microsoft deckt es ab.

Selbst hosten oder Bot-Tarif

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

  • Betriebssystem-Updates und Sicherheit sowie .NET-Runtime-Upgrades.
  • Das Veröffentlichen und Kopieren jedes neuen Builds, die Service-Datei, die Token-Datei und ihre Berechtigungen.
  • Das Lesen von journalctl, um herauszufinden, warum der Bot gestoppt hat oder nicht mehr antwortet.
  • Backups von allem, was dein Bot speichert.

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:

  • .NET 6, 8, 9 oder 10 aus einer Auswahl und der Build: Lade das Projekt hoch und drücke Start.
  • Der Token, bei Telegram geprüft, bevor er gespeichert wird, verschlüsselt abgelegt und deinem Code unter fünf Namen übergeben.
  • Neustart des Bots nach einem Absturz. Stürzt er innerhalb einer Minute erneut ab, bleibt er gestoppt, und die Console nennt den Grund.
  • Eine Schaltfläche Webhook entfernen im Bereich Telegram und Banner über der Console, die die Ursache nennen, wenn eine Zeile einen abgelehnten Token, eine andere Kopie oder einen Webhook zeigt.
  • Upload, Git-Deploys und Backups aus dem Panel.

Häufige Fragen

Mein Telegram.Bot-Bot läuft, antwortet aber nie. Warum?

Meistens schlägt das Polling fehl, ohne dass es jemand meldet: Ohne OnError-Handler gehen die Fehler in die Trace-Ausgabe von .NET, nicht in die Konsole. Füge den Handler aus dem Bot oben hinzu und starte neu. Die üblichen Ursachen sind eine andere Kopie, die mit demselben Token pollt (409 Conflict), ein noch gesetzter Webhook am Bot oder ein in @BotFather widerrufener Token.

Kann ich Telegram.Bot hier mit einem Webhook nutzen?

Auf unseren Tarifen noch nicht: Ein Webhook braucht eine öffentliche HTTPS-Adresse, die sie nicht enthalten. Polling braucht keine, weil der Bot Telegram nach neuen Nachrichten fragt, und genau das macht OnMessage.

Bremst der Build bei jedem Start meinen Bot aus?

Nur den Start: In unserem Test dauerte der Start mit dem Build 1,5 Sekunden gegenüber 0,3 Sekunden für das Programm allein. Sobald der Bot läuft, ist er gleich schnell. Um den Build zu sparen, veröffentliche auf deinem Rechner und lade statt des Projekts die Dateien aus dem Ordner publish hoch.

Welche .NET-Version soll ich wählen?

.NET 8, die empfohlene, mit net8.0 in deinem Projekt wie oben. Telegram.Bot baut auch unter .NET 6, 9 und 10; setze dieselbe Version in TargetFramework und bei Laufzeitumgebung. Ein Projekt für ein neueres .NET als die Laufzeitumgebung bricht den Build mit NETSDK1045 ab; eines für ein älteres .NET baut, startet aber nicht, weil dieses .NET nicht im Image installiert ist.

Bereit, deinen Telegram.Bot-Bot rund um die Uhr laufen zu lassen? Sieh dir die Tarife auf Telegram-Bot-Hosting an.

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

UNSERE NEUESTEN BLOGS