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-патерн тримає будь-який процес живим.