Telegram-бот на VPS: развёртывание за 59 ₽/мес

Боты, ИИ и автоматизация
Telegram-бот на VPS: развёртывание за 59 ₽/мес

Telegram-бот на сервере — это единственный способ заставить его работать 24/7: домашний компьютер выключается, ноутбук уходит в сон, а интернет провайдера падает в самый неподходящий момент. Хорошая новость: VPS для бота не обязан стоить как полноценный сервер для сайта. Боту не нужны ни входящий трафик, ни выделенный IP-адрес — он сам ходит к API Telegram исходящими запросами. Это значит, что подойдёт NAT VPS за 59 ₽/мес, и в этой статье мы пошагово развернём на нём бота на Python и aiogram: от первого SSH-подключения до автозапуска через systemd на Ubuntu 24.04 LTS.

Почему боту нужен сервер, а не домашний компьютер

Запустить бота можно и на своём ПК — ровно до первой перезагрузки Windows ради обновлений. Сервер решает четыре проблемы сразу:

  • Круглосуточная работа. VPS не выключается, не уходит в сон и не зависит от вашего домашнего электричества. У нормального хостинга uptime составляет 99,9%.
  • Стабильный интернет. Канал 100 Мбит/с из дата-центра надёжнее домашнего Wi-Fi, а до серверов Telegram из европейского дата-центра пинг обычно ниже, чем из квартиры.
  • Изоляция. Бот не мешает вашим играм и рабочим программам, а вы — боту.
  • Автовосстановление. systemd перезапустит упавший процесс за секунды — дома это пришлось бы делать руками.

Почему VPS для бота может стоить 59 рублей: главное про NAT

Классический VPS стоит от 400–500 рублей, и заметная часть цены — выделенный IPv4-адрес: адреса закончились ещё в 2019 году, и хостеры покупают их на вторичном рынке (подробнее — в статье про дефицит IPv4). Но Telegram-боту выделенный IP не нужен в принципе.

Стандартная схема работы бота — long polling: скрипт сам обращается к api.telegram.org и спрашивает «есть новые сообщения?». Все соединения — исходящие. Никто не должен «достучаться» до вашего сервера снаружи, поэтому общий IP-адрес на NAT VPS ничем не мешает.

NAT VPS — это обычный KVM-сервер, который делит один IPv4 с соседями. У Cheap-Host такие серверы размещены в Германии: тариф NAT Start за 59 ₽/мес даёт 1 vCPU, 1 ГБ RAM и 10 ГБ NVMe — для бота на aiogram этого хватает с многократным запасом. Из ограничений: закрыт порт 25 (SMTP) и вместо всех портов вам выдаётся диапазон из 999 TCP/UDP-портов плюс отдельный SSH-порт. Для long polling ни то, ни другое не имеет значения.

Что понадобится перед началом

  1. Токен бота. Напишите @BotFather в Telegram, команда /newbot — получите токен вида 1234567890:AAE....
  2. Сервер с Ubuntu 24.04 LTS. На Cheap-Host сервер разворачивается автоматически за 45–60 секунд: IP, SSH-порт и пароль приходят сразу после оплаты.
  3. SSH-клиент. В Windows 10/11, macOS и Linux он встроен в терминал.

Шаг 1. Подключаемся к серверу по SSH

В письме от хостинга будут IP, порт SSH и пароль root. Подключаемся (порт указан для примера):

ssh root@203.0.113.10 -p 22022

Если SSH для вас в новинку — держите подробный разбор подключения к VPS по SSH с Windows, macOS и Linux. Первым делом обновим систему:

apt update && apt upgrade -y

Шаг 2. Устанавливаем Python и создаём виртуальное окружение

В Ubuntu 24.04 уже стоит Python 3.12, но модуль venv нужно доставить:

apt install -y python3-venv python3-pip
mkdir -p /opt/tgbot && cd /opt/tgbot
python3 -m venv venv
source venv/bin/activate

Виртуальное окружение изолирует зависимости бота от системного Python — так обновления системы не сломают бота, и наоборот.

Шаг 3. Ставим aiogram и пишем код бота

Устанавливаем aiogram — самую популярную асинхронную библиотеку для Telegram-ботов на Python:

pip install aiogram

Создаём файл /opt/tgbot/bot.py с минимальным эхо-ботом:

import asyncio
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message

TOKEN = "ВАШ_ТОКЕН_ОТ_BOTFATHER"

dp = Dispatcher()

@dp.message(CommandStart())
async def cmd_start(message: Message):
    await message.answer("Привет! Я работаю на VPS за 59 рублей.")

@dp.message()
async def echo(message: Message):
    await message.answer(message.text)

async def main():
    bot = Bot(token=TOKEN)
    await dp.start_polling(bot)

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

В реальном проекте токен лучше вынести в переменную окружения или файл .env, а не хранить в коде.

Шаг 4. Тестовый запуск

python bot.py

Откройте своего бота в Telegram и отправьте /start — он должен ответить. Работает? Останавливаем его сочетанием Ctrl+C: сейчас бот привязан к SSH-сессии и умрёт вместе с ней, а нам нужна настоящая работа 24/7.

Шаг 5. Создаём службу systemd для работы 24/7

systemd — штатный менеджер служб Linux: он запустит бота при старте сервера и поднимет его после любого падения. Создаём unit-файл /etc/systemd/system/tgbot.service:

[Unit]
Description=Telegram bot (aiogram)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=/opt/tgbot
ExecStart=/opt/tgbot/venv/bin/python /opt/tgbot/bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Обратите внимание: в ExecStart указан Python именно из виртуального окружения — активировать venv отдельно не нужно. Запускаем и включаем автозапуск:

systemctl daemon-reload
systemctl enable --now tgbot
systemctl status tgbot

Статус active (running) означает, что бот работает и переживёт и перезагрузку сервера, и падение скрипта. Больше приёмов работы с юнитами — в статье о создании своих служб systemd.

Логи и обновление бота

Все сообщения бота (включая трейсбеки Python) попадают в журнал systemd:

journalctl -u tgbot -f             # логи в реальном времени
journalctl -u tgbot --since today  # логи за сегодня

Обновление кода сводится к двум действиям: залить новый файл (scp bot.py root@IP:/opt/tgbot/ или git pull) и перезапустить службу:

systemctl restart tgbot

Сколько ресурсов нужно боту: выбираем тариф

Эхо-бот на aiogram потребляет 40–80 МБ RAM. Ориентиры по тарифам NAT VPS Cheap-Host:

ТарифЦенаРесурсыКому подходит
NAT Start59 ₽/мес1 vCPU, 1 ГБ RAM, 10 ГБ NVMe1–3 бота, SQLite, до сотен пользователей в день
NAT Base99 ₽/мес1 vCPU, 2 ГБ RAM, 15 ГБ NVMeБот + PostgreSQL/Redis, обработка фото
NAT Pro199 ₽/мес2 vCPU, 4 ГБ RAM, 25 ГБ NVMeНесколько активных ботов, парсинг, очереди задач

Во всех тарифах — KVM с полным root, NVMe-диск и безлимитный трафик, а апгрейд на старший тариф выполняется без потери данных. Если рядом с ботом планируете крутить и другие скрипты — почитайте, как запускать Python-скрипты на сервере 24/7.

FAQ

Нужен ли Telegram-боту выделенный IP-адрес?

Нет. Бот на long polling сам опрашивает серверы Telegram исходящими запросами, входящие соединения ему не нужны. Поэтому бот отлично работает на NAT VPS с общим IPv4 — это и позволяет платить 59 рублей вместо 450.

Хватит ли 1 ГБ RAM для Telegram-бота?

Да, с запасом. Бот на aiogram обычно потребляет 40–80 МБ памяти. На 1 ГБ помещаются несколько ботов плюс SQLite-база. Больше памяти нужно, только если бот обрабатывает медиа или держит тысячи одновременных диалогов.

Что будет с ботом при перезагрузке сервера?

Если бот оформлен как служба systemd и включён через systemctl enable, он стартует автоматически. Restart=always дополнительно перезапустит бота при падении скрипта.

Можно ли использовать вебхуки на NAT VPS?

Можно, но сложнее: вебхук Telegram требует HTTPS на портах 443, 80, 88 или 8443, а на NAT VPS выдаётся диапазон нестандартных портов. Практичнее long polling — при нагрузке до десятков сообщений в секунду разницы вы не заметите.

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

Залейте новый bot.py и выполните systemctl restart tgbot. Перезапуск занимает 1–2 секунды, а сообщения, пришедшие за это время, Telegram отдаст при следующем опросе — пользователи ничего не потеряют.

Вывод

Развёртывание Telegram-бота на VPS занимает полчаса: SSH, python3 -m venv, pip install aiogram, unit-файл systemd — и бот работает круглосуточно, переживая перезагрузки и падения. Ключевая экономия в том, что боту не нужен ни входящий трафик, ни выделенный IP, поэтому переплачивать за классический VPS незачем. Если для этой задачи вам нужен сервер — у Cheap-Host есть NAT Start от 59 ₽/мес: NVMe, KVM, безлимитный трафик и выдача сервера за минуту.

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