Чтобы запустить бота на telebot 24/7, нужна машина, которая всегда включена: Linux VPS со службой systemd, которая запускает бота заново при остановке, или тариф для ботов в PlayNHost (от US$1.99 в месяц), где вы загружаете готовую программу, а панель передаёт ей токен и перезапускает её при сбое. В нашем тесте бот на telebot 3.3.8 (gopkg.in/telebot.v3) занял около 11 МБ памяти. Бот на Go собирается на вашем компьютере как одна программа для Linux x86-64: на сервере ничего не компилируется. Шаги в PlayNHost:
- Соберите бота под Linux x86-64 на своём компьютере, как показано ниже в разделе Build it for Linux.
- На странице хостинга Telegram-ботов нажмите Создать сервер у тарифа. В окне заказа на вопрос Для какой платформы ваш бот? ответьте Telegram и выберите Go.
- Откройте сервер в панели. Карточка Настройка бота на странице Обзор открывается на шаге Подключение к Telegram; её первый пункт, Что запускается, должен показывать Этот бот запускает Go Bot.
- На шаге Подключение к Telegram вставьте токен от @BotFather в поле Вставьте токен бота, нажмите Подключение, проверьте показанное имя бота и нажмите Да, продолжить.
- На шаге Ваш код нажмите Загрузить файлы, затем в разделе Files нажмите Загрузить и выберите свою программу с именем
bot. Или пусть сервер скачает её сам: на странице Бот, во вкладке Код, в карточке Настройки укажите в поле Ссылка для скачивания (необязательно) https-ссылку на программу и нажмите Сохранить. - Нажмите Запустить бота и откройте Console. После
[PlayNHost] Starting your botбот выведетLogged in as @your_bot, а индикатор на странице Обзор сменится на Онлайн в Telegram. - На странице Бот, во вкладке Telegram, нажмите Открыть в Telegram и отправьте боту
/start.
Создание бота в @BotFather и карточка настройки описаны в статье Как запустить Telegram-бота на хостинге. Сам тип Go Bot (Файл запуска, Аргументы запуска (необязательно) и ссылка для скачивания) одинаков для ботов Discord и Telegram: Как запустить Discord-бота на Go. Эта страница о telebot: что он потребляет на сервере и что стоит знать, прежде чем его запускать.
Что мы измерили
| Библиотека | Версия | Память без нагрузки | От запуска до ответа платформы | Размер программы |
|---|---|---|---|---|
| telebot (Telegram) | 3.3.8 | 11 МБ | 0.1 с | 8.1 МБ |
| go-telegram/bot (Telegram) | 1.27.0 | 11 МБ | 0.1 с | 8.1 МБ |
| discordgo (Discord) | 0.29.0 | 12 МБ | 0.3 с | 9.0 МБ |
| Программа на Go без библиотеки | Go 1.23.12 | 2 МБ | нет | 2.1 МБ |
Как мы измеряли: на нашем собственном узле, в одноразовом контейнере, настроенном как тариф для ботов на 1 ГБ с одним процессором и образом Debian, на котором работает наш тип Go Bot, программа каждой библиотеки обращалась к Telegram или Discord с поддельным токеном, и он отклонялся; программа без библиотеки не делала обращений. Память это резидентная память через 15 секунд после этого ответа, время запуска отсчитывается от старта до ответа, а каждое значение это медиана запусков со 2 по 4. Программы собраны с Go 1.23.12 и CGO_ENABLED=0.
Это нижние границы: программа без чатов и пока без данных. Ваш собственный код, то, что он хранит в памяти, и число чатов прибавляются к ним, поэтому минимальная программа на telebot занимает малую часть тарифа STARTER на 0.5 ГБ.
Минимальный бот на telebot
Он отвечает на /start, читает токен, который даёт панель, выводит строку о готовности, ясно сообщает, когда Telegram отклоняет токен, и корректно останавливается, когда вы нажимаете Остановить. Положите оба файла в одну папку и выполните go mod tidy: команда скачает telebot и запишет 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()
}
Строка Logged in as @your_bot переключает индикатор на Онлайн в Telegram. Панель передаёт программе токен как TELEGRAM_BOT_TOKEN, а также как TOKEN, BOT_TOKEN, TELEGRAM_TOKEN и TELOXIDE_TOKEN. Пример из README telebot читает os.Getenv("TOKEN"), так что его строка с токеном тоже работает без изменений.
Сборка под Linux
Из папки проекта, на любом компьютере:
# 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 создаёт один самодостаточный файл, который не зависит от системных библиотек сервера, поэтому он работает в нашем образе Debian, в какой бы системе вы ни собирали. Результат это файл с именем bot без расширения. Windows-файл .exe или сборка под macOS на сервере не запустится: тогда консоль покажет [PlayNHost] bot is not a Linux program. Build it for Linux x86-64 (not Windows or macOS) and upload it again.
Если токен неверный
В нашем тесте с поддельным токеном tele.NewBot вернул такую ошибку (наша тестовая программа вывела её после типа ошибки):
*telebot.Error: telegram: Unauthorized (401)
NewBot спрашивает у Telegram, кто такой бот (getMe), до того как вернуть управление, поэтому отклонённый токен останавливает программу ещё до polling. telebot возвращает свою ошибку ErrUnauthorized на ответ Unauthorized от Telegram. Пример из README завершает программу через log.Fatal(err); бот выше вместо этого выводит Telegram did not accept the bot token. Paste the current one from @BotFather, then restart., строку, которую панель распознаёт: она показывает баннер Telegram не принял токен вашего бота над Console.
Чтобы исправить, отправьте в @BotFather /mybots, выберите бота, затем API Token и снова скопируйте токен. На странице Бот, во вкладке Telegram, нажмите Заменить токен, вставьте его, нажмите Сохранить токен, затем Перезапустить сейчас.
Что нужно знать о telebot на сервере
- Ошибки при polling тихие. Когда запрос сообщений у Telegram не удаётся,
LongPollerв telebot сразу повторяет его, без паузы, и выводит ошибку только при включённомVerbose. Поэтому, если другая копия бота опрашивает Telegram с тем же токеном (409 Conflict), установлен вебхук или токен отозвали во время работы бота, ваш бот продолжает работать, но получает мало сообщений или не получает их вовсе, а консоль молчит. Остановите все другие копии, прежде чем запускать бота здесь, и прочитайте Как исправить ошибку 409 Conflict у Telegram-бота. - Как увидеть, что делает polling.
Verbose: trueвtele.Settingsзаписывает в лог каждый запрос и ответ Telegram, так что текст409 Conflictпоявляется в Console, и панель может показать Ваш бот работает ещё и в другом месте. Он также пишет в лог сообщения, которые люди отправляют вашему боту, поэтому включайте его на время теста, а не навсегда. - Вебхук, оставшийся на боте.
b.Start()не удаляет вебхук, а пока он установлен, polling молча не работает. Бот выше вызываетb.RemoveWebhook()перед стартом, и ожидающие сообщения сохраняются. Можно также нажать Удалить вебхук во вкладке Telegram. ПоллеруWebhookв telebot нужен публичный HTTPS-адрес, которого в наших тарифах пока нет: используйтеLongPoller. - Паника в обработчике завершает программу. telebot запускает каждый обработчик в своей горутине (если не включён
Synchronous), и паника там останавливает всё.b.Use(middleware.Recover())превращает панику в ошибку, которая выводится. Вызывайтеb.Useдоb.Handle: middleware подключается в момент добавления обработчика. - Ошибки обработчиков выводятся за вас. Ошибка, которую возвращает ваш обработчик, попадает в стандартный обработчик ошибок telebot, который выводит номер обновления и ошибку. Задайте
OnErrorвtele.Settings, чтобы изменить это. - Ваш токен в сообщениях об ошибках. telebot помещает токен в адрес каждого запроса (
/botи далее токен), а сетевые ошибки Go содержат этот адрес. Бот выше заменяет токен перед выводом ошибки. Не делитесь сырым выводом консоли бота, который выводит ошибки как есть. - Корректная остановка. Панель останавливает бота на Go сигналом Ctrl+C (
SIGINT).b.Start()работает, пока не вызванb.Stop(), поэтому бот выше запускает его в горутине, ждёт сигнала и затем вызываетb.Stop(), что отменяет выполняющийся запрос. - Обновления. У типа Go Bot нет поля Пакеты и источника Git: ваши модули находятся внутри программы. Чтобы обновить, удалите старую программу в разделе Files, загрузите новую сборку и перезапустите. Если используется ссылка для скачивания, опубликуйте новую сборку по этой ссылке, удалите программу в разделе Files и нажмите Запустить.
Запуск самостоятельно на Linux VPS
Скопируйте собранную программу на VPS; Go там не нужен, а сборка с CGO_ENABLED=0 не зависит от системных библиотек VPS. Создайте пользователя для бота, положите программу в его папку и храните токен в файле, который может читать только 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
Создайте /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
Запустите службу сейчас и при каждой загрузке, затем следите за её выводом:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f
systemctl stop по умолчанию отправляет SIGTERM, который бот выше тоже обрабатывает, так что он останавливается корректно. Restart=always запускает бота снова после сбоя или выхода. Сначала остановите все другие копии: с telebot 409 Conflict не показывает ничего и в journalctl.
Свой сервер или тариф для ботов
На VPS, которым вы управляете сами, вам придётся заниматься:
- Обновлениями и безопасностью операционной системы.
- Копированием каждой новой сборки, файла службы, файла с токеном и его прав.
- Чтением
journalctl, чтобы выяснить, почему бот остановился. - Резервными копиями данных бота.
Взамен на VPS можно запустить что угодно, и ему можно назначить домен с HTTPS для вебхука.
На тарифе для ботов PlayNHost это делает панель:
- Образ Debian, который запускает программу для Linux x86-64, и проверка при старте, которая сообщает, если файл собран под Windows или macOS.
- Загрузка в разделе Files или ссылка для скачивания, которую сервер забирает при запуске.
- Токен, проверенный в Telegram, хранится в зашифрованном виде и передаётся программе как
TELEGRAM_BOT_TOKENиTOKEN. - Перезапуск бота после сбоя. Если он снова падает в течение минуты, он остаётся остановленным, а Console объясняет причину.
- Кнопка Удалить вебхук во вкладке Telegram и баннер над Console, когда бот выводит, что Telegram отклонил токен.
Вопросы, которые задают люди
Какую версию telebot выбрать, v3 или v4?
v3.3.8 (6 авг. 2024) это новейшая стабильная версия, и именно её мы измеряли. Разработка перешла на v4: это ветка репозитория по умолчанию, и README устанавливает gopkg.in/telebot.v4, но это всё ещё бета (v4.0.0-beta.10, 16 июн. 2026). Беты v4 добавляют более новые версии Telegram Bot API, вплоть до Bot API 10.1 в v4.0.0-beta.10, которых нет в v3.3.8. Стартовый пример в README в обеих версиях одинаков, кроме пути импорта. Обе работают на наших серверах одинаково: сборка, загрузка, запуск.
Почему мой бот на telebot работает, но не отвечает?
Чаще всего другая копия опрашивает Telegram с тем же токеном, на вашем ПК или на старом хостинге, либо установлен вебхук. telebot не выводит ни ту, ни другую проблему, поэтому консоль выглядит нормально. Остановите другую копию или отзовите токен в @BotFather и вставьте новый во вкладке Telegram; в той же вкладке проверьте, нет ли вебхука. Чтобы увидеть причину, один раз перезапустите бота с Verbose: true.
Можно ли использовать вебхук telebot вместо polling?
Пока нет. Для вебхука нужен публичный HTTPS-адрес, которого в наших тарифах пока нет. LongPoller адреса не требует: бот сам запрашивает у Telegram новые сообщения, с ожиданием 10 секунд в боте выше.
telebot или go-telegram/bot?
Оба работают на типе Go Bot одинаково. В нашем тесте go-telegram/bot занял 11 МБ против 11 МБ у telebot, поэтому память не помогает выбрать. Новейший релиз go-telegram/bot это v1.27.0 от 11 сент. 2026. Если вы следуете руководству, берите ту библиотеку, которую использует оно.
Готовы запустить бота на telebot без остановок? Посмотрите тарифы на странице хостинга Telegram-ботов.



