Aby hostować bota aiogram 24/7, uruchom go na maszynie, która stale działa, zamiast na swoim komputerze: na VPS-ie z Linuksem z usługą systemd, która uruchomi go ponownie po awarii lub restarcie, albo na planie botowym PlayNHost (od 1,99 USD miesięcznie, zobacz hosting botów Telegram), gdzie wgrywasz kod, wklejasz token i klikasz Start. W naszym teście bot na aiogram 3.31.0 zużywał ok. 173 MB pamięci w spoczynku; nasz najmniejszy plan botowy, STARTER, ma 0,5 GB. Obie drogi używają long pollingu: dp.start_polling(bot) pyta Telegram o nowe wiadomości, więc bot nie potrzebuje publicznego adresu. Kroki w PlayNHost:
- W Telegramie wyślij
/newbotdo @BotFather i skopiuj token, który dostaniesz. - Na stronie hosting botów Telegram kliknij Utwórz serwer przy wybranym planie. W oknie zamówienia na pytanie Na jaką platformę jest Twój bot? odpowiedz Telegram i wybierz Python.
- Otwórz swój serwer w panelu. Karta Skonfiguruj swojego bota w sekcji Przegląd otwiera się na kroku Połącz z Telegramem; jej pierwszy krok, Co działa, powinien pokazywać Ten bot uruchamia Python Bot.
- W kroku Połącz z Telegramem wklej token i kliknij Połączenie. Sprawdź wyświetloną nazwę bota i kliknij Tak, dalej.
- W kroku Twój kod kliknij Prześlij pliki, aby otworzyć Files, i wgraj
bot.pyorazrequirements.txt, albo kliknij Połącz Git. - Na stronie Bot, w panelu Kod, sprawdź, czy Plik startowy to plik, który uruchamia
asyncio.run(main())(domyślniebot.py). - Kliknij Uruchom bota, otwórz Console i poczekaj na linię aiogram
Run polling for bot @your_bot. Znacznik w sekcji Przegląd zmieni się na Online w Telegramie. Wyślij swojemu botowi/start.
Pierwszy start trwa dłużej, bo pip instaluje aiogram i jego zależności. Potem instaluje ponownie tylko wtedy, gdy zmieni się plik requirements, dodatkowe pakiety lub wersja Pythona, albo raz dziennie. Krok po kroku ze zrzutami ekranu: Jak hostować bota Telegram.
Co zmierzyliśmy
Uruchomiliśmy trzy pythonowe biblioteki do Telegrama na jednym z naszych serwerów, w jednorazowych kontenerach skonfigurowanych tak, jak panel uruchamia bota w Pythonie: Python 3.12 (Runtime oznaczony jako zalecany), pakiety zainstalowane tym samym poleceniem pip, limit pamięci 1 GB i jeden rdzeń CPU.
| Biblioteka | Wersja | Pamięć w spoczynku | Od startu do odpowiedzi Telegrama | Rozmiar po instalacji, z zależnościami |
|---|---|---|---|---|
| aiogram | 3.31.0 | 173 MB | 4,3 s | 33,9 MB |
| python-telegram-bot | 22.8 | 44 MB | 0,9 s | 12,3 MB |
| pyTelegramBotAPI | 4.37.1 | 40 MB | 0,7 s | 21,9 MB |
| Sam Python 3.12 | 9 MB |
Każdy bot ładował bibliotekę i pytał Telegram, kim jest, z fałszywym tokenem (aiogram: bot.get_me()). Pamięć to to, co procesy bota zajmowały 15 sekund po tym, jak Telegram odrzucił token; czas startu liczy się od uruchomienia Pythona do chwili, gdy biblioteka zgłasza tę odpowiedź, więc obejmuje jedną rundę do Telegrama. Obie wartości to mediana z trzech uruchomień po uruchomieniu rozgrzewkowym.
Te liczby to dolna granica biblioteki: bez czatów, bez pracujących handlerów, bez niczego w cache. Twój własny kod, dane, które trzyma w pamięci (na przykład stany rozmów w pamięciowym storage aiogram), i liczba obsługiwanych czatów dochodzą do tego, więc dobierz plan do tego, co robi twój bot. Nasza starsza strona python-telegram-bot kontra aiogram w PlayNHost mierzyła inną konfigurację (Python 3.13, bot zbudowany i gotowy do startu), więc jej liczby nie są porównywalne z tymi.
Minimalny bot aiogram
Odpowiada na /start, czyta token, który daje mu panel, i zapisuje w logu linię gotowości. Umieść bibliotekę w requirements.txt:
aiogram>=3,<4
A kod w 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())
Czyta BOT_TOKEN, nazwę, której używają własne przykłady aiogram; panel przekazuje twojemu kodowi token pod tą nazwą oraz pod TELEGRAM_BOT_TOKEN, TOKEN i TELEGRAM_TOKEN. Logowanie na poziomie INFO sprawia, że aiogram wypisuje linię zaczynającą się od INFO:aiogram.dispatcher:Run polling for bot @your_bot, gdy Telegram przyjmie token, a panel czyta tę linię, by pokazać Online w Telegramie, więc nie potrzebujesz własnego printa. delete_webhook() usuwa webhook pozostawiony przez innego hosta, zanim zacznie się polling. async with bot.context() zamyka połączenie bota z Telegramem, gdy main() się kończy, także gdy kończy się błędem.
Jeśli token jest błędny
W naszym teście, z tokenem, który Telegram odrzuca, nasz testowy bot wypisał:
TelegramUnauthorizedError: Telegram server says - Unauthorized
W pełnym tracebacku klasa wygląda tak: aiogram.exceptions.TelegramUnauthorizedError. Pierwsze wywołanie Telegrama kończy się błędem (w powyższym bocie delete_webhook(); bez niego getMe, które wykonuje start_polling), więc bot od razu się zatrzymuje z kodem wyjścia 1. W PlayNHost panel pokazuje nad konsolą Telegram nie przyjął tokena twojego bota z przyciskiem Zastąp token.
Aby to naprawić, skopiuj token jeszcze raz: w @BotFather wyślij /mybots, wybierz swojego bota, potem API Token. Wklej go na stronie Bot, w panelu Telegram, w polu Token, i uruchom bota ponownie.
Dwa inne przypadki wyglądają inaczej. Token ze spacją albo bez numeru bota i dwukropka przed sekretem zawodzi przed jakimkolwiek żądaniem: Bot() sprawdza format i zgłasza TokenValidationError z komunikatem zaczynającym się od Token is invalid!. Token unieważniony, gdy bot już pracuje w pollingu, go nie zatrzymuje: aiogram loguje Failed to fetch updates - TelegramUnauthorizedError i ponawia co kilka sekund, więc proces wygląda na działający, a nic nie odpowiada. Zauważysz to dzięki banerowi w panelu.
Co host powinien wiedzieć o aiogram
- Nazwy pakietu i importu: obie to
aiogram. Razem z nim instalują się aiohttp, pydantic, magic-filter, aiofiles i certifi. - Wersja Pythona: aiogram 3.31 wymaga Pythona 3.10 do 3.14. Runtime w panelu Kod oferuje dokładnie 3.10 do 3.14, z 3.12 oznaczonym jako zalecany.
- Kod aiogram 2 nie działa na aiogram 3: usunięto
Executor, więcexecutor.start_polling(dp)zmienia się wawait dp.start_polling(bot). Poradnik, w którymrequirements.txtprzypina wersję 2.x, na przykładaiogram==2.25.2, to kod wersji 2; zobacz pytanie poniżej. - Webhook pozostawiony przez innego hosta:
start_pollinggo nie usuwa, a Telegram odrzuca polling, dopóki jakiś jest ustawiony, więc aiogram logujeTelegramConflictErrori ponawia próbę. Zostawawait bot.delete_webhook()jak wyżej albo kliknij Usuń webhook na stronie Bot, w panelu Telegram. - Logowanie: bez
logging.basicConfiglinieINFOaiogram, w tym linia gotowości, nie są wyświetlane. Na poziomieINFOloguje też jedną linię na każdy update (Update id=... is handled); w mocno obciążonym bocie dodajlogging.getLogger("aiogram.event").setLevel(logging.WARNING), co zachowuje linię gotowości. - Które update'y docierają: jeśli nie przekażesz
allowed_updates,start_pollingprosi Telegram tylko o te typy update'ów, dla których masz handlery. - Druga kopia: gdy inna kopia prowadzi polling z tym samym tokenem, Telegram odpowiada
409 Conflict, a aiogram ponawia próby, dopóki działa. Panel pokazuje Twój bot działa też gdzie indziej. Zobacz Jak naprawić błąd 409 Conflict bota Telegram.
Hostowanie samodzielnie na VPS-ie z Linuksem
W Debianie lub Ubuntu zainstaluj Pythona, utwórz użytkownika dla bota i zainstaluj aiogram w środowisku wirtualnym. Sprawdź, czy python3 --version pokazuje 3.10 do 3.14.
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
Umieść token w pliku, który może czytać tylko root. Otwórz go poleceniem sudo nano /etc/tgbot.env, wpisz jedną linię, zapisz, a potem uruchom sudo chmod 600 /etc/tgbot.env:
BOT_TOKEN=123456789:your-token-from-botfather
Utwórz /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
Uruchom go teraz i przy każdym starcie systemu, a potem śledź jego wyjście:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f
Linie logowania trafiają do journala na bieżąco; PYTHONUNBUFFERED=1 robi to samo dla każdego dodanego print(), który Python w przeciwnym razie przetrzymuje w buforze, gdy nie pisze do terminala. systemctl stop tgbot wysyła SIGTERM, który start_polling obsługuje, zatrzymując polling i zamykając sesję bota. Po zmianie kodu uruchom sudo systemctl restart tgbot. Najpierw zatrzymaj każdą kopię na swoim komputerze, bo inaczej Telegram odpowie 409 Conflict.
Samodzielny hosting czy plan botowy
- Na VPS-ie, którym zarządzasz sam: aktualizacje systemu, wersja Pythona, środowisko wirtualne, ponowna instalacja pakietów, plik unit, czytanie journala i zauważenie, że bot przestał odpowiadać. W zamian masz roota i możesz używać trybu webhook aiogram, jeśli dodasz domenę i HTTPS.
- Na planie botowym robi to panel: instaluje
requirements.txt, gdy się zmieni, uruchamia bota ponownie po awarii, sprawdza token w Telegramie przed zapisaniem, przekazuje go twojemu kodowi pod pięcioma nazwami, czyta konsolę i wskazuje przyczynę, gdy bot przestaje odpowiadać (odrzucony token, druga kopia, webhook), z przyciskiem dla tokena i webhooka. Nasze plany botowe nie zawierają jeszcze publicznego adresu HTTPS, więc boty używają tam long pollingu, czyli tego, co robistart_polling.
Zobacz też Jak używać bazy danych MySQL z botem aiogram (aiomysql).
Najczęstsze pytania
Czy mogę uruchomić bota aiogram 2?
Jeśli możesz, przenieś go na aiogram 3: przewodnik migracji aiogram wymienia zmiany, zaczynając od usuniętego Executor. Ostatnie wydanie aiogram 2, 2.25.2, ukazało się 6 października 2023. Podaje jako obsługiwane Pythona 3.7 do 3.10 i wymaga aiohttp starszego niż 3.9, które PyPI oferuje jako gotowe pakiety tylko do Pythona 3.11. Jeśli potrzebujesz uruchomić stary kod przed przeniesieniem, przypnij aiogram==2.25.2 w requirements.txt i ustaw Runtime na Python 3.10, najnowszą wersję, jaką podaje.
Dlaczego mój bot aiogram wygląda na działającego, ale nigdy nie odpowiada?
aiogram ponawia próby, gdy polling już ruszył: przy tokenie unieważnionym w @BotFather, przy innej kopii używającej tego samego tokena i przy webhooku pozostawionym na bocie. Przeczytaj linie zaczynające się od Failed to fetch updates w Console; panel zamienia każdy z tych trzech przypadków w baner wskazujący przyczynę, z przyciskiem dla tokena i webhooka.
Gdzie żyją stany FSM aiogram?
Przy domyślnym storage w pamięci, w procesie bota: giną przy restarcie bota, na przykład po zmianie kodu. Aby je zachować, użyj storage poza procesem, takiego jak storage Redis aiogram z serwerem Redis, do którego masz dostęp.
Czy potrzebuję webhooka, żeby bot aiogram był online?
Nie. start_polling stale pyta Telegram o nowe wiadomości, więc bot odpowiada, dopóki proces działa. Przenoszenie bota, który używał webhooka: Jak przenieść bota Telegram do PlayNHost.
aiogram działa na każdym planie botowym PlayNHost, od STARTER (0,5 GB) w górę. Porównaj plany i kliknij Utwórz serwer na stronie hosting botów Telegram.



