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

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

Блог MAATRIX · 2026-07-07

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

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\nsudo ufw allow OpenSSH && sudo ufw enable\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash\nsource ~/.bashrc\nnvm install --lts\nnode -v && npm -v
', 'Клонируем проект и ставим зависимости строго по lock-файлу — это гарантирует те же версии, что в разработке.', '
git clone https://github.com/you/mybot.git ~/mybot\ncd ~/mybot\nnpm ci
']

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

['Токен бота храним в .env, а не в коде. Пакет dotenv подхватит его при старте.', "
cat > ~/mybot/.env <<'EOF'\nBOT_TOKEN=123456:AA...your-token\nNODE_ENV=production\nEOF\nchmod 600 ~/mybot/.env
", "В коде достаточно строки require('dotenv').config() в самом начале, чтобы process.env.BOT_TOKEN стал доступен. Права 600 на файл означают, что читать его может только владелец — даже другой пользователь на том же сервере не подсмотрит токен. Никогда не коммитьте .env в git: добавьте его в .gitignore заранее, до первого коммита, иначе токен останется в истории репозитория навсегда, даже если позже вы его удалите."]

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

['PM2 — популярный процесс-менеджер для Node: перезапуск при падении, логи, автостарт после ребута.', '
npm install -g pm2\ncd ~/mybot\npm2 start bot.js --name mybot\npm2 save\npm2 startup systemd -u $USER --hp $HOME
', 'Команда pm2 save запоминает текущий список процессов, чтобы после ребута PM2 поднял ровно те же боты. Последняя команда выведет строку с sudo — выполните её один раз, чтобы сам PM2 стартовал при загрузке сервера. Отдельный плюс PM2 — встроенный мониторинг потребления CPU и памяти по каждому процессу, что удобно, когда на одном VPS крутится несколько ботов сразу. Логи и статус:', '
pm2 logs mybot\npm2 list\npm2 restart mybot
']

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

['Если не хотите лишней зависимости, systemd справляется и без PM2. Укажите абсолютный путь к node из nvm:', '
which node   # например /home/user/.nvm/versions/node/v20.11.0/bin/node
', '
[Unit]\nDescription=Node.js bot\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=botuser\nWorkingDirectory=/home/botuser/mybot\nExecStart=/home/botuser/.nvm/versions/node/v20.11.0/bin/node bot.js\nRestart=always\nRestartSec=5\nEnvironment=NODE_ENV=production\n\n[Install]\nWantedBy=multi-user.target
', '
sudo systemctl daemon-reload\nsudo systemctl enable --now mybot\njournalctl -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-бота

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

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

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

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

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

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

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