MAATRIX / Блог / VPS для бота на Node.js: telegraf, discord.js и PM2

VPS для бота на Node.js: telegraf, discord.js и PM2

VPS для бота на Node.js: telegraf и discord.js в production
Блог MAATRIX · 2026-07-07

Node.js — рабочая лошадка для ботов: telegraf для Telegram и discord.js для Discord. Соберём production-стенд: правильная установка Node через nvm, автозапуск через PM2 или systemd, логи и обновление без простоя.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Node.js и боты: telegraf vs discord.js

Событийная модель Node идеально ложится на ботов: один процесс держит тысячи соединений и обрабатывает вебхуки без блокировок. Для Telegram чаще берут telegraf или grammY, для Discord — discord.js с шардингом под большие серверы.

Обе библиотеки работают в long-polling или через вебхук. Начать проще с polling: он не требует домена и TLS, бот сам ходит за обновлениями к API. Под нагрузкой переключаются на вебхук за nginx — платформа сама шлёт события боту, это экономит ресурсы и снижает задержку отклика. Переключение обычно сводится к смене пары строк в коде и настройке reverse proxy, а бизнес-логика остаётся прежней.

  • telegraf/grammY — Telegram, лаконичный async-код.
  • discord.js — Discord, gateway-соединение и шардинг.
  • Единый рантайм — легко держать несколько ботов на одном сервере.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для Node.js-бота

Установка Node.js через nvm

Не ставьте Node из apt — там устаревшая версия. nvm ставит нужный LTS и легко переключает версии.

sudo apt update && sudo apt install -y curl git ufw
sudo ufw allow OpenSSH && sudo ufw enable
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.bashrc
nvm install --lts
node -v && npm -v

Клонируем проект и ставим зависимости строго по lock-файлу — это гарантирует те же версии, что в разработке.

git clone https://github.com/you/mybot.git ~/mybot
cd ~/mybot
npm ci

Секреты и переменные окружения

Токен бота храним в .env, а не в коде. Пакет dotenv подхватит его при старте.

cat > ~/mybot/.env <<'EOF'
BOT_TOKEN=123456:AA...your-token
NODE_ENV=production
EOF
chmod 600 ~/mybot/.env

В коде достаточно строки require('dotenv').config() в самом начале, чтобы process.env.BOT_TOKEN стал доступен. Права 600 на файл означают, что читать его может только владелец — даже другой пользователь на том же сервере не подсмотрит токен. Никогда не коммитьте .env в git: добавьте его в .gitignore заранее, до первого коммита, иначе токен останется в истории репозитория навсегда, даже если позже вы его удалите.

Вариант A: автозапуск через PM2

PM2 — популярный процесс-менеджер для Node: перезапуск при падении, логи, автостарт после ребута.

npm install -g pm2
cd ~/mybot
pm2 start bot.js --name mybot
pm2 save
pm2 startup systemd -u $USER --hp $HOME

Команда pm2 save запоминает текущий список процессов, чтобы после ребута PM2 поднял ровно те же боты. Последняя команда выведет строку с sudo — выполните её один раз, чтобы сам PM2 стартовал при загрузке сервера. Отдельный плюс PM2 — встроенный мониторинг потребления CPU и памяти по каждому процессу, что удобно, когда на одном VPS крутится несколько ботов сразу. Логи и статус:

pm2 logs mybot
pm2 list
pm2 restart mybot

Вариант B: чистый systemd

Если не хотите лишней зависимости, systemd справляется и без PM2. Укажите абсолютный путь к node из nvm:

which node   # например /home/user/.nvm/versions/node/v20.11.0/bin/node
[Unit]
Description=Node.js bot
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=botuser
WorkingDirectory=/home/botuser/mybot
ExecStart=/home/botuser/.nvm/versions/node/v20.11.0/bin/node bot.js
Restart=always
RestartSec=5
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
journalctl -u mybot -f

Где брать сервер и частые ошибки

Node-бот экономен: базовому боту достаточно 1 ГБ RAM, discord.js с шардингом под крупные серверы — 2 ГБ. На тарифах MAATRIX это AMD EPYC + NVMe от $8/мес: высокая частота ядра ускоряет обработку событий, а локации UK, США и РФ дают низкий пинг к Discord Gateway и Telegram API. Оплата картой РФ, СБП, криптой или токеном MAAT.

  • Node из apt — старая версия, несовместимая с новыми библиотеками.
  • npm install вместо npm ci — плавающие версии зависимостей.
  • Относительный путь к node в systemd — unit не найдёт бинарник; указывайте абсолютный.
  • Одновременный polling двух копий — Telegram отдаёт ошибку 409.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для Node.js-бота

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

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

PM2 или systemd — что лучше?

PM2 удобнее для нескольких Node-процессов и даёт готовый мониторинг. systemd надёжнее и не тянет лишних зависимостей. Для одного бота достаточно systemd.

Почему npm ci, а не npm install?

npm ci ставит версии строго по package-lock.json и не меняет его — на production вы получаете ровно те же зависимости, что в разработке.

Нужен ли домен для Node-бота?

Для long-polling — нет. Домен и TLS нужны только при работе через вебхук.