MAATRIX / Блог / Discord-бот на Python: установка на VPS

Discord-бот на Python: установка на VPS

Discord-бот на Python: установка на VPS

MAATRIX

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.

  1. Откройте discord.com/developers/applications и нажмите New Application, задайте имя.
  2. В разделе Bot нажмите Add Bot (в актуальном интерфейсе приложение и бот создаются практически одним действием).
  3. Там же, в разделе Bot, нажмите Reset Token (или Copy, если токен ещё не показывался) — это единственный раз, когда Discord покажет токен целиком. Сохраните его в надёжном месте, не в чат и не в публичный репозиторий.
  4. Ниже, в блоке Privileged Gateway Intents, включите нужные переключатели — подробнее какие именно и зачем, в следующем разделе.
  5. В разделе OAuth2 → URL Generator отметьте scope botapplications.commands, если планируете slash-команды), затем в списке Bot Permissions выберите нужные права (например, «Send Messages», «Read Message History», «Manage Messages» для модерации). Сгенерированная ссылка внизу — это приглашение бота на сервер.
  6. Откройте сгенерированную ссылку в браузере, выберите свой сервер (нужны права администратора на этом сервере) и подтвердите.

Если токен утёк или засветился в публичном коде — сразу возвращайтесь в тот же раздел 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_contentDeveloper Portal → Bot, и в кодеЧитать текст сообщений (без него message.content будет пустой строкой)Да
members (Server Members)Developer Portal → Bot, и в кодеСписок участников, события входа/выхода, ролиДа
presencesDeveloper Portal → Bot, и в кодеСтатус участников (онлайн/офлайн, активность)Да
остальные (guilds, messages, reactions и т.д.)Только в кодеБазовые события серверов, сообщений, реакцийНет

Порядок включения привилегированного intent:

  1. В Developer Portal → BotPrivileged Gateway Intents включите переключатель (например, «Message Content Intent»).
  2. В коде явно поставьте флаг: 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 происходит быстро.