MAATRIX GAMES / Блог / Как поднять сервер Discord-бот: пошаговая инструкция

Как поднять сервер Discord-бот: пошаговая инструкция

MAATRIX GAMES

Написали бота для своего Discord-сервера, погоняли его на домашнем ПК — и он тут же лёг, как только вы закрыли терминал или выключили комп на ночь. Знакомая история: бот на ноутбуке живёт ровно до первого перезапуска роутера. Дальше разберём, как поставить бота на нормальный VPS, чтобы он работал 24/7 независимо от вашего интернета — от получения токена до автозапуска после падения процесса. Сразу оговорка по терминологии: речь не про игровой сервер в привычном смысле (Minecraft, Rust и так далее — там сервер запускает Steam-приложение или бинарник игры). Discord-бот — это ваш собственный код на Node.js или Python (либо готовый бот, если вы просто хостите чужой), который через API Discord подключается как обычный пользователь-приложение. По железу это гораздо легче любого игрового сервера.

Что нужно для запуска: сервер, ОС, ресурсы

Простой бот — это по сути один процесс, который держит вебсокет-соединение с Discord и изредка отвечает на команды. Он почти не грузит CPU в простое, поэтому даже 512 МБ RAM хватает для старта. Проблемы начинаются, когда бот растёт: держит музыку в голосовых каналах (транскодирование звука ест CPU), хранит локальную базу (SQLite/PostgreSQL), сидит на десятках серверов сразу или гоняет тяжёлые ML-фичи.

Ориентировочно по нагрузке:

СценарийRAMvCPUКомментарий
Один бот, модерация + простые команды, 1-5 серверов512 МБ1Хватает с запасом
Бот с базой данных (очки, экономика, тикеты)1 ГБ1БД съедает память под кэш
Музыкальный бот (голосовые каналы, стриминг)1-2 ГБ2Транскодирование грузит CPU сильнее памяти
Несколько ботов или бот на сотни серверов (шардинг)2-4 ГБ2-4Уже нужен мониторинг и логротация

ОС — Ubuntu 22.04/24.04 LTS или Debian 12, доступ по SSH с правами sudo. Публичный статический IP для самого бота не обязателен: он сам инициирует соединение к Discord, входящие порты открывать не нужно (кроме случаев, когда бот параллельно отдаёт веб-панель или webhook-эндпоинт — тогда понадобится проброс порта и, желательно, домен с HTTPS).

Кстати, многих ботов ставят именно рядом с игровым сервером — чтобы показывать онлайн игроков в статусе канала, слать алерты о падении процесса или дёргать RCON для рестарта по расписанию. Если игровой сервер ещё не поднят, вот гайды по Minecraft, Rust и ARK: Survival Evolved — там же есть параметры RCON, которые бот потом будет использовать.

Создаём приложение бота и получаем токен

  1. Идём на discord.com/developers/applications, жмём New Application, даём имя (его увидят участники сервера как имя бота, потом можно переименовать).
  2. Открываем вкладку Bot слева. Если бот-юзер ещё не создан — портал предложит его добавить автоматически.
  3. Жмём Reset Token — токен показывается один раз, сразу копируем его в надёжное место (менеджер паролей, не в чат и не в код). Потеряли — жмём Reset Token заново, старый токен сразу станет недействителен.
  4. Ниже на той же вкладке — Privileged Gateway Intents. Включаем только то, что реально нужно коду:
  • MESSAGE CONTENT INTENT — если бот читает текст сообщений (например, команды на !-префиксе, не слэш-команды);
  • SERVER MEMBERS INTENT — если нужен список участников (приветствия, роли по вступлению);
  • PRESENCE INTENT — статусы онлайн/оффлайн участников, нужен редко.

Discord требует эти intent'ы явно из-за приватности — без включения соответствующий код в библиотеке просто не будет получать нужные события, даже если у бота есть все права на сервере.

Токен — это по сути пароль от бота. Кто его получит, сможет полностью управлять ботом от вашего имени на всех серверах, куда он приглашён. Никогда не публикуйте его в репозитории, скриншотах или логах.

Поднять сервер Discord-бот за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Готовим окружение: Node.js или Python

Подключаемся по SSH и обновляем систему:

sudo apt update && sudo apt upgrade -y

Заводим отдельного пользователя — запускать бота от root не стоит:

sudo adduser botuser
sudo su - botuser

Вариант Node.js (для discord.js — самой популярной библиотеки под JS):

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node -v
npm -v

Вариант Python (для discord.py):

sudo apt install -y python3 python3-venv python3-pip
python3 --version

Выбор языка — дело вкуса и того, на чём уже написан код бота. discord.js активнее развивается и обычно на шаг впереди по новым фичам API (например, компоненты v2, слэш-команды), discord.py — стабильная и предсказуемая библиотека, удобна тем, кто уже пишет на Python. Обе прекрасно живут на 512 МБ.

Пишем и запускаем базового бота

Создаём папку проекта и инициализируем зависимости.

Node.js + discord.js:

mkdir ~/mybot && cd ~/mybot
npm init -y
npm install discord.js dotenv

index.js:

require('dotenv').config();
const { Client, GatewayIntentBits, Events } = require('discord.js');

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ],
});

client.once(Events.ClientReady, (c) => {
  console.log(`Бот запущен как ${c.user.tag}`);
});

client.on(Events.MessageCreate, (message) => {
  if (message.author.bot) return;
  if (message.content === '!ping') {
    message.reply('Pong!');
  }
});

client.login(process.env.DISCORD_TOKEN);

Python + discord.py:

cd ~
python3 -m venv mybot-venv
source mybot-venv/bin/activate
pip install discord.py python-dotenv

bot.py:

import os
import discord
from discord.ext import commands
from dotenv import load_dotenv

load_dotenv()

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix='!', intents=intents)

@bot.event
async def on_ready():
    print(f'Бот запущен как {bot.user}')

@bot.command()
async def ping(ctx):
    await ctx.send('Pong!')

bot.run(os.getenv('DISCORD_TOKEN'))

Файл .env рядом с кодом (пока без автозапуска — просто для теста):

DISCORD_TOKEN=вставьте_сюда_токен

Запускаем вручную и смотрим, что в консоли появилось Бот запущен как ИмяБота#1234:

node index.js
# или
python3 bot.py

Останавливаем через Ctrl+C — на этом этапе бот ещё не приглашён ни на один сервер, поэтому команды тестировать негде.

Приглашаем бота на свой сервер

  1. В Developer Portal открываем вкладку OAuth2 → URL Generator.
  2. В блоке Scopes отмечаем bot, а если планируете слэш-команды (/команда) — ещё и applications.commands.
  3. Ниже появится блок Bot Permissions — не ставьте галочку Administrator ради удобства, это даёт боту вообще все права и превращает его в единую точку риска при утечке токена. Отмечайте только реально нужные пункты (Send Messages, Read Message History, Manage Messages, Connect/Speak для голосовых и т.д.) — портал сам собирает нужную битовую маску прав, руками её высчитывать не надо.
  4. Копируем сгенерированную ссылку внизу страницы, открываем в браузере, выбираем нужный сервер (нужны права Manage Server на этом сервере) и подтверждаем.

Бот появится в списке участников. Возвращаемся на VPS, снова запускаем node index.js или python3 bot.py и пишем в любом текстовом канале !ping — должен прилететь ответ Pong!. Если тишина — проверьте, что канал виден боту (права на чтение/запись) и что MESSAGE CONTENT INTENT включён на шаге получения токена.

Автозапуск через pm2 или systemd

Ручной запуск в SSH-сессии умрёт при разрыве соединения. Нужен менеджер процессов, который поднимет бота при падении и при перезагрузке сервера.

pm2 — самый простой вариант для Node.js-ботов:

sudo npm install -g pm2
cd ~/mybot
pm2 start index.js --name discord-bot
pm2 save
pm2 startup

Последняя команда выведет строку с sudo env PATH=... — её нужно скопировать и выполнить отдельно, это зарегистрирует pm2 как systemd-сервис, который поднимется вместе с сервером. Дальше полезные команды:

pm2 logs discord-bot     # логи в реальном времени
pm2 restart discord-bot  # перезапуск после правки кода
pm2 status               # список процессов и их состояние

systemd напрямую — универсальный вариант для Python (и подходит для Node тоже). Создаём юнит:

sudo nano /etc/systemd/system/discord-bot.service
[Unit]
Description=Discord bot
After=network.target

[Service]
Type=simple
User=botuser
WorkingDirectory=/home/botuser/mybot
ExecStart=/home/botuser/mybot-venv/bin/python3 bot.py
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Включаем и запускаем:

sudo systemctl daemon-reload
sudo systemctl enable --now discord-bot
sudo systemctl status discord-bot
journalctl -u discord-bot -f

Restart=on-failure — ключевая строка: если процесс упадёт с ошибкой (например, Discord временно недоступен), systemd поднимет его заново через 5 секунд, а не оставит лежать до вашего ручного вмешательства.

Храним токен в переменных окружения, а не в коде

Токен, вписанный прямо в bot.py или index.js, рано или поздно окажется в git-репозитории, скриншоте с ошибкой или бэкапе — и его придётся сбрасывать. Правильная схема — переменные окружения:

  • Для ручного запуска и pm2 — файл .env рядом с кодом плюс библиотека dotenv (как в примерах выше). Обязательно добавьте .env в .gitignore, если код лежит в git:
echo ".env" >> .gitignore
  • Для systemd — переменную можно передать прямо в юнит через EnvironmentFile, без dotenv в коде:
[Service]
EnvironmentFile=/home/botuser/mybot/.env
ExecStart=/home/botuser/mybot-venv/bin/python3 bot.py

Формат файла тот же KEY=значение построчно, без кавычек вокруг значения.

  • Если токен всё же засветился (закоммитили по ошибке, показали на стриме) — сразу идите в Developer Portal → Bot → Reset Token. Старый токен станет нерабочим мгновенно, это единственный надёжный способ откатить утечку.

Для команд с несколькими разработчиками имеет смысл вынести секреты в отдельный секрет-менеджер (Vault, Doppler, встроенные secrets в CI), но для одного бота на своём VPS связки .env + .gitignore + EnvironmentFile вполне достаточно.

Поднять сервер Discord-бот за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

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

Бот отваливается с ошибкой "Used disallowed intents".

Значит код запрашивает intent (обычно MESSAGE CONTENT или SERVER MEMBERS), который не включён в Developer Portal → Bot → Privileged Gateway Intents. Включите нужный флажок и перезапустите процесс.

Хватит ли 512 МБ, если бот будет расти?

Для старта — да, но как только добавляете базу данных, музыку в голосовых каналах или десятки серверов, лучше сразу закладывать 1-2 ГБ: миграция на более мощный тариф — это апгрейд VPS, а не переустановка бота с нуля.

Можно ли обойтись без VPS и держать бота на Repl.it/бесплатном хостинге?

Технически да, но такие площадки часто "усыпляют" процесс без активности или ограничивают аптайм — для бота, который должен работать круглосуточно, это ненадёжно. VPS с systemd/pm2 даёт полный контроль и предсказуемый аптайм.

Как обновить код бота без простоя?

Залейте новую версию файлов, затем pm2 restart discord-bot или sudo systemctl restart discord-bot — процесс перезапустится за секунду-две, соединение с Discord переустановится автоматически.

Нужен ли статический IP серверу?

Нет, если бот только слушает Discord API — исходящее соединение работает с любого IP. Статический адрес нужен, только если бот дополнительно принимает входящие webhook'и или отдаёт веб-панель.