Как запустить Discord-бота без своего сервера

Discord-бот живёт ровно столько, сколько работает процесс, который его запустил. Пока у вас открыт терминал на домашнем компьютере, бот в сети и отвечает на команды; закрыли ноутбук, ушли в спящий режим, пропал Wi-Fi — и в списке участников он гаснет, хотя пользователи продолжают писать. Обычно это решают арендой VPS: ставить окружение, настраивать автозапуск, следить, чтобы процесс не падал, и платить за сервер каждый месяц. Разбираем, как поднять Discord-бота без сервера и администрирования: код загружается в Dockbox, а постоянную работу контейнера платформа берёт на себя.

Чем Discord-бот отличается от Telegram-бота

Discord-бот подключается к Gateway — постоянному соединению с серверами Discord, через которое приходят события о новых сообщениях и командах. Значит, нужен процесс, который живёт непрерывно: разорвалось соединение — бот молчит. Telegram в этом смысле устроен похоже, но у Discord есть свои детали, которые чаще всего и ломают деплой.

Библиотека задаёт язык проекта. Для Node.js это discord.js, для Python — discord.py (или его форки вроде nextcord). От этого зависит файл зависимостей, который вы положите в проект.

Есть привилегированные интенты. Без них бот подключается, но не видит содержимое сообщений — об этом ниже, потому что это самая частая причина «бот в сети, но не отвечает».

Свой хостинг искать придётся. Сам Discord бесплатен, а вот место для круглосуточного процесса — нет: либо аренда сервера, либо платформа для деплоя. На Dockbox контейнер работает постоянно: ни лимита по времени, ни засыпания при простое здесь нет.

Шаг 1. Получите токен в Developer Portal

Откройте Discord Developer Portal, создайте приложение и перейдите на вкладку Bot. Токен выдаётся кнопкой Reset Token — это ключ доступа к боту, длинная строка вида:

MTIzNDU2Nzg5MDEyMzQ1Njc4.Gh1jkL.abc...

Сохраните его отдельно и никому не показывайте. Тот, у кого есть токен, управляет ботом от вашего имени и читает переписку в его каналах. Если токен случайно утёк, нажмите Reset Token ещё раз — старый сразу перестанет работать.

Тут же, на вкладке Bot, включите Message Content Intent в разделе Privileged Gateway Intents — без него бот не получит текст сообщений. А чтобы пригласить бота на сервер, соберите ссылку на вкладке OAuth2 → URL Generator: отметьте область bot (и applications.commands, если используете слэш-команды), выберите нужные права и откройте получившийся адрес.

Шаг 2. Соберите проект и вынесите токен из кода

Соберите бота в одну папку и положите рядом файл зависимостей: package.json для Node.js или requirements.txt для Python. Папку node_modules и виртуальное окружение включать не нужно — платформа поставит зависимости сама.

discord.py==2.4.0
python-dotenv==1.0.1

Дальше главное: токен должен читаться из переменной окружения, а не лежать в коде. Так делает почти любой сгенерированный код — и так его нельзя оставлять:

TOKEN = "MTIzNDU2Nzg5...Gh1jkL.abc"
client.run(TOKEN)

Правильный вариант — значение приходит снаружи, из окружения:

import os
TOKEN = os.environ["DISCORD_TOKEN"]
client.run(TOKEN)

Для Node.js то же самое через process.env.DISCORD_TOKEN. Код вы наверняка будете показывать или заливать в Git, а токен в коде — это токен в репозитории.

Шаг 3. Загрузите проект в Dockbox

Загрузите папку ZIP-архивом или импортируйте репозиторий из GitHub — приватный тоже подойдёт. Писать Dockerfile не нужно: платформа сама определит язык, установит зависимости и соберёт проект. Порт указывать не надо — Discord-бот с подключением к Gateway входящие запросы не слушает, он сам держит исходящее соединение.

Если точка входа называется нестандартно, укажите команду запуска: для Python это python main.py, для Node.js — npm start или node index.js.

Шаг 4. Добавьте токен в секреты и запустите

На шаге настройки Dockbox спросит переменные окружения. Добавьте ту же переменную, что читает код, — например DISCORD_TOKEN — и вставьте значение токена из Developer Portal. Значение хранится отдельно от кода и зашифровано: в панели видно только имя переменной.

Туда же стоит сложить всё остальное, что бот берёт из окружения: ID каналов и ролей, ключи внешних API, строку подключения к базе. Забытая переменная — самая частая причина падения при старте, потому что код честно сообщает о ней в логе.

Шаг 5. Проверьте, что бот в сети

После сборки откройте свой сервер в Discord: в списке участников бот должен быть с зелёным статусом online. Отправьте команду, на которую он умеет отвечать, — префиксную или слэш-команду через /. Параллельно смотрите логи в панели Dockbox: там видно и успешное подключение к Gateway, и текст ошибки, если что-то не так.

Типичные причины, что бот в сети, но молчит: не включён Message Content Intent, не установлены зависимости из файла, запущен второй экземпляр с тем же токеном или команды не зарегистрированы для вашего сервера. Причину почти всегда видно в логе прямым текстом.

Про режим работы и тарифы

На Dockbox бот работает постоянно, пока запущен его контейнер: платформа следит за процессом и перезапускает его при сбое. Никакого бесплатного тарифа с часами работы, лимита по времени или засыпания при простое здесь нет: круглосуточность — стандартный режим, а не отдельная опция. Код, настройки и секреты остаются на месте, ничего не удаляется.

Тарифы различаются ресурсами и числом проектов, а не режимом работы. Starter — 990 ₽/мес, причём первый месяц бесплатный: 1 vCPU, 2 ГБ RAM, один проект. Pro — 2490 ₽/мес: 2 vCPU, 4 ГБ RAM, 5 проектов и возможность подключить свой домен. Team — 4990 ₽/мес. Цены указаны в рублях, оплата вперёд за срок.

Что в итоге

Чтобы Discord-бот был онлайн круглосуточно, не нужен арендованный сервер с ручной настройкой автозапуска. Нужно место, которое держит процесс живым само. Загрузите код в Dockbox — и бот будет отвечать на команды, даже когда ваш компьютер выключен. Telegram-бот заводится точно так же — про это есть отдельный разбор.

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

Можно ли поднять Discord-бота без сервера?

Да. Сервер нужен только как место, где процесс работает непрерывно, — эту часть берёт на себя платформа для деплоя. Вы загружаете код в Dockbox, платформа собирает проект, запускает бота и перезапускает его при сбое.

Бот появляется в списке участников, но не отвечает на команды. Почему?

Чаще всего не включён Message Content Intent в Developer Portal: бот подключается к Gateway, видит события, но не получает текст сообщений. Другие причины — команды не зарегистрированы, запущен второй экземпляр с тем же токеном или обработчик падает с ошибкой. Смотрите логи в панели.

Нужно ли указывать порт при деплое Discord-бота?

Нет. Бот подключается к Gateway по исходящему соединению и входящие запросы не принимает, поэтому порт ему не нужен. Порт понадобится только если вы делаете веб-приложение с Interactions Endpoint.

Где хранить токен, если не в коде?

В секретах проекта. Значение шифруется, в панели видны только имена переменных, а код читает токен через os.environ в Python или process.env в Node.js.

Что будет, если бот упадёт с ошибкой?

Платформа перезапустит упавший контейнер сама. Логи доступны в панели в реальном времени, поэтому причину сбоя можно найти и поправить код без дежурства у терминала.