NOVO 📢 Oferta de lançamento limitada: até 70% de desconto no seu primeiro mês, em todos os jogos!Ver planos

Como hospedar um bot telebot 24/7 (Go, Telegram)

Hospedagem de bot do TelegramUpdated Nov 6, 202613 min read

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:

  1. Faça o build do seu bot para Linux x86-64 no seu computador, como mostrado abaixo em Build it for Linux.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. Clique em Iniciar bot e abra o Console. Depois de [PlayNHost] Starting your bot, seu bot imprime Logged in as @your_bot, e o indicador em Visão geral muda para Online no Telegram.
  7. Na página Bot, painel Telegram, clique em Abrir no Telegram e envie /start ao 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

BibliotecaVersãoMemória sem cargaDo início à resposta da plataformaTamanho do programa
telebot (Telegram)3.3.811 MB0,1 s8,1 MB
go-telegram/bot (Telegram)1.27.011 MB0,1 s8,1 MB
discordgo (Discord)0.29.012 MB0,3 s9,0 MB
Um programa Go sem bibliotecaGo 1.23.122 MBnenhuma2,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 LongPoller do telebot tenta de novo na hora, sem pausa, e só imprime o erro quando Verbose está 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: true em tele.Settings registra cada requisição e a resposta do Telegram, de modo que o texto 409 Conflict aparece 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 chama b.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 poller Webhook do telebot precisa de um endereço HTTPS público, que nossos planos ainda não incluem: use LongPoller.
  • Um panic em um handler encerra o programa. O telebot roda cada handler na sua própria goroutine (a menos que Synchronous esteja ativado), e um panic ali para tudo. b.Use(middleware.Recover()) transforma um panic em um erro que é impresso. Chame b.Use antes de b.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 OnError em tele.Settings para mudar isso.
  • Seu token nas mensagens de erro. O telebot coloca o token no endereço de cada requisição (/bot seguido 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é que b.Stop() seja chamado, então o bot acima o inicia em uma goroutine, espera o sinal e depois chama b.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 journalctl para 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_TOKEN e TOKEN.
  • 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.

Seu bot já está em outro lugar? Traga-o para nós

NOSSOS ÚLTIMOS ARTIGOS