Discord-бот на ноутбуке умирает в момент, когда вы закрываете крышку. Для теста — нормально, для бота, на который реально полагается ваш сервер, — бесполезно. Перенесите его на VPS — и он остаётся онлайн: переживает обрыв wifi, не останавливается, пока вы спите, и сам переподключается к Discord.
Вот всё целиком — минимальный бот, сервис, который держит его живым, и как платить без удостоверения.
Почему VPS, а не ноутбук
Discord-боту нужно стабильное постоянное соединение со шлюзом Discord. Ноутбук засыпает, перезагружается для обновлений, меняет сеть — каждый раз бот уходит в офлайн, и участники это замечают. VPS держит одно ровное соединение круглосуточно. Это и есть главная причина переносить ботов с личных машин.
Какой размер — и как платить
Discord-бот лёгкий. Он держит websocket и реагирует на события, так что машина в основном ждёт:
- 1 ГБ RAM, 1–2 ядра покрывают большинство ботов — даже довольно загруженных.
- Больше нужно, только если бот сам тянет тяжёлое: генерацию картинок, локальную модель, аудио на много серверов, большую базу.
Два практичных решения:
- NAT хватает. Бот делает только исходящие подключения к Discord, так что NAT-тариф с проброшенным SSH работает — без выделенного IP и открытых входящих портов. Публичный IP нужен, только если вы ещё запускаете веб-панель или принимаете webhooks.
- Без KYC, оплата криптой. Регистрация по email и оплата USDC или USDT в сетях Base или Ethereum — без карты и документов. Карта тоже работает, но у on-ramp минимум ~$27, поэтому для дешёвого тарифа проще один раз пополнить небольшой баланс.
Это CPU-only и один дата-центр в Германии — для бота нормально, но стоит знать, если нужен GPU или конкретный регион.
Минимальный бот
Зайдите по SSH, поставьте Python и положите небольшого бота на discord.py:
sudo apt update && sudo apt install -y python3-venv
mkdir ~/bot && cd ~/bot
python3 -m venv venv && source venv/bin/activate
pip install -U discord.py
# bot.py
import os, discord
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f"online as {client.user}")
@client.event
async def on_message(m):
if m.author == client.user:
return
if m.content == "!ping":
await m.channel.send("pong")
client.run(os.environ["DISCORD_TOKEN"])
Токен берётся в Discord Developer Portal (ваше приложение → Bot → Reset Token); там же включите интент Message Content, если бот читает сообщения.
Держим живым через systemd
Запуск python bot.py в SSH-сессии означает, что бот умрёт с отключением. systemd-сервис это решает — перезапуск при падении и переживание ребута:
# /etc/systemd/system/discordbot.service
[Unit]
Description=Discord bot
After=network-online.target
[Service]
User=botuser
WorkingDirectory=/home/botuser/bot
Environment=DISCORD_TOKEN=your-token-here
ExecStart=/home/botuser/bot/venv/bin/python bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now discordbot
sudo journalctl -u discordbot -f # смотрим логи
Это и есть разница между «скриптом, который я запускаю» и «ботом, который работает сам».
Честные оговорки
- Берегите токен. Держите его в service-файле (root-only) или переменной окружения, запускайте под не-root
botuser, не коммитьте. Если утёк — сразу сбросьте в Developer Portal. - Голос тяжелее. Музыкальный/голосовой бот, стримящий на много серверов, требует больше CPU и трафика, чем текстовый — берите с запасом и тестируйте перед масштабированием.
- Следите за тем, что бот делает, а не только хостит. Хостинг дешёвый; если бот в цикле дёргает платные API — расходы там.
В этих рамках Discord-бот на собственном сервере просто остаётся онлайн — в этом весь смысл. Выберите тариф, платите криптой, и он онлайн за минуты. Если у вас и другие боты — тот же systemd-паттерн держит любой процесс живым.