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

Локально бот открывается в пару строк, но настоящий бот живёт на сервере 24/7. Разбираем весь путь: токен, выбор хостинга, деплой, автозапуск через systemd, вебхуки и мониторинг.

Бот, который работает только пока открыт терминал на вашем ноутбуке, — это не бот, а демонстрация. Настоящий Telegram-бот должен отвечать круглосуточно и независимо от вашего сна и интернета, — а значит, ему нужен хостинг. В этой статье пройдём весь путь от локального скрипта до работающего на сервере процесса, шаг за шагом.

Шаги описаны на примере Python и aiogram, но почти всё то же самое справедливо для Node.js и Telegraf — отличия минимальны и оговорены отдельно.

Шаг 1. Получите токен и почистите секреты

Если бота ещё нет, откройте @BotFather в Telegram и создайте бота командой /newbot. Вы получите токен вида 1234567890:AA... — это ключ доступа к Bot API, и хранить его нужно аккуратно: не в коде, а в переменных окружения или файле .env. Создайте файл .env рядом с проектом:

BOT_TOKEN=1234567890:AA...

И сразу добавьте .env в .gitignore — иначе рано или поздно токен уедет в публичный репозиторий. Утечка токена означает, что ботом сможет управлять кто угодно; «перевыпустить» его можно у BotFather командой /revoke.

Шаг 2. Решите, как бот будет общаться с Telegram: polling или webhook

Есть два способа получать апдейты:

  • long polling — бот сам делает запросы к серверам Telegram. Проще всего: не нужен домен, не нужен HTTPS-сертификат, работает даже на сервере без белого IP. Минус — чуть больше служебного трафика.
  • webhook — Telegram сам кладёт апдейты на ваш HTTPS-эндпоинт. Экономнее по ресурсам и обязателен для serverless-хостинга, но требует домена с валидным сертификатом.

Для первого опыта выбирайте long polling — он прощает ошибки конфигурации. Позже, когда захотите serverless или веб-эндпоинт, перейдёте на webhook: в aiogram это одна строка запуска.

Шаг 3. Выберите, где бот будет жить

Три принципиально разных пути:

  1. VPS — виртуальный сервер, который вы настраиваете сами. Максимум контроля и дешёвая цена: смотрите Timeweb Cloud, Beget VPS, Selectel, VDSina или Aeza.
  2. PaaS из Git — вы пушите код, платформа сама собирает и запускает его. Без администрирования, но дороже за то же: например, Amvera Cloud для оплаты российскими картами, Railway или Render для глобальных платформ.
  3. Serverless — бот как функция, которая просыпается на каждом апдейте. Подходит, если готовы перейти на webhook: смотрите Yandex Cloud Functions.

Для шагов ниже предполагаем VPS — это самый универсальный вариант, на котором понятно, за что вы платите.

Шаг 4. Подготовьте проект к деплою

Мини-чеклист перед заливкой на сервер:

  • requirements.txt (или pyproject.toml) со всеми зависимостями и зафиксированными версиями;
  • точка входа — файл bot.py, где вызов запуска цикла вынесен в понятную функцию;
  • конфигурация через .env-переменные, а не через константы в коде;
  • строка логирования хотя бы по основным событиям: logging из стандартной библиотеки достаточно;
  • желательно — обработка ошибок на уровне цикла: упавший на исключении бот больше не отвечает, пока его не перезапустят.

Шаг 5. Залейте код на сервер

На VPS хватит Git’а: качайте на сервер, не пересылая файлы вручную.

ssh root@ваш-сервер
apt update && apt install -y python3 python3-venv git
git clone https://github.com/ваш-логин/ваш-бот.git
cd ваш-бот
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env && nano .env

Запустите бота в фоне хотя бы через nohup, чтобы проверить, что всё работает: логи и токен на месте, нет ошибок импорта.

Шаг 6. Сделайте автозапуск через systemd

nohup — игрушка; настоящий друг бота — systemd. Создайте unit-файл /etc/systemd/system/tg-bot.service:

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

[Service]
User=bot
WorkingDirectory=/home/bot/ваш-бот
ExecStart=/home/bot/ваш-бот/.venv/bin/python bot.py
Restart=always
RestartSec=5
EnvironmentFile=/home/bot/ваш-бот/.env

[Install]
WantedBy=multi-user.target

Ключи Restart=always и RestartSec=5 означают: если бот упадёт или сервер перезагрузится, systemd поднимет его заново через пять секунд.

Далее:

useradd -m bot
chown -R bot:bot /home/bot/ваш-бот
systemctl daemon-reload
systemctl enable --now tg-bot
systemctl status tg-bot

Для Node.js меняется только строка ExecStart — там будет node index.js или npm start.

Шаг 7. Если выбрали webhook — настройте домен и HTTPS

Понадобится домен, DNS-запись A на IP вашего сервера и сертификат: самый простой путь — certbot из пакетов. После этого скажите Telegram, куда класть апдейты:

curl "https://api.telegram.org/bot<ТОКЕН>/setWebhook?url=https://ваш-домен/telegram"

На стороне приложения поднимите HTTPS-обработчик по этому пути (в aiogram — aiogram.webhook или отдельный aiohttp-сервер; в Node.js — middleware Telegraf для webhook-режима).

Шаг 8. Логи, мониторинг и апдейты

Самое важное после запуска — заметить поломку раньше пользователей:

  • просмотр логов systemd: journalctl -u tg-bot -f;
  • обновление кода: git pull, затем systemctl restart tg-bot;
  • здоровье: простой uptime-монитор (UptimeRobot, healthchecks.io) или коллега, который время от времени пишет боту;
  • на сервере — свободное место (df -h) и память: боты редко прожорливы, но утечки случаются.

Что дальше

Дальше обычно начинается рост: базы данных для состояния, очередь на обработку медиа, второй бот — и вот вы уже выбираете между одним сервером «на всё» и набором услуг. Пара наводок:

Локальный бот превращается в круглосуточного работника за один вечер, если идти по шагам: токен — polling — сервер — systemd. Остальное — состояния, базы, вебхуки — достраивается по мере роста самого бота.

Выбираете хостинг под бота?

12 сервисов — фильтры по цене, стеку и способу деплоя на главной каталога.

Открыть каталог