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



