На главную

Как запустить Telegram-бота на VPS

У вас уже есть Python-бот. Перенесём его на сервер, установим зависимости и настроим запуск, который не зависит от открытого SSH-окна.

Выбрать VPS для бота

Ubuntu 24.04 · Python · systemd Автор: safehostОбновлено

Бумажный самолётик Telegram, соединённый оранжевым кабелем с сервером VPS

В примере точка входа — bot.py, зависимости записаны в requirements.txt, токен читается из BOT_TOKEN. В коде уже настроен long polling. Проект должен поддерживать Python 3.12 из Ubuntu 24.04. Если у вас другие имена файлов или версия Python, адаптируйте команды под свой проект.

Выберите VPS под работу бота

Ориентируйтесь на то, что выполняет программа. Боту с командами и запросами к внешнему API обычно нужно меньше ресурсов, чем приложению с собственной базой данных, обработкой изображений или несколькими процессами.

mini · 1 vCPU · 1 ГБ RAM
Отправная точка для одного небольшого бота. Базовый SSD — 20 ГБ.
small · 2 vCPU · 2 ГБ RAM
Больше запаса для бота с базой данных или несколькими сервисами. Базовый SSD — 40 ГБ.

Это ориентиры, а не обещание определённого числа пользователей. После запуска проверьте CPU, память и диск в мониторинге кабинета. Тяжёлые задачи и локальные модели требуют отдельного расчёта.

Актуальные базовые цены — в тарифах. Выбранный объём SSD и выделенный IPv4 влияют на итог: полную стоимость кабинет показывает до оплаты.

Для первого запуска подойдёт long polling

При long polling бот сам запрашивает обновления у Telegram. Ему нужен исходящий доступ к Bot API; входящий HTTPS-адрес и домен для этого способа не нужны. Ниже рассматриваем именно такой запуск.

Webhook нужен, когда Telegram должен отправлять обновления на ваш публичный HTTPS-адрес. Тогда потребуется настроить доступ к приложению и сертификат. Polling и webhook для одного бота одновременно не работают — это ограничение Telegram Bot API.

Если переносите действующего бота, подготовьте новый сервер заранее. Перед включением polling остановите старую копию. Если был настроен webhook, удалите его через deleteWebhook, сохранив ожидающие обновления.

Подготовьте чистый сервер

Создайте VPS с Ubuntu 24.04 и подключитесь по SSH. Адрес, пользователя и порт возьмите из карточки сервера в личном кабинете. Команды ниже выполняются на VPS пользователем с доступом к sudo.

sudo apt update
sudo apt install -y python3-venv git
sudo adduser --system --group --home /opt/telegram-bot --shell /usr/sbin/nologin telegram-bot
sudo install -d -o telegram-bot -g telegram-bot -m 0750 /opt/telegram-bot/app

Приложение будет работать от отдельного пользователя telegram-bot. Каталог /opt/telegram-bot/app предназначен для кода и файлов этого бота.

Перенесите код и установите зависимости

Для публичного репозитория замените YOUR_ACCOUNT/YOUR_BOT своим адресом. Для закрытого проекта можно передать файлы по SCP или настроить доступ к репозиторию отдельным ключом. Секреты и локальное виртуальное окружение переносить вместе с кодом не нужно.

sudo -u telegram-bot git clone https://github.com/YOUR_ACCOUNT/YOUR_BOT.git /opt/telegram-bot/app
sudo -u telegram-bot python3 -m venv /opt/telegram-bot/venv
sudo -u telegram-bot /opt/telegram-bot/venv/bin/python -m pip install -r /opt/telegram-bot/app/requirements.txt

Пакеты устанавливаются в отдельное виртуальное окружение Python. Если проект использует базу данных, перенесите её отдельно и проверьте путь подключения: копирования одного репозитория недостаточно.

Сохраните токен вне репозитория

Создайте файл окружения, доступный только root, и откройте его редактором:

sudo touch /etc/telegram-bot.env
sudo chown root:root /etc/telegram-bot.env
sudo chmod 600 /etc/telegram-bot.env
sudoedit /etc/telegram-bot.env

Запишите в него строку, подставив токен своего бота вместо заглушки:

BOT_TOKEN=REPLACE_WITH_YOUR_BOT_TOKEN

В Python токен должен читаться из окружения, например так:

import os

BOT_TOKEN = os.environ["BOT_TOKEN"]

Файл прочитает systemd перед запуском процесса. Не добавляйте его в Git и не выводите токен в журнал.

Поручите запуск systemd

Откройте новый файл службы:

sudoedit /etc/systemd/system/telegram-bot.service

Добавьте конфигурацию. Путь в ExecStart должен указывать на реальную точку входа вашего проекта.

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

[Service]
Type=exec
User=telegram-bot
Group=telegram-bot
WorkingDirectory=/opt/telegram-bot/app
EnvironmentFile=/etc/telegram-bot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/telegram-bot/venv/bin/python /opt/telegram-bot/app/bot.py
Restart=on-failure
RestartSec=5
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Примените файл и включите службу:

sudo systemctl daemon-reload
sudo systemctl enable --now telegram-bot.service

Теперь процессом управляет systemd: закрытие SSH-сессии не остановит бота. Настройка Restart=on-failure задаёт перезапуск после ошибки; enable включает запуск службы при загрузке системы.

Проверьте ответ, журнал и перезапуск

sudo systemctl status telegram-bot.service --no-pager
sudo journalctl -u telegram-bot.service -n 50 --no-pager

У службы должен быть статус active (running). Затем отправьте боту команду в Telegram и убедитесь, что он ответил: одного статуса службы для проверки приложения недостаточно.

Проверьте повторный запуск и ещё раз отправьте команду:

sudo systemctl restart telegram-bot.service
sudo systemctl is-active telegram-bot.service
sudo systemctl is-enabled telegram-bot.service

Ожидаемые ответы — active и enabled. Когда проверите ответ в Telegram, можно закрыть SSH. Мониторинг VPS покажет расход CPU, памяти и диска; работоспособность команд бота проверяйте отдельно.

Если бот не отвечает

В журнале конфликт получения обновлений
Проверьте, не работает ли ещё одна копия на ноутбуке или старом хостинге. При polling оставьте один процесс и убедитесь, что webhook отключён.
Ошибка авторизации
Проверьте значение BOT_TOKEN в файле окружения и перезапустите службу после изменения. Не присылайте токен в общий чат поддержки.
Не найден модуль или файл
Сверьте ExecStart, точку входа и зависимости в requirements.txt. Служба использует Python из /opt/telegram-bot/venv, а не окружение вашей SSH-сессии.
Процесс запущен, ответы задерживаются
Проверьте соединение с Telegram, внешними API и базой данных, затем показатели VPS. Увеличение тарифа поможет только тогда, когда ограничением действительно стали ресурсы сервера.