Как запустить 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. Выберите, где бот будет жить
Три принципиально разных пути:
- VPS — виртуальный сервер, который вы настраиваете сами. Максимум контроля и дешёвая цена: смотрите Timeweb Cloud, Beget VPS, Selectel, VDSina или Aeza.
- PaaS из Git — вы пушите код, платформа сама собирает и запускает его. Без администрирования, но дороже за то же: например, Amvera Cloud для оплаты российскими картами, Railway или Render для глобальных платформ.
- 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) и память: боты редко прожорливы, но утечки случаются.
Что дальше
Дальше обычно начинается рост: базы данных для состояния, очередь на обработку медиа, второй бот — и вот вы уже выбираете между одним сервером «на всё» и набором услуг. Пара наводок:
- сомневаетесь между типами хостинга — прочитайте материал «VPS или PaaS для бота: что выбрать»;
- бюджет строго нулевой — см. разбор бесплатных вариантов и их ограничений;
- нужен полный список сервисов с ценами — держите под рукой сравнительную таблицу и каталог с фильтрами.
Локальный бот превращается в круглосуточного работника за один вечер, если идти по шагам: токен — polling — сервер — systemd. Остальное — состояния, базы, вебхуки — достраивается по мере роста самого бота.
12 сервисов — фильтры по цене, стеку и способу деплоя на главной каталога.
Открыть каталог