Para alojar un bot de telebot 24/7 lo ejecutas en una máquina que siempre está encendida: un VPS Linux con un servicio systemd que lo vuelve a iniciar cuando se detiene, o un plan de bots de PlayNHost (desde US$1.99 al mes), donde subes el programa terminado y el panel le da el token y lo reinicia si se cae. En nuestra prueba, un bot con telebot 3.3.8 (gopkg.in/telebot.v3) usó unos 11 MB de memoria. Un bot en Go se compila en tu propio ordenador como un único programa Linux x86-64: en el servidor no se compila nada. Los pasos en PlayNHost:
- Compila tu bot para Linux x86-64 en tu ordenador, como se muestra más abajo en Build it for Linux.
- En alojamiento de bots de Telegram, haz clic en Crear servidor en un plan. En la ventana del pedido, responde ¿Para qué plataforma es tu bot? con Telegram y elige Go.
- Abre tu servidor en el panel. La tarjeta Configura tu bot en Resumen se abre en Conectar con Telegram; su primer paso, Qué se ejecuta, debería decir Este bot ejecuta Go Bot.
- En Conectar con Telegram, pega el token de @BotFather en Pega el token de tu bot, haz clic en Conexión, comprueba el nombre del bot que aparece y haz clic en Sí, continuar.
- En Tu código, haz clic en Subir archivos, luego en Files haz clic en Subir y elige tu programa, llamado
bot. O deja que el servidor lo descargue: en la página Bot, panel Código, tarjeta Ajustes, pon en Enlace de descarga (opcional) un enlace https al programa y haz clic en Guardar. - Haz clic en Iniciar bot y abre Console. Tras
[PlayNHost] Starting your bottu bot imprimeLogged in as @your_bot, y el indicador de Resumen pasa a En línea en Telegram. - En la página Bot, panel Telegram, haz clic en Abrir en Telegram y envía
/starta tu bot.
Cómo crear el bot en @BotFather y cómo funciona la tarjeta de configuración se explica en Cómo alojar un bot de Telegram. El tipo Go Bot en sí (el Archivo de entrada, los Argumentos de inicio (opcional) y el enlace de descarga) es el mismo para bots de Discord y de Telegram: Cómo alojar un bot de Discord en Go. Esta página trata de telebot: qué usa en un servidor y qué conviene saber antes de alojarlo.
Lo que medimos
| Biblioteca | Versión | Memoria sin carga | Del inicio a la respuesta de la plataforma | Tamaño del 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 |
| Un programa en Go sin biblioteca | Go 1.23.12 | 2 MB | ninguna | 2.1 MB |
Cómo: en nuestro propio nodo, en un contenedor desechable configurado como un plan de bots de 1 GB con una CPU y la imagen Debian en la que se ejecuta nuestro tipo Go Bot, el programa de cada biblioteca llamó a Telegram o a Discord con un token falso, que fue rechazado; el programa sin biblioteca no hizo ninguna llamada. La memoria es la memoria residente 15 segundos después de esa respuesta, el tiempo de inicio va desde el arranque hasta la respuesta, y cada cifra es la mediana de las ejecuciones 2 a 4. Los programas se compilaron con Go 1.23.12 y CGO_ENABLED=0.
Son valores mínimos: un programa sin chats y sin datos todavía. Tu propio código, lo que guarda en memoria y el número de chats se suman a ellos, así que un programa telebot mínimo usa una pequeña parte del plan STARTER de 0.5 GB.
Un bot mínimo con telebot
Responde a /start, lee el token que le da el panel, imprime una línea de listo, avisa claramente cuando Telegram rechaza el token y se detiene limpiamente cuando pulsas Detener. Pon los dos archivos en una carpeta y ejecuta go mod tidy, que descarga telebot y escribe 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 línea Logged in as @your_bot es la que cambia el indicador a En línea en Telegram. El panel entrega el token a tu programa como TELEGRAM_BOT_TOKEN, y también como TOKEN, BOT_TOKEN, TELEGRAM_TOKEN y TELOXIDE_TOKEN. El ejemplo del README de telebot lee os.Getenv("TOKEN"), así que su línea del token también funciona sin cambios.
Compílalo para Linux
Desde la carpeta de tu proyecto, en cualquier ordenador:
# 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 genera un único archivo autocontenido que no depende de las bibliotecas del sistema del servidor, así que se ejecuta en nuestra imagen Debian sea cual sea el sistema en el que compiles. El resultado es un archivo llamado bot sin extensión. Un .exe de Windows o una compilación de macOS no se ejecuta en el servidor: la consola dice entonces [PlayNHost] bot is not a Linux program. Build it for Linux x86-64 (not Windows or macOS) and upload it again.
Si el token es incorrecto
En nuestra prueba, con un token falso, tele.NewBot devolvió este error (nuestro programa de prueba lo imprimió después del tipo del error):
*telebot.Error: telegram: Unauthorized (401)
NewBot pregunta a Telegram quién es el bot (getMe) antes de devolver el control, así que un token rechazado detiene el programa antes de que haga polling. telebot devuelve su error ErrUnauthorized para la respuesta Unauthorized de Telegram. El ejemplo del README termina el programa con log.Fatal(err); el bot de arriba imprime en su lugar Telegram did not accept the bot token. Paste the current one from @BotFather, then restart., una línea que el panel reconoce: muestra el aviso Telegram no aceptó el token de tu bot encima de Console.
Para arreglarlo, en @BotFather envía /mybots, elige tu bot, luego API Token y copia el token de nuevo. En la página Bot, panel Telegram, haz clic en Reemplazar token, pégalo, haz clic en Guardar token y luego en Reiniciar ahora.
Qué conviene saber de telebot en un servidor
- Los errores durante el polling son silenciosos. Cuando falla la petición de mensajes a Telegram, el
LongPollerde telebot lo reintenta de inmediato, sin pausa, y solo imprime el error siVerboseestá activado. Así, cuando otra copia del bot hace polling con el mismo token (409 Conflict), hay un webhook configurado o el token se revoca mientras el bot funciona, tu bot sigue en marcha pero recibe pocos mensajes o ninguno, y la consola permanece en silencio. Detén cualquier otra copia antes de iniciarlo aquí y consulta Solucionar el error 409 Conflict de un bot de Telegram. - Ver qué hace el polling.
Verbose: trueentele.Settingsregistra cada petición y la respuesta de Telegram, de modo que el texto409 Conflictaparece en Console y el panel puede mostrar Tu bot también se está ejecutando en otro sitio. También registra los mensajes que la gente envía a tu bot, así que actívalo para una prueba, no de forma permanente. - Un webhook que se quedó en el bot.
b.Start()no elimina un webhook, y mientras haya uno el polling falla en silencio. El bot de arriba llama ab.RemoveWebhook()antes de empezar, lo que conserva los mensajes que estaban esperando. También puedes hacer clic en Quitar webhook en el panel Telegram. El pollerWebhookde telebot necesita una dirección HTTPS pública, que nuestros planes aún no incluyen: usaLongPoller. - Un pánico en un handler termina el programa. telebot ejecuta cada handler en su propia goroutine (salvo que
Synchronousesté activado), y un pánico ahí lo detiene todo.b.Use(middleware.Recover())convierte un pánico en un error que se imprime. Llama ab.Useantes deb.Handle: el middleware se adjunta cuando se añade un handler. - Los errores de los handlers se imprimen por ti. Un error que devuelve tu handler va al gestor de errores por defecto de telebot, que imprime el número de la actualización y el error. Define
OnErrorentele.Settingspara cambiarlo. - Tu token en los mensajes de error. telebot pone el token en la dirección de cada petición (
/botseguido del token), y los errores de red de Go incluyen esa dirección. El bot de arriba sustituye el token antes de imprimir un error. No compartas la salida cruda de la consola de un bot que imprime los errores tal cual. - Una parada limpia. El panel detiene un bot en Go con Ctrl+C (
SIGINT).b.Start()se ejecuta hasta que se llama ab.Stop(), así que el bot de arriba lo inicia en una goroutine, espera la señal y luego llama ab.Stop(), que cancela la petición en curso. - Actualizaciones. El tipo Go Bot no tiene campo Paquetes ni origen Git: tus módulos van dentro del programa. Para actualizar, borra el programa antiguo en Files, sube la nueva compilación y reinicia. Con un enlace de descarga, publica la nueva compilación en ese enlace, borra el programa en Files y pulsa Iniciar.
Alójalo tú mismo en un VPS Linux
Copia el programa compilado al VPS; allí no hace falta Go, y una compilación con CGO_ENABLED=0 no depende de las bibliotecas del sistema del VPS. Crea un usuario para el bot, pon el programa en su carpeta y guarda el token en un archivo que solo root pueda leer:
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
Inícialo ahora y en cada arranque, y luego sigue su salida:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f
systemctl stop envía SIGTERM por defecto, al que también escucha el bot de arriba, así que se detiene limpiamente. Restart=always vuelve a iniciar el bot tras un fallo o una salida. Detén antes cualquier otra copia: con telebot un 409 Conflict tampoco muestra nada en journalctl.
Autoalojado o plan de bots
En un VPS que gestionas tú, te encargas de:
- Las actualizaciones y la seguridad del sistema operativo.
- Copiar cada nueva compilación, el archivo de servicio, el archivo del token y sus permisos.
- Leer
journalctlpara saber por qué se detuvo el bot. - Las copias de seguridad de los datos del bot.
A cambio, un VPS ejecuta cualquier cosa, y puedes darle un dominio con HTTPS para un webhook.
En un plan de bots de PlayNHost el panel lo hace por ti:
- Una imagen Debian que ejecuta un programa Linux x86-64, y una comprobación al iniciar que te avisa cuando el archivo es una compilación de Windows o macOS.
- Subida en Files, o un enlace de descarga que el servidor obtiene al iniciar.
- El token, comprobado con Telegram, guardado cifrado y entregado a tu programa como
TELEGRAM_BOT_TOKENyTOKEN. - Reinicio del bot tras un fallo. Si vuelve a fallar en menos de un minuto, queda detenido y Console explica por qué.
- Un botón Quitar webhook en el panel Telegram, y un aviso encima de Console cuando tu bot imprime que Telegram rechazó el token.
Preguntas frecuentes
¿Debo usar telebot v3 o v4?
v3.3.8 (6 ago 2024) es la versión estable más reciente y la que medimos. El trabajo se ha movido a v4: es la rama por defecto del repositorio y su README instala gopkg.in/telebot.v4, pero sigue siendo una beta (v4.0.0-beta.10, 16 jun 2026). Las betas de v4 añaden versiones más nuevas de la API de bots de Telegram, hasta Bot API 10.1 en v4.0.0-beta.10, que v3.3.8 no tiene. El ejemplo de inicio del README es igual en ambas salvo por la ruta de importación. Las dos se ejecutan igual en nuestros servidores: compilar, subir, iniciar.
¿Por qué mi bot de telebot funciona pero no responde?
Lo más habitual es que otra copia esté haciendo polling con el mismo token, en tu PC o en un host antiguo, o que haya un webhook configurado. telebot no imprime ninguno de los dos problemas, así que la consola parece normal. Detén la otra copia, o revoca el token en @BotFather y pega el nuevo en el panel Telegram; comprueba en ese mismo panel si hay un webhook. Para ver la causa, reinicia una vez con Verbose: true.
¿Puedo usar el webhook de telebot en lugar del polling?
Todavía no. Un webhook necesita una dirección HTTPS pública, que nuestros planes aún no incluyen. LongPoller no necesita dirección: el bot pide a Telegram los mensajes nuevos, con una espera de 10 segundos en el bot de arriba.
¿telebot o go-telegram/bot?
Ambos funcionan igual en el tipo Go Bot. En nuestra prueba go-telegram/bot usó 11 MB frente a 11 MB de telebot, así que la memoria no decide entre ellos. La versión más reciente de go-telegram/bot es la v1.27.0, del 11 sep 2026. Si sigues un tutorial, usa la biblioteca que use.
¿Listo para ejecutar tu bot de telebot todo el día? Mira los planes en alojamiento de bots de Telegram.



