Чуть больше месяца назад мы запустили Telegram-бота, через который можно заказать виртуальный сервер. Этот бот помогает арендовать VPN-сервер, VPS из нашего маркетплейса или уникальную конфигурацию под ваши цели.

А не возникало ли у вас желания запустить собственный Telegram-бот на своей удалённой виртуалке? Если да, то добро пожаловать под кат, где мы разбираем весь процесс от заказа и подготовки виртуальной машины до запуска бота в работу. Скажем сразу, данная статья — для тех, кто мало знаком с работой Linux-систем и написанием кода Telegram-ботов, но хочет сделать по этому пути один из первых своих шагов.

▍ Заказываем виртуальный сервер


Итак, переходим к созданию виртуального сервера, на котором будет размещаться наш бот. Во-первых, выбираем дата-центр.


Затем указываем конфигурацию нашего будущего VPS. Для хостинга простенького Telegram-бота подойдёт сервер в практически минимальной комплектации под управлением Ubuntu 22.04.


После того, как закончится установка операционной системы, новый VPS появится в списке серверов. Там же указана информация для подключения к нему по SSH: IP-адрес, учётные данные для авторизации — имя пользователя и пароль.


▍ Предварительная настройка операционной системы


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

Во-первых, мы добавим в систему новую учётную запись, которую будем использовать в качестве администратора вместо пользователя root, обладающего абсолютными правами доступа ко всем ресурсам и функциям системы. Команды, требующие для своего выполнения повышения прав до уровня root, мы будем запускать от имени нового пользователя с использованием команды sudo (superuser do).

Итак, подключаемся к нашему серверу по SSH. Для подключения будем использовать соответствующее приложение — Putty. Загружаем дистрибутив, устанавливаем программу и запускаем её. В строку Host Name (or IP address) вводим IP-адрес нашего VPS и нажимаем Open.


В открывшемся терминале вводим имя пользователя и пароль, которые берём в настройках сервера из личного кабинета RUVDS. Первый вход производится с использованием учётной записи root.


После успешной авторизации в системе создаём нового пользователя. В нашем примере его имя будет ruvds-user.

adduser ruvds-user

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


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

usermod -aG sudo ruvds-user

На этом миссия учётной записи root заканчивается, поэтому отключаемся от сервера, используя комбинацию клавиш Ctrl d.

Теперь снова запускаем Putty, вводим IP-адрес и авторизуемся на сервере под именем нового пользователя, которым в нашем примере является учётная запись ruvds-user.


Наш новый пользователь обладает достаточным уровнем полномочий для того, чтобы исполнять команды от имени администратора системы. Исходя из этого, мы закроем доступ по SSH для учётной записи root. Для чего при помощи текстового редактора nano необходимо отредактировать файл sshd_config, который располагается в каталоге /etc/ssh/.

cd /etc/ssh/
sudo nano sshd_config

В тексте файла находим строку, содержащую название параметра PermitRootLogin, удаляем в начале строки символ #, если он есть. Данный символ означает, что такая строка является закомментированной, то есть не учитывается в текущей конфигурации. После чего устанавливаем значение параметра в no вместо yes.


Теперь закрываем текстовый редактор с сохранением внесённых изменений. Для этого используем комбинацию клавиш Ctrl x, затем нажимаем y и Enter. И наконец, чтобы изменения вступили в силу, перезапускаем службу SSH при помощи команды:

sudo service ssh restart

Теперь для защиты нашего сервера активируем на нём межсетевой экран. В операционных системах Ubuntu и Debian для управления брандмауэром часто применяется утилита iptables. Её более простым интерфейсом в части настройки межсетевого экрана является UFW — Uncomplicated Firewall. Чтобы открыть доступ к серверу через какое-либо приложение или порт, необходимо добавить в UFW разрешающее правило для этого приложения или порта.

Но сначала брандмауэр нужно установить. Для чего обновляем списки пакетов в системе:

sudo apt update

Затем запускаем инсталляцию UFW:

sudo apt install ufw

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

sudo ufw app list

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


Тем не менее, мы можем разрешить доступ к серверу исключительно по SSH, для чего добавим в UFW разрешающее правило для данного протокола:

sudo ufw allow OpenSSH

Теперь включим брандмауэр:

sudo ufw enable

Дополнительно установим ограничение на подключение по SSH с IP-адресов, с которых производится больше пяти попыток соединения с сервером за последние полминуты. Такого рода защита активируется командой:

sudo ufw limit ssh

Проверить состояние межсетевого экрана, а заодно и глянуть на список активных правил, можно с помощью команды:

sudo ufw status



Дополнительно устанавливаем консольное приложение wget, которое чуть позже понадобится для загрузки файлов со сторонних ресурсов:

sudo apt install wget

▍ Установка Python и библиотеки telebot


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

Нового пользователя назовём bot-user (вы, конечно же, можете выбрать другое имя):

sudo adduser bot-user


После чего закрываем терминал с использованием комбинации клавиш Ctrl d и снова подключаемся к серверу, но теперь уже под учётной записью нового пользователя. Если получилось успешно авторизоваться в системе, переходим в домашний каталог и там создаём директорию, в которой будут находиться файлы нашего Telegram-бота:

cd ~
mkdir test_bot

Наш Telegram-бот будет работать на Python, для чего наиболее простым методом выглядит использование простой библиотеки telebot, которая предоставляет доступ к API Telegram Bot. С её помощью мы сможем создать Telegram-бота, запустить его на виртуальном сервере и впоследствии управлять им. Здесь не следует путать создание бота, то есть его тела — файла, содержащего код в нашем случае на Python, и создание бота как его регистрацию в мессенджере Telegram, к которой мы ещё вернёмся. Непосредственно сам Python предустановлен по умолчанию на виртуальных серверах RUVDS с Ubuntu 22.04. Убедиться в этом можно через запрос версии Python, проинсталлированной в системе:

python3 --version

Судя по выводу команды, на нашем VPS уже стоит Python версии 3.10.12.


Что касается библиотеки telebot, то для её установки мы применим менеджер pip, из индекса пакетов которого можно проинсталлировать большое количество программных продуктов, написанных на Python, в том числе и telebot. Для установки самого pip необходимо загрузить установочный скрипт при помощи утилиты wget. Для этого переходим в каталог, к примеру, /tmp и загружаем туда тот самый установочный скрипт:

cd /tmp
wget https://bootstrap.pypa.io/get-pip.py

После чего запускаем его:

python3 get-pip.py

После того, как скрипт отработал, проверяем версию проинсталлированного менеджера pip:

python3 -m pip --version

В нашем случае вывод команды показал версию менеджера пакетов как 23.3.2.



И теперь запускаем установку библиотеки telebot:

python3 -m pip install pyTelegramBotAPI

▍ Регистрация бота в Telegram


Пришло время зарегистрировать нашего бота в Telegram. Открываем мессенджер и в строке поиска набираем @BotFather — это специальный сервис для управления ботами в Telegram.


Переходим в @BotFather и отправляем ему сообщение с текстом /newbot. В ответ на наше сообщение сервис попросит ввести название для создаваемого бота. Оно не обязательно должно быть уникальным, поэтому мы назвали наш просто — Our First Test Bot.


Затем @BotFather предложит придумать и ввести для нашего бота username. Это своего рода уникальный идентификатор для бота, заканчивающийся на bot, который не должен быть никем использован ранее. В нашем случае мы ввели our_first_test_bot.


Если придуманный идентификатор соответствует требованиям сервиса, @BotFather выведет соответствующее сообщение, где помимо прочего указан токен для API, который обязательно нужно сохранить в надёжном и безопасном месте. Чуть позже этот токен нам очень пригодится.


▍ Размещение бота на сервере


Пришло время написать код нашего Telegram-бота и запустить его на уже подготовленном виртуальном сервере. Итак, наш бот будет иметь самый минимальный функционал. Он будет уметь отвечать «Привет!» в ответ на сообщение /start и сможет представляться «Я — тестовый бот!» в ответ на сообщение /help. Всё! Остановимся на том, что он больше ничего умеет и будет игнорировать все другие сообщения, отправляемые ему.
Код бота мы разместим в двух файлах:

  • main.py — основной скрипт, содержащий всю логику нашего бота. В файле мы опишем реакцию бота на сообщения /start и /start, больше — ничего. Такая вот логика.
  • config.py — файл конфигурации, содержащий токен, который при создании бота выдал нам @BotFather (см. выше).

Код нашего простейшего бота выглядит так:

import telebot
from config import botkey
bot = telebot.TeleBot(botkey)
@bot.message_handler(commands=['start'])
def handle_message(message):
    bot.send_message(message.chat.id, 'Привет❗️')
@bot.message_handler(commands=['help'])
def handle_message(message):
    bot.send_message(message.chat.id, '???? Я - тестовый бот❗️')
bot.polling()

Чтобы создать бота на нашем сервере, подключаемся к виртуалке под учёткой пользователя bot-user, переходим в созданный каталог, предназначенный для размещения файлов бота test_bot и создаём сам файл:

cd ~/test_bot
touch main.py

Открываем созданный файл при помощи текстового редактора:

nano main.py

После чего вставляем туда текст кода и закрываем файл с сохранением изменений (комбинация клавиш Ctrl x, затем y и Enter).
Там же создаём второй файл config.py:

touch config.py
nano config.py

У нас он содержит всего одну строку:

botkey = 'token'

Вместо слова token вставляем токен, который мы получили от @BotFather при создании бота в Telegram. Затем так же закрываем файл, сохраняя внесённые изменения.

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

scp C:\test_bot\main.py C:\test_bot\config.py bot-user@168.68.68.168:~/test_bot/

Ещё для передачи файлов на удалённую Linux-систему можно воспользоваться приложением WinSCP, которое может скопировать их при помощи протокола SFTP (SSH File Transfer Protocol).

▍ Запуск бота


Теперь пробуем запустить нашего бота. Переходим в его каталог:

cd ~/test_bot

И запускаем командой:

python3 main.py

Если после нажатия клавиши Enter не появилось никаких ошибок, значит, бот успешно запущен и работает в фоновом режиме. Убедится в этом можно, перейдя к нашему боту непосредственно в мессенджере.


Чтобы вернуться в командную строку, придётся завершить работу Telegram-бота комбинацией клавиш Ctrl c. Поэтому теперь мы сделаем так, чтобы наш бот был запущен постоянно. Запуск в таком режиме из директории бота производится командой:

nohup python3 main.py &

При этом система покажет номер процесса, который соответствует нашему боту, запущенному в фоновом режиме.


Для возврата в командную строку нажимаем Enter. Факт работы Telegram-бота подтверждает вывод списка запущенных процессов с фильтром по имени файла main.py, установленным c помощью утилиты grep:

ps -ax | grep main.py

Здесь мы видим тот же номер процесса.


В дальнейшем, если мы будем вносить какие-либо изменения в код нашего бота, то для их применения необходимо сначала остановить бот, завершив работу процесса, который в нашем случае имеет значение 757:

kill 757

После чего, находясь в каталоге ~/test_bot/, снова запускаем бот уже знакомой командой:

nohup python3 main.py &

▍ Запуск бота как службы


Но что же произойдёт, если наш сервер перезагрузится? А, ничего. Бот не будет работать, потому что не запустится. Чтобы он заработал, нам придётся запускать его предыдущей командой. Поэтому мы сделаем так, чтобы при перезагрузке системы бот запускался автоматически.

Есть несколько способов, как это можно осуществить. Мы же реализуем запуск нашего бота как службы при помощи системы инициализации systemd. Данная система содержит такой инструмент, как systemctl. С его помощью мы можем управлять работой служб, функционирующих в фоновом режиме — запускать их, останавливать, проверять их состояние.

Итак, подключаемся к системе под учётной записью администратора и создаём новый юнит systemd:

cd /lib/systemd/system
sudo nano test_bot.service

В создаваемый файл вставляем следующее содержимое:

[Unit]
Description=Our First Test Bot Service
After=network.target

[Service]
Type=idle
Restart=always
RestartSec=3
User=bot-user
WorkingDirectory=/home/bot-user/test_bot/
ExecStart=python3 main.py

[Install]
WantedBy=multi-user.target

Здесь:
  • Description — название службы;
  • WorkingDirectory — каталог, в котором содержится файл бота;
  • ExecStart — команда, запускающая бота;
  • User — учётная запись, под именем которой запускается бот;
  • Restart=always — указание на перезапуск службы при возникновении ошибки.

Закрываем файл с сохранением внесённых изменений. Теперь просим systemd перечитать файлы юнитов:

sudo systemctl daemon-reload

Включаем новую службу:

sudo systemctl enable test_bot.service

И запускаем её:

sudo systemctl start test_bot.service

Проверяем состояние запущенной службы:

sudo systemctl status test_bot.service

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


При внесении изменений в функционал бота применяться они будут теперь при перезапуске службы:

sudo systemctl restart test_bot.service

▍ Вместо заключения


Конечно, наш созданный в статье Telegram-бот — до смешного простой и размещён на виртуальном сервере минимальной конфигурации. Вы можете запустить на удалённом VPS собственного бота с более насыщенным функционалом.

Помоги спутнику бороться с космическим мусором в нашей новой игре! ????

Комментарии (3)


  1. FSA
    16.01.2024 15:30
    +2

    Для телеграм ботов есть такая приятная штука, как webhook. Для него достаточно обычного веб-сервера. При запросах пользователей просто отcылается https запрос по указанному URL. А дальше вы уже можете на любом языке программирования разобрать его и подготовить ответ. Т.е. бота можно даже не на VDS, а на виртуальном хостинге разместить где есть веб-сервер и нужный вам язык программирования. При использовании webhook пользователи получают ответ от бота максимально быстро, на сколько это может делать ваш сервер.


    1. Jem_Jem
      16.01.2024 15:30

      Только надо иметь сертификат (самоподписной вроде не прокатит) и следить за его актуальностью. Вы как это делаете?


      1. FSA
        16.01.2024 15:30

        На VDS вообще не проблема. Ставишь certbot, выпускает сертификат через него и он сам обновляется. Можно ещё руками поставить acme.s, который поддерживает не только Let's Encrypt. Но со вторым надо руками добавлять задание в cron для автоматического обновления сертификатов.