Per ospitare un bot telebot 24/7 lo esegui su una macchina sempre accesa: un VPS Linux con un servizio systemd che lo riavvia quando si ferma, oppure un piano bot su PlayNHost (da 1,99 US$ al mese), dove carichi il programma finito e il pannello gli dà il token e lo riavvia se va in crash. Nel nostro test un bot telebot 3.3.8 (gopkg.in/telebot.v3) ha usato circa 11 MB di memoria. Un bot Go si compila sul tuo computer come un unico programma Linux x86-64: sul server non si compila nulla. I passaggi su PlayNHost:
- Compila il tuo bot per Linux x86-64 sul tuo computer, come mostrato sotto in Build it for Linux.
- Su hosting per bot Telegram, clicca su Crea server su un piano. Nella finestra dell'ordine rispondi a Per quale piattaforma è il tuo bot? con Telegram e scegli Go.
- Apri il tuo server nel pannello. La scheda Configura il tuo bot in Panoramica si apre su Connetti a Telegram; il suo primo passaggio, Cosa viene eseguito, dovrebbe dire Questo bot esegue Go Bot.
- In Connetti a Telegram incolla il token di @BotFather sotto Incolla il token del bot, clicca su Connessione, controlla il nome del bot mostrato e clicca su Sì, continua.
- In Il tuo codice clicca su Carica i file, poi in Files clicca su Carica e scegli il tuo programma, chiamato
bot. Oppure lascia che lo scarichi il server: nella pagina Bot, riquadro Codice, scheda Impostazioni, imposta Link di download (facoltativo) su un link https al programma e clicca su Salva. - Clicca su Avvia il bot e apri Console. Dopo
[PlayNHost] Starting your botil tuo bot stampaLogged in as @your_bote l'indicatore in Panoramica passa a Online su Telegram. - Nella pagina Bot, riquadro Telegram, clicca su Apri in Telegram e invia
/startal tuo bot.
La creazione del bot in @BotFather e la scheda di configurazione sono spiegate in Come ospitare un bot Telegram. Il tipo Go Bot in sé (il File di avvio, gli Argomenti di avvio (facoltativo) e il link di download) è lo stesso per i bot Discord e Telegram: Come ospitare un bot Discord in Go. Questa pagina parla di telebot: cosa usa su un server e cosa sapere prima di ospitarlo.
Cosa abbiamo misurato
| Libreria | Versione | Memoria senza carico | Dall'avvio alla risposta della piattaforma | Dimensione del programma |
|---|---|---|---|---|
| telebot (Telegram) | 3.3.8 | 11 MB | 0,1 s | 8,1 MB |
| go-telegram/bot (Telegram) | 1.27.0 | 11 MB | 0,1 s | 8,1 MB |
| discordgo (Discord) | 0.29.0 | 12 MB | 0,3 s | 9,0 MB |
| Un programma Go senza librerie | Go 1.23.12 | 2 MB | nessuna | 2,1 MB |
Come: sul nostro nodo, in un container usa e getta configurato come un piano bot da 1 GB con una CPU e l'immagine Debian su cui gira il nostro tipo Go Bot, il programma di ogni libreria ha chiamato Telegram o Discord con un token finto, che è stato rifiutato; il programma senza libreria non ha fatto nessuna chiamata. La memoria è la memoria residente 15 secondi dopo quella risposta, il tempo di avvio va dal lancio alla risposta e ogni valore è la mediana delle esecuzioni da 2 a 4. I programmi sono stati compilati con Go 1.23.12 e CGO_ENABLED=0.
Sono valori minimi: un programma senza chat e senza dati. Il tuo codice, ciò che tiene in memoria e il numero di chat si sommano, quindi un programma telebot minimo usa una piccola parte del piano STARTER da 0,5 GB.
Un bot telebot minimo
Risponde a /start, legge il token che gli dà il pannello, stampa una riga di pronto, dice chiaramente quando Telegram rifiuta il token e si ferma in modo pulito quando premi Ferma. Metti i due file in una cartella, poi esegui go mod tidy, che scarica telebot e scrive go.sum.
go.mod
module bot
go 1.23
require gopkg.in/telebot.v3 v3.3.8
main.go
package main
import (
"errors"
"fmt"
"os"
"os/signal"
"strings"
"syscall"
"time"
tele "gopkg.in/telebot.v3"
"gopkg.in/telebot.v3/middleware"
)
func main() {
token := os.Getenv("TELEGRAM_BOT_TOKEN")
if token == "" {
fmt.Println("TELEGRAM_BOT_TOKEN is not set. Paste your token on the Bot page, Telegram, then restart.")
os.Exit(1)
}
// Network errors contain the request address, and the address contains the token.
hide := func(err error) string { return strings.ReplaceAll(err.Error(), token, "<token>") }
b, err := tele.NewBot(tele.Settings{
Token: token,
Poller: &tele.LongPoller{Timeout: 10 * time.Second},
})
if errors.Is(err, tele.ErrUnauthorized) {
fmt.Println("Telegram did not accept the bot token. Paste the current one from @BotFather, then restart.")
os.Exit(1)
}
if err != nil {
fmt.Println("Could not start the bot:", hide(err))
os.Exit(1)
}
// Without this, a panic in one handler stops the whole program.
b.Use(middleware.Recover())
b.Handle("/start", func(c tele.Context) error {
return c.Send("Hello! I am running on PlayNHost.")
})
// A webhook left on the bot blocks polling. Remove it and keep the messages that are waiting.
if err := b.RemoveWebhook(); err != nil {
fmt.Println("Could not remove the webhook:", hide(err))
}
fmt.Println("Logged in as @" + b.Me.Username)
go b.Start()
// The panel stops the bot with Ctrl+C (SIGINT).
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
<-stop
b.Stop()
}
La riga Logged in as @your_bot è ciò che porta l'indicatore a Online su Telegram. Il pannello dà il token al tuo programma come TELEGRAM_BOT_TOKEN, e anche come TOKEN, BOT_TOKEN, TELEGRAM_TOKEN e TELOXIDE_TOKEN. L'esempio del README di telebot legge os.Getenv("TOKEN"), quindi anche la sua riga del token funziona senza modifiche.
Compilare per Linux
Dalla cartella del tuo progetto, su qualsiasi computer:
# macOS or Linux
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o bot
# Windows PowerShell
$env:GOOS="linux"; $env:GOARCH="amd64"; $env:CGO_ENABLED="0"; go build -o bot
CGO_ENABLED=0 produce un unico file autonomo che non dipende dalle librerie di sistema del server, quindi gira sulla nostra immagine Debian qualunque sia il sistema su cui compili. Il risultato è un file chiamato bot senza estensione. Un .exe di Windows o una build per macOS non gira sul server: la console dice allora [PlayNHost] bot is not a Linux program. Build it for Linux x86-64 (not Windows or macOS) and upload it again.
Se il token è sbagliato
Nel nostro test, con un token finto, tele.NewBot ha restituito questo errore (il nostro programma di prova lo ha stampato dopo il tipo dell'errore):
*telebot.Error: telegram: Unauthorized (401)
NewBot chiede a Telegram chi è il bot (getMe) prima di restituire il controllo, quindi un token rifiutato ferma il programma prima che faccia polling. telebot restituisce il suo errore ErrUnauthorized per la risposta Unauthorized di Telegram. L'esempio del README termina il programma con log.Fatal(err); il bot qui sopra stampa invece Telegram did not accept the bot token. Paste the current one from @BotFather, then restart., una riga che il pannello riconosce: mostra il banner Telegram non ha accettato il token del bot sopra Console.
Per risolvere, in @BotFather invia /mybots, scegli il tuo bot, poi API Token, e copia di nuovo il token. Nella pagina Bot, riquadro Telegram, clicca su Sostituisci il token, incollalo, clicca su Salva il token, poi su Riavvia ora.
Cosa sapere su telebot su un server
- Gli errori durante il polling sono silenziosi. Quando la richiesta dei messaggi a Telegram fallisce, il
LongPollerdi telebot riprova subito, senza pausa, e stampa l'errore solo seVerboseè attivo. Così, quando un'altra copia del bot fa polling con lo stesso token (409 Conflict), è impostato un webhook o il token viene revocato mentre il bot gira, il tuo bot continua a girare ma riceve pochi messaggi o nessuno, e la console resta muta. Ferma ogni altra copia prima di avviarlo qui e consulta Come risolvere l’errore 409 Conflict di un bot Telegram. - Vedere cosa fa il polling.
Verbose: trueintele.Settingsregistra ogni richiesta e la risposta di Telegram, così il testo409 Conflictcompare in Console e il pannello può mostrare Il tuo bot è in esecuzione anche altrove. Registra anche i messaggi che le persone inviano al tuo bot, quindi attivalo per una prova, non in modo permanente. - Un webhook rimasto sul bot.
b.Start()non rimuove un webhook e, finché ce n'è uno, il polling fallisce in silenzio. Il bot qui sopra chiamab.RemoveWebhook()prima di partire, mantenendo i messaggi in attesa. Puoi anche cliccare su Rimuovi il webhook nel riquadro Telegram. Il pollerWebhookdi telebot richiede un indirizzo HTTPS pubblico, che i nostri piani non includono ancora: usaLongPoller. - Un panic in un handler termina il programma. telebot esegue ogni handler nella propria goroutine (a meno che
Synchronoussia attivo) e un panic lì ferma tutto.b.Use(middleware.Recover())trasforma un panic in un errore che viene stampato. Chiamab.Useprima dib.Handle: il middleware viene collegato quando si aggiunge un handler. - Gli errori degli handler vengono stampati per te. Un errore restituito dal tuo handler va al gestore di errori predefinito di telebot, che stampa il numero dell'aggiornamento e l'errore. Imposta
OnErrorintele.Settingsper cambiarlo. - Il tuo token nei messaggi di errore. telebot mette il token nell'indirizzo di ogni richiesta (
/botseguito dal token) e gli errori di rete di Go includono quell'indirizzo. Il bot qui sopra sostituisce il token prima di stampare un errore. Non condividere l'output grezzo della console di un bot che stampa gli errori così come sono. - Un arresto pulito. Il pannello ferma un bot Go con Ctrl+C (
SIGINT).b.Start()gira finché non viene chiamatob.Stop(), quindi il bot qui sopra lo avvia in una goroutine, aspetta il segnale e poi chiamab.Stop(), che annulla la richiesta in corso. - Aggiornamenti. Il tipo Go Bot non ha il campo Pacchetti né una sorgente Git: i tuoi moduli sono dentro il programma. Per aggiornare, elimina il vecchio programma in Files, carica la nuova build e riavvia. Con un link di download, pubblica la nuova build a quel link, elimina il programma in Files e premi Avvia.
Ospitarlo da soli su un VPS Linux
Copia il programma compilato sul VPS; lì non serve Go, e una build con CGO_ENABLED=0 non dipende dalle librerie di sistema del VPS. Crea un utente per il bot, metti il programma nella sua cartella e tieni il token in un file leggibile solo da root:
sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo install -o mybot -m 755 bot /opt/mybot/bot
sudo sh -c 'echo "TELEGRAM_BOT_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env
Crea /etc/systemd/system/mybot.service:
[Unit]
Description=telebot Telegram bot
Wants=network-online.target
After=network-online.target
[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/opt/mybot/bot
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Avvialo subito e a ogni avvio del sistema, poi segui il suo output:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f
systemctl stop invia SIGTERM per impostazione predefinita, e il bot qui sopra lo ascolta, quindi si ferma in modo pulito. Restart=always riavvia il bot dopo un crash o un'uscita. Ferma prima ogni altra copia: con telebot un 409 Conflict non mostra nulla nemmeno in journalctl.
Self-hosting o piano bot
Su un VPS che gestisci tu, ti occupi di:
- Aggiornamenti e sicurezza del sistema operativo.
- Copiare ogni nuova build, il file di servizio, il file del token e i suoi permessi.
- Leggere
journalctlper capire perché il bot si è fermato. - I backup dei dati del bot.
In cambio un VPS esegue qualsiasi cosa e puoi dargli un dominio con HTTPS per un webhook.
Su un piano bot PlayNHost lo fa il pannello per te:
- Un'immagine Debian che esegue un programma Linux x86-64 e un controllo all'avvio che te lo dice quando il file è una build per Windows o macOS.
- Caricamento in Files, oppure un link di download che il server scarica all'avvio.
- Il token, verificato con Telegram, memorizzato cifrato e dato al tuo programma come
TELEGRAM_BOT_TOKENeTOKEN. - Il riavvio del bot dopo un crash. Se va in crash di nuovo entro un minuto, resta fermo e Console ne spiega il motivo.
- Un pulsante Rimuovi il webhook nel riquadro Telegram e un banner sopra Console quando il tuo bot stampa che Telegram ha rifiutato il token.
Domande frequenti
Devo usare telebot v3 o v4?
v3.3.8 (6 ago 2024) è l'ultima versione stabile e quella che abbiamo misurato. Il lavoro si è spostato su v4: è il branch predefinito del repository e il suo README installa gopkg.in/telebot.v4, ma è ancora una beta (v4.0.0-beta.10, 16 giu 2026). Le beta v4 aggiungono versioni più recenti della Bot API di Telegram, fino a Bot API 10.1 in v4.0.0-beta.10, che v3.3.8 non ha. L'esempio introduttivo del README è lo stesso in entrambe, a parte il percorso di import. Girano allo stesso modo sui nostri server: build, caricamento, avvio.
Perché il mio bot telebot gira ma non risponde?
Molto spesso un'altra copia sta facendo polling con lo stesso token, sul tuo PC o su un vecchio host, oppure è impostato un webhook. telebot non stampa nessuno dei due problemi, quindi la console sembra normale. Ferma l'altra copia, oppure revoca il token in @BotFather e incolla il nuovo nel riquadro Telegram; controlla nello stesso riquadro se c'è un webhook. Per vedere la causa, riavvia una volta con Verbose: true.
Posso usare il webhook di telebot al posto del polling?
Non ancora. Un webhook richiede un indirizzo HTTPS pubblico, che i nostri piani non includono ancora. LongPoller non richiede nessun indirizzo: il bot chiede a Telegram i nuovi messaggi, con un'attesa di 10 secondi nel bot qui sopra.
telebot o go-telegram/bot?
Entrambi girano allo stesso modo sul tipo Go Bot. Nel nostro test go-telegram/bot ha usato 11 MB contro gli 11 MB di telebot, quindi la memoria non decide tra i due. L'ultima release di go-telegram/bot è la v1.27.0, dell'11 set 2026. Se segui un tutorial, usa la libreria che usa lui.
Pronto a far girare il tuo bot telebot senza pause? Guarda i piani su hosting per bot Telegram.



