VPS для Telegram-бота: как запустить и держать его живым
Бот написан, на компьютере работает, отвечает на команды. Но стоит закрыть ноутбук - и он замолкает. Чтобы бот отвечал круглосуточно, ему нужен сервер, который никогда не выключается. Для этой задачи берут VPS.
Разберём, почему для бота подходит именно виртуальный сервер, а не обычный хостинг, сколько ресурсов ему заложить, чем отличаются два способа работы с Telegram и как запустить бота так, чтобы он держался в работе месяцами и сам поднимался после перезагрузки.
Почему боту нужен VPS, а не хостинг
Обычный виртуальный хостинг рассчитан на сайты: пришёл запрос, отдалась страница, процесс завершился. Бот устроен иначе - это программа, которая работает постоянно, годами не завершаясь, и всё время слушает Telegram на предмет новых сообщений.
Хостинг такое чаще всего запрещает: долгоживущие фоновые процессы там либо не разрешены, либо принудительно завершаются. VPS даёт то, чего боту не хватает на хостинге:
- постоянно работающий процесс без ограничений по времени;
- полный доступ, чтобы поставить нужную версию Python или Node и любые библиотеки;
- свой белый IP, если бот работает через webhook;
- автозапуск после перезагрузки сервера.
Локальный компьютер или ноутбук на эту роль не годятся: их выключают, у них рвётся интернет, они уходят в сон. Боту нужна машина, которая просто всегда включена.
Сколько ресурсов нужно боту
Хорошая новость: боту нужно совсем немного. Логика простая - большинство ботов почти всё время ждут сообщений и почти не нагружают процессор.
| Тип бота | vCPU | RAM | Диск |
|---|---|---|---|
| Простой бот: команды, уведомления | 1 | 1 ГБ | 10 ГБ NVMe |
| Бот с базой данных, до 10 000 пользователей | 1 | 2 ГБ | 20 ГБ NVMe |
| Бот с обработкой картинок или файлов | 2 | 2 ГБ | 20 ГБ NVMe |
| Бот с нейросетью или тяжёлой логикой | 2 | 4 ГБ | 40 ГБ NVMe |
| Несколько ботов на одной машине | 2 | 4 ГБ | 40 ГБ NVMe |
Самый скромный тариф закрывает потребности типичного бота с запасом. Наращивать ресурсы имеет смысл, только когда появляется тяжёлая обработка: генерация изображений, обращения к нейросетям, работа с большими файлами.
Система - любой Linux, лучше всего Ubuntu Server LTS: под неё больше всего примеров и готовых инструкций.
Polling или webhook: два способа работы
У Telegram-бота есть два способа получать сообщения, и от выбора зависит, нужен ли боту домен.
Polling - бот сам постоянно спрашивает Telegram: "есть новые сообщения?". Работает из коробки, ничего дополнительно настраивать не нужно, домен и SSL не требуются. Это способ по умолчанию, с него все начинают.
Webhook - наоборот: Telegram сам присылает сообщение боту, как только оно приходит. Работает быстрее и экономичнее, но требует домен с SSL-сертификатом, потому что Telegram шлёт данные только на HTTPS-адрес.
| Polling | Webhook | |
|---|---|---|
| Кто инициирует | Бот спрашивает Telegram | Telegram шлёт боту |
| Нужен домен и SSL | Нет | Да |
| Сложность запуска | Минимальная | Выше |
| Нагрузка | Чуть выше | Ниже |
| Когда выбирать | Старт, большинство ботов | Высокие нагрузки, много сообщений |
Практический совет: начинайте с polling. Его достаточно для абсолютного большинства ботов, и он не требует ни домена, ни возни с сертификатами. На webhook переходят позже, если бот вырастает в нагруженный сервис.
Как запустить бота на сервере
После аренды сервер нужно подготовить: обновить систему и провести базовую настройку безопасности. Это подробно расписано в статье настройка VPS с нуля, пройдите её первым делом.
Дальше на примере Python-бота. Ставим Python и загружаем код бота на сервер:
sudo apt update
sudo apt install python3 python3-pip python3-venv -yСоздаём отдельное окружение для зависимостей бота, чтобы не смешивать их с системными:
cd ~/mybot
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txtПроверяем, что бот вообще запускается:
python3 bot.pyЕсли бот ответил в Telegram - код рабочий. Но запущенный так бот живёт только пока открыта сессия SSH: закроете терминал, и он остановится. Нужен способ держать его в работе постоянно.
Чтобы бот не падал: systemd
Правильный способ держать бота живым на Linux - оформить его как системную службу через systemd. Тогда бот запустится сам после перезагрузки сервера и автоматически перезапустится, если вдруг упадёт.
Создаём файл службы:
sudo nano /etc/systemd/system/mybot.serviceСодержимое (пути и имя пользователя подставьте свои):
[Unit]
Description=Telegram Bot
After=network.target
[Service]
Type=simple
User=mike
WorkingDirectory=/home/mike/mybot
ExecStart=/home/mike/mybot/venv/bin/python3 bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetКлючевая строка здесь - Restart=always: если бот по любой причине завершится, systemd поднимет его заново через 5 секунд.
Включаем автозапуск и стартуем бота:
sudo systemctl daemon-reload
sudo systemctl enable --now mybotПроверяем, что всё работает:
sudo systemctl status mybotСтрока active (running) означает, что бот запущен и находится под присмотром systemd. Теперь он переживёт и закрытие SSH, и перезагрузку сервера.
Смотреть логи бота, если что-то идёт не так:
journalctl -u mybot -fАльтернатива: Docker
Если бот уже упакован в Docker, его запускают контейнером с флагом автоперезапуска:
docker run -d --restart=always --name mybot mybot-imageФлаг --restart=always делает то же, что Restart=always в systemd: контейнер поднимется после перезагрузки и после падения. Для работы с Docker сервер должен быть на KVM-виртуализации, на OpenVZ он работает с ограничениями.
Частые ошибки
Запустили бота через python3 bot.py и закрыли SSH. Бот остановился вместе с сессией. Нужен systemd или Docker, а не запуск руками.
Не поставили автоперезапуск. Бот упал ночью из-за ошибки и лежит до утра. Restart=always поднимает его сам.
Держат бота на бесплатном хостинге или в бесплатном облаке. Такие площадки усыпляют неактивные процессы, и бот замолкает. Для постоянной работы нужен полноценный сервер.
Токен бота лежит прямо в коде на сервере в открытом виде. Выносите токен в переменные окружения или отдельный файл с ограниченными правами, а сам код не выкладывайте в публичные репозитории с токеном внутри.
Взяли webhook, не разобравшись. Без домена и SSL webhook не заработает, а polling дал бы результат сразу. Начинайте с polling.
Частые вопросы
Какой язык и библиотека - неважно для сервера? Верно, серверу всё равно. Python с aiogram или python-telegram-bot, Node.js с Telegraf, что угодно другое - все работают на обычном Linux VPS одинаково. Меняется только команда запуска в службе.
Сколько ботов можно держать на одном сервере? Несколько простых ботов спокойно живут на одной машине с 1-2 ГБ памяти. Каждый оформляется отдельной службой systemd. Ограничение не в количестве, а в суммарной нагрузке.
Нужен ли боту статический IP? Для polling - нет, бот сам обращается к Telegram. Статический белый IP нужен для webhook, потому что Telegram должен знать постоянный адрес, куда слать сообщения. У VPS белый IP есть по умолчанию.
Что будет с ботом при перезагрузке сервера? Если бот оформлен как служба systemd с enable, он запустится автоматически сразу после загрузки системы. Именно для этого его и делают службой, а не запускают руками.
Бот иногда перестаёт отвечать, в чём дело? Частые причины: процесс упал без автоперезапуска, кончилась память, или бот словил необработанную ошибку. Посмотрите логи через journalctl -u имя_бота - там будет видно, что произошло. Restart=always защищает от первого случая.
Можно ли на этом же сервере держать ещё и сайт бота? Да, на одном VPS спокойно уживаются бот, его база данных и небольшой сайт. Это одна из причин брать VPS, а не отдельные площадки под каждую задачу.
Нужен сервер под Telegram-бота? VPS на Linux и NVMe с root-доступом и белым IP, активация за 3 минуты. Хватит самого доступного тарифа, а нарастить ресурсы под нейросеть можно за минуты. Первые 7 дней - тестовый период с возвратом средств.
Что дальше
- Тарифы VPS и VDS в Москве и Казани: NVMe, защита от DDoS, активация за 3 минуты
- Аренда VPS в Европе с оплатой в рублях: серверы в Амстердаме, карты МИР, счета для юрлиц РФ