Главная
|
Услуги и цены
VDS
Выделенные серверы
Размещение сервера
|
F.A.Q
|
О компании
|

Как хостить Telegram-бота на Python на VDS с systemd

Если запустить бота командой python3 bot.py, он будет работать в текущем терминале. При закрытии SSH-соединения, завершении процесса или перезагрузке сервера бот может остановиться.

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

Такой подход подходит для ботов, которые получают сообщения через long polling. Если бот использует webhook, дополнительно потребуется настроить веб-сервер и HTTPS.

  • 1. Подготовьте сервер и установите Python
  • 2. Создайте Telegram-бота на Python
  • 3. Создайте отдельного пользователя для бота
  • 4. Настройте systemd для автозапуска
  • 5. Проверьте работу службы
  • Безопасность и рекомендации
  • Итог

Шаг 1. Подготовьте сервер и установите Python

Подключитесь к VDS по SSH. Если сервер новый, сначала выполните базовую настройку системы по инструкции Подготовка сервера Linux к работе.

Обновите список пакетов и установите Python с необходимыми инструментами:

apt update
apt install -y python3 python3-pip python3-venv

Создайте отдельную директорию для проекта:

mkdir -p /srv/mybot
cd /srv/mybot

В примере используется путь /srv/mybot. Если вы выберете другую директорию, её потребуется указать во всех последующих командах и в конфигурации systemd.

Создайте виртуальное окружение:

python3 -m venv venv

Установите библиотеку для работы с Telegram Bot API:

/srv/mybot/venv/bin/pip install pyTelegramBotAPI

Использование полного пути к pip позволяет установить библиотеку именно в созданное окружение. Активировать его для выполнения команд в этой статье не требуется.

Шаг 2. Создайте Telegram-бота на Python

Создайте файл с кодом:

nano /srv/mybot/bot.py

Добавьте следующий пример:

import telebot

TOKEN = "ВАШ_ТОКЕН"
bot = telebot.TeleBot(TOKEN)


@bot.message_handler(commands=["start"])
def start_message(message):
    bot.send_message(message.chat.id, "Бот работает!")


bot.infinity_polling()

Замените ВАШ_ТОКЕН токеном своего бота, полученным через BotFather. Токен предоставляет доступ к управлению ботом, поэтому его нельзя публиковать или передавать посторонним.

В примере бот отвечает на команду /start. Метод infinity_polling() запускает получение обновлений Telegram и позволяет библиотеке повторять попытки подключения при некоторых сетевых сбоях.

Сохраните файл и запустите бота вручную:

/srv/mybot/venv/bin/python /srv/mybot/bot.py

Откройте Telegram, перейдите к своему боту и отправьте команду /start. Если бот ответил сообщением, значит, код и подключение к Telegram работают.

Проверка работы Telegram-бота

Остановите тестовый процесс сочетанием Ctrl+C. На этом этапе бот завершится, поскольку он запущен непосредственно в терминале. Далее настроим systemd, чтобы не запускать его вручную после каждого перезапуска сервера.

Шаг 3. Создайте отдельного пользователя для бота

Создадим отдельного пользователя без права входа в интерактивную оболочку:

useradd --system --no-create-home --shell /usr/sbin/nologin mybot

Передадим ему права на чтение файлов проекта:

chown -R root:mybot /srv/mybot
chmod 750 /srv/mybot
chmod 640 /srv/mybot/bot.py
chmod 750 /srv/mybot/venv/bin
chmod 750 /srv/mybot/venv/bin/python

Шаг 4. Настройте systemd для автозапуска

Создайте unit-файл, описывающий работу службы:

nano /etc/systemd/system/mybot.service

Добавьте конфигурацию:

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

[Service]
Type=simple
User=mybot
Group=mybot
WorkingDirectory=/srv/mybot
ExecStart=/srv/mybot/venv/bin/python /srv/mybot/bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

В конфигурации важны несколько параметров:

  • User и Group определяют пользователя и группу, от имени которых запускается бот.
  • WorkingDirectory задаёт рабочую директорию приложения.
  • ExecStart указывает точные пути к Python и файлу бота.
  • Restart=always предписывает перезапускать службу после завершения процесса.
  • RestartSec=5 задаёт паузу перед повторным запуском, чтобы при постоянной ошибке бот не перезапускался слишком часто.
  • After и Wants помогают запускать службу после начала настройки сети.

Systemd не активирует виртуальное окружение автоматически, поэтому команда должна указывать интерпретатор внутри venv.

Сохраните файл. Затем сообщите systemd об изменениях:

systemctl daemon-reload

Включите автозапуск и запустите службу:

systemctl enable --now mybot.service

Параметр enable добавляет службу в автозагрузку, а --now запускает её сразу. Выполнять команды отдельно не требуется.

Шаг 5. Проверьте работу службы

Убедитесь, что systemd запустил бота:

systemctl status mybot.service

Если всё настроено правильно, в выводе появится статус active (running).

Статус работающей службы Telegram-бота в systemd

После этого отправьте боту команду /start в Telegram, чтобы проверить обработку сообщений.

Для просмотра последних записей журнала используйте:

journalctl -u mybot.service -n 50 --no-pager

Если нужно наблюдать за работой бота в реальном времени, выполните:

journalctl -u mybot.service -f

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

Чтобы выйти из режима просмотра журнала, нажмите Ctrl+C. Это завершит просмотр, но не остановит службу.

Если вы изменили код бота, перезапустите службу:

systemctl restart mybot.service

После изменения самого unit-файла сначала выполните systemctl daemon-reload, а затем перезапустите службу. Изменения обычного Python-кода не требуют повторной загрузки конфигурации systemd.

Безопасность и рекомендации

Храните токен отдельно от кода. Не добавляйте токен в публичный репозиторий и не публикуйте его в логах. Для небольшого проекта можно вынести его в отдельный файл окружения с ограниченными правами доступа, а затем подключить этот файл через параметр EnvironmentFile в конфигурации systemd.

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

Следите за журналом службы. Если бот перестал отвечать, сначала проверьте systemctl status mybot.service и journalctl -u mybot.service -n 50. Перезапуск без изучения ошибки может лишь временно скрыть проблему.

Итог

После настройки systemd Telegram-бот работает как фоновая служба, запускается вместе с сервером и автоматически перезапускается при завершении процесса. Для управления им достаточно команд systemctl status, systemctl restart и journalctl.

Такой вариант подходит для небольших ботов, уведомлений, автоматизации и других Python-приложений, которым требуется постоянная работа на VDS.

logo
© 2022 62yun
Все права защищены
vk.com/62yuncom
support@62yun.ru
logo
vk.com/62yuncom
support@62yun.ru
Услуги
VDS Выделенные серверы
Полезное
F.A.Q О компании Политика конфиденциальности Оферта
Способы оплаты
wechatpay visa mastercard
MirAccept
Партнеры
25port
© 2022 62yun Все права защищены
ВВЕРХ