Discord-бот на VPS: хостинг 24/7 без своего ПК

Боты, ИИ и автоматизация
Discord-бот на VPS: хостинг 24/7 без своего ПК

Хостинг Discord-бота на VPS — логичный шаг, когда надоело держать компьютер включённым круглые сутки: стоит выключить ПК, и бот уходит в офлайн, а модерация, музыка и команды на сервере умирают вместе с ним. Арендованный сервер решает это раз и навсегда, причём стоить он может меньше 100 рублей в месяц. Секрет в том, что Discord-боту не нужны ни входящий трафик, ни выделенный IP-адрес — он сам подключается к серверам Discord. В этой инструкции разберём весь путь: от токена в Developer Portal до systemd-службы на Ubuntu 24.04 LTS, которая держит бота онлайн 24/7.

Как работает Discord-бот и почему ему не нужен «настоящий» сервер

Бот на discord.py (как и на JS-библиотеке discord.js) общается с Discord через гейтвей — постоянное WebSocket-соединение, которое устанавливает сам бот. Все запросы идут в одну сторону: с вашего сервера наружу. Discord никогда не стучится к вам сам, поэтому:

  • не нужно открывать и пробрасывать порты;
  • не нужен выделенный IPv4-адрес — самая дорогая часть классического VPS;
  • не нужен домен и SSL-сертификат.

Это идеальный профиль нагрузки для NAT VPS — сервера с общим IP-адресом, который стоит в разы дешевле обычного. У Cheap-Host линейка NAT VPS размещена в Германии: KVM-виртуализация, NVMe-диски, безлимитный трафик и канал 100 Мбит/с. Для Discord-бота оптимален тариф NAT Base за 99 ₽/мес: 1 vCPU, 2 ГБ RAM и 15 ГБ NVMe — хватит и на бота, и на базу данных рядом. Ограничения NAT (999 портов вместо всех и закрытый порт 25) боту безразличны: входящие порты ему не нужны, почту он не рассылает.

Шаг 1. Создаём бота в Discord Developer Portal

  1. Откройте discord.com/developers/applications и нажмите New Application.
  2. На вкладке Bot нажмите Reset Token и сохраните токен — он показывается один раз.
  3. Там же включите Message Content Intent, если бот должен читать текст сообщений (для префикс-команд — обязательно).
  4. На вкладке OAuth2 → URL Generator отметьте scope bot, выберите права и пригласите бота на свой сервер по сгенерированной ссылке.

Шаг 2. Подключаемся к VPS и готовим систему

После оплаты сервер на Cheap-Host разворачивается за 45–60 секунд — IP, SSH-порт и пароль приходят на почту. Подключаемся и обновляем Ubuntu 24.04:

ssh root@203.0.113.20 -p 22022
apt update && apt upgrade -y

Пока вы на сервере, есть смысл сразу настроить вход по SSH-ключам вместо пароля — это пять минут и заметно безопаснее.

Шаг 3. Python, виртуальное окружение и discord.py

Ставим venv, создаём каталог проекта и изолированное окружение:

apt install -y python3-venv python3-pip
mkdir -p /opt/dcbot && cd /opt/dcbot
python3 -m venv venv
source venv/bin/activate
pip install discord.py

Для музыкального бота дополнительно понадобятся apt install -y ffmpeg и pip install "discord.py[voice]".

Шаг 4. Минимальный рабочий бот

Создаём файл /opt/dcbot/bot.py:

import os
import discord
from discord.ext import commands

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(f"Pong! Задержка: {round(bot.latency * 1000)} мс")

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

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

DISCORD_TOKEN="ваш_токен" python bot.py

Бот должен появиться онлайн на сервере Discord и ответить на !ping. Останавливаем его Ctrl+C и переходим к главному — автозапуску.

Шаг 5. Служба systemd: бот, который не умирает

Если просто запустить скрипт в SSH-сессии, он завершится при закрытии терминала. Правильное решение — системная служба. Создаём файл /etc/systemd/system/dcbot.service:

[Unit]
Description=Discord bot (discord.py)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=/opt/dcbot
Environment=DISCORD_TOKEN=ваш_токен
ExecStart=/opt/dcbot/venv/bin/python /opt/dcbot/bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Запускаем и включаем автозапуск при загрузке сервера:

systemctl daemon-reload
systemctl enable --now dcbot
systemctl status dcbot

Теперь бот переживает и падения скрипта (перезапуск через 5 секунд благодаря Restart=always), и перезагрузку VPS. Тот же приём работает для любых фоновых программ — детали в статье про запуск Python-скриптов на сервере 24/7.

Логи, обновления и типичные проблемы

Смотреть, что бот пишет в консоль (включая ошибки Python):

journalctl -u dcbot -f
journalctl -u dcbot --since "1 hour ago"

Обновление кода: заливаете новый bot.py через scp или git pull и выполняете systemctl restart dcbot. Частые грабли:

  • PrivilegedIntentsRequired — забыли включить Message Content Intent в Developer Portal.
  • Improper token has been passed — опечатка в токене или лишние кавычки/пробелы в Environment=.
  • Бот падает по памяти — на тарифе с 1 ГБ RAM тяжёлому боту поможет настройка swap или апгрейд тарифа (у Cheap-Host он выполняется без потери данных).

Выбор тарифа под Discord-бота

СценарийТариф Cheap-HostЦенаРесурсы
Модерация, команды, 1–2 сервераNAT Start59 ₽/мес1 vCPU, 1 ГБ, 10 ГБ NVMe
Бот + база данных, десятки серверовNAT Base99 ₽/мес1 vCPU, 2 ГБ, 15 ГБ NVMe
Музыка, обработка изображенийNAT Pro199 ₽/мес2 vCPU, 4 ГБ, 25 ГБ NVMe
Несколько ботов + парсеры + очередиNAT Plus349 ₽/мес4 vCPU, 8 ГБ, 50 ГБ NVMe

Тот же подход работает и для ботов в других мессенджерах — например, вот инструкция по развёртыванию Telegram-бота на VPS.

FAQ

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

Нет. Бот сам устанавливает исходящее WebSocket-соединение с гейтвеем Discord, входящие подключения ему не нужны. Именно поэтому Discord-бот отлично работает на NAT VPS с общим IP-адресом — самом дешёвом типе сервера.

Сколько RAM нужно Discord-боту?

Простой бот на discord.py занимает 60–120 МБ RAM. Для бота с музыкой, обработкой изображений или большим количеством серверов лучше 2 ГБ. Тариф NAT Base (2 ГБ RAM) за 99 ₽/мес покрывает большинство сценариев.

Может ли бот проигрывать музыку на дешёвом VPS?

Да, но потребуются ffmpeg и библиотека PyNaCl, а нагрузка на CPU и RAM вырастет. Для музыкального бота берите минимум 2 ГБ RAM (NAT Base), а при активном использовании — NAT Pro с 2 vCPU и 4 ГБ.

Что произойдёт, если бот упадёт с ошибкой ночью?

Служба systemd с параметрами Restart=always и RestartSec=5 перезапустит процесс через 5 секунд. Причину утром покажет journalctl -u dcbot --since yesterday.

Можно ли хранить токен бота прямо в коде?

Технически работает, но небезопасно: попав в git-репозиторий, токен даст полный доступ к боту любому. Держите его в .env или в строке Environment= systemd-юнита и никогда не публикуйте.

Вывод

Хостинг Discord-бота 24/7 не требует ни домашнего компьютера, ни дорогого сервера: боту хватает исходящего соединения, поэтому NAT VPS без выделенного IP — самый экономный вариант из возможных. Полчаса на настройку — SSH, python3 -m venv, pip install discord.py, systemd-юнит — и бот живёт своей жизнью, автоматически поднимаясь после любых сбоев. Если нужен сервер под эту задачу — у Cheap-Host есть NAT Base за 99 ₽/мес: 2 ГБ RAM, NVMe, KVM, безлимитный трафик и выдача сервера за минуту.

Читайте также