Чтобы запустить бота 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:
- На странице хостинга Telegram-ботов нажмите Создать сервер на нужном тарифе. В окне заказа ответьте на Для какой платформы ваш бот? значением Telegram и выберите Node.js.
- Откройте свой сервер в панели. Карточка Настройка бота на странице Обзор открывается на шаге Подключение к Telegram; его первый шаг, Что запускается, должен показывать Этот бот запускает Node.js Bot.
- В разделе Подключение к Telegram вставьте токен от @BotFather в поле Вставьте токен бота, нажмите Подключить, проверьте показанное имя бота и нажмите Да, продолжить.
- Убедитесь, что в вашем
package.jsonуказана версия, для которой написан код:^2.3.0для бота сnew Bot(...)или старая версия для бота сnew TelegramBot(...). - В разделе Ваш код нажмите Загрузить файлы и загрузите
package.jsonиindex.jsбезnode_modulesлибо нажмите Подключить Git. - На странице Бот, на вкладке Код, убедитесь, что Файл запуска указывает на файл, который запускает вашего бота (по умолчанию
index.js). Если вы его меняете, нажмите Сохранить. - Нажмите Запустить бота и откройте Console. При первом запуске npm устанавливает библиотеку, затем бот выводит
Logged in as @your_bot, а метка на странице Обзор меняется на Онлайн в Telegram. - На странице Бот, на вкладке Telegram, нажмите Открыть в Telegram и отправьте боту
/start.
Создание бота в @BotFather и шаги в панели описаны в статье Как запустить Telegram-бота на хостинге. Эта страница посвящена самой node-telegram-bot-api: её версиям, тому, что она использует на сервере, и тому, что стоит знать перед запуском.
Для какой версии написан ваш бот?
Имя пакета осталось прежним, но его API полностью изменился в августе 2026 года:
| Версия | Выпущена | Как выглядит ваш код |
|---|---|---|
| 0.x (последняя: 0.67.0) | До 13 дек. 2025 | const 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-api | 2.3.0 | 63 МБ | 0,2 с | 2,4 МБ |
| grammY | 1.46.0 | 60 МБ | 0,2 с | 3,0 МБ |
| Telegraf | 4.16.3 | 60 МБ | 0,2 с | 2,7 МБ |
| Только Node.js 22, без библиотеки | 22.23.4 | 43 МБ | нет | нет |
Как мы измеряли: на нашем собственном узле, в одноразовом контейнере, настроенном как тариф для ботов на 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-ботов.



