НОВОЕ 📢 Ограниченное стартовое предложение: скидка до 70% на первый месяц для любой игры!Посмотреть тарифы

Как запустить бота nextcord 24/7

Хостинг Discord-ботовUpdated Nov 6, 20269 min read

Чтобы запустить бота nextcord 24/7, держите его на машине, которая всегда включена, а не на своём ПК: на Linux VPS со службой systemd, если вы размещаете его сами, или на тарифе для ботов в хостинге Discord-ботов PlayNHost (от US$1.99 в месяц), где вы загружаете код, вставляете токен и нажимаете «Старт». В нашем тесте бот на nextcord 3.2.0 занял около 47 МБ памяти и связался с Discord примерно через 1.0 секунды после запуска. Первое, что нужно проверить: nextcord 3 требует Python 3.12 или новее. Шаги в PlayNHost:

  1. На странице хостинга Discord-ботов нажмите Создать сервер у нужного тарифа. В окне заказа на вопрос Для какой платформы ваш бот? ответьте Discord и выберите Python.
  2. Откройте свой сервер в панели. Карточка Настройка бота в разделе Обзор открывается на шаге Подключение к Discord. Её первый шаг, Что запускается, должен показывать Этот бот запускает Python Bot.; нажмите на этот шаг, чтобы проверить, затем Продолжить.
  3. На шаге Подключение к Discord вставьте токен в поле Вставьте токен бота, нажмите Подключение, затем Да, продолжить.
  4. На шаге Разрешения отметьте Мой код это использует только для привилегированных интентов, которые запрашивает ваш код (бот ниже не нуждается ни в одном), нажмите Добавить на сервер Discord, затем Продолжить.
  5. На шаге Ваш код нажмите Загрузить файлы и загрузите bot.py и requirements.txt, в котором указан nextcord, либо нажмите Подключить Git.
  6. На странице Бот, во вкладке Код, оставьте Среда выполнения равной Python 3.12 (recommended), 3.13 или 3.14, укажите Файл запуска, если он не bot.py, и нажмите Сохранить.
  7. Нажмите Запустить бота и следите за разделом Console. Когда бот выведет Logged in as ..., карточка покажет Ваш бот онлайн в Discord.

Общие шаги для Python (пакеты, строки консоли) описаны в статье Как запустить Discord-бота на Python. Эта страница о том, чем отличается nextcord.

Что мы измерили

Мы запустили каждую Python-библиотеку для Discord на собственных серверах, в той же конфигурации Python 3.12, что использует тариф для ботов, с лимитом памяти 1 ГБ:

БиблиотекаВерсияПамять в покоеОт запуска до ответа Discord
nextcord3.2.047 МБ1.0 с
discord.py2.7.148 МБ1.0 с
Pycord2.8.151 МБ1.1 с
disnake2.12.247 МБ0.9 с
hikari2.7.061 МБ1.3 с
Один Python3.129 МБ

Как мы измеряли: самая маленькая программа, которая загружает библиотеку и входит с поддельным токеном, установленная так, как наши серверы её устанавливают. Память это то, что процесс занимал через 15 секунд после того, как Discord отклонил токен, а время запуска считается от старта до этого ответа, поэтому в него входит одно обращение к Discord. Каждое значение это медиана трёх запусков после одного прогревочного. Это нижняя граница: бот, который подключился, вошёл на серверы и кэширует участников, использует больше, и насколько больше, зависит от бота.

Что это значит для тарифа: минимальный бот на nextcord занимает небольшую часть тарифа STARTER на 0.5 ГБ. Подбирайте тариф по тому, что держит в памяти ваш собственный бот, а не по библиотеке.

Минимальный бот на nextcord

Он отвечает на /ping слэш-командой и выводит строку о готовности. Токен он читает из DISCORD_TOKEN, под этим именем панель передаёт его вашему коду.

requirements.txt

nextcord>=3.2,<4

bot.py

import logging
import os

import nextcord
from nextcord.ext import commands

logging.basicConfig(level=logging.INFO)

bot = commands.Bot()


@bot.event
async def on_ready():
    print(f"Logged in as {bot.user}")


@bot.slash_command(description="Check that the bot answers")
async def ping(interaction: nextcord.Interaction):
    await interaction.send("Pong!")


bot.run(os.environ["DISCORD_TOKEN"])

Диапазон версий в requirements.txt задан намеренно: на слишком старом Python pip остановится с ошибкой, а не станет молча ставить старый nextcord (см. ниже). commands.Bot() не требует префикса для слэш-команд. nextcord сам регистрирует /ping в Discord при каждом подключении. Строка Logged in as переводит индикатор в разделе Обзор в состояние Онлайн в Discord.

Если токен неверный

Когда Discord отклоняет токен, nextcord вызывает такую ошибку (текст, который вывел наш тестовый бот):

LoginFailure: Improper token has been passed.

При bot.run() трассировка заканчивается строкой nextcord.errors.LoginFailure: Improper token has been passed., и бот останавливается. Панель читает эту строку: индикатор показывает Проблема с токеном, а в баннере написано Discord не принял токен вашего бота. Получите новый токен в Discord Developer Portal: ваше приложение, Bot, Reset Token (он показывается один раз). Нажмите Заменить токен в баннере, затем Заменить токен на вкладке Discord, вставьте его и снова запустите бота. См. Как создать Discord-бота и получить его токен.

Что хосту нужно знать о nextcord

  • Python 3.12 или новее. Каждый выпуск nextcord 3 требует Python 3.12 или новее. На Python 3.10 или 3.11 простая строка nextcord заставляет pip поставить 2.6.0 от сентября 2023 года, последний выпуск, который их поддерживает, и код, написанный для nextcord 3, может не заработать. С nextcord>=3.2,<4 pip откажется: консоль покажет ошибку pip и [PlayNHost] pip could not install everything in requirements.txt., а если nextcord на сервере никогда не был установлен, бот затем остановится с ModuleNotFoundError: No module named 'nextcord'. Выберите 3.12, 3.13 или 3.14 в поле Среда выполнения; изменение применяется при следующем запуске.
  • Импортируется nextcord. Вы ставите nextcord и пишете import nextcord и from nextcord.ext import commands. Если вы переходите с discord.py, руководство по миграции nextcord советует удалить discord.py и заменить discord на nextcord в импортах и коде.
  • Неизвестные ему команды удаляются. При подключении nextcord регистрирует новые команды, обновляет изменённые и удаляет в Discord команды, которых нет в вашем коде (rollout_delete_unknown, включено по умолчанию). Если тот же бот использует вторая программа, например тестовая копия на вашем ПК, команды, которые определены только в ней, удаляются при каждом подключении копии на сервере. Для тестов используйте отдельное приложение.
  • Не трогайте on_connect. Эта регистрация выполняется во внутреннем on_connect бота. Если определить @bot.event async def on_connect(), он будет заменён, и ваши команды перестанут обновляться. Код запуска помещайте в on_ready, как выше.
  • Включите логирование. nextcord сам не настраивает логирование, а его документация настоятельно рекомендует это сделать. Без него Python показывает только предупреждения и ошибки; logging.basicConfig(level=logging.INFO) в боте выше показывает и информационные строки библиотеки.
  • Интенты. Интенты по умолчанию не включают привилегированных, а слэш-командам они не нужны. Командам с префиксом нужны intents.message_content = True в вашем коде и включённый Message Content Intent в Developer Portal. Если ваш код запрашивает его, а в Portal он выключен, Discord отклонит вход. См. Как исправить «Used disallowed intents» у вашего Discord-бота.

Свой Linux VPS

Сначала проверьте версию Python: python3 --version должна показать 3.12 или новее. В Ubuntu 24.04 поставляется 3.12, а в Debian 13 3.13; в Debian 12 поставляется 3.11, а в Ubuntu 22.04 3.10, обе слишком старые для nextcord 3. Затем установите Python, создайте пользователя и папку для бота и установите nextcord в виртуальное окружение:

sudo apt update
sudo apt install -y python3 python3-venv
sudo useradd --system --create-home --home-dir /opt/nextcord-bot bot
sudo cp bot.py requirements.txt /opt/nextcord-bot/
sudo chown bot: /opt/nextcord-bot/bot.py /opt/nextcord-bot/requirements.txt
sudo -u bot python3 -m venv /opt/nextcord-bot/venv
sudo -u bot /opt/nextcord-bot/venv/bin/pip install -r /opt/nextcord-bot/requirements.txt

Поместите токен в файл, который может читать только root. Создайте /etc/nextcord-bot.env командой sudo nano /etc/nextcord-bot.env, напишите одну строку, DISCORD_TOKEN= и затем ваш токен, сохраните и выполните sudo chmod 600 /etc/nextcord-bot.env.

Затем создайте /etc/systemd/system/nextcord-bot.service:

[Unit]
Description=nextcord Discord bot
Wants=network-online.target
After=network-online.target

[Service]
User=bot
WorkingDirectory=/opt/nextcord-bot
EnvironmentFile=/etc/nextcord-bot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/nextcord-bot/venv/bin/python bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Запустите службу сейчас и при каждой загрузке, затем следите за её выводом:

sudo systemctl daemon-reload
sudo systemctl enable --now nextcord-bot
sudo journalctl -u nextcord-bot -f

PYTHONUNBUFFERED=1 заставляет print() попадать в журнал сразу, а не когда заполнится буфер. Чтобы обновить бота, скопируйте новые файлы, снова выполните строку pip install и sudo systemctl restart nextcord-bot.

Свой сервер или тариф для ботов

Ваш собственный VPSТариф для ботов PlayNHost
PythonВерсия из вашего дистрибутива, которая для nextcord 3 должна быть 3.12 или новееВыберите 3.12, 3.13 или 3.14 в поле Среда выполнения
ПакетыВы запускаете pip install после каждого измененияУстанавливаются при запуске после изменения requirements.txt или версии Python, а также при первом запуске через день после последней установки
ПерезапускиВаш юнит systemdЗапускается снова после сбоя; остаётся остановленным с указанием причины, если снова падает в течение минуты
ТокенФайл, который вы защищаете самиХранится в зашифрованном виде, проверяется в Discord при вставке и передаётся вашему коду как DISCORD_TOKEN
ОшибкиВы читаете журналБаннер в консоли называет причину, например неверный токен или пакет, который не установился
Обновления системы, файрвол, SSHЭто ваша заботаНе ваша забота

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

Почему pip установил nextcord 2.6.0?

У вас Python 3.10 или 3.11. nextcord 3 требует 3.12 или новее, поэтому pip выбирает самый новый выпуск, который ещё поддерживает ваш Python. Укажите в поле Среда выполнения на вкладке Код Python 3.12 или новее и снова запустите бота: пакеты установятся заново, потому что версия Python изменилась.

Мои слэш-команды пропали. Почему?

Частая причина: другая программа вошла с тем же ботом и синхронизировала свой список, а nextcord удаляет команды, которых нет в его коде. Запускайте только одну копию на приложение. Пока вы тестируете, guild_ids=[your_server_id] у команды или default_guild_ids у commands.Bot() создаёт её только на этом сервере, а документация Discord сообщает, что серверные команды обновляются мгновенно.

Можно ли сохранить код на discord.py?

Большую его часть. nextcord начинался как форк discord.py, поэтому классы вроде Client, Intents и ext.commands есть под именем nextcord. Слэш-команды отличаются: @bot.slash_command и interaction.send() в nextcord, app_commands в discord.py. Удалите discord.py и поменяйте импорты, как сказано в руководстве по миграции nextcord.

Поместится ли бот на nextcord в самый маленький тариф?

Да. При около 47 МБ в нашем тесте минимальный бот на nextcord оставляет большую часть тарифа STARTER на 0.5 ГБ вашему собственному коду. Переходите на тариф побольше, когда этого требует сам бот: крупные серверы, участников которых он кэширует, файлы или изображения, которые он обрабатывает, или данные, которые он держит в памяти.

Готовы запустить своего? Выберите тариф на странице хостинга Discord-ботов и загрузите своего бота на nextcord.

Ваш бот уже у другого хостинга? Перенесите его к нам

ПОСЛЕДНИЕ БЛОГИ