Discord-бот на Python: установка на VPS
Discord-бот, который работает у вас на ноутбуке, живёт ровно до закрытия терминала — как только вы выключите компьютер или уйдёт в сон, бот отвалится, и сервер об этом узнает через пару секунд по обрыву heartbeat. Для бота, которым реально пользуются на сервере — модерация, музыка, тикеты, интеграции — нужен постоянно включённый хост с автоперезапуском. Разберём установку с нуля: Python-окружение, приложение бота в Discord Developer Portal, минимальный рабочий код с правильными intents и systemd-юнит, который держит бота живым 24/7.
Содержание
Статус discord.py в 2026 году
Стоит сразу закрыть вопрос, который всплывает в любом обсуждении: несколько лет назад автор discord.py (Rapptz) приостанавливал разработку из-за смены API Discord на privileged intents, и часть сообщества тогда разошлась по форкам вроде nextcord, disnake и pycord. С осени 2022 года разработка discord.py возобновилась, и на момент написания статьи (конец августа 2026) это по-прежнему основная, активно поддерживаемая библиотека — с регулярными релизами, поддержкой slash-команд через discord.ext.commands и app_commands, и актуальной документацией.
Форки (pycord, nextcord, disnake) тоже живы и местами удобнее для конкретных задач (например, pycord иногда быстрее подхватывает новые фичи API), но API у всех почти идентичен — то, что написано ниже для discord.py, с минимальными правками (обычно только в импортах) переносится на любой форк. Если вы начинаете новый проект, разумно перед установкой проверить страницу библиотеки на PyPI или GitHub на актуальную версию — конкретный номер версии я тут специально не привожу, чтобы не устарел раньше статьи.
Подготовка VPS и Python-окружения
Понадобится VPS с Linux (примеры ниже для Ubuntu/Debian) и SSH-доступ. Ресурсов для одного бота средней нагрузки хватает по минимуму — 1 vCPU и 1 ГБ RAM, дисковое пространство некритично.
Обновите систему и поставьте Python с виртуальным окружением:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-venv python3-pip git
python3 --version
Нужен Python 3.9 или новее — discord.py актуальных версий на более старых интерпретаторах не соберётся. Создайте рабочую директорию и виртуальное окружение — это отдельная папка с пакетами, изолированная от системного Python, чтобы обновления библиотеки не ломали другие проекты на сервере:
mkdir -p /opt/discordbot && cd /opt/discordbot
python3 -m venv venv
source venv/bin/activate
После активации в приглашении командной строки появится (venv) — это значит, что pip install дальше ставит пакеты именно сюда, а не в систему.
Важный практический момент: Discord-боту не нужны открытые входящие порты. Библиотека работает через исходящее WebSocket-соединение (Gateway) и REST-запросы к API Discord — оба инициируются с вашей стороны. Поэтому в файрволе VPS ничего специально открывать не нужно, если только вы не поднимаете рядом веб-сервер для OAuth-колбэков или дашборда.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать VPSПриложение бота в Discord Developer Portal
Токен и права бота выдаются через портал разработчика, а не через обычный аккаунт Discord.
- Откройте discord.com/developers/applications и нажмите New Application, задайте имя.
- В разделе Bot нажмите Add Bot (в актуальном интерфейсе приложение и бот создаются практически одним действием).
- Там же, в разделе Bot, нажмите Reset Token (или Copy, если токен ещё не показывался) — это единственный раз, когда Discord покажет токен целиком. Сохраните его в надёжном месте, не в чат и не в публичный репозиторий.
- Ниже, в блоке Privileged Gateway Intents, включите нужные переключатели — подробнее какие именно и зачем, в следующем разделе.
- В разделе OAuth2 → URL Generator отметьте scope
bot(иapplications.commands, если планируете slash-команды), затем в списке Bot Permissions выберите нужные права (например, «Send Messages», «Read Message History», «Manage Messages» для модерации). Сгенерированная ссылка внизу — это приглашение бота на сервер. - Откройте сгенерированную ссылку в браузере, выберите свой сервер (нужны права администратора на этом сервере) и подтвердите.
Если токен утёк или засветился в публичном коде — сразу возвращайтесь в тот же раздел Bot и жмите Reset Token: старый токен мгновенно перестаёт работать, и бота нужно будет перезапустить с новым значением.
Установка discord.py и минимальный бот
С активным виртуальным окружением поставьте библиотеку:
pip install -U discord.py python-dotenv
python-dotenv не обязателен для работы discord.py, но избавляет от соблазна вписать токен прямо в код — вместо этого он читается из файла окружения.
Создайте файл .env рядом с ботом и сразу ограничьте на него права:
echo "DISCORD_TOKEN=вставьте_сюда_токен" > .env
chmod 600 .env
Минимальный рабочий бот, bot.py, с одной обычной командой на префиксе и одной slash-командой:
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv("DISCORD_TOKEN")
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} (id: {bot.user.id})")
await bot.tree.sync() # регистрирует slash-команды на всех серверах
@bot.command()
async def ping(ctx):
await ctx.send(f"Понг! Задержка: {round(bot.latency * 1000)} мс")
@bot.tree.command(name="hello", description="Поздороваться с ботом")
async def hello(interaction: discord.Interaction):
await interaction.response.send_message(f"Привет, {interaction.user.mention}!")
bot.run(TOKEN)
Запустите вручную и проверьте, что бот появляется онлайн на сервере:
python bot.py
!ping должен ответить с задержкой в мс, /hello — появиться как slash-команда (может понадобиться до часа на глобальную синхронизацию, если не тестировать bot.tree.sync(guild=...) на конкретном сервере — с ним команды применяются мгновенно).
Intents: что и зачем включать явно
Intents — это подписки на категории событий Gateway; часть из них Discord считает «привилегированными» и требует явного включения в двух местах одновременно — иначе бот либо не подключится, либо тихо не будет получать нужные события.
| Intent | Где включить | Зачем | Привилегированный |
|---|---|---|---|
message_content | Developer Portal → Bot, и в коде | Читать текст сообщений (без него message.content будет пустой строкой) | Да |
members (Server Members) | Developer Portal → Bot, и в коде | Список участников, события входа/выхода, роли | Да |
presences | Developer Portal → Bot, и в коде | Статус участников (онлайн/офлайн, активность) | Да |
| остальные (guilds, messages, reactions и т.д.) | Только в коде | Базовые события серверов, сообщений, реакций | Нет |
Порядок включения привилегированного intent:
- В Developer Portal → Bot → Privileged Gateway Intents включите переключатель (например, «Message Content Intent»).
- В коде явно поставьте флаг:
intents.message_content = True(илиintents.members = Trueи т.д.).
Оба шага обязательны одновременно — включили только в портале, но не в коде, событие всё равно не придёт; включили только в коде без портала — при старте бот получит ошибку PrivilegedIntentsRequired и не подключится вовсе. Если у бота больше 100 серверов, привилегированные intents (кроме message_content, для него порог 75) дополнительно требуют верификации приложения через форму Discord — на старте и в тестах это не актуально, но стоит держать в голове на будущее.
Практический совет: не включайте intents «про запас». Каждый лишний привилегированный intent — это больше данных участников, которые бот получает и потенциально хранит, а значит больше ответственности за их защиту. Если бот не читает контент сообщений (например, работает только через slash-команды) — message_content можно не включать вовсе.
Запуск как systemd-сервис для 24/7
Ручной запуск в терминале обрывается вместе с SSH-сессией. Чтобы бот работал постоянно и сам поднимался после сбоя или перезагрузки сервера, оформите его как systemd-сервис.
Создайте юнит:
sudo nano /etc/systemd/system/discordbot.service
Содержимое:
[Unit]
Description=Discord bot on Python
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=discordbot
WorkingDirectory=/opt/discordbot
ExecStart=/opt/discordbot/venv/bin/python /opt/discordbot/bot.py
Restart=on-failure
RestartSec=5
EnvironmentFile=/opt/discordbot/.env
[Install]
WantedBy=multi-user.target
Обратите внимание на EnvironmentFile — файл .env в формате KEY=value (без кавычек и без export) systemd понимает напрямую, отдельная библиотека python-dotenv для продакшен-запуска уже не нужна, она была нужна только для локальной отладки. Запускать бота от root не стоит — создайте отдельного системного пользователя:
sudo useradd -r -s /usr/sbin/nologin discordbot
sudo chown -R discordbot:discordbot /opt/discordbot
Включите и запустите сервис:
sudo systemctl daemon-reload
sudo systemctl enable discordbot
sudo systemctl start discordbot
sudo systemctl status discordbot
Логи бота (включая print() из кода и трейсбэки исключений) смотрите через journalctl:
journalctl -u discordbot -f
Restart=on-failure перезапускает процесс, если он упал с ошибкой, но не защищает от логических зависаний (бот жив, но не отвечает) — для этого полезно завести отдельный мониторинг, например через uptime-kuma, который проверяет статус бота косвенно (например, по HTTP-эндпоинту health-check, если вы его добавите в код) или хотя бы следит за самим сервером.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать VPSНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли обойтись без Developer Portal и просто использовать личный аккаунт Discord?
Нет, боты работают только через отдельное приложение с собственным токеном — это требование Discord API, обход невозможен и запрещён правилами сервиса (селфботы блокируются).
discord.py, pycord или disnake — что выбрать в 2026 году?
discord.py остаётся наиболее широко документированной и стабильной опцией для большинства задач. Форки стоит рассматривать, если нужна конкретная фича, которой в discord.py пока нет, или вам ближе их подход к slash-командам — код в этой статье почти без изменений переносится между ними.
Бот не подключается с ошибкой про intents — что не так?
Почти всегда это привилегированный intent, включённый в коде, но не в Developer Portal (или наоборот). Проверьте оба места: переключатель в разделе Bot и соответствующий флаг intents.xxx = True в коде.
Slash-команда не появляется в Discord
Первая глобальная синхронизация (bot.tree.sync()) может занимать до часа на распространение по кэшам Discord. Для быстрой проверки во время разработки синхронизируйте команды на конкретном сервере: bot.tree.sync(guild=discord.Object(id=ВАШ_SERVER_ID)) — так изменения применяются почти мгновенно.
Сколько ресурсов VPS реально нужно под одного бота?
Для бота на несколько серверов и умеренную нагрузку 1 vCPU / 1 ГБ RAM запускается и работает стабильно; расход растёт в первую очередь от количества серверов, кэша Discord.py (объекты guild/member) и вашей собственной логики (БД, обращения к внешним API), а не от самой библиотеки.
Как обновить бота без простоя?
Залейте новый код, поставьте зависимости (pip install -U -r requirements.txt) и перезапустите сервис: sudo systemctl restart discordbot. Простой обычно занимает секунды — переподключение к Gateway происходит быстро.