NOWOŚĆ 📢 Ograniczona oferta na start: do 70% zniżki na pierwszy miesiąc, na każdą grę!Zobacz plany

Jak hostować bota aiogram 24/7 na planie botowym lub VPS-ie z Linuksem

Hosting botów TelegramUpdated Nov 6, 202610 min read

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:

  1. W Telegramie wyślij /newbot do @BotFather i skopiuj token, który dostaniesz.
  2. 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.
  3. 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.
  4. W kroku Połącz z Telegramem wklej token i kliknij Połączenie. Sprawdź wyświetloną nazwę bota i kliknij Tak, dalej.
  5. W kroku Twój kod kliknij Prześlij pliki, aby otworzyć Files, i wgraj bot.py oraz requirements.txt, albo kliknij Połącz Git.
  6. Na stronie Bot, w panelu Kod, sprawdź, czy Plik startowy to plik, który uruchamia asyncio.run(main()) (domyślnie bot.py).
  7. 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.

BibliotekaWersjaPamięć w spoczynkuOd startu do odpowiedzi TelegramaRozmiar po instalacji, z zależnościami
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
Sam Python 3.129 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ęc executor.start_polling(dp) zmienia się w await dp.start_polling(bot). Poradnik, w którym requirements.txt przypina wersję 2.x, na przykład aiogram==2.25.2, to kod wersji 2; zobacz pytanie poniżej.
  • Webhook pozostawiony przez innego hosta: start_polling go nie usuwa, a Telegram odrzuca polling, dopóki jakiś jest ustawiony, więc aiogram loguje TelegramConflictError i ponawia próbę. Zostaw await bot.delete_webhook() jak wyżej albo kliknij Usuń webhook na stronie Bot, w panelu Telegram.
  • Logowanie: bez logging.basicConfig linie INFO aiogram, w tym linia gotowości, nie są wyświetlane. Na poziomie INFO loguje też jedną linię na każdy update (Update id=... is handled); w mocno obciążonym bocie dodaj logging.getLogger("aiogram.event").setLevel(logging.WARNING), co zachowuje linię gotowości.
  • Które update'y docierają: jeśli nie przekażesz allowed_updates, start_polling prosi 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 robi start_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.

Twój bot działa już gdzie indziej? Przenieś go do nas

NASZE OSTATNIE WPISY