Держим бота Discord в сети круглые сутки - полное руководство

Пошаговое руководство: как запустить бота Discord на VPS и держать его в сети круглые сутки. С PM2 (Node.js) и systemd (Python).

Обзор

Написали бота Discord на discord.js или discord.py? Чтобы он работал круглые сутки, нужен VPS. Вот порядок действий.

Шаг 1: выбрать и заказать VPS

Начального VPS (1 vCPU, 1-2 ГБ памяти, SSD) хватает большинству ботов Discord. У By-Hoster это примерно 4,99 € в месяц.

  1. Зайдите в личный кабинет By-Hoster
  2. Выберите «VPS Linux» → дистрибутив Ubuntu 22.04 LTS
  3. Подтвердите и оплатите: VPS выдаётся за 60 секунд, доступ по SSH приходит письмом

Шаг 2: подключение по SSH и подготовка

  1. Подключитесь по SSH: ssh root@votre-ip
  2. Обновите систему: apt update && apt upgrade -y
  3. Создайте пользователя, отличного от root: adduser botuser && usermod -aG sudo botuser
  4. Установите Node.js 20 LTS: curl -fsSL https://deb.nodesource.com/setup_20.x | bash && apt install -y nodejs (для Node) или Python 3: apt install -y python3 python3-pip python3-venv (для Python)

Шаг 3: развернуть бота

  1. Загрузите код через Git: git clone https://github.com/vous/votre-bot.git
  2. Установите зависимости: npm install (Node) или pip install -r requirements.txt (Python)
  3. Создайте файл .env со своим токеном Discord и никогда не отправляйте его в Git
  4. Проверьте, запустив вручную: node bot.js или python bot.py

Шаг 4: держать бота в сети круглые сутки

Для Node.js: используйте PM2.

  1. Установите PM2: npm install -g pm2
  2. Запустите бота: pm2 start bot.js --name discord-bot
  3. Настройте автозапуск после перезагрузки: pm2 startup && pm2 save
  4. Смотрите журналы: pm2 logs discord-bot

Шаг 5: защитить VPS с ботом Discord

Бот Discord, доступный из интернета, — желанная мишень для подбора паролей SSH, сканирования портов и попыток использовать уязвимости. Трёх мер хватает, чтобы снять 99 % угроз: вход по SSH только с ключом, строгий межсетевой экран UFW и fail2ban против перебора по словарю.

  1. Отключить вход по SSH с паролем: создайте ключ у себя (ssh-keygen -t ed25519), скопируйте его на VPS (ssh-copy-id botuser@votre-ip), затем в /etc/ssh/sshd_config поставьте PasswordAuthentication no и PermitRootLogin no. Перезапустите: systemctl restart sshd
  2. Включить UFW (межсетевой экран Ubuntu): ufw default deny incoming && ufw default allow outgoing && ufw allow ssh && ufw enable. Ваш бот Discord открывает исходящие соединения (к gateway.discord.gg), входящие порты не нужны
  3. Установить fail2ban: apt install -y fail2ban && systemctl enable --now fail2ban. Он сам блокирует любой адрес, с которого за 10 минут пришло больше 5 неудачных попыток входа по SSH (по умолчанию на час)
  4. Автоматические обновления безопасности: apt install -y unattended-upgrades && dpkg-reconfigure --priority=low unattended-upgrades. Критические исправления (CVE) ставятся без вашего участия
  5. Хранить токен Discord в .env вне репозитория: добавьте .env в .gitignore и подгружайте его через dotenv (Node) или python-dotenv (Python). Никогда не отправляйте токен на GitHub: Discord отзывает утёкшие токены за считаные секунды

Неполадки: бот Discord падает, что делать?

Упавший в работе бот редко страдает от неисправного VPS: в 90 % случаев виновата ошибка приложения (истёкший токен, необработанное исключение, нехватка памяти, ограничение частоты со стороны Discord). Вот список проверок по порядку.

  • Проверить состояние процесса: pm2 status (Node) или systemctl status mon-bot (Python). Ищите «online» или «active (running)». Если написано «errored» или «failed», переходите к следующему пункту
  • Прочитать свежие записи журнала: pm2 logs discord-bot --lines 100 или journalctl -u mon-bot -n 100 --no-pager. Типичные сообщения Discord, которые стоит узнавать: DiscordAPIError[401] — токен недействителен или отозван, DiscordAPIError[429] — превышена частота запросов, UnhandledPromiseRejection — необработанное асинхронное исключение
  • Недействительный токен (401 Unauthorized): создайте новый на discord.com/developers/applications → Bot → Reset Token. Обновите .env и выполните pm2 restart discord-bot
  • Бота снял OOM (кончилась память): проверьте командой dmesg | grep -i "killed process". Если подтвердилось, значит либо в коде утечка памяти (кеш растёт без конца), либо VPS мал: переходите на 4 ГБ памяти
  • Бот не в сети, но процесс работает: скорее всего, Discord оборвал WebSocket. Включите autoReconnect: true в discord.js (так по умолчанию) или напишите обработчик on('disconnect'), который заново вызывает client.login()
  • Заставить бота перезапуститься начисто: pm2 restart discord-bot --update-env перечитывает и код, И переменные окружения. Чтобы начать совсем с нуля: pm2 delete discord-bot && pm2 start bot.js --name discord-bot
  • Постоянное наблюдение: настройте pm2 install pm2-logrotate (иначе журналы забьют диск) и вебхук Discord через pm2-discord-webhook, который предупредит вас, если бот упал больше 3 раз за 5 минут

Идём дальше: добавляем боту базу данных

Серьёзному боту Discord нужно что-то запоминать: настройки для каждого сервера, статистику пользователей, внутриигровую экономику, кеш слэш-команд, модерацию (предупреждения, отключения голоса). Три варианта под разные задачи: PostgreSQL для надёжных связанных данных, MongoDB для гибких структур, Redis для быстрого кеша и таблиц лидеров.

  • PostgreSQL (подходит 80 % ботов): apt install -y postgresql postgresql-contrib. Создайте базу: sudo -u postgres createdb monbot. Отлично сочетается с Prisma ORM (Node): npm i @prisma/client prisma, затем опишите модели в schema.prisma и выполните npx prisma migrate dev. Строгая типизация и версии миграций — то что нужно для данных вроде серверов, пользователей и предупреждений
  • MongoDB (для меняющихся структур): apt install -y mongodb-org, затем systemctl enable --now mongod. Возьмите Mongoose (Node): npm i mongoose. Удобно хранить вложенные настройки в JSON (параметры сервера со списками ролей, своими каналами и прочим), не описывая заранее жёсткую структуру
  • Redis (кеш и таблицы лидеров в реальном времени): apt install -y redis-server. Возьмите ioredis (Node) или redis-py (Python). Подходит для кеша слэш-команд (срок жизни 1 час), подсчёта опыта в упорядоченном множестве (ZADD leaderboard 1500 user_id, затем ZREVRANGE leaderboard 0 9 WITHSCORES для первой десятки) и ограничения частоты для каждого пользователя против спама
  • Простейший пример на Prisma (Node и PostgreSQL): model Guild { id String @id; prefix String @default("!"); xpEnabled Boolean @default(true); warnings Warning[] }, а затем в самом боте: const guild = await prisma.guild.upsert({ where: { id: msg.guildId }, update: {}, create: { id: msg.guildId } }). Так бот надолго запомнит настройки каждого сервера
  • Что стоит делать: снимайте копию базы каждый день (pg_dump monbot > backup.sql по cron), никогда не выставляйте PostgreSQL или MongoDB на публичный адрес (в UFW запретите всё, кроме SSH) и используйте пул соединений, чтобы база не захлебнулась, когда бот вырастет

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

Для простого бота — от 1 ГБ памяти. Для бота с базой данных и несколькими сотнями серверов — 2-4 ГБ памяти. Начального VPS By-Hoster за 4,99 € в месяц хватает 90 % ботов.

Да, если настроен pm2 startup (Node) или служба systemd (Python). После перезагрузки бот запустится сам.

PM2 — это диспетчер процессов для Node.js со встроенной панелью, цветными журналами, наблюдением за процессором и памятью в реальном времени и работой в несколько копий: то что нужно для discord.js. systemd — родной диспетчер служб Linux: ближе к системе, зато универсальный (Node, Python, Go, Rust). Для Python с discord.py или aiogram обычно предпочитают systemd, ведь PM2 задуман под Node.