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 ни то, ни другое не имеет значения.
Что понадобится перед началом
- Токен бота. Напишите
@BotFatherв Telegram, команда/newbot— получите токен вида1234567890:AAE.... - Сервер с Ubuntu 24.04 LTS. На Cheap-Host сервер разворачивается автоматически за 45–60 секунд: IP, SSH-порт и пароль приходят сразу после оплаты.
- 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 Start | 59 ₽/мес | 1 vCPU, 1 ГБ RAM, 10 ГБ NVMe | 1–3 бота, SQLite, до сотен пользователей в день |
| NAT Base | 99 ₽/мес | 1 vCPU, 2 ГБ RAM, 15 ГБ NVMe | Бот + PostgreSQL/Redis, обработка фото |
| NAT Pro | 199 ₽/мес | 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, безлимитный трафик и выдача сервера за минуту.