Napisałeś bota Telegram z aiogram, przetestowałeś lokalnie i działa. Teraz musi żyć gdzieś, co nie śpi, gdy zamkniesz laptop. Mały VPS to naturalny dom — ale jest przepaść między python bot.py w sesji SSH a botem, który faktycznie pozostaje włączony przez awarie, restarty i spadki Twojego połączenia.
To wersja produkcyjna: virtualenv, token trzymany poza kodem, usługa systemd, która wskrzesza bota sama, i jasna odpowiedź na pytanie, które wszyscy w końcu zadają — polling czy webhook?
Dlaczego nie po prostu uruchomić go na laptopie
Bot potrzebuje stałego wychodzącego połączenia z Telegramem. Twój laptop zasypia, restartuje się po aktualizacje i skacze między sieciami — każde z tych zrzuca bota, a użytkownicy trafiają na ścianę ciszy. VPS trzyma to połączenie całą dobę. To cały powód, by przenieść go z maszyny, i ten sam powód, dla którego bot Discord też należy na serwer.
Jeśli chcesz po prostu najszybszej ścieżki „postaw go online” z minimalnym botem, przewodnik hostowania bota Telegram to obejmuje. Ten tekst idzie poziom głębiej: aiogram, bezpieczna obsługa tokenu i wiedza, kiedy skalować.
Bot, w virtualenv
Zaloguj się przez SSH i trzymaj bota izolowanego we własnym venv — nie instaluj pakietów systemowo, to robi bałagan z aktualizacjami i sprzątaniem później:
sudo apt update && sudo apt install -y python3-venv
mkdir ~/tgbot && cd ~/tgbot
python3 -m venv venv && source venv/bin/activate
pip install -U aiogram
Minimalny bot aiogram 3, który czyta token ze środowiska, nie ze zakodowanego na twardo ciągu:
# bot.py
import asyncio, logging, os
from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.filters import CommandStart
logging.basicConfig(level=logging.INFO)
dp = Dispatcher()
@dp.message(CommandStart())
async def start(m: Message):
await m.answer("Żywy i działający na VPS.")
async def main():
bot = Bot(os.environ["BOT_TOKEN"])
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Trzymaj token poza kodem
Nigdy nie wklejaj tokenu BotFather do bot.py — jeden push do publicznego repozytorium i wyciekł. Umieść go zamiast tego w pliku env czytelnym dla root:
sudo tee /etc/tgbot.env >/dev/null <<'EOF'
BOT_TOKEN=123456:your-token-from-botfather
EOF
sudo chmod 600 /etc/tgbot.env
Wyciekły token jest o jedno /revoke w BotFather od naprawienia — ale wyciekłe cokolwiek innego na współdzielonej maszynie jest gorsze. Dedykowany VPS dla bota jest szczerze bezpieczniejszym domem dla tokenu niż Twój codzienny laptop: jeśli wycieknie, rotujesz jeden token, nie całą konfigurację.
Część, która utrzymuje go przy życiu: systemd
To, co oddziela bota, który działa, od bota, który pozostaje działający. Utwórz usługę:
# /etc/systemd/system/tgbot.service
[Unit]
Description=Telegram bot (aiogram)
After=network-online.target
Wants=network-online.target
[Service]
User=botuser
WorkingDirectory=/home/botuser/tgbot
EnvironmentFile=/etc/tgbot.env
ExecStart=/home/botuser/tgbot/venv/bin/python bot.py
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Uruchom go jako użytkownik inny niż root (botuser powyżej), nie root — jeśli bot kiedyś zostanie skompromitowany, chcesz go mieć zamkniętego. Potem:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
Restart=always z RestartSec=3 oznacza, że awaria — zła aktualizacja od Telegrama, nieobsłużony wyjątek, OOM — przywraca bota w trzy sekundy zamiast zostawiać go martwym, aż zauważysz. Obserwuj na żywo:
journalctl -u tgbot -f
To cała Twoja konfiguracja logowania. Żadnych plików logów do rotowania, żadnych dodatkowych narzędzi — journald już to ma.
Aktualizowanie bez dramatu przestoju
Gdy zmieniasz kod lub podbijasz aiogram:
cd ~/tgbot && source venv/bin/activate
pip install -U aiogram # jeśli aktualizujesz bibliotekę
sudo systemctl restart tgbot
journalctl -u tgbot -n 30 --no-pager # potwierdź, że wrócił czysto
Restart mruga botem na sekundę lub dwie. Dla bota odpytującego to niewidoczne dla użytkowników — Telegram kolejkuje aktualizacje i dostarcza je, gdy bot się połączy ponownie.
Polling vs webhook — uczciwa wersja
To decyzja, którą ludzie przemyśliwają. Oto zwykła wersja:
Polling (start_polling, tego używa kod powyżej) sprawia, że bot pyta Telegram „coś nowego?” na długotrwałym połączeniu. Nie potrzebuje niczego poza wychodzącym internetem — bez domeny, bez TLS, bez otwartych portów przychodzących. Działa dobrze za NAT. Dla przytłaczającej większości botów to poprawne i powinieneś się tu zatrzymać.
Webhook sprawia, że Telegram wypycha aktualizacje do Ciebie, co oznacza, że musisz wystawić publiczny punkt końcowy HTTPS. To wymaga domeny i osiągalnego portu przychodzącego — więc albo dedykowanego publicznego IP, albo reverse proxy z przodu. Więcej konfiguracji, więcej rzeczy, które się psują. Zapłatą jest niższa latencja i mniejszy narzut na dużej skali — tysiące jednoczesnych użytkowników, ciężki wolumen aktualizacji.
Praktyczna zasada: zacznij od pollingu na planie NAT. Przejdź na webhook dopiero, gdy faktycznie przerośniesz polling — a jeśli tak, to wtedy dedykowane IP zarabia na swoje miejsce, bo potrzebujesz tego przychodzącego punktu końcowego HTTPS.
Ile kosztuje uruchomienie
Bot odpytujący jest lekki. Bezczynnie czeka na long-poll Telegrama i reaguje na wiadomości, więc maszyna głównie czeka:
- Nano za 3 $ (1 vCPU / 1 GB) — w porządku dla większości botów, nawet całkiem gadatliwych.
- Micro za 5 $ (2 vCPU / 2 GB) — gdy bot trzyma bazę danych (SQLite/Postgres), obsługuje media lub obsługuje wielu użytkowników.
- Wyżej tylko, jeśli sam bot wykonuje prawdziwą pracę — przetwarzanie obrazów, lokalny model, ciężka logika na wiadomość.
Rejestracja jest tylko e-mailem, a płacisz w USDC lub USDT na Base lub Ethereum — bez karty, bez dokumentu. Karta też działa, ale on-ramp ma minimum ~27 $, więc dla planu za 3 $ wygodniej doładować małe saldo raz i pozwolić odnowieniom z niego czerpać. To tylko CPU, jedno centrum danych w Niemczech — nieistotne dla bota, warto wiedzieć, jeśli potrzebowałbyś GPU lub konkretnego regionu.
Uczciwa konkluzja
Bot Telegram to jedna z najtańszych rzeczy, które możesz hostować samodzielnie: maszyna za 3 $, jednostka systemd i polling dają Ci bota, który jest online przez awarie i restarty bez Twojego pilnowania. Sięgnij po webhook i większy plan tylko, gdy skala faktycznie to wymusza — nie dlatego, że tutorial powiedział Ci, że webhooki są „lepsze”. Weź małą maszynę, trzymaj token w pliku env, pozwól systemd obsłużyć dostępność i — przed czymkolwiek innym — uruchom listę kontrolną bezpieczeństwa nowego VPS, by sama maszyna była zablokowana.
Gotowy hostować swojego? Bot Telegram ledwie zużywa zasoby — plan Nano (3 $/mies.) uruchamia go 24/7 bez zamieszania.
Komentarze
Brak komentarzy. Bądź pierwszy.