Para hospedar um bot telebot 24/7, você o executa em uma máquina que fica sempre ligada: uma VPS Linux com um serviço systemd que o inicia de novo quando ele para, ou um plano de bots na PlayNHost (a partir de US$1,99 por mês), onde você envia o programa pronto e o painel entrega o token e o reinicia se ele travar. No nosso teste, um bot com telebot 3.3.8 (gopkg.in/telebot.v3) usou cerca de 11 MB de memória. Um bot em Go é compilado no seu próprio computador como um único programa Linux x86-64: nada é compilado no servidor. Os passos na PlayNHost:
- Faça o build do seu bot para Linux x86-64 no seu computador, como mostrado abaixo em Build it for Linux.
- Em hospedagem de bots do Telegram, clique em Criar servidor em um plano. Na janela do pedido, responda Para qual plataforma é o seu bot? com Telegram e escolha Go.
- Abra seu servidor no painel. O cartão Configurar seu bot em Visão geral abre em Conectar ao Telegram; o primeiro passo, O que roda, deve dizer Este bot roda Go Bot.
- Em Conectar ao Telegram, cole o token do @BotFather em Cole o token do seu bot, clique em Conectar, confira o nome do bot exibido e clique em Sim, continuar.
- Em Seu código, clique em Enviar arquivos, depois em Files clique em Enviar e escolha seu programa, chamado
bot. Ou deixe o servidor buscá-lo: na página Bot, painel Código, cartão Configurações, defina Link de download (opcional) como um link https para o programa e clique em Salvar. - Clique em Iniciar bot e abra o Console. Depois de
[PlayNHost] Starting your bot, seu bot imprimeLogged in as @your_bot, e o indicador em Visão geral muda para Online no Telegram. - Na página Bot, painel Telegram, clique em Abrir no Telegram e envie
/startao seu bot.
A criação do bot no @BotFather e o cartão de configuração estão explicados em Como hospedar um bot do Telegram. O tipo Go Bot em si (o Arquivo de entrada, os Argumentos de início (opcional) e o link de download) é o mesmo para bots do Discord e do Telegram: Como hospedar um bot do Discord em Go. Esta página trata do telebot: o que ele usa em um servidor e o que saber antes de hospedá-lo.
O que medimos
| Biblioteca | Versão | Memória sem carga | Do início à resposta da plataforma | Tamanho do programa |
|---|---|---|---|---|
| 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 |
| Um programa Go sem biblioteca | Go 1.23.12 | 2 MB | nenhuma | 2,1 MB |
Como: em um nó nosso, em um contêiner descartável configurado como um plano de bots de 1 GB com uma CPU e a imagem Debian em que roda o nosso tipo Go Bot, o programa de cada biblioteca chamou o Telegram ou o Discord com um token falso, que foi recusado; o programa sem biblioteca não fez nenhuma chamada. A memória é a memória residente 15 segundos depois dessa resposta, o tempo de início vai do lançamento até a resposta, e cada valor é a mediana das execuções 2 a 4. Os programas foram compilados com Go 1.23.12 e CGO_ENABLED=0.
São valores mínimos: um programa sem conversas e ainda sem dados. Seu próprio código, o que ele guarda na memória e o número de conversas se somam a eles, então um programa telebot mínimo usa uma pequena parte do plano STARTER de 0,5 GB.
Um bot telebot mínimo
Ele responde a /start, lê o token que o painel entrega, imprime uma linha de pronto, avisa com clareza quando o Telegram recusa o token e para de forma limpa quando você clica em Parar. Coloque os dois arquivos em uma pasta e rode go mod tidy, que baixa o telebot e escreve 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()
}
A linha Logged in as @your_bot é o que muda o indicador para Online no Telegram. O painel entrega o token ao seu programa como TELEGRAM_BOT_TOKEN e também como TOKEN, BOT_TOKEN, TELEGRAM_TOKEN e TELOXIDE_TOKEN. O exemplo do README do telebot lê os.Getenv("TOKEN"), então a linha do token dele também funciona sem alterações.
Faça o build para Linux
Na pasta do seu projeto, em qualquer computador:
# 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 gera um único arquivo autocontido que não depende das bibliotecas de sistema do servidor, então ele roda na nossa imagem Debian não importa em que sistema você faça o build. O resultado é um arquivo chamado bot, sem extensão. Um .exe do Windows ou um build para macOS não roda no servidor: o console então mostra [PlayNHost] bot is not a Linux program. Build it for Linux x86-64 (not Windows or macOS) and upload it again.
Se o token estiver errado
No nosso teste, com um token falso, tele.NewBot retornou este erro (nosso programa de teste o imprimiu depois do tipo do erro):
*telebot.Error: telegram: Unauthorized (401)
NewBot pergunta ao Telegram quem é o bot (getMe) antes de retornar, então um token recusado interrompe o programa antes de ele fazer polling. O telebot retorna seu erro ErrUnauthorized para a resposta Unauthorized do Telegram. O exemplo do README encerra o programa com log.Fatal(err); o bot acima imprime, em vez disso, Telegram did not accept the bot token. Paste the current one from @BotFather, then restart., uma linha que o painel reconhece: ele mostra o aviso O Telegram não aceitou o token do seu bot acima do Console.
Para corrigir, no @BotFather envie /mybots, escolha seu bot, depois API Token, e copie o token de novo. Na página Bot, painel Telegram, clique em Substituir token, cole-o, clique em Salvar token e depois em Reiniciar agora.
O que saber sobre o telebot em um servidor
- Erros durante o polling são silenciosos. Quando a busca de mensagens no Telegram falha, o
LongPollerdo telebot tenta de novo na hora, sem pausa, e só imprime o erro quandoVerboseestá ativado. Assim, quando outra cópia do bot faz polling com o mesmo token (409 Conflict), há um webhook definido ou o token é revogado enquanto o bot roda, seu bot continua rodando, mas recebe poucas mensagens ou nenhuma, e o console fica quieto. Pare qualquer outra cópia antes de iniciá-lo aqui e veja Como corrigir o erro 409 Conflict do bot do Telegram. - Ver o que o polling faz.
Verbose: trueemtele.Settingsregistra cada requisição e a resposta do Telegram, de modo que o texto409 Conflictaparece no Console e o painel pode mostrar Seu bot também está rodando em outro lugar. Ele também registra as mensagens que as pessoas enviam ao seu bot, então ative-o para um teste, não de forma permanente. - Um webhook deixado no bot.
b.Start()não remove um webhook, e enquanto houver um definido o polling falha em silêncio. O bot acima chamab.RemoveWebhook()antes de começar, o que preserva as mensagens que estavam esperando. Você também pode clicar em Remover webhook no painel Telegram. O pollerWebhookdo telebot precisa de um endereço HTTPS público, que nossos planos ainda não incluem: useLongPoller. - Um panic em um handler encerra o programa. O telebot roda cada handler na sua própria goroutine (a menos que
Synchronousesteja ativado), e um panic ali para tudo.b.Use(middleware.Recover())transforma um panic em um erro que é impresso. Chameb.Useantes deb.Handle: o middleware é anexado quando um handler é adicionado. - Os erros dos handlers são impressos para você. Um erro que seu handler retorna vai para o tratador de erros padrão do telebot, que imprime o número da atualização e o erro. Defina
OnErroremtele.Settingspara mudar isso. - Seu token nas mensagens de erro. O telebot coloca o token no endereço de cada requisição (
/botseguido do token), e os erros de rede do Go incluem esse endereço. O bot acima substitui o token antes de imprimir um erro. Não compartilhe a saída bruta do console de um bot que imprime erros como estão. - Uma parada limpa. O painel para um bot em Go com Ctrl+C (
SIGINT).b.Start()roda até queb.Stop()seja chamado, então o bot acima o inicia em uma goroutine, espera o sinal e depois chamab.Stop(), que cancela a requisição em andamento. - Atualizações. O tipo Go Bot não tem o campo Pacotes nem origem Git: seus módulos estão dentro do programa. Para atualizar, apague o programa antigo em Files, envie o novo build e reinicie. Com um link de download, publique o novo build nesse link, apague o programa em Files e clique em Iniciar.
Hospede você mesmo em uma VPS Linux
Copie o programa compilado para a VPS; ela não precisa de Go, e um build com CGO_ENABLED=0 não depende das bibliotecas de sistema da VPS. Crie um usuário para o bot, coloque o programa na pasta dele e guarde o token em um arquivo que só o root possa ler:
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
Crie /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
Inicie agora e a cada boot, depois acompanhe a saída:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f
systemctl stop envia SIGTERM por padrão, que o bot acima também escuta, então ele para de forma limpa. Restart=always inicia o bot de novo após uma falha ou uma saída. Pare antes qualquer outra cópia: com o telebot, um 409 Conflict também não mostra nada no journalctl.
Hospedagem própria ou plano de bots
Em uma VPS que você mesmo gerencia, você cuida de:
- Atualizações e segurança do sistema operacional.
- Copiar cada novo build, o arquivo de serviço, o arquivo do token e as permissões dele.
- Ler o
journalctlpara descobrir por que o bot parou. - Backups dos dados do bot.
Em troca, uma VPS roda qualquer coisa, e você pode dar a ela um domínio com HTTPS para um webhook.
Em um plano de bots da PlayNHost, o painel faz isso por você:
- Uma imagem Debian que executa um programa Linux x86-64 e uma verificação na partida que avisa quando o arquivo é um build para Windows ou macOS.
- Envio em Files ou um link de download que o servidor busca ao iniciar.
- O token, verificado com o Telegram, guardado criptografado e entregue ao seu programa como
TELEGRAM_BOT_TOKENeTOKEN. - Reinício do bot após uma falha. Se ele falhar de novo em menos de um minuto, fica parado e o Console diz o motivo.
- Um botão Remover webhook no painel Telegram e um aviso acima do Console quando seu bot imprime que o Telegram recusou o token.
Perguntas frequentes
Devo usar o telebot v3 ou v4?
A v3.3.8 (6 ago 2024) é a versão estável mais recente e a que medimos. O trabalho migrou para a v4: ela é o branch padrão do repositório e o README instala gopkg.in/telebot.v4, mas ainda é um beta (v4.0.0-beta.10, 16 jun 2026). Os betas da v4 adicionam versões mais novas da Bot API do Telegram, até a Bot API 10.1 na v4.0.0-beta.10, que a v3.3.8 não tem. O exemplo inicial do README é o mesmo nas duas, exceto pelo caminho de importação. Ambas rodam do mesmo jeito nos nossos servidores: build, envio, início.
Por que meu bot telebot roda, mas não responde?
Na maioria das vezes outra cópia está fazendo polling com o mesmo token, no seu PC ou em uma hospedagem antiga, ou há um webhook definido. O telebot não imprime nenhum dos dois problemas, então o console parece normal. Pare a outra cópia ou revogue o token no @BotFather e cole o novo no painel Telegram; verifique no mesmo painel se há um webhook. Para ver a causa, reinicie uma vez com Verbose: true.
Posso usar o webhook do telebot em vez do polling?
Ainda não. Um webhook precisa de um endereço HTTPS público, que nossos planos ainda não incluem. O LongPoller não precisa de endereço: o bot pede ao Telegram as mensagens novas, com uma espera de 10 segundos no bot acima.
telebot ou go-telegram/bot?
Ambos rodam do mesmo jeito no tipo Go Bot. No nosso teste, o go-telegram/bot usou 11 MB contra 11 MB do telebot, então a memória não decide entre eles. A versão mais recente do go-telegram/bot é a v1.27.0, de 11 set 2026. Se você segue um tutorial, use a biblioteca que ele usa.
Pronto para manter seu bot telebot rodando sem parar? Veja os planos em hospedagem de bots do Telegram.



