VPS для бота на Node.js: telegraf, discord.js и PM2
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 нужны только при работе через вебхук.