Ai scris un bot Telegram cu aiogram, l-ai testat local și merge. Acum trebuie să trăiască undeva unde nu adoarme când închizi laptopul. Un VPS mic e casa firească — dar între python bot.py într-o sesiune SSH și un bot care chiar rămâne pornit după căderi, reporniri și conexiuni pierdute e o distanță.
Asta e versiunea de producție: un virtualenv, tokenul ținut în afara codului, un serviciu systemd care readuce singur botul la viață și un răspuns lucid la întrebarea pe care o pune toată lumea până la urmă — polling sau webhook?
De ce să nu-l rulezi pur și simplu pe laptop
Un bot are nevoie de o conexiune constantă spre Telegram. Laptopul tău intră în repaus, repornește pentru actualizări și sare de la o rețea la alta — fiecare dintre ele deconectează botul, iar utilizatorii dau de un zid de tăcere. Un VPS ține conexiunea non-stop. Ăsta e tot motivul să-l muți de pe mașina ta și e același motiv pentru care și un bot Discord își are locul pe un server.
Dacă vrei doar calea cea mai rapidă de „pune-l online” cu un bot minimal, ghidul de găzduire a unui bot Telegram acoperă asta. Articolul de față merge un nivel mai adânc: aiogram, gestionarea sigură a tokenului și momentul în care trebuie să crești.
Botul, într-un virtualenv
Conectează-te prin SSH și ține botul izolat în propriul venv — nu instala pachetele la nivel de sistem, mai târziu face actualizările și curățenia un haos:
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
Un bot aiogram 3 minimal, care își citește tokenul din mediu, nu dintr-un șir scris direct în cod:
# 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("Alive and running on a VPS.")
async def main():
bot = Bot(os.environ["BOT_TOKEN"])
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Ține tokenul în afara codului
Nu lipi niciodată tokenul de la BotFather în bot.py — un singur push într-un repo public și s-a scurs. Pune-l în schimb într-un fișier de mediu care poate fi citit doar de root:
sudo tee /etc/tgbot.env >/dev/null <<'EOF'
BOT_TOKEN=123456:your-token-from-botfather
EOF
sudo chmod 600 /etc/tgbot.env
Un token scurs se repară cu un /revoke în BotFather — dar orice altceva scurs de pe o mașină folosită de mai mulți e mai rău. Un VPS dedicat botului e, sincer, o casă mai sigură pentru token decât laptopul de zi cu zi: dacă se scurge, rotești un token, nu toată configurarea.
Partea care îl ține în viață: systemd
Asta desparte un bot care rulează de un bot care rămâne pornit. Creează serviciul:
# /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
Rulează-l ca utilizator fără drepturi de root (botuser mai sus), nu ca root — dacă botul e vreodată compromis, vrei să fie închis într-o cutie. Apoi:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
Restart=always cu RestartSec=3 înseamnă că o cădere — o actualizare ciudată de la Telegram, o excepție netratată, un OOM — readuce botul în trei secunde, în loc să-l lase mort până observi. Urmărește-l live:
journalctl -u tgbot -f
Asta e toată configurarea de loguri. Fără fișiere de rotit, fără unelte în plus — journald le are deja.
Actualizări fără drame
Când schimbi codul sau actualizezi aiogram:
cd ~/tgbot && source venv/bin/activate
pip install -U aiogram # if upgrading the library
sudo systemctl restart tgbot
journalctl -u tgbot -n 30 --no-pager # confirm it came back clean
Repornirea îl întrerupe pe bot o secundă sau două. Pentru un bot cu polling, utilizatorii nici nu observă — Telegram pune actualizările la coadă și le livrează când botul se reconectează.
Polling vs webhook — versiunea cinstită
E decizia la care oamenii se gândesc prea mult. Iată versiunea simplă:
Polling (start_polling, ce folosește codul de mai sus) înseamnă că botul întreabă Telegram „e ceva nou?” pe o conexiune de lungă durată. Nu are nevoie decât de internet spre exterior — fără domeniu, fără TLS, fără porturi de intrare deschise. Merge fără probleme în spatele NAT. Pentru marea majoritate a boților, e corect și te poți opri aici.
Webhook înseamnă că Telegram împinge actualizările spre tine, deci trebuie să expui un endpoint HTTPS public. Asta cere un domeniu și un port de intrare accesibil — deci fie un IP public dedicat, fie un reverse proxy în față. Mai multă configurare, mai multe lucruri care se pot strica. Câștigul e o latență mai mică și mai puțin overhead la scară mare — mii de utilizatori simultan, un volum mare de actualizări.
Regula practică: începe cu polling pe un plan NAT. Treci la webhook doar când chiar ai depășit pollingul — iar dacă se întâmplă, atunci își câștigă locul un IP dedicat, pentru că ai nevoie de acel endpoint HTTPS de intrare.
Cât costă să-l rulezi
Un bot cu polling e ușor. Stă pe long-pollul Telegram și reacționează la mesaje, așa că mașina mai mult așteaptă:
- Nano de $3 (2 vCPU / 1 GB) — în regulă pentru majoritatea boților, chiar și pentru cei destul de vorbăreți.
- Micro de $5 (2 vCPU / 2 GB) — când botul ține o bază de date (SQLite/Postgres), procesează media sau servește mulți utilizatori.
- Mai sus doar dacă botul face el muncă reală — procesare de imagini, un model local, logică grea pentru fiecare mesaj.
Înregistrarea cere doar un e-mail și plătești în USDC sau USDT pe Base sau Ethereum — fără card, fără act de identitate. Merge și cu cardul, dar on-ramp-ul are un minim de ~$27, așa că pentru un plan de $3 e mai simplu să alimentezi o dată un sold mic și să lași reînnoirile să tragă din el. Rulează doar pe CPU, într-un centru de date din UE — nicio problemă pentru un bot, merită știut dacă ai avea nevoie de un GPU sau de o anumită regiune.
Concluzia cinstită
Un bot Telegram e unul dintre cele mai ieftine lucruri pe care le poți găzdui singur: o mașină de $3, o unitate systemd și polling îți dau un bot care rămâne online după căderi și reporniri fără să stai cu ochii pe el. Apucă-te de webhook și de un plan mai mare doar când scara chiar te obligă — nu pentru că un tutorial ți-a spus că webhookurile sunt „mai bune”. Ia mașina mică, ține tokenul într-un fișier de mediu, lasă systemd să se ocupe de funcționarea continuă și — înainte de orice — parcurge lista de securitate pentru un VPS nou, ca mașina însăși să fie închisă cum trebuie.
Gata să-l găzduiești pe al tău? Un bot Telegram abia folosește resurse — planul Nano ($3/lună) îl rulează 24/7 fără bătăi de cap.
Comentarii
Încă nu există comentarii. Fii primul.