MAATRIX GAMES / Блог / Как поднять сервер Telegram-бот: пошаговая инструкция

Как поднять сервер Telegram-бот: пошаговая инструкция

MAATRIX GAMES

Бот, который живёт только пока открыт ваш ноутбук, — это не бот, а демо-версия. Рано или поздно он понадобится 24/7: слать уведомления, отвечать в чате комьюнити, дёргать RCON игрового сервера по команде. Разворачиваем всё с нуля на VPS — от токена у BotFather до systemd-юнита, который сам поднимет бота после ребута хоста, без плясок с screen и tmux.

Системные требования

Telegram-бот — это не игровой сервер, ресурсов ему нужно в разы меньше. Но экономить до нуля тоже не стоит, особенно если бот будет держать соединение с базой или обрабатывать медиа.

  • RAM: от 512 МБ для простого бота на long polling с парой команд. Если бот работает с базой данных (SQLite сойдёт и на 512 МБ, PostgreSQL лучше закладывать от 1 ГБ), добавляет фильтры на медиа или держит несколько ботов на одной машине — берите 1-2 ГБ.
  • CPU: 1 ядро хватает почти всегда. Боты — event-driven, не гоняют вычисления постоянно, ядро простаивает большую часть времени.
  • Диск: 5-10 ГБ с запасом под ОС, логи и, если понадобится, локальную БД. Под SSD/NVMe диск не обязателен так жёстко, как для игровых серверов, но лишним не будет.
  • ОС: Ubuntu 22.04/24.04 LTS или Debian 12 — под них максимум готовых инструкций и пакетов без плясок с бэкпортами.
  • Сеть: для long polling входящие порты не нужны вообще, бот сам стучится к Telegram. Для webhook нужен белый IP и открытый 443 (или 80/88/8443 — Telegram принимает несколько портов).

Если планируете на той же машине держать что-то ещё, например игровой сервер с ботом-уведомителем поверх, посмотрите требования конкретной игры — например, в статье про подъём сервера Minecraft — и суммируйте RAM.

Создание бота через BotFather и получение токена

Всё начинается в самом Telegram, без единой команды в терминале.

  1. Найдите в Telegram бота @BotFather — это официальный бот от самой платформы, единственный способ зарегистрировать нового бота.
  2. Отправьте команду /newbot.
  3. Укажите отображаемое имя бота (можно на русском, можно менять потом).
  4. Укажите username бота — обязательно латиницей и обязательно заканчивается на bot (например, myserver_notify_bot). Username менять сложнее, продумайте сразу.
  5. BotFather пришлёт токен вида 123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw. Это ключ полного доступа к боту — с ним можно слать сообщения от его имени, менять команды, читать апдейты.

Токен нигде не публикуйте — ни в публичном репозитории, ни в скриншоте, ни в чате поддержки. Если он всё же утёк, в BotFather есть команда /revoke — она выдаст новый токен и отзовёт старый.

Заодно сразу настройте через BotFather:

  • /setdescription — описание бота, которое видно до старта диалога.
  • /setcommands — список команд с подсказками (start - Запустить бота, каждая команда с новой строки).
  • /setprivacy — если бот будет добавлен в группы и должен видеть все сообщения, а не только адресованные ему командой, отключите Privacy Mode (Disable).

Поднять сервер Telegram-бот за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Установка окружения: Python или Node.js

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

Python — чаще выбирают за счёт скорости написания и обилия готовых сниппетов:

sudo apt update && sudo apt install -y python3 python3-pip python3-venv git

Создаём отдельного пользователя, чтобы бот не крутился под root, и виртуальное окружение — иначе рано или поздно словите конфликт версий пакетов с системным Python:

sudo useradd -m -s /bin/bash botuser
sudo su - botuser
mkdir ~/mybot && cd ~/mybot
python3 -m venv venv
source venv/bin/activate

Node.js — удобен, если вы уже пишете на JS/TS или бот интегрируется с веб-частью проекта. Ставим через nvm, чтобы не зависеть от старой версии в репозиториях Ubuntu:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.bashrc
nvm install --lts
node -v

Оба варианта одинаково пригодны для 24/7-бота — выбор между ними это вопрос вкуса и остального стека проекта, а не производительности.

Установка библиотеки и минимальный рабочий бот

Готовых библиотек для Telegram Bot API много, но по факту для старта достаточно одной из этих (беру их как примеры, а не как единственно верный выбор):

  • aiogram (Python, асинхронный, самый активно развивающийся вариант на сегодня).
  • python-telegram-bot (Python, тоже асинхронный с версии 20.x, чуть более многословный API, зато отличная документация).
  • node-telegram-bot-api (Node.js, простой и старый проверенный вариант).

Пример на aiogram — минимальный бот с одной командой:

pip install aiogram

# bot.py
import asyncio
import os
from aiogram import Bot, Dispatcher
from aiogram.filters import Command
from aiogram.types import Message

bot = Bot(token=os.environ["BOT_TOKEN"])
dp = Dispatcher()

@dp.message(Command("start"))
async def cmd_start(message: Message):
    await message.answer("Бот на связи, сервер держится")

async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

Тот же функционал на node-telegram-bot-api:

npm init -y
npm install node-telegram-bot-api

// bot.js
const TelegramBot = require('node-telegram-bot-api');
const token = process.env.BOT_TOKEN;
const bot = new TelegramBot(token, { polling: true });

bot.onText(/\/start/, (msg) => {
  bot.sendMessage(msg.chat.id, 'Бот на связи, сервер держится');
});

Запускаем и проверяем, что бот реально отвечает в Telegram:

export BOT_TOKEN="ваш_токен_от_BotFather"
python3 bot.py
# или
node bot.js

Если бот молчит — первым делом проверяйте, что токен скопирован без пробелов и что вы не забыли /setprivacy Disable, если это групповой бот.

Long polling или webhook — в чём разница

Способ доставки апдейтов от Telegram к вашему боту — первая архитектурная развилка, и для старта она важнее, чем выбор библиотеки.

Long polling — бот сам раз в несколько секунд стучится к серверам Telegram и спрашивает: "есть новые сообщения?". Плюсы: не нужен белый IP, не нужен SSL-сертификат, не нужно открывать порты — работает даже за NAT. Минусы: чуть выше задержка ответа (обычно доли секунды, но не гарантированный instant), и держится постоянное соединение — при большом количестве ботов на одной машине это ощутимая нагрузка на сеть.

Webhook — Telegram сам присылает апдейты POST-запросом на ваш HTTPS-эндпоинт, как только что-то происходит. Плюсы: минимальная задержка, ниже накладные расходы при высокой нагрузке. Минусы: нужен действующий SSL-сертификат (самоподписанный тоже подходит, но с нюансами настройки), нужен открытый порт и настроенный веб-сервер (nginx как reverse proxy — стандартная связка).

Для одного бота с умеренной нагрузкой long polling — разумная стартовая точка: меньше движущихся частей, меньше что может сломаться. На webhook имеет смысл переходить, когда ботов несколько на одном IP или когда важна минимальная задержка (например, бот встроен в торговый или уведомительный пайплайн). aiogram и python-telegram-bot поддерживают оба режима без смены библиотеки — переключение это по сути замена start_polling() на start_webhook() с указанием URL и сертификата.

Автозапуск через systemd и хранение токена

Ручной запуск командой python3 bot.py умирает вместе с SSH-сессией. Решение то же, что для игровых серверов, — systemd-юнит с автоматическим рестартом. Тот же подход подробно разобран в статье про автозапуск сервера Rust, здесь адаптируем его под бота.

Создаём /etc/systemd/system/mybot.service:

[Unit]
Description=Telegram Bot
After=network.target

[Service]
Type=simple
User=botuser
WorkingDirectory=/home/botuser/mybot
Environment=BOT_TOKEN=ваш_токен_от_BotFather
ExecStart=/home/botuser/mybot/venv/bin/python3 bot.py
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Для Node.js версии меняете только ExecStart на /usr/bin/node /home/botuser/mybot/bot.js (путь к node уточните командой which node, у nvm он не в /usr/bin).

Хранить токен прямо в юните — рабочий, но не лучший вариант: файл юнита читаем любым процессом с root-правами, и токен легко случайно попадёт в дамп конфигурации. Чище — вынести секреты в отдельный файл, недоступный на чтение никому кроме пользователя бота:

sudo mkdir -p /etc/mybot
echo "BOT_TOKEN=ваш_токен_от_BotFather" | sudo tee /etc/mybot/env
sudo chmod 600 /etc/mybot/env
sudo chown botuser:botuser /etc/mybot/env

И в юните вместо Environment= подключаем файл:

EnvironmentFile=/etc/mybot/env

Применяем и запускаем:

sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo systemctl status mybot
journalctl -u mybot -f

Последняя команда — живые логи бота, самое частое место, куда вы будете заглядывать при отладке. Никогда не коммитьте .env или файл с токеном в git — если проект под версионным контролем, сразу добавьте .env и env в .gitignore.

Поднять сервер Telegram-бот за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

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

Можно ли запустить несколько ботов на одной VPS с 512 МБ?

Да, если боты лёгкие и на long polling — каждый съедает обычно 30-80 МБ памяти в состоянии простоя. Но закладывайте запас: два-три простых бота на 512 МБ уживутся, для большего количества берите 1 ГБ и выше.

Бот перестаёт отвечать через какое-то время без явной ошибки в логах.

Частая причина — процесс убит OOM killer из-за нехватки памяти (проверьте dmesg | grep -i oom), либо оборвалось соединение и polling завис без исключения. Помогает Restart=on-failure в systemd-юните и разумный RestartSec, чтобы не заддосить самого себя частыми рестартами при реальной проблеме на стороне Telegram.

Нужен ли отдельный VPS под бота, если у меня уже есть игровой сервер?

Необязательно — лёгкий бот спокойно живёт на той же машине рядом с игровым сервером, если есть запас по RAM сверх требований игры. Отдельная VPS оправдана, когда бот критичен для бизнеса (например, обрабатывает платежи или уведомления саппорта) и вы не хотите, чтобы падение или перегрузка игрового сервера утянула его за собой.

Как обновить код бота без простоя?

Загружаете новую версию файлов на сервер (git pull или scp), затем sudo systemctl restart mybot — простой обычно укладывается в 1-2 секунды, для большинства ботов это незаметно. Для нулевого даунтайма нужен уже blue-green деплой с двумя инстансами за балансировщиком, но для одиночного бота это избыточная сложность.

Чем polling отличается от webhook по нагрузке на VPS?

На стороне бота polling чуть тяжелее по сетевому трафику из-за постоянных запросов, но для одного-двух ботов разница не заметна на глаз. Webhook требует держать веб-сервер (nginx/aiohttp) и валидный SSL, что добавляет собственные точки отказа — сертификат может протухнуть, порт может оказаться закрыт файрволом.