Футбольный телеграм бот на Python (4/4): Запуск на сервере

В четвертой части серии статей по написанию телеграм бота на python, запустим его на сервере. Для разнообразия и правдоподобия я выбрал вариант размещения на VPS, а не Heroku.

Во-первых, Heroku очень редко используют в продакшене. Его платные тарифы сильно выше стоимости аренды сервера.

Во-вторых, крупные кампании дают виртуальные машины бесплатно на год. Этого достаточно, что бы 4 года не платить за работу сервера.

Получение VPS

Как я уже написал, есть возможность получить VPS бесплатно на год. Выбирайте любой:

Только не активируйте все сразу, это разовое предложение.

Не буду подробно описывать, как развернуть VPS, у этих платформ документации на высоком уровне. Если у вас трудности с английским и переводчиками, начинайте с Azure. У них много русской документации. Скажу только, что крайне желательно выбирать OS Ubuntu 18.04.

Процесс получения бесплатного периода и создание виртуальной машины достаточно тернист. Если вы никогда не делали это ранее, будьте готов потратить 1-2 часа на знакомство с облачными решениями.

Я буду использовать VPS с почасовой оплатой от reg.ru. Это дешевое и простое решение. Для обучения и демонстрации можно запускать на несколько часов по цене от 0,32 ₽/час. А постоянная работа подобного бота будет стоить 215 рублей в месяц.

Подключение к виртуальной машине

Для подключения к VPS нужно знать ip (IPv4), логин (обычно «root») и пароль.

С Linux и MacOS можно подключится из терминала. Введите команду, логин и ip сервера.

ssh root@123.123.123.23

Для windows можно скачать терминал Ubuntu. Если такой вариант не подходит, используйте PuTTY (порт: 22). Вот так выглядит консоль. Для подключения требуется ввести «yes» и пароль.

Футбольный телеграм бот на Python (4/4): Запуск на сервере

После входа я узнал какая версия python установлена командой python -V. Из коробки стоит 3.6.9, а проект на 3.8.5, нужно обновить.

Подготовка сервера

  1. Установим необходимую версию python. Внимательно вводите эти команды по очереди, это процесс кастомной установки.
$ sudo apt update
$ sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev
$ wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz
$ tar -xf Python-3.8.5.tgz
$ cd Python-3.8.5
$ ./configure --enable-optimizations
$ make  # ~15 минут
$ sudo make altinstall
$ cd /home

Немного деталей. Я скачал архив, распаковал и установил python 3.8.5. Будет готов подождать пока выполнится команды make. Введите python3.8 -V и убедитесь, что можно продолжать:

/home# python3.8 -V
Python 3.8.5 

2. Создадим проект. Установим и создадим виртуально окружение. Выполняйте команды по очереди:

$ python3.8 -m pip install --upgrade pip 
$ pip install virtualenv
$ mkdir fonlinebot
$ cd fonlinebot
$ virtualenv venv
$ source venv/bin/activate
$ python -V
$ deactivate

Мы установили pip и virtualenv. Затем создали папку «fonlinebot», создали в ней виртуальное окружение и проверили его.

Футбольный телеграм бот на Python (4/4): Запуск на сервере

3. Установим и запустим Redis-server. Для установки и проверки в Ubuntu введите эти команды:

$ sudo apt install redis-server
$ redis-cli
127.0.0.1:6379> ping

Получите PONG, значит redis запущен. Устанавливать удаленный доступ и пароль в этом руководстве я не буду. Эта служба доступна только конкретной машине, что полностью покрывает задачу.

4. Переменные окружения. Теперь нужно спрятать токен и API-ключ в переменные. Выполните команду nano /etc/environment и вставьте эти строки со своими значениями в кавычках.

fonlinebot_token="замените_на_токен"
fonlinebot_api_key="замените_на_ключ_апи"

Затем нажмите CTRL+O -> Enter -> CTRL+X для сохранения. Перезапустите машину: sudo reboot, что бы переменить настройки.

5. Подготовка кода бота. Отредактируйте файл config.py. Раскомментируем настройки логирования и установим переменные окружения.

# fonlinebot/config.py
#...
import datetime
import os


formatter = '[%(asctime)s] %(levelname)8s --- %(message)s (%(filename)s:%(lineno)s)'
logging.basicConfig(
    filename=f'bot-from-{datetime.datetime.now().date()}.log',
    filemode='w',
    format=formatter,
    datefmt='%Y-%m-%d %H:%M:%S',
    level=logging.WARNING
)


TOKEN = os.environ.get("fonlinebot_token")
#...

   'x-rapidapi-key': os.environ.get("fonlinebot_api_key"),
#...

Скрывать секретную информацию (токены, пароли) обязательно. Нельзя выкладывать файлы с паролями на гитхаб, stackoverflow или отправлять сторонним разработчикам.

Половина работы сделана. Теперь нужно загрузить файлы на сервер.

Загрузка файлов на VPS

Скачайте и установите WinSCP. Это программа для загрузки проекта на VPS. Альтернативный вариант Filezilla. Вариант для повышения скиллов — Git.

Откройте и установите соединение с сервером:

программа для загрузки проекта на сервер

Далее перенесите файлы проекта (без venv и файлов Pycharm) в папку home/fonlinebot/.

файлы проекта (без venv и файлов Pycharm) в папку home/fonlinebot/

Готово? Запустим бота с сервера.

$ cd /home/fonlinebot/  # перейдем в папку проекта
$ source venv/bin/activate  # активируем окружение
$ pip install -r requirements.txt  # установим зависимости
$ python main.py  # запустим бота

Теперь перейдите в Телеграм и протестируйте работу. Отвечает? Хорошо, остановите его (ctrl+c) и деактивируйте виртуальное окружение (deactivate)

Финишная прямая проекта. После закрытия терминала, бот остановится. После перезапуска сервера, он не запустится. Настроем автономную работу.

Беспрерывная работа бота

Создадим собственную службу для постоянной работы бота и перезапуска в случае падения.


nano /lib/systemd/system/fonlinebot.service

С настройками:

[Unit]
Description=Football online bot
After=network.target

[Service]
EnvironmentFile=/etc/environment
ExecStart=/home/fonlinebot/venv/bin/python main.py
ExecReload=/home/fonlinebot/venv/bin/python main.py
WorkingDirectory=/home/fonlinebot/
KillMode=process
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Затем нажмите CTRL+O -> Enter -> CTRL+X для сохранения. Что это за настройки?

Настройки службы, нам важны эти:

  • Description — описание службы.
  • EnvironmentFile — путь к файлу с переменными.
  • ExecStart и ExecReload — это команды для запуска и перезапуска бота.
  • WorkingDirectory — путь к папке в которой файл запуска main.py.

Для запуска службы выполните эти 2 команды.

systemctl enable fonlinebot
systemctl start fonlinebot

Теперь вернемся в бот и посмотрим как он отвечает.

Если бот не отвечает, проверьте статус и логи. Здесь сложно предвидеть ошибку:

systemctl status fonlinebot  # статус
journalctl -u  fonlinebot.service  # логи

Проект готов, отличная работа! Все этапы разработки на Gitlab.

Заключение

Мы проделали большую работу: создали бота, настроили его взаимодействие с внешним api и загрузили на сервера. В процессе затронули кнопки, меню, callback и ошибки.

Вот несколько идей для продолжения проекта:

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

Удачи!

Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: Почта
admin@pythonru.comAlex Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScript