НОВОЕ 📢 Ограниченное стартовое предложение: скидка до 70% на первый месяц для любой игры!Посмотреть тарифы

Как запустить бота Telegraf 24/7 (Telegram, Node.js)

Хостинг Telegram-ботовUpdated Nov 6, 202610 min read

Чтобы запустить бота Telegraf 24/7, его нужно держать на машине, которая всегда включена: на Linux VPS с сервисом systemd, который запускает бота снова после остановки, или на тарифе для ботов PlayNHost (от US$1.99 в месяц), где панель устанавливает ваши пакеты, передаёт коду токен и перезапускает бота после сбоя. В нашем тесте бот на Telegraf 4.16.3 занял около 60 МБ памяти на Node.js 22. bot.launch() в Telegraf по умолчанию использует long polling, и именно он нужен нашим тарифам: у них пока нет публичного HTTPS-адреса для вебхука. Шаги в PlayNHost:

  1. На странице хостинга Telegram-ботов нажмите Создать сервер у нужного тарифа. В окне заказа на вопрос Для какой платформы ваш бот? ответьте Telegram и выберите Node.js.
  2. Откройте свой сервер в панели. Карточка Настройка бота на странице Обзор открывается на шаге Подключение к Telegram; его первый шаг, Что запускается, должен показывать Этот бот запускает Node.js Bot.
  3. На шаге Подключение к Telegram вставьте токен от @BotFather в поле Вставьте токен бота, нажмите Подключение, проверьте показанное имя бота и нажмите Да, продолжить.
  4. На шаге Ваш код нажмите Загрузить файлы и загрузите package.json и index.js без node_modules либо нажмите Подключить Git.
  5. На странице Бот, в разделе Код, проверьте, что Файл запуска указывает на файл, который запускает вашего бота (по умолчанию index.js). Если вы его меняете, нажмите Сохранить.
  6. Нажмите Запустить бота и откройте Console. При первом запуске npm устанавливает Telegraf, затем бот выводит Logged in as @your_bot, а индикатор на вкладке Обзор меняется на Онлайн в Telegram.
  7. На странице Бот, в разделе Telegram, нажмите Открыть в Telegram и отправьте боту /start.

Создание бота в @BotFather и шаги в панели подробно описаны в статье Как запустить Telegram-бота на хостинге. Эта страница о самом Telegraf: что он потребляет на сервере и что полезно знать перед запуском.

Что мы измерили

БиблиотекаВерсияПамять после запускаОт старта до ответа TelegramРазмер установки
Telegraf4.16.360 МБ0,2 с2,7 МБ
grammY1.46.060 МБ0,2 с3,0 МБ
node-telegram-bot-api2.3.063 МБ0,2 с2,4 МБ
Только Node.js 22, без библиотеки22.23.443 МБнетнет

Как мы измеряли: на нашем собственном узле, в одноразовом контейнере, настроенном как тариф для бота на 1 ГБ (образ Node.js 22 и команда запуска нашего типа бота Node.js, лимит памяти Node на уровне 80 процентов), каждый бот обращался к Telegram с поддельным токеном, который Telegram отклонял. Память это резидентная память через 15 секунд после этого ответа, время запуска считается от launch до ответа, а каждое значение это медиана запусков со 2 по 4.

Это нижние границы: бот без чатов и без данных. К ним добавляются ваш собственный код, то, что он держит в памяти, и число чатов, так что библиотека занимает небольшую часть 0,5 ГБ тарифа STARTER.

Минимальный бот на Telegraf

Он отвечает на /start, читает токен, который даёт панель, и выводит строку готовности. Положите оба файла в главную папку бота.

package.json

{
  "name": "my-telegraf-bot",
  "private": true,
  "main": "index.js",
  "dependencies": {
    "telegraf": "^4.16.3"
  }
}

index.js

const { Telegraf } = require("telegraf");

const bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN);

bot.start((ctx) => ctx.reply("Hello! I am running on PlayNHost."));

// Without this, an error in one command stops the whole bot.
bot.catch((err, ctx) => {
  console.error(`Error while handling update ${ctx.update.update_id}:`, err);
});

// launch() only returns when the bot stops, so the ready line goes in its callback.
bot.launch(() => console.log(`Logged in as @${bot.botInfo.username}`)).catch((err) => {
  if (err.code === 401) {
    console.log("Telegram did not accept the bot token. Paste the current one from @BotFather, then restart.");
  } else {
    console.error(err);
  }
  process.exit(1);
});

process.once("SIGINT", () => bot.stop("SIGINT"));
process.once("SIGTERM", () => bot.stop("SIGTERM"));

В собственных примерах Telegraf читается process.env.BOT_TOKEN. Панель передаёт коду токен как TELEGRAM_BOT_TOKEN, а также как BOT_TOKEN, TOKEN, TELEGRAM_TOKEN и TELOXIDE_TOKEN, поэтому такие примеры работают без изменений. Именно строка Logged in as @your_bot переключает индикатор на Онлайн в Telegram.

Если токен неверный

В нашем тесте с поддельным токеном bot.launch() в Telegraf завершился ошибкой TelegramError, у которой err.code равен 401. Если вывести её как имя и сообщение, получится так:

Error: 401: Unauthorized

Имя отображается как Error, потому что класс ошибки в Telegraf не задаёт собственного имени. Telegraf не повторяет попытку с отклонённым токеном: bot.launch() сразу завершается ошибкой, как и у бота, которому токен не передали вовсе (401: Bot Token is required). Бот выше перехватывает оба случая и вместо этого выводит Telegram did not accept the bot token. Paste the current one from @BotFather, then restart., а панель показывает над Console баннер Telegram не принял токен вашего бота. Чтобы исправить, отправьте в @BotFather команду /mybots, выберите бота, затем API Token и скопируйте токен ещё раз. На странице Бот, в разделе Telegram, нажмите Заменить токен, вставьте его, нажмите Сохранить токен, затем Перезапустить сейчас.

Что нужно знать о Telegraf на сервере

  • Релизы: последняя версия Telegraf 4.16.3 вышла 29 февр. 2024. Версия 4.16.0 (25 февр. 2024) добавила Bot API 7.0 и 7.1 от Telegram; собственный журнал изменений Telegram дошёл до Bot API 10.3 (24 авг. 2026). Последний push в репозиторий GitHub был 24 сент. 2026. В нашем тесте 4.16.3 установилась и запустилась нормально на Node.js 22.
  • Строка готовности идёт в колбэк launch(). bot.launch() возвращается только тогда, когда бот останавливается, поэтому console.log после await bot.launch() никогда не выводится, пока бот работает. Начиная с 4.16.0 launch() принимает колбэк, который Telegraf вызывает, когда Telegram принял токен, с заполненным bot.botInfo.
  • Ошибка в команде останавливает бота, если не задан bot.catch. Обработчик по умолчанию в Telegraf выводит Unhandled error while processing вместе с обновлением и снова бросает ошибку, что завершает polling, и процесс останавливается. Наша панель перезапускает упавшего бота примерно через минуту, но до тех пор он не в сети. С bot.catch, как выше, ошибка выводится, а бот продолжает работать.
  • На каждое обновление отводится 90 секунд. Обновление, обработчики которого работают дольше, сообщается как ошибка (опция handlerTimeout, по умолчанию 90.000 мс), которая затем попадает в bot.catch. Для более долгих задач передайте new Telegraf(token, { handlerTimeout: ... }).
  • Оставшийся на боте вебхук удаляется за вас. bot.launch() без опции webhook вызывает deleteWebhook перед polling и сохраняет ожидающие сообщения, если только вы не передали dropPendingUpdates: true. bot.launch({ webhook: ... }) требует публичного HTTPS-адреса, которого в этих тарифах пока нет: используйте обычный bot.launch(). Если вы переезжаете с хостинга с вебхуком: Как перенести Telegram-бота на PlayNHost.
  • Другая копия бота останавливает эту. При 409 Conflict (тот же токен опрашивается где-то ещё) polling в Telegraf бросает ошибку вместо повторной попытки. Панель показывает Ваш бот работает ещё и в другом месте: остановите копию на своём компьютере или на старом хостинге. См. Как исправить ошибку 409 Conflict у Telegram-бота. Во время polling сетевые ошибки, 429 и собственные ошибки 5xx от Telegram повторяются после паузы, которую просит Telegram, либо через 5 секунд.
  • Версия Node.js: Telegraf 4.16.3 требует Node.js 12.20 или 14.13.1 и новее. В Среда выполнения в разделе Код доступны Node.js 20, 22 (recommended), 24, 25 и 26.
  • Лимит памяти: стартовый скрипт задаёт NODE_OPTIONS=--max-old-space-size в 80 процентов памяти вашего тарифа, чтобы у остального процесса оставалось место. Подробности о стартовом скрипте Node.js: Как запустить Discord-бота на Node.js.

Запуск самостоятельно на Linux VPS

В Debian 12 или 13 и в Ubuntu 24.04 для Telegraf хватает пакета из дистрибутива (в Debian 12 идёт Node.js 18.20, в Debian 13 идёт 20.19, в Ubuntu 24.04 идёт 18.19):

sudo apt update
sudo apt install nodejs npm
node --version

Создайте пользователя для бота, скопируйте файлы и установите пакеты:

sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp package.json index.js /opt/mybot/
sudo chown -R mybot: /opt/mybot
cd /opt/mybot && sudo -u mybot npm install --omit=dev

Храните токен вне кода, в файле, который может читать только root:

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=Telegraf Telegram bot
Wants=network-online.target
After=network-online.target

[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/usr/bin/node index.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Запустите его сейчас и при каждой загрузке, затем следите за выводом:

sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f

Restart=always запускает бота снова после сбоя или после process.exit(1). systemctl stop mybot отправляет SIGTERM, который строки process.once превращают в bot.stop(). Сначала остановите любую другую копию, иначе Telegram ответит обеим ошибкой 409 Conflict.

Своими силами или тариф для ботов

На VPS, которым вы управляете сами, на вас лежит:

  • Обновление и защита операционной системы, а также обновления Node.js.
  • Запуск npm install после каждого изменения, файл сервиса, файл токена и его права.
  • Чтение journalctl, чтобы выяснить, почему бот остановился.
  • Резервные копии данных бота.

Зато на VPS работает что угодно, и можно привязать к нему домен с HTTPS для вебхука.

На тарифе для ботов PlayNHost панель делает это за вас:

  • Выбор версии Node.js и npm install, когда меняются package.json, lock-файл или версия Node.js.
  • Токен проверяется в Telegram перед сохранением, хранится в зашифрованном виде и передаётся вашему коду.
  • Перезапуск бота после сбоя. Если он падает снова в течение минуты, он остаётся остановленным, а Console показывает причину.
  • Баннеры над Console, которые называют причину, когда Telegram отклоняет токен, запущена другая копия или задан вебхук, с кнопкой Удалить вебхук в разделе Telegram.
  • Загрузка файлов, деплой из Git и резервные копии прямо из панели.

Частые вопросы

Почему ничего не выводится после await bot.launch()?

Потому что bot.launch() ждёт окончания polling, а polling идёт, пока работает бот. Код после него выполнится только тогда, когда бот остановится. Помещайте стартовые сообщения в колбэк, bot.launch(() => ...), и регистрируйте команды до вызова launch().

Можно ли и дальше использовать Telegraf или лучше перейти на grammY?

Работающий бот на Telegraf 4 запускается на наших тарифах как есть: для хостинга ничего менять не нужно. Последний релиз вышел в феврале 2024, поэтому у методов, которые Telegram добавил после Bot API 7.1, нет коротких вызовов в Telegraf. grammY 1.46.0 (26 авг. 2026) поддерживает Bot API 10.3, и наш стартовый бот для Node.js использует его. Переходите, когда вам нужно что-то новее того, что предлагает Telegraf.

Мой бот на Telegraf остановился с 409: Conflict. Что делать?

Другая копия опрашивает Telegram с тем же токеном, часто на вашем компьютере или на старом хостинге. Telegraf останавливается вместо повторной попытки. Панель перезапускает его примерно через минуту; если он снова остановится в течение минуты после этого, то останется остановленным. Найдите и остановите другую копию либо создайте новый токен в @BotFather и вставьте его через Заменить токен.

Можно ли запустить Telegraf на Bun?

Да. При заказе выберите Bun вместо Node.js: на нашей странице хостинга Telegram-ботов Telegraf указан для него. Шаги на этой странице относятся к Node.js.

Готовы запустить бота Telegraf на круглые сутки? Посмотрите тарифы на странице хостинга Telegram-ботов.

Ваш бот уже у другого хостинга? Перенесите его к нам

ПОСЛЕДНИЕ БЛОГИ