−25%

la planurile Windows anuale, până pe 31 oct. Vezi planurile

EQVPS
Începe

Rulează un bot Telegram 24/7 pe un VPS: aiogram, systemd, polling vs webhook

4 iul. 2026 · 6 min de citit · EQVPS Team

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.

Întrebări frecvente

Polling sau webhook — pe care să-l folosesc?

Începe cu polling. Merge de pe orice mașină cu internet spre exterior — fără domeniu, fără porturi deschise, fără TLS — și ajunge din plin pentru majoritatea boților. Treci la webhook doar când rulezi la scară (mii de utilizatori) sau ai nevoie de cea mai mică latență posibilă; un webhook cere un endpoint HTTPS public, adică un domeniu și un port de intrare accesibil (un IP dedicat sau un reverse proxy), deci mai multe piese în mișcare. Pentru 95% dintre boți, polling pe un VPS mic e răspunsul corect.

Am nevoie de un IP dedicat sau de un domeniu pentru un bot Telegram?

Nu pentru polling — botul face doar apeluri spre exterior către Telegram, așa că ajunge un plan NAT cu SSH redirecționat. Ai nevoie de un endpoint HTTPS public (domeniu + port de intrare, adică un IP dedicat sau un reverse proxy) doar dacă treci în modul webhook. Majoritatea boților nu au nevoie niciodată de el.

Ce mărime de VPS îi trebuie unui bot aiogram?

Cea mai mică. Un bot cu polling mai mult așteaptă după long-pollul Telegram, așa că 2 vCPU / 1 GB (un Nano de $3) duc comod majoritatea boților. Treci la mai mare doar când botul face el munca grea — o bază de date, procesare media sau un model local —, ceea ce te împinge spre 2 GB ($5) sau mai mult.

Cum țin botul pornit după ce mă deconectez?

Rulează-l ca serviciu systemd cu Restart=always. Pornit în terminal, moare când se închide SSH-ul; sub systemd supraviețuiește deconectării, repornește după o cădere și revine după o repornire a serverului. Asta e linia dintre o demonstrație și ceva pe care te poți baza.

Comentarii

Încă nu există comentarii. Fii primul.

Lasă un comentariu

Comentariile sunt moderate înainte să apară.