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

aiogram-Bot 24/7 hosten: so läuft er rund um die Uhr

Telegram-Bot-HostingUpdated Nov 6, 202611 min read

Um einen aiogram-Bot 24/7 zu hosten, lässt du ihn auf einer Maschine laufen, die immer an bleibt, statt auf deinem PC: auf einem Linux-VPS mit einem systemd-Dienst, der ihn nach einem Absturz oder Neustart wieder startet, oder mit einem PlayNHost-Bot-Tarif (ab 1,99 US$ im Monat, siehe Telegram-Bot-Hosting), bei dem du deinen Code hochlädst, den Token einfügst und auf Start klickst. In unserem Test brauchte ein aiogram-3.31.0-Bot etwa 173 MB Speicher ohne Last; unser kleinster Bot-Tarif, STARTER, hat 0,5 GB. Beide Wege nutzen Long Polling: dp.start_polling(bot) fragt Telegram nach neuen Nachrichten, der Bot braucht also keine öffentliche Adresse. Die Schritte bei PlayNHost:

  1. Sende in Telegram /newbot an @BotFather und kopiere den Token, den du bekommst.
  2. Klicke auf Telegram-Bot-Hosting bei einem Tarif auf Server erstellen. Beantworte im Bestellfenster Wofür ist dein Bot? mit Telegram und wähle Python.
  3. Öffne deinen Server im Panel. Die Karte Deinen Bot einrichten auf der Übersicht öffnet sich bei Mit Telegram verbinden; der erste Schritt, Was läuft, sollte Dieser Bot führt Python Bot aus. anzeigen.
  4. Füge bei Mit Telegram verbinden den Token ein und klicke auf Verbinden. Prüfe den angezeigten Bot-Namen und klicke auf Ja, weiter.
  5. Klicke bei Dein Code auf Dateien hochladen, um Files zu öffnen und bot.py und requirements.txt hochzuladen, oder klicke auf Git verbinden.
  6. Prüfe auf der Seite Bot im Bereich Code, dass die Startdatei die Datei ist, die asyncio.run(main()) ausführt (standardmäßig bot.py).
  7. Klicke auf Bot starten, öffne die Console und warte auf die aiogram-Zeile Run polling for bot @your_bot. Der Chip auf der Übersicht springt auf Online in Telegram. Sende deinem Bot /start.

Der erste Start dauert länger, weil pip aiogram und seine Abhängigkeiten installiert. Danach installiert es nur noch neu, wenn sich deine Requirements-Datei, die zusätzlichen Pakete oder die Python-Version ändern, oder einmal am Tag. Schritt für Schritt mit Screenshots: So hostest du einen Telegram-Bot.

Was wir gemessen haben

Wir haben die drei Python-Telegram-Bibliotheken auf einem unserer eigenen Server in Wegwerf-Containern laufen lassen, eingerichtet so, wie das Panel einen Python-Bot ausführt: Python 3.12 (die als empfohlen markierte Laufzeitumgebung), Pakete mit demselben pip-Befehl installiert, ein Speicherlimit von 1 GB und ein CPU-Kern.

BibliothekVersionSpeicher ohne LastStart bis zur Antwort von TelegramInstallierte Größe mit Abhängigkeiten
aiogram3.31.0173 MB4,3 s33,9 MB
python-telegram-bot22.844 MB0,9 s12,3 MB
pyTelegramBotAPI4.37.140 MB0,7 s21,9 MB
Python 3.12 allein9 MB

Jeder Bot lud die Bibliothek und fragte Telegram mit einem gefälschten Token, wer er ist (aiogram: bot.get_me()). Der Speicher ist das, was die Prozesse des Bots 15 Sekunden nach der Ablehnung des Tokens durch Telegram belegten; die Startzeit läuft vom Start von Python bis zu dem Moment, in dem die Bibliothek diese Antwort meldet, enthält also einen Roundtrip zu Telegram. Beide Werte sind der Median aus drei Läufen nach einem Aufwärmlauf.

Diese Werte sind die Untergrenze der Bibliothek: keine Chats, keine arbeitenden Handler, nichts im Cache. Dein eigener Code, die Daten, die er im Speicher hält (zum Beispiel Konversationszustände in aiograms Memory-Storage), und die Zahl der Chats, die er bedient, kommen obendrauf, richte den Tarif also danach aus, was dein Bot tut. Unsere ältere Seite python-telegram-bot vs aiogram bei PlayNHost hat ein anderes Setup gemessen (Python 3.13, ein fertig gebauter, startbereiter Bot), ihre Zahlen sind mit diesen also nicht vergleichbar.

Ein minimaler aiogram-Bot

Er antwortet auf /start, liest den Token, den das Panel ihm gibt, und schreibt eine Bereitschaftszeile ins Log. Trage die Bibliothek in requirements.txt ein:

aiogram>=3,<4

Und den Code in bot.py:

import asyncio
import logging
import os
import sys

from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message

dp = Dispatcher()


@dp.message(CommandStart())
async def start(message: Message) -> None:
    await message.answer("Hello! I am running on PlayNHost.")


async def main() -> None:
    bot = Bot(os.environ["BOT_TOKEN"])
    async with bot.context():
        await bot.delete_webhook()
        await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())

Er liest BOT_TOKEN, den Namen, den auch aiograms eigene Beispiele verwenden; das Panel gibt deinem Code den Token unter diesem Namen sowie unter TELEGRAM_BOT_TOKEN, TOKEN und TELEGRAM_TOKEN. Logging auf INFO sorgt dafür, dass aiogram eine Zeile ausgibt, die mit INFO:aiogram.dispatcher:Run polling for bot @your_bot beginnt, sobald Telegram den Token akzeptiert hat, und das Panel liest diese Zeile, um Online in Telegram anzuzeigen, du brauchst also kein eigenes print. delete_webhook() entfernt einen Webhook, der von einem anderen Host übrig geblieben ist, bevor das Polling beginnt. async with bot.context() schließt die Verbindung des Bots zu Telegram, wenn main() endet, auch wenn es mit einem Fehler endet.

Wenn der Token falsch ist

In unserem Test, mit einem Token, den Telegram ablehnt, gab unser Test-Bot Folgendes aus:

TelegramUnauthorizedError: Telegram server says - Unauthorized

In einem vollständigen Traceback heißt die Klasse aiogram.exceptions.TelegramUnauthorizedError. Der erste Aufruf an Telegram schlägt fehl (im Bot oben delete_webhook(); ohne ihn das getMe, das start_polling ausführt), sodass der Bot sofort mit Exit-Code 1 stoppt. Bei PlayNHost zeigt das Panel über der Konsole Telegram hat deinen Bot-Token nicht akzeptiert mit Token ersetzen an.

Kopiere den Token zur Behebung erneut: Sende in @BotFather /mybots, wähle deinen Bot und dann API Token. Füge ihn auf der Seite Bot im Bereich Telegram unter Token ein und starte den Bot neu.

Zwei andere Fälle sehen anders aus. Ein Token mit einem Leerzeichen oder ohne die Nummer des Bots und einen Doppelpunkt vor dem Geheimteil scheitert vor jeder Anfrage: Bot() prüft das Format und löst TokenValidationError mit einer Meldung aus, die mit Token is invalid! beginnt. Ein Token, der widerrufen wird, während der Bot schon pollt, stoppt ihn nicht: aiogram loggt Failed to fetch updates - TelegramUnauthorizedError und versucht es alle paar Sekunden erneut, der Prozess sieht also aus, als liefe er, während nichts antwortet. Am Banner im Panel merkst du es.

Was ein Host über aiogram wissen sollte

  • Paket- und Importnamen: beide lauten aiogram. Es installiert aiohttp, pydantic, magic-filter, aiofiles und certifi mit.
  • Python-Version: aiogram 3.31 braucht Python 3.10 bis 3.14. Die Laufzeitumgebung im Bereich Code bietet genau 3.10 bis 3.14 an, wobei 3.12 als empfohlen markiert ist.
  • aiogram-2-Code läuft nicht unter aiogram 3: der Executor wurde entfernt, aus executor.start_polling(dp) wird also await dp.start_polling(bot). Ein Tutorial, dessen requirements.txt eine 2.x-Version festlegt, etwa aiogram==2.25.2, ist Code für Version 2; siehe die Frage weiter unten.
  • Ein Webhook von einem anderen Host: start_polling entfernt ihn nicht, und Telegram verweigert das Polling, solange einer gesetzt ist, daher loggt aiogram TelegramConflictError und versucht es erneut. Behalte await bot.delete_webhook() wie oben bei, oder klicke auf der Seite Bot im Bereich Telegram auf Webhook entfernen.
  • Logging: ohne logging.basicConfig werden aiograms INFO-Zeilen, einschließlich der Bereitschaftszeile, nicht angezeigt. Auf INFO loggt es außerdem eine Zeile pro Update (Update id=... is handled); füge bei einem stark genutzten Bot logging.getLogger("aiogram.event").setLevel(logging.WARNING) hinzu, das die Bereitschaftszeile behält.
  • Welche Updates ankommen: wenn du kein allowed_updates übergibst, fragt start_polling Telegram nur nach den Update-Typen, für die du Handler hast.
  • Eine zweite Kopie: wenn eine andere Kopie mit demselben Token pollt, antwortet Telegram mit 409 Conflict, und aiogram versucht es erneut, solange es läuft. Das Panel zeigt Dein Bot läuft auch noch woanders an. Siehe Telegram-Bot-Fehler 409 Conflict beheben.

Selbst auf einem Linux-VPS hosten

Installiere unter Debian oder Ubuntu Python, lege einen Benutzer für den Bot an und installiere aiogram in einer virtuellen Umgebung. Prüfe, dass python3 --version 3.10 bis 3.14 meldet.

sudo apt update
sudo apt install -y python3 python3-venv
sudo useradd --system --create-home --home-dir /opt/tgbot --shell /usr/sbin/nologin tgbot
sudo cp bot.py requirements.txt /opt/tgbot/
sudo -u tgbot python3 -m venv /opt/tgbot/venv
sudo -u tgbot /opt/tgbot/venv/bin/pip install -r /opt/tgbot/requirements.txt

Lege den Token in eine Datei, die nur root lesen kann. Öffne sie mit sudo nano /etc/tgbot.env, schreibe eine Zeile, speichere und führe dann sudo chmod 600 /etc/tgbot.env aus:

BOT_TOKEN=123456789:your-token-from-botfather

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

[Unit]
Description=Telegram bot (aiogram)
Wants=network-online.target
After=network-online.target

[Service]
User=tgbot
WorkingDirectory=/opt/tgbot
EnvironmentFile=/etc/tgbot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/tgbot/venv/bin/python /opt/tgbot/bot.py
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 tgbot
sudo journalctl -u tgbot -f

Die Logging-Zeilen landen sofort im Journal; PYTHONUNBUFFERED=1 bewirkt dasselbe für jedes print(), das du hinzufügst und das Python sonst in einem Puffer zurückhält, wenn es nicht in ein Terminal schreibt. systemctl stop tgbot sendet SIGTERM, was start_polling behandelt, indem es das Polling stoppt und die Sitzung des Bots schließt. Führe nach einer Codeänderung sudo systemctl restart tgbot aus. Stoppe vorher jede Kopie auf deinem PC, sonst antwortet Telegram mit 409 Conflict.

Selbst hosten oder Bot-Tarif

  • Auf einem VPS, den du verwaltest: Systemupdates, die Python-Version, die virtuelle Umgebung, das Neuinstallieren von Paketen, die Unit-Datei, das Lesen des Journals und das Bemerken, wenn der Bot nicht mehr antwortet. Dafür hast du root und kannst aiograms Webhook-Modus nutzen, wenn du eine Domain und HTTPS hinzufügst.
  • Bei einem Bot-Tarif übernimmt das Panel: es installiert requirements.txt, wenn sie sich ändert, startet den Bot nach einem Absturz neu, prüft den Token bei Telegram, bevor es ihn speichert, gibt ihn deinem Code unter fünf Namen, liest die Konsole und nennt die Ursache, wenn der Bot nicht mehr antwortet (ein abgelehnter Token, eine zweite Kopie, ein Webhook), mit einer Schaltfläche für Token und Webhook. Unsere Bot-Tarife enthalten noch keine öffentliche HTTPS-Adresse, daher nutzen Bots dort Long Polling, also das, was start_polling tut.

Siehe auch So nutzt du eine MySQL-Datenbank mit einem aiogram-Bot (aiomysql).

Häufige Fragen

Kann ich einen aiogram-2-Bot betreiben?

Portiere ihn auf aiogram 3, wenn du kannst: aiograms Migrationsleitfaden listet die Änderungen auf, angefangen beim entfernten Executor. Das letzte aiogram-2-Release, 2.25.2, erschien am 6. Oktober 2023. Es nennt Python 3.7 bis 3.10 als unterstützt und braucht aiohttp älter als 3.9, das PyPI nur bis Python 3.11 als fertige Pakete anbietet. Wenn du den alten Code vor dem Portieren zum Laufen bringen musst, lege aiogram==2.25.2 in requirements.txt fest und setze die Laufzeitumgebung auf Python 3.10, die neueste Version, die dafür gelistet ist.

Warum sieht mein aiogram-Bot aus, als liefe er, antwortet aber nie?

aiogram versucht es weiter, sobald das Polling gestartet ist: bei einem in @BotFather widerrufenen Token, bei einer anderen Kopie mit demselben Token und bei einem am Bot verbliebenen Webhook. Lies die Zeilen, die mit Failed to fetch updates beginnen, in der Console; das Panel macht aus jedem der drei Fälle ein Banner, das die Ursache nennt, mit einer Schaltfläche für Token und Webhook.

Wo liegen aiograms FSM-Zustände?

Beim Standard-Memory-Storage im Bot-Prozess: sie gehen verloren, wenn der Bot neu startet, zum Beispiel nach einer Codeänderung. Um sie zu behalten, nutze einen Storage außerhalb des Prozesses, etwa aiograms Redis-Storage mit einem Redis-Server, den du erreichen kannst.

Brauche ich einen Webhook, um einen aiogram-Bot online zu halten?

Nein. start_polling fragt Telegram immer wieder nach neuen Nachrichten, der Bot antwortet also, solange der Prozess läuft. Einen Bot umziehen, der einen Webhook nutzte: So ziehst du einen Telegram-Bot zu PlayNHost um.

aiogram läuft auf jedem PlayNHost-Bot-Tarif, ab STARTER (0,5 GB). Vergleiche die Tarife und klicke auf Server erstellen bei Telegram-Bot-Hosting.

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

UNSERE NEUESTEN BLOGS