Как сделать телеграмм бота для сервера и как его запустить.
Вступление
В данной статье я хотел бы раскрыть тему о том, как можно сделать твоего телеграмм бота видимым и доступным для других, то есть его размещение и обслуживание на сервере. Чтобы его мог пощупать не только ты, но любой другой желающий.
Я покажу пример развертывания тг бота на VPS сервере beget. Ибо я хорошо с ним знаком. Но, данная статья универсальна для любого хостинг провайдера.
И без дальнейших рассусоливаний давай приступим к развертыванию.
Подготовка сервера к работе, его развертывание
Итак, ты имеешь готовый проект с ботом, он у тебя запускается и работает. Но ты не можешь вечно оставлять компьютер (и соответственно программу) включенной. Значит, разворачиваем на других компьютерах, которые не жалко. Да, я про сервера, хостинг и VPS.
И вот так, мы с тобой подошли к вопросу, как развернуть сервер. И где его достать.
- Нажми на вкладку облако.
- Потом на кнопку создать.
- Настрой сервер под себя.
Добавление проекта на сервер
После того как сервер был создан и настроен под вас. Нужно будет зайти на него.
Для этого копируем внешний 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
Если 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
Использованные термины
- VPS (Виртуальный частный сервер) ⟶ Это услуга суть которой заключается в том что предоставляется доступ к выделеному серверу на определённой машине. Таких выделенных серверов на одной машине может быть тысячи. Обычно управление таким сервером не отличается от управления обычным, физическим.