Вступление
В данной статье я хотел бы раскрыть тему о том, как можно сделать твоего телеграмм бота видимым и доступным для других, то есть его размещение и обслуживание на сервере. Чтобы его мог пощупать не только ты, но любой другой желающий.
Я покажу пример развертывания тг бота на VPS сервере beget. Ибо я хорошо с ним знаком. Но, данная статья универсальна для любого хостинг провайдера.
И без дальнейших рассусоливаний давай приступим к развертыванию.
Подготовка сервера к работе, его развертывание
Итак, ты имеешь готовый проект с ботом, он у тебя запускается и работает. Но ты не можешь вечно оставлять компьютер (и соответственно программу) включенной. Значит, разворачиваем на других компьютерах, которые не жалко. Да, я про сервера, хостинг и VPS.
И вот так, мы с тобой подошли к вопросу, как развернуть сервер. И где его достать.
- Нажми на вкладку облако.
-
Потом на кнопку создать.
-
Настрой сервер под себя.
Добавление проекта на сервер
После того как сервер был создан и настроен под вас. Нужно будет зайти на него.
Для этого копируем внешний IP, и в терминале вводим
У тебя спросят пароль. Его высылают обычно по зарегистрированной почте. Введи его.
Обновляем пакеты и внешние зависимости
Переходим в домашний каталог
Перенос проекта
Используя Git
Клонируем проект
И соответственно
Для обновления проекта
Без Git
Создаём пустую директорию
И переходим туда
Для переноса файлов проекта, используй файловый менеджер хостинга или, как я, используй команду scp
Где /path/to/project папка проекта на локальной машины.
Где YOur_IP это IP выданный хостингом
Где /path/where/to/save это место куда будет перемещена папка проекта, на сервере
Настройка виртуального окружения python
Если ты не используешь виртуальное окружение при создании ботов (что конечно же нежелательно), то можешь смело пропускать данный шаг.
После того как все файлы проекта были перенесены. Мы должны будем убедиться в том чтобы все необходимые пакеты для python были установлены.
Для этого, создадим виртуальное окружение
Активируем его
Установка зависимостей
Без файла зависимостей
Если файла зависимостей нет, то есть тот файл, который генерирует команда pip freeze. То придётся самолично прописать все пакеты, которые необходимо установить.
и так далее
С файлом зависимости
Если файл зависимости есть. А он создаётся командой
Зависимости, таким образом устанавливаются очень просто
Проверка работоспособности сервера и бота
Для того чтобы проверить, всё ли работает. Проделаем те же шаги как и при разработке на локальной машине
Заходим в директорию проекта на сервере
Активируем виртуальное окружение(если есть)
Запускаем бота
Открываем телеграмм и даём команды боту. Если отвечает, что же, значит всё получилось. Если нет перепройди предыдущие шаги и убедись в правильности введённых команд.
Автоматизируем обновление проекта
Небольшое отступление по теме
Всё работает, и в принципе, можно было бы на этом и остановиться. Но сервер имеет такое свойство как перезагружаться время от времени. Да и вам тоже придётся его перезагружать по тем или иным причинам.
То есть, при каждой такой загрузке вам придётся заново заходить на сервер, активировать виртуальное окружение (если есть) и запускать бота, опять.
Мы люди занятые, ведь так? Зачем нам помнить и проверять постоянно, работает бот или нет ? Лучше данную задачу, как и любую другую, автоматизировать.
Создание необходимых файлов
Для этого мы создадим systemd службу, демона, как я его называю, и скрипт который данная служба будет запускать.
Создадим службу.
Отредактируем файл
Вставь туда следующий код
Где /Where/Your/Bot/Project/Exist/ всего лишь директория твоего проекта
Где /Where/Your/Bot/Project/Exist/start.sh всего лишь местоположение скрипта запуска бота
Дальше создадим скрипт запуска бота. Обычно я его создаю в директории самого проекта заранее.
Добавим ему бит исполнения. Дадим ему возможность быть запущенным из терминала.
Добавим следующий контент в скрипт
Инициализация службы и её запуск
Осталось выполнить буквально пару команд
Из вывода данных команд непонятно, успешно ли мы запустилась служба или нет. Чтобы проверить и узнать наверняка выполни команду
Если active(running). Значит служба успешно запущена
Также можно увидеть что служба enabled. Это значит, что при каждом запуске или перезагрузке системы, данная служба будет запущена автоматически.
Подготовка проекта к длительной поддержке
Многие, в том числе я раньше, недооценивали (недооценивают) данный шаг. До тех пор, пока лично не столкнёшься с монотонностью и повторяемостью шагов, которых можно было бы избежать, если всё правильно сделать и настроить.
Вот, типичные шаги, каждого, кто собирается обновить своего тг бота.
- Зайти на сервер (ssh или специализированная админка хостинга)
- Перейти к директории проекта.
- Перенести новые файлы с локального компьютера на сервер (ssh-move или файловый менеджер хостинга)
- Убедиться что ничего не сломал
- Убедиться что всё перенёс
- Обнаружить что нужно ещё что-то улучшить и повторить процесс заново.
И это без баз данных. Да и некоторые шаги я объединил в один. Так, например, перенос файлов на сервер, та ещё задачка. Она становиться ещё более опасной если не делать резервное копирование (бэкапы). Не дай бог вам ошибиться и что-нибудь затереть. Всё пропало.
Для себя, я выделил три основные проблемы, когда обновлял проекты:
- Проблема доступа
- Проблема проверки
- Проблема резервного копирования
Первая проблема решается при помощи ssh клиента и сгенерированных RSA паролей. Вторую и третью можно решить внедрив Git в проект.
Настройка входа через SSH без пароля
Конечно, web интерфейсы удобны, красивы, функциональны, но чёрт, их очень тяжело автоматизировать. Конечно, можно было бы использовать selenium, но зачем, если можно написать обычный python или bash/powershel скрипт.
Идеальным решением данной проблемы является ssh доступ к серверу. Я на 100% уверен, что ты, мой читатель, знаешь что такое терминал и как с ним работать.
По дефолту, чтобы получить доступ к серверу потребуется пароль. Но вводить его каждый раз это тот ещё гемор. Поэтому, настроим доступ к серверу через сгенерированную пару ключей. Один на локальную машину, другой на сервер.
Генерируем пару.
Когда просят ввести имя ключа, вводим полный путь до него + имя ключа
Когда просят ввести пароль и другое, ничего не вводи.
После генерации ключа перейди к директории где был сгенерирован ключ.
Копируем публичный ключ на целевой сервер.
Теперь вы должны войти в систему без ввода пароля.
Внедрение технологии Git. Его практическое использование.
Две проблемы я объединил в одну, ибо их обоих можно решить интегрировав одну единственную технологию контроля версий, да я про git.
Данный инструмент берёт на себя отслеживание всех изменённых, удалённых и добавленных файлов. Также, в случае необходимости откатить изменения, просто выполни соответствующую команду.
Я не собираюсь, рассказывать все особенности работы с git-ом. Но я покажу тот минимум, что необходим для легкого и быстрого обновления проекта. Спойлер, буквально 3 команды.
Инициализация Git на локальной, домашней машине/компьютере.
Сначала инициализируем пустой репозиторий.
Создаём репозиторий на github, копируем ссылку на страницу репозитория.
Добавляем скопированную ссылку
Где REF_NAME это любое название вашей ссылки
Добавляем файлы.
Создаём первый коммит
Отправляем изменения на сервер, в первый раз
Где REF_NAME это название твоей ссылки, которую ты обозвал 3 шага назад.
Где BRANCH_NAME это имя ветки, по умолчанию это master
Клонирование Git репозитория уже на сервере
После входа на сервер. Остаётся запомнить 3 команды.
Для создания локальной копии на сервере
Заходим в директорию локальной копии репозитория
Для обновления проекта
Вывод
Вот таким вот образом я разворачиваю своих телеграмм ботов на серверах. Все мои боты, которые я публикую здесь, имеют свой github репозиторий и в этих репозиториях вы сможете найти соответствующие примеры скриптов запуска и службы (демоны).
Надеюсь данная статья помогла тебе развернуть твоего первого телеграмм бота. Пока.