Neckrez

Как запустить Telegram-бота 24/7 на VPS (Python + systemd)

Бот на ноутбуке умирает, когда закрываешь крышку. Разбираем, как запустить его на VPS: он работает без перерыва, сам перезапускается после сбоя и перезагрузки и стоит $10 в месяц.

Чтобы Telegram-бот работал круглосуточно, разместите его на VPS и запустите как службу systemd. systemd запускает бота при старте сервера и перезапускает его за несколько секунд после сбоя. В статье — путь от пустого сервера до работающего Python-бота примерно за десять минут, с точными командами.

Почему VPS, а не ноутбук

  • Всегда онлайн — ноутбук засыпает, теряет Wi-Fi и перезагружается из-за обновлений, а сервер — нет.
  • Перезапускается сам — systemd возвращает бота после сбоя или перезагрузки без вашего участия.
  • Недорого — бот, который опрашивает Telegram, почти не нагружает процессор и память, хватит самого маленького тарифа.

Простое правило: бот с опросом Telegram спокойно работает на 1 vCPU и 1 ГБ оперативной памяти. Тариф Quark в Neckrez (1 vCPU, 1 ГБ, $10 в месяц) подходит. Переходите на Ion, только если у бота большая база данных или тяжёлые задачи.

Как это сделать в Neckrez

  • 1. Зарегистрируйтесь по почте — без KYC, без карты и номера телефона.
  • 2. Пополните баланс криптой — от $15. USDT в сетях BEP20, TON, Polygon или Solana стоит всего несколько центов комиссии.
  • 3. Разверните сервер — выберите Ubuntu, любую локацию рядом с вами и тариф Quark.
  • 4. Подождите около минуты — вы получите выделенный IPv4-адрес и полный root-доступ.
  • 5. Платите почасово — списание идёт, только пока сервер существует, поэтому можно тестировать и удалять его когда угодно.

Подробнее об этом сценарии — на странице VPS для ботов.

Подготовьте сервер

Подключитесь под root по IP-адресу из личного кабинета, обновите систему и создайте отдельного пользователя для бота. Запускать бота от root плохая идея: если бота взломают, пострадает весь сервер.

ssh root@YOUR_SERVER_IP
apt update && apt upgrade -y
apt install -y python3 python3-venv ufw
adduser --disabled-password --gecos "" botuser

Установите бота

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

su - botuser
mkdir -p ~/bot && cd ~/bot
python3 -m venv venv
./venv/bin/pip install python-telegram-bot

Сохраните минимального бота как bot.py в этой папке. Он отвечает на /start — этого достаточно, чтобы убедиться, что всё работает. Потом замените его своим кодом.

import os
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("The bot is running 24/7")

app = ApplicationBuilder().token(os.environ["BOT_TOKEN"]).build()
app.add_handler(CommandHandler("start", start))
app.run_polling()

Не храните токен бота в коде. Положите его в файл, который читает только пользователь бота:

echo 'BOT_TOKEN=PASTE_YOUR_TOKEN_FROM_BOTFATHER' > ~/bot/.env
chmod 600 ~/bot/.env
exit

Запустите как службу systemd

Снова под root создайте файл службы. Строка Restart=always — та самая, которая держит бота живым.

nano /etc/systemd/system/bot.service
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target

[Service]
User=botuser
WorkingDirectory=/home/botuser/bot
EnvironmentFile=/home/botuser/bot/.env
ExecStart=/home/botuser/bot/venv/bin/python bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Включите автозапуск при каждой загрузке, запустите сейчас и проверьте, что служба работает:

systemctl daemon-reload
systemctl enable --now bot
systemctl status bot
journalctl -u bot -f

Отправьте /start своему боту в Telegram: он должен ответить. Выйти из просмотра журнала можно по Ctrl+C. После изменения кода применяйте его командой systemctl restart bot.

Закройте сервер

Бот с опросом только делает исходящие соединения, поэтому открытым должен быть один SSH:

ufw allow OpenSSH
ufw enable

Одна честная оговорка: в статье используется опрос (polling) как самый простой способ. Вебхуки реагируют быстрее, но требуют домена и HTTPS, поэтому начните с опроса и переходите, только если это нужно.

Что полезно для сервера с ботом

  • Почасовая оплата — поднимите второй сервер, чтобы проверить рискованное изменение, затем удалите его и заплатите за несколько часов.
  • Снимки — сделайте резервную копию перед большим обновлением, её можно восстановить на новый сервер позже (хранится 7 дней).
  • Мгновенная смена IP — на серверах Vultr, если адрес попал в чёрный список, его можно сменить без пересоздания сервера.
  • Бесплатная защита от DDoS на каждом тарифе.

FAQ

Нужен ли домен? Нет. Бот с опросом Telegram использует только IP-адрес сервера.

Запустится ли бот после перезагрузки? Да. systemctl enable запускает его при загрузке, а Restart=always возвращает после сбоя.

Сколько это стоит? Тариф Quark — $10 в месяц с почасовой оплатой, платить можно криптой.

Начать

Тарифы от $10 в месяц с почасовой оплатой. Разверните сервер и запустите бота.