Если запустить бота командой node bot.js, он будет работать в текущем процессе. При завершении процесса бот остановится, а после перезагрузки VDS его придётся запускать повторно.
PM2 решает эту задачу и предоставляет дополнительные инструменты управления. Он автоматически перезапускает завершившиеся процессы, сохраняет список приложений и позволяет просматривать их состояние.
Для Node.js-проектов PM2 часто удобнее ручного управления процессами. При этом он не заменяет системные инструменты Linux полностью: например, настройка автозапуска самого PM2 всё равно использует механизм запуска служб операционной системы.
1. Подготовьте сервер и установите Node.js
2. Создайте Telegram-бота на Node.js
Сохраните токен в конфигурации PM2
Подключитесь к VDS по SSH. Если сервер новый, сначала выполните базовую настройку системы по инструкции Подготовка сервера Linux к работе.
Установите Node.js и npm:
apt install -y nodejs npm
Проверьте установленные версии:
node -v
npm -v
Если обе команды выводят номера версий, инструменты доступны в системе.
Теперь установите PM2 глобально:
npm install -g pm2
Проверьте, что менеджер процессов доступен:
pm2 -v
Создайте директорию проекта:
mkdir -p /srv/newbot
cd /srv/newbot
В примере используется путь /srv/newbot. Он будет указан и в дальнейших командах, поэтому при выборе другой директории замените путь во всех соответствующих местах.
Инициализируйте проект:
npm init -y
Команда создаст файл package.json, в котором хранятся сведения о проекте и его зависимостях.
Установите библиотеку для работы с Telegram Bot API:
npm install node-telegram-bot-api
Создайте файл бота:
nano bot.js
Добавьте следующий код:
const TelegramBot = require("node-telegram-bot-api");
const token = process.env.BOT_TOKEN;
if (!token) {
throw new Error("Не задана переменная окружения BOT_TOKEN");
}
const bot = new TelegramBot(token, { polling: true });
bot.onText(/\/start/, (msg) => {
bot.sendMessage(msg.chat.id, "Бот работает!");
});
bot.on("polling_error", (error) => {
console.error("Ошибка polling:", error.message);
});
Вместо хранения токена непосредственно в коде используется переменная окружения BOT_TOKEN. Такой подход позволяет менять секретные данные отдельно от исходников и не раскрывать токен при публикации проекта.
Получить токен можно через BotFather в Telegram. После этого настроим передачу токена процессу PM2.
Сохраните файл и выйдите из редактора. Проверьте код запуском:
BOT_TOKEN="ВАШ_ТОКЕН" node bot.js
Замените ВАШ_ТОКЕН действительным токеном. Откройте бота в Telegram и отправьте команду /start. Если пришёл ответ, значит, бот подключается к Telegram и обрабатывает сообщения.
Остановите процесс сочетанием Ctrl+C. Теперь настроим постоянный запуск через PM2.
Для начала запустим бота под управлением PM2, передав токен через переменную окружения:
BOT_TOKEN="ВАШ_ТОКЕН" pm2 start /srv/newbot/bot.js --name mybot
PM2 запустит приложение в фоновом режиме. После выполнения команды терминал можно закрыть, не останавливая бота.

Проверьте состояние процесса:
pm2 status
В списке должен появиться процесс mybot со статусом online. Это означает, что PM2 считает приложение работающим, но само по себе ещё не подтверждает, что бот успешно обрабатывает сообщения.
Проверьте логи:
pm2 logs mybot
Здесь отображаются сообщения приложения и ошибки, которые помогают определить причину неполадок. Чтобы выйти из просмотра логов, нажмите Ctrl+C: процесс бота продолжит работу.
Чтобы не передавать токен непосредственно в команде запуска, можно создать файл конфигурации PM2.
Создайте файл:
nano /srv/newbot/ecosystem.config.js
Добавьте конфигурацию:
module.exports = {
apps: [
{
name: "mybot",
script: "/srv/newbot/bot.js",
cwd: "/srv/newbot",
env: {
BOT_TOKEN: "ВАШ_ТОКЕН"
},
autorestart: true,
restart_delay: 5000
}
]
};
Замените значение ВАШ_ТОКЕН своим токеном. Ограничьте доступ к файлу, поскольку он содержит секретные данные:
chmod 600 /srv/newbot/ecosystem.config.js
Остановите предыдущий процесс и запустите приложение по конфигурации:
pm2 delete mybot
pm2 start /srv/newbot/ecosystem.config.js
Обычный запуск через PM2 ещё не гарантирует восстановление работы после перезагрузки сервера. Для этого необходимо настроить запуск самого PM2 при загрузке Linux.
Выполните:
pm2 startup

PM2 выведет команду, которую нужно выполнить для создания службы автозапуска. Скопируйте именно команду из своего терминала: она может отличаться в зависимости от пользователя и расположения исполняемых файлов.
После выполнения предложенной команды сохраните текущий список процессов:
pm2 save
PM2 сохранит список приложений, которые нужно восстановить при запуске. Если добавить нового бота или изменить состав процессов, выполните pm2 save повторно.
Проверьте состояние приложений:
pm2 status
Теперь PM2 настроен на восстановление сохранённых процессов после перезагрузки VDS.
Для повседневной работы достаточно нескольких команд.
Перезапустить бота:
pm2 restart mybot
Остановить бота:
pm2 stop mybot
Удалить процесс из списка PM2:
pm2 delete mybot
Посмотреть логи:
pm2 logs mybot
Посмотреть состояние всех приложений:
pm2 status
Обратите внимание: pm2 stop останавливает процесс, но оставляет его в списке. Команда pm2 delete удаляет процесс из списка управления, но не удаляет файлы проекта.
После изменения конфигурации приложения может потребоваться перезапуск с обновлением переменных окружения:
pm2 restart mybot --update-env
Если вы изменили ecosystem.config.js, примените новую конфигурацию:
pm2 reload /srv/newbot/ecosystem.config.js --update-env
Для небольшого бота обычного restart обычно достаточно. Команда reload полезнее для приложений, где требуется более аккуратное обновление процесса, но она не гарантирует отсутствие перерыва в работе для любого приложения.
PM2 позволяет запускать Telegram-бота на Node.js в фоновом режиме, отслеживать его состояние и автоматически восстанавливать работу после завершения процесса. После настройки автозапуска сохранённые приложения будут запускаться вместе с сервером.