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

Как запустить бота node-telegram-bot-api 24/7

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

Чтобы запустить бота node-telegram-bot-api 24/7, его нужно держать на машине, которая всегда включена: на Linux VPS со службой systemd, которая запускает его снова после остановки, или на тарифе для ботов PlayNHost (от US$1.99 в месяц), где панель устанавливает ваши пакеты, передаёт коду токен и перезапускает бота после сбоя. В нашем тесте бот на node-telegram-bot-api 2.3.0 занимал около 63 МБ памяти на Node.js 22. Сначала одно: версия 2, которую сегодня ставит npm, это новая библиотека без класса TelegramBot, поэтому руководства для старых версий к ней больше не подходят. Боты, написанные для 0.x или 1.x, сохраняют свой API, если закрепить их версию, как показано ниже. Шаги в PlayNHost:

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

Создание бота в @BotFather и шаги в панели описаны в статье Как запустить Telegram-бота на хостинге. Эта страница посвящена самой node-telegram-bot-api: её версиям, тому, что она использует на сервере, и тому, что стоит знать перед запуском.

Для какой версии написан ваш бот?

Имя пакета осталось прежним, но его API полностью изменился в августе 2026 года:

ВерсияВыпущенаКак выглядит ваш код
0.x (последняя: 0.67.0)До 13 дек. 2025const TelegramBot = require('node-telegram-bot-api'), new TelegramBot(token, { polling: true }), bot.onText(...), bot.sendMessage(chatId, text)
1.x (с 1.0.0 по 1.2.0)С 12 июня по 14 июля 2026Тот же класс TelegramBot, переписанный на TypeScript и подключаемый через import TelegramBot from 'node-telegram-bot-api'
2.x (сейчас 2.3.0)С 16 авг. 2026 (2.3.0: 4 нояб. 2026)const { Bot } = require('node-telegram-bot-api'), bot.command(...), ctx.reply(...), bot.api.sendMessage({ chat_id, text })

В README проекта об этом сказано прямо: "v2 is a from-scratch redesign, no v1 compatibility", а в его changelog написано, что npm install node-telegram-bot-api по старому руководству "now lands you on a completely different API". Бот на TelegramBot, запущенный на 2.x, сразу падает, потому что такого класса больше нет.

Для бота, написанного для 0.x, оставьте эту версию в package.json:

"dependencies": {
  "node-telegram-bot-api": "^0.67.0"
}

Диапазон с ^ никогда не переходит на новую основную версию, поэтому ежедневная установка пакетов на наших серверах оставляет бота на 0.x. Не пишите latest или *. Если вы устанавливаете пакет через Пакеты на вкладке Код, тоже укажите версию, node-telegram-bot-api@0.67: имя без версии запрашивает у npm релиз с тегом latest, а это 2.3.0.

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

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

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

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

Минимальный бот на node-telegram-bot-api 2

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

package.json

{
  "name": "my-telegram-bot",
  "private": true,
  "main": "index.js",
  "dependencies": {
    "node-telegram-bot-api": "^2.3.0"
  }
}

index.js

const { Bot, TelegramApiError } = require("node-telegram-bot-api");
const { run } = require("node-telegram-bot-api/node");

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

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

async function main() {
  await bot.init(); // asks Telegram who the bot is, so a wrong token fails here
  await bot.api.deleteWebhook(); // version 2 does not remove a webhook by itself
  console.log(`Logged in as @${bot.botInfo.username}`);
  await run(bot); // polls for messages until the bot is stopped
}

main().catch((err) => {
  if (err instanceof TelegramApiError && err.errorCode === 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.env.BOT_TOKEN. Панель передаёт коду токен как TELEGRAM_BOT_TOKEN, а также как BOT_TOKEN, TOKEN, TELEGRAM_TOKEN и TELOXIDE_TOKEN, поэтому эти примеры работают без изменений. run() берётся из node-telegram-bot-api/node: он опрашивает Telegram и корректно останавливается по SIGINT или SIGTERM. Версия 2 работает и с require, как выше, и с import.

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

В нашем тесте с поддельным токеном первый вызов версии 2 к Telegram (getMe) завершился такой ошибкой:

TelegramApiError: 401: Unauthorized

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

Бот на 0.x ведёт себя иначе: он не останавливается. Он пишет в журнал строку вроде error: [polling_error] {"code":"ETELEGRAM","message":"ETELEGRAM: 401 Unauthorized"} и снова спрашивает Telegram примерно каждые 0,3 секунды, так что выглядит работающим, хотя ничего не отвечает. Панель читает эту строку и показывает тот же баннер.

Что нужно знать о node-telegram-bot-api на сервере

  • Вебхук, оставшийся на боте: версия 2 его не удаляет. Её опрос воспринимает 409 как конфликт, повторяет 10 раз с интервалом 5 секунд и затем останавливается. Бот выше вызывает bot.api.deleteWebhook() перед опросом; можно также нажать Удалить вебхук на вкладке Telegram. Версия 0.x сама удаляет вебхук, когда опрос получает 409.
  • Другая копия бота: при 409 Conflict версия 2 ждёт 5 секунд и молча пробует снова, до 10 раз подряд. После этого она останавливается, run() выводит node-telegram-bot-api: polling stopped on a fatal error: с текстом от Telegram, а панель показывает Ваш бот работает ещё и в другом месте. Остановите копию на своём компьютере или на старом хостинге. См. Как исправить ошибку 409 Conflict у Telegram-бота.
  • Ошибка в команде не останавливает бота. Версия 2 выводит Unhandled error while processing update вместе с ошибкой и продолжает работу. Задайте свой обработчик через bot.catch((err, ctx) => ...).
  • Вебхуки: startWebhook, createWebhookServer и webhookCallback требуют публичного HTTPS-адреса, которого у этих тарифов пока нет. Используйте run(bot) или bot.startPolling(). Переезд с хостинга с вебхуком: Как перенести Telegram-бота на PlayNHost.
  • Как увидеть, что он делает: на странице Бот, на вкладке Окружение, добавьте переменную DEBUG со значением node-telegram-bot-api:* (Добавить переменную) и перезапустите бота. Версия 2 тогда выводит в консоль каждый запрос и каждый опрос.
  • Версия Node.js: для 2.3.0 нужен Node.js 18.2 или новее. В поле Среда выполнения на вкладке Код доступны Node.js 20, 22 (recommended), 24, 25 и 26.
  • Лимит памяти: скрипт запуска задаёт NODE_OPTIONS=--max-old-space-size в 80 процентов памяти вашего тарифа, чтобы остальной части процесса хватило места. Подробности о скрипте запуска Node.js: Как запустить Discord-бота на Node.js.

Запуск на собственном Linux VPS

Для версии 2 нужен Node.js 18.2 или новее. На Debian 12 или 13 и Ubuntu 24.04 пакет дистрибутива достаточно новый (в Debian 12 это Node.js 18.20, в Debian 13 это 20.19, в Ubuntu 24.04 это 18.19); в Ubuntu 22.04 поставляется Node.js 12, который для неё слишком стар:

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=node-telegram-bot-api 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, который run() превращает в корректную остановку. Сначала остановите любую другую копию, иначе Telegram ответит обеим ошибкой 409 Conflict.

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

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

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

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

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

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

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

Мой старый бот остановился с ошибкой вроде TelegramBot is not a constructor. Почему?

Скорее всего, npm установил версию 2, в которой нет класса TelegramBot: require('node-telegram-bot-api') теперь возвращает объект с именованными экспортами, такими как Bot, а не класс, который можно вызвать через new. Впишите в package.json версию, для которой написан ваш бот, например "node-telegram-bot-api": "^0.67.0", удалите node_modules и package-lock.json в разделе Files и перезапустите: пакеты установятся заново. Или перенесите код на версию 2 по таблице из changelog проекта.

Писать нового бота на версии 2 или на 0.x?

Для нового бота на версии 2: она получает обновления, а 2.3.0 поддерживает Bot API 10.3 от Telegram. Оставайтесь на 0.x для существующего бота, пока не появится время на переход; она по-прежнему устанавливается из npm.

Где сессии переживают перезапуск?

Не в MemorySessionStorage: он живёт внутри процесса и после каждого перезапуска пуст. FileSessionStorage из node-telegram-bot-api/node записывает по одному файлу на чат в папку, которую вы укажете, например ./.my_bot_sessions. На наших тарифах эта папка лежит в файлах вашего сервера, поэтому она переживает перезапуски и попадает в ваши резервные копии.

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

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

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