EQVPS
Inizia

Far girare un bot Telegram 24/7 su un VPS: aiogram, systemd, polling vs webhook

4 lug 2026 · 6 min di lettura · EQVPS Team

Hai scritto un bot Telegram con aiogram, l'hai testato localmente, e funziona. Ora deve vivere da qualche parte che non dorme quando chiudi il laptop. Un piccolo VPS è la casa naturale — ma c'è un divario tra python bot.py in una sessione SSH e un bot che resta effettivamente attivo attraverso crash, riavvii e la caduta della tua connessione.

Questa è la versione di produzione: un virtualenv, il token tenuto fuori dal tuo codice, un servizio systemd che resuscita il bot da solo, e una risposta lucida alla domanda che tutti alla fine fanno — polling o webhook?

Perché non eseguirlo semplicemente sul laptop

Un bot ha bisogno di una connessione stabile in uscita a Telegram. Il tuo laptop va in sospensione, si riavvia per gli aggiornamenti e salta tra reti — ognuna di queste fa cadere il bot, e gli utenti sbattono contro un muro di silenzio. Un VPS mantiene quella connessione 24 ore su 24. È tutto il motivo per spostarlo dalla tua macchina, ed è lo stesso motivo per cui anche un bot Discord appartiene a un server.

Se vuoi solo il percorso più veloce per "metterlo online" con un bot minimale, la guida per ospitare un bot Telegram copre quello. Questo pezzo va un livello più a fondo: aiogram, gestione sicura del token e sapere quando scalare.

Il bot, in un virtualenv

Fai SSH e tieni il bot isolato nel proprio venv — non installare pacchetti a livello di sistema, rende un pasticcio aggiornamenti e pulizia più tardi:

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 minimale che legge il suo token dall'ambiente, non da una stringa scritta a mano:

# 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())

Tieni il token fuori dal tuo codice

Non incollare mai il token di BotFather in bot.py — un push su un repo pubblico e è trapelato. Mettilo invece in un file env leggibile da 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 trapelato è a un /revoke in BotFather dall'essere sistemato — ma qualsiasi altra cosa trapelata su una macchina condivisa è peggio. Un VPS dedicato per il bot è onestamente una casa più sicura per il token del tuo laptop quotidiano: se trapela, ruoti un token, non tutto il tuo setup.

La parte che lo tiene vivo: systemd

È questo che separa un bot che gira da un bot che resta in funzione. Crea il servizio:

# /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

Eseguilo come utente non-root (botuser sopra), non root — se il bot viene mai compromesso, lo vuoi confinato. Poi:

sudo systemctl daemon-reload
sudo systemctl enable --now tgbot

Restart=always con RestartSec=3 significa che un crash — un brutto aggiornamento da Telegram, un'eccezione non gestita, un OOM — riporta il bot in tre secondi invece di lasciarlo morto finché non te ne accorgi. Guardalo in tempo reale:

journalctl -u tgbot -f

Ecco tutta la tua configurazione di logging. Nessun file di log da ruotare, nessuno strumento extra — journald ce l'ha già.

Aggiornare senza drammi di downtime

Quando cambi il codice o aggiorni aiogram:

cd ~/tgbot && source venv/bin/activate
pip install -U aiogram          # se aggiorni la libreria
sudo systemctl restart tgbot
journalctl -u tgbot -n 30 --no-pager   # conferma che è tornato pulito

Il riavvio fa saltare il bot per un secondo o due. Per un bot in polling è invisibile agli utenti — Telegram mette in coda gli aggiornamenti e li consegna una volta che il bot si riconnette.

Polling vs webhook — la versione onesta

È la decisione su cui la gente pensa troppo. Ecco la versione semplice:

Polling (start_polling, ciò che usa il codice sopra) fa chiedere al bot a Telegram "c'è qualcosa di nuovo?" su una connessione a lunga durata. Non ha bisogno di nulla se non internet in uscita — nessun dominio, nessun TLS, nessuna porta in entrata aperta. Gira bene dietro NAT. Per la stragrande maggioranza dei bot, è corretto e dovresti fermarti qui.

Webhook fa spingere gli aggiornamenti da Telegram verso di te, il che significa che devi esporre un endpoint HTTPS pubblico. Questo richiede un dominio e una porta in entrata raggiungibile — quindi o un IP pubblico dedicato o un reverse proxy davanti. Più setup, più cose che si rompono. Il vantaggio è latenza più bassa e meno overhead su grande scala — migliaia di utenti concorrenti, volume di aggiornamenti pesante.

La regola pratica: inizia con il polling su un piano NAT. Passa a un webhook solo quando hai effettivamente superato il polling — e se lo fai, è allora che un IP dedicato si guadagna il posto, perché ti serve quell'endpoint HTTPS in entrata.

Quanto costa farlo girare

Un bot in polling è leggero. Sta inattivo sul long-poll di Telegram e reagisce ai messaggi, quindi la macchina per lo più aspetta:

La registrazione è solo con email e paghi in USDC o USDT su Base o Ethereum — niente carta, niente ID. Anche una carta funziona, ma l'on-ramp ha un minimo di ~$27, quindi per un piano da $3 è più fluido ricaricare un piccolo saldo una volta e lasciare che i rinnovi attingano da lì. È solo CPU, un datacenter in Germania — un non-problema per un bot, utile sapere se ti serviva una GPU o una regione specifica.

La conclusione onesta

Un bot Telegram è una delle cose più economiche che puoi fare self-hosting: una macchina da $3, una unit systemd, e il polling ti dà un bot che è online attraverso crash e riavvii senza che tu lo sorvegli. Ricorri a un webhook e a un piano più grande solo quando la scala lo impone davvero — non perché un tutorial ti ha detto che i webhook sono "migliori". Prendi la piccola macchina, tieni il token in un file env, lascia che systemd gestisca l'uptime, e — prima di tutto — esegui la checklist di sicurezza per un nuovo VPS così la macchina stessa è blindata.


Pronto a ospitare il tuo? Un bot Telegram usa a malapena risorse — il piano Nano ($3/mese) lo fa girare 24/7 senza problemi.

FAQ

Polling o webhook — quale dovrei usare?

Inizia con il polling. Funziona da qualsiasi macchina con internet in uscita — nessun dominio, nessuna porta aperta, nessun TLS — ed è più che sufficiente per la maggior parte dei bot. Passa a un webhook solo quando giri su scala (migliaia di utenti) o ti serve la latenza più bassa possibile; un webhook ha bisogno di un endpoint HTTPS pubblico, il che significa un dominio e una porta in entrata raggiungibile (un IP dedicato, o un reverse proxy), quindi è più parti in movimento. Per il 95% dei bot, il polling su un piccolo VPS è la risposta giusta.

Mi serve un IP dedicato o un dominio per un bot Telegram?

Non per il polling — il bot fa solo chiamate in uscita a Telegram, quindi un piano NAT con SSH su porta inoltrata è sufficiente. Ti serve un endpoint HTTPS pubblico (dominio + porta in entrata, cioè un IP dedicato o un reverse proxy) solo se passi alla modalità webhook. La maggior parte dei bot non ne ha mai bisogno.

Quale dimensione di VPS serve a un bot aiogram?

La più piccola. Un bot in polling per lo più aspetta il long-poll di Telegram, quindi 1 vCPU / 1 GB (un Nano da $3) gestisce comodamente la maggior parte dei bot. Sali di dimensione solo quando il bot stesso fa il lavoro pesante — un database, elaborazione media o un modello locale — che ti spinge verso 2 GB ($5) o più.

Come tengo il bot in funzione dopo il logout?

Eseguilo come servizio systemd con Restart=always. Avviato nel terminale muore quando l'SSH si chiude; sotto systemd sopravvive al logout, si riavvia in caso di crash e torna dopo un riavvio. È la linea tra una demo e qualcosa su cui puoi fare affidamento.

← Torna al blogVedi piani e prezzi →

Commenti

Ancora nessun commento. Sii il primo.

Lascia un commento

I commenti sono moderati prima di comparire.