Node.js-бот на Telegraf уже работает: команды обрабатываются, npm start поднимает проект, локально всё отвечает. Дальше начинается обычная проблема — где держать бота, чтобы он отвечал круглосуточно, а не пока открыт ваш ноутбук. Классический путь: арендовать VPS, поставить Node.js, настроить pm2 и автозапуск. Для небольшого бота это несоразмерно много возни. Есть короче: загрузить код на https://dockbox.host — платформа сама соберёт окружение и будет держать процесс живым. Разберём по шагам, что подготовить в проекте.
Проверьте package.json и команду запуска
Зависимости должны быть перечислены. Telegraf или node-telegram-bot-api и всё остальное, что бот импортирует, — в dependencies файла package.json.
Скрипт запуска обязателен. Платформа должна знать, чем поднимать проект. Обычно это start:
"scripts": {
"start": "node bot.js"
}
node_modules в архив не кладите. Папку с зависимостями соберут заново из package.json и package-lock.json на этапе сборки. Архив от этого меньше, а сборка предсказуемее.
Версию Node.js лучше зафиксировать. Если бот использует современный синтаксис или свежий Telegraf, укажите её в engines — так сборка не уедет на другой мажорной версии.
Уберите токен из кода в переменные окружения
Токен — это пароль от бота. Кто его получит, тот сможет и писать вашим пользователям, и читать переписку. В коде ему не место.
Плохой вариант, который встречается постоянно:
const bot = new Telegraf("7123456789:AAH...");
Правильный — читать из окружения:
const { Telegraf } = require("telegraf");
const bot = new Telegraf(process.env.BOT_TOKEN);
Секреты задаются в панели проекта, а не в репозитории. В Dockbox для этого есть отдельный раздел: вы указываете имя переменной и значение, а в коде остаётся только process.env.BOT_TOKEN. Значения хранятся в зашифрованном виде — видны имена, но не сами токены.
Не забудьте про .gitignore. Если проект подключён через Git, добавьте туда .env — иначе токен уедет в историю коммитов вместе с кодом и останется там навсегда.
Оставьте long polling — это самый простой режим
Ничего дополнительно поднимать не нужно. В Telegraf bot.launch() запускает бота в режиме длинного опроса: приложение само спрашивает Telegram о новых сообщениях. Ни веб-сервера, ни домена, ни сертификата, ни открытых портов.
const { Telegraf } = require("telegraf");
const bot = new Telegraf(process.env.BOT_TOKEN);
bot.start((ctx) => ctx.reply("Привет!"));
bot.launch();
console.log("Бот запущен");
Webhook оставьте на потом. Он выигрывает в нагрузке, но требует публичный HTTPS-адрес и аккуратной работы с секретом. Пока бот небольшой, длинный опрос дешевле по нервам.
Один токен — один экземпляр. Запустите второй процесс с тем же токеном — Telegram вернёт 409 Conflict, и один из ботов замолчит. Это самая частая причина истории «локально работал, после деплоя молчит».
Наведите порядок в путях и портах
Не зашивайте порт числом. Если рядом с ботом поднимается веб-часть, порт берите из переменной окружения:
const port = process.env.PORT || 8080;
app.listen(port);
Никаких абсолютных путей с вашего компьютера. Путь вида /Users/вася/project/data на сервере не существует, и бот упадёт при старте. Если бот пишет файлы или базу, держите их в постоянной папке, а не во временной.
Печатайте логи в stdout. Туда, куда пишет console.log, платформа смотрит сама: всё, что вы выводите, видно в панели в реальном времени — без настройки файлов логов и ротации.
Загрузите проект в Dockbox
Git-репозиторий или архив. Деплой можно вести прямо из Git, приватный репозиторий тоже подойдёт. Как вариант — закинуть ZIP с исходниками.
Язык и команду платформа определит сама. Node.js виден по package.json: подходящий образ, установка зависимостей, запуск скрипта start. Выбирать версию рантайма и менеджер процессов руками не нужно.
Токен — в переменные окружения проекта. Этот шаг забывают чаще всего: код загружен, а BOT_TOKEN не задан. Бот падает сразу при старте с сообщением, что токен пустой. Начните с него, а уже потом читайте логи сборки.
Запустите и проверьте бота
Отправьте /start. Если бот отвечает — сборка и запуск прошли. Затем дайте пару команд, которые он реально умеет.
Посмотрите логи. Нормальный старт — строка вроде «Бот запущен» без трейсбеков. Если бот молчит, ответ почти всегда в логах: неверный токен, отсутствующая зависимость или незаданная переменная.
Остановите локальную копию. Пока бот работает у вас на ноутбуке с тем же токеном, задеплоенный экземпляр будет получать 409 Conflict и терять сообщения.
Про режим работы. Бот поднимается после деплоя и отвечает постоянно: платформа следит за процессом и перезапускает его при сбое, а код, настройки и токен остаются на месте. Чтобы бот работал с большим запасом ресурсов, нужен тариф Pro.
Чем это отличается от VPS с pm2
Не нужно администрировать сервер. На VPS вы сами ставите Node.js, обновляете пакеты, следите за диском и безопасностью. Здесь этой части просто нет.
pm2 и systemd ни при чём. Платформа держит процесс и поднимает его после падения — ровно та функция, ради которой на сервере ставят менеджер процессов.
Публичный адрес — когда понадобится. Бот на длинном опросе работает молча и снаружи недоступен. Если позже перейдёте на вебхук, публичную HTTPS-ссылку платформа выдаёт сразу после публикации, а свой домен можно привязать на тарифе Pro.
Частые вопросы
Где разместить Telegram-бота на Node.js, чтобы он работал постоянно?
На платформе деплоя, например на https://dockbox.host: вы загружаете код, она определяет Node.js по package.json, ставит зависимости и держит процесс запущенным на своих серверах, а не на вашем компьютере. Бот работает постоянно, останавливается, но код и настройки сохраняются. Для круглосуточной работы нужен тариф Pro.
Подойдёт ли это для Telegraf и node-telegram-bot-api?
Да, библиотека не важна — запускается любой Node.js-проект. Главное, чтобы в package.json были перечислены зависимости и команда запуска, токен лежал в переменной окружения, а бот работал в режиме длинного опроса.
Нужно ли ставить pm2 и настраивать автозапуск?
Нет. Платформа сама следит за процессом и перезапускает его при падении. Устанавливать pm2, писать unit-файл для systemd или настраивать автозапуск, как на VPS, не требуется.
Класть ли node_modules в архив?
Нет. Папку с зависимостями загружать не нужно: их установят из package.json и package-lock.json во время сборки. Так архив меньше, а сборка чище и воспроизводимее.
Будет ли бот работать, когда компьютер выключен?
Да. После деплоя бот живёт на серверах платформы, поэтому отвечает независимо от того, включён ли ваш ноутбук, и поднимается сам, если упадёт.