Как сделать телеграмм бота для сервера и как его запустить.

Вступление

В данной статье я хотел бы раскрыть тему о том, как можно сделать твоего телеграмм бота видимым и доступным для других, то есть его размещение и обслуживание на сервере. Чтобы его мог пощупать не только ты, но любой другой желающий.
Я покажу пример развертывания тг бота на VPS сервере beget. Ибо я хорошо с ним знаком. Но, данная статья универсальна для любого хостинг провайдера.
И без дальнейших рассусоливаний давай приступим к развертыванию.

Подготовка сервера к работе, его развертывание

Итак, ты имеешь готовый проект с ботом, он у тебя запускается и работает. Но ты не можешь вечно оставлять компьютер (и соответственно программу) включенной. Значит, разворачиваем на других компьютерах, которые не жалко. Да, я про сервера, хостинг и VPS.
И вот так, мы с тобой подошли к вопросу, как развернуть сервер. И где его достать.
  • Нажми на вкладку облако.
  • Потом на кнопку создать. beget нажми на облако
  • Настрой сервер под себя. настрой VPS на beget

Добавление проекта на сервер

После того как сервер был создан и настроен под вас. Нужно будет зайти на него. Для этого копируем внешний IP, и в терминале вводим

ssh root@YOUR_IP
		
У тебя спросят пароль. Его высылают обычно по зарегистрированной почте. Введи его.
Обновляем пакеты и внешние зависимости

sudo apt update
sudo apt upgrade
		
Переходим в домашний каталог

cd /home
		

Перенос проекта

Используя Git

Клонируем проект

git clone https://github/YourUserName/YourRepoName
		
И соответственно

git pull												
		
Для обновления проекта

Без Git

Создаём пустую директорию

mkdir NewProject										
		
И переходим туда

cd NewProject											
		
Для переноса файлов проекта, используй файловый менеджер хостинга или, как я, используй команду scp

scp -r /path/to/project root@YOur_IP:/path/where/to/save					
		
Где /path/to/project папка проекта на локальной машины. Где YOur_IP это IP выданный хостингом Где /path/where/to/save это место куда будет перемещена папка проекта, на сервере

Настройка виртуального окружения python

Если ты не используешь виртуальное окружение при создании ботов (что конечно же нежелательно), то можешь смело пропускать данный шаг.
После того как все файлы проекта были перенесены. Мы должны будем убедиться в том чтобы все необходимые пакеты для python были установлены.
Для этого, создадим виртуальное окружение

python -m venv .venv										
		
Активируем его

source .venv/bin/activate									
		

Установка зависимостей

Без файла зависимостей

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

pip install aiogram
pip install OTHERE_PACKAGES
		
и так далее

С файлом зависимости

Если файл зависимости есть. А он создаётся командой

pip freeze > req.txt										
		
Зависимости, таким образом устанавливаются очень просто

pip install -r req.txt										
		

Проверка работоспособности сервера и бота

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

ssh root@You.Ip.add.es									
cd /YOur/project/Folder									
		
Активируем виртуальное окружение(если есть)

source .venv/bin/activate									
		
Запускаем бота

python main.py										
		
Открываем телеграмм и даём команды боту. Если отвечает, что же, значит всё получилось. Если нет перепройди предыдущие шаги и убедись в правильности введённых команд.

Автоматизируем обновление проекта

Небольшое отступление по теме

Всё работает, и в принципе, можно было бы на этом и остановиться. Но сервер имеет такое свойство как перезагружаться время от времени. Да и вам тоже придётся его перезагружать по тем или иным причинам.
То есть, при каждой такой загрузке вам придётся заново заходить на сервер, активировать виртуальное окружение (если есть) и запускать бота, опять.
Мы люди занятые, ведь так? Зачем нам помнить и проверять постоянно, работает бот или нет ? Лучше данную задачу, как и любую другую, автоматизировать.

Создание необходимых файлов

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

touch /lib/systemd/system/bot_name.service							
		
Отредактируем файл

vim /lib/systemd/system/bot_name.service							
		
Вставь туда следующий код

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

[Service]
Type=simple
WorkingDirectory=/Where/Your/Bot/Project/Exist/
ExecStart=/Where/Your/Bot/Project/Exist/start.sh
RestartSec=60
Restart=always

[Install]
WantedBy=multi-user.target
		
Где /Where/Your/Bot/Project/Exist/ всего лишь директория твоего проекта
Где /Where/Your/Bot/Project/Exist/start.sh всего лишь местоположение скрипта запуска бота
Дальше создадим скрипт запуска бота. Обычно я его создаю в директории самого проекта заранее.

touch start.sh											
		
Добавим ему бит исполнения. Дадим ему возможность быть запущенным из терминала.

chmod +x start.sh										
		
Добавим следующий контент в скрипт

#!/usr/bin/env bash

cd /Where/Your/Bot/Project/Exist/ 
source .venv/bin/activate
python main.py
		

Инициализация службы и её запуск

Осталось выполнить буквально пару команд

systemctl enable bot_name.service								
systemctl start bot_name.service								
		
Из вывода данных команд непонятно, успешно ли мы запустилась служба или нет. Чтобы проверить и узнать наверняка выполни команду

systemctl status bot_name.service								
		
статус работы программы systemctl об сервисе
Если active(running). Значит служба успешно запущена Также можно увидеть что служба enabled. Это значит, что при каждом запуске или перезагрузке системы, данная служба будет запущена автоматически.

Подготовка проекта к длительной поддержке

Многие, в том числе я раньше, недооценивали (недооценивают) данный шаг. До тех пор, пока лично не столкнёшься с монотонностью и повторяемостью шагов, которых можно было бы избежать, если всё правильно сделать и настроить.
Вот, типичные шаги, каждого, кто собирается обновить своего тг бота.
  • Зайти на сервер (ssh или специализированная админка хостинга)
  • Перейти к директории проекта.
  • Перенести новые файлы с локального компьютера на сервер (ssh-move или файловый менеджер хостинга)
  • Убедиться что ничего не сломал
  • Убедиться что всё перенёс
  • Обнаружить что нужно ещё что-то улучшить и повторить процесс заново.
И это без баз данных. Да и некоторые шаги я объединил в один. Так, например, перенос файлов на сервер, та ещё задачка. Она становиться ещё более опасной если не делать резервное копирование (бэкапы). Не дай бог вам ошибиться и что-нибудь затереть. Всё пропало.
Для себя, я выделил три основные проблемы, когда обновлял проекты:
  • Проблема доступа
  • Проблема проверки
  • Проблема резервного копирования
Первая проблема решается при помощи ssh клиента и сгенерированных RSA паролей. Вторую и третью можно решить внедрив Git в проект.

Настройка входа через SSH без пароля

Конечно, web интерфейсы удобны, красивы, функциональны, но чёрт, их очень тяжело автоматизировать. Конечно, можно было бы использовать selenium, но зачем, если можно написать обычный python или bash/powershel скрипт.
Идеальным решением данной проблемы является ssh доступ к серверу. Я на 100% уверен, что ты, мой читатель, знаешь что такое терминал и как с ним работать.
По дефолту, чтобы получить доступ к серверу потребуется пароль. Но вводить его каждый раз это тот ещё гемор. Поэтому, настроим доступ к серверу через сгенерированную пару ключей. Один на локальную машину, другой на сервер.
Генерируем пару.

ssh-keygen -t rsa										  
		
Когда просят ввести имя ключа, вводим полный путь до него + имя ключа
Когда просят ввести пароль и другое, ничего не вводи.
После генерации ключа перейди к директории где был сгенерирован ключ.

cd ~/dima/.ssh/										
		
Копируем публичный ключ на целевой сервер.

ssh-copy-id -i my_id.pub root@111.11.11.11							
		
Теперь вы должны войти в систему без ввода пароля.

Внедрение технологии Git. Его практическое использование.

Две проблемы я объединил в одну, ибо их обоих можно решить интегрировав одну единственную технологию контроля версий, да я про git.
Данный инструмент берёт на себя отслеживание всех изменённых, удалённых и добавленных файлов. Также, в случае необходимости откатить изменения, просто выполни соответствующую команду.
Я не собираюсь, рассказывать все особенности работы с git-ом. Но я покажу тот минимум, что необходим для легкого и быстрого обновления проекта. Спойлер, буквально 3 команды.

Инициализация Git на локальной, домашней машине/компьютере.

Сначала инициализируем пустой репозиторий.

git init												
		
Создаём репозиторий на github, копируем ссылку на страницу репозитория.
Добавляем скопированную ссылку

git remote add REF_NAME https://github/YourUserName/YourRepoName			
		
Где REF_NAME это любое название вашей ссылки
Добавляем файлы.

git add .											
		
Создаём первый коммит

git commit -m “Your comment”								
		
Отправляем изменения на сервер, в первый раз

git push -u REF_NAME BRANCH_NAME							
		
Где REF_NAME это название твоей ссылки, которую ты обозвал 3 шага назад.
Где BRANCH_NAME это имя ветки, по умолчанию это master

Клонирование Git репозитория уже на сервере

После входа на сервер. Остаётся запомнить 3 команды.
Для создания локальной копии на сервере

git clone https://github/YourUserName/YourRepoName					
		
Заходим в директорию локальной копии репозитория

cd YourRepoName										
		
Для обновления проекта

git pull												
		

Вывод

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

сердце
0
3 соединённые точки
0

Использованные термины