Как поднять сервер Discord-бот: пошаговая инструкция
Написали бота для своего Discord-сервера, погоняли его на домашнем ПК — и он тут же лёг, как только вы закрыли терминал или выключили комп на ночь. Знакомая история: бот на ноутбуке живёт ровно до первого перезапуска роутера. Дальше разберём, как поставить бота на нормальный VPS, чтобы он работал 24/7 независимо от вашего интернета — от получения токена до автозапуска после падения процесса. Сразу оговорка по терминологии: речь не про игровой сервер в привычном смысле (Minecraft, Rust и так далее — там сервер запускает Steam-приложение или бинарник игры). Discord-бот — это ваш собственный код на Node.js или Python (либо готовый бот, если вы просто хостите чужой), который через API Discord подключается как обычный пользователь-приложение. По железу это гораздо легче любого игрового сервера.
Содержание
Что нужно для запуска: сервер, ОС, ресурсы
Простой бот — это по сути один процесс, который держит вебсокет-соединение с Discord и изредка отвечает на команды. Он почти не грузит CPU в простое, поэтому даже 512 МБ RAM хватает для старта. Проблемы начинаются, когда бот растёт: держит музыку в голосовых каналах (транскодирование звука ест CPU), хранит локальную базу (SQLite/PostgreSQL), сидит на десятках серверов сразу или гоняет тяжёлые ML-фичи.
Ориентировочно по нагрузке:
| Сценарий | RAM | vCPU | Комментарий |
|---|---|---|---|
| Один бот, модерация + простые команды, 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, которые бот потом будет использовать.
Создаём приложение бота и получаем токен
- Идём на discord.com/developers/applications, жмём New Application, даём имя (его увидят участники сервера как имя бота, потом можно переименовать).
- Открываем вкладку Bot слева. Если бот-юзер ещё не создан — портал предложит его добавить автоматически.
- Жмём Reset Token — токен показывается один раз, сразу копируем его в надёжное место (менеджер паролей, не в чат и не в код). Потеряли — жмём Reset Token заново, старый токен сразу станет недействителен.
- Ниже на той же вкладке — 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 — на этом этапе бот ещё не приглашён ни на один сервер, поэтому команды тестировать негде.
Приглашаем бота на свой сервер
- В Developer Portal открываем вкладку OAuth2 → URL Generator.
- В блоке Scopes отмечаем
bot, а если планируете слэш-команды (/команда) — ещё иapplications.commands. - Ниже появится блок Bot Permissions — не ставьте галочку Administrator ради удобства, это даёт боту вообще все права и превращает его в единую точку риска при утечке токена. Отмечайте только реально нужные пункты (Send Messages, Read Message History, Manage Messages, Connect/Speak для голосовых и т.д.) — портал сам собирает нужную битовую маску прав, руками её высчитывать не надо.
- Копируем сгенерированную ссылку внизу страницы, открываем в браузере, выбираем нужный сервер (нужны права 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'и или отдаёт веб-панель.