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

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

  • Командная строка Linux
  • Базовое понимание Python
  • Базовое понимание Docker

Обратите внимание, что это руководство можно обобщить и применить к другим программам на python, а не только к Telegram-ботам.

Установка Docker

Неудивительно, что первым шагом к настройке Telegram-бота является установка Docker. В зависимости от вашей операционной системы шаги по установке могут отличаться, в примере я буду использовать VPS на Linux, как установить Docker на VPS, указано в этом руководстве. Приведенные ниже шаги предназначены для Ubuntu но вам следует обратиться к руководству по установке Docker, если вы используете другую операционную систему:

1. Настройте репозиторий apt в Docker.

2. Установите пакеты Docker.

3. Убедитесь, что установка Docker Engine прошла успешно, запустив образ hello-world.

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

Как только мы настроим Docker, приступим к клонированию примера проекта Telegram-бота с помощью следующей команды:

Если у вас не установлен Git, то проект можно просто скачать в браузере

После распаковать и загрузить в директорию на сервере.

Настройка проекта

Создание Telegram-бота включает в себя несколько ключевых этапов, которые описаны ниже:

  1. Установите Telegram и создайте учетную запись: Сначала убедитесь, что на вашем устройстве установлено приложение Telegram и вы создали учетную запись.
  2. Найдите BotFather: BotFather — официальный бот, который помогает создавать Telegram-ботов и управлять ими. Найдите “BotFather” в приложении Telegram и начните чат с ним.
  3. Создайте нового бота:
  • Отправьте команду “/newbot” BotFather.
  • BotFather попросит вас выбрать имя для вашего бота. Это отображаемое имя, которое будет отображаться в контактах и беседах. Введите имя и отправьте его.
  • Далее BotFather попросит вас выбрать имя пользователя для вашего бота. 
    Оно должно заканчиваться на “bot» (например, “weather_bot» или “my_weather_bot”). 
    Имя пользователя должно быть уникальным.

4. Получите токен бота:

  • Если имя пользователя доступно, BotFather подтвердит, что бот создан. В этом сообщении вы увидите абзац, начинающийся словами “Используйте этот токен для доступа к HTTP API”. Длинная строка букв и цифр в этом абзаце — это ваш TELEGRAM_BOT_TOKEN.
  • Аккуратно скопируйте этот токен. Он должен выглядеть примерно так:
  • Надежно храните этот токен. Любой, у кого есть этот токен, может управлять вашим ботом, поэтому не делитесь им публично.

Перед запуском проекта необходимо установить следующие пакеты на сервер:

  • python-telegram-bot — библиотека-обертка для работы с api телеграмма (подробнее здесь)
  • natasha — библиотека для nlp при работе с русским текстом (подробнее здесь)
  • emoji — пригодится для работы со смайликами
  • requests — для работы с Api Yandex и API Open Weather

В файле constants/global_env_variables.py нужно задать токены для работы с апишками.

Рекомендуемый вариант: ничего не менять в коде, а задать каждую переменную в глобальном окружении своего компьютера (как создавать глобальные переменные окружения для bash/zsh здесь).
Легкий и быстрый вариант (только для локального запуска!): Ты можешь просто заменить каждую переменную в духе BOT_TOKEN = os.environ.get('BOT_TOKEN') на BOT_TOKEN="your token".

Список всех констант-токенов, которые нужно задать:

Теперь давайте убедимся, что проект работает, установив необходимые пакеты и затем запустив программу:

Если программа запущена успешно, вы увидите «экземпляр TeleQR запущен!», напечатанный в консоли.

На данный момент мы получили ТОКЕН бота, развернули и проверили на работоспособность телеграмм бота локально на сервере, теперь наша задача упаковать его в Docker.

Создание Dockerfile

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

1. Создайте пустой Dockerfile:

В каталоге вашего проекта создайте пустой файл с именем Dockerfile. Этот файл будет содержать инструкции для Docker о том, как создать ваш контейнер.

2. Добавление базового изображения:

Первая строка в файле Dockerfile указывает базовый образ, который будет использоваться нашим контейнером. В данном случае мы используем Python версии 3.10.12 в качестве базового образа мы объявим это в верхней части файла:

3. Настройка рабочего каталога:

Далее мы устанавливаем рабочий каталог внутри контейнера docker где будет находиться код нашего приложения:

4. Копирование файлов в контейнер:

Далее нам нужно скопировать все файлы из нашего локального каталога проекта в контейнер. Каталог включает в себя наши скрипты на Python, файл требований и любые другие файлы проекта. В приведенной ниже команде COPY первая команда . представляет наш текущий каталог проекта а второй . представляет собой docker рабочий каталог контейнера (который мы только что установили с помощью предыдущей команды):

5. Создание каталога:

Затем мы используем команду RUN для выполнения mkdir ./images в рабочем каталоге нашего контейнера docker. Этот шаг специфичен для примера проекта Telegram-бота. мы используем, но вы можете обобщить эту часть Dockerfile для любых других настроек в ваших проектах:

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

После настройки файлов проекта мы теперь устанавливаем зависимости, требуемые нашим приложением на Python.

7. Указание команды для запуска приложения:

Наконец, мы указываем команду, которая должна выполняться при запуске контейнера. В данном случае мы запускаем наш скрипт на Python с именем weather_bot.py

Это было не просто. Но если вы зашли так далеко, то поздравляю! Вы успешно создали Dockerfile для вашего Telegram-бота. 

Остался последний шаг — создать образ Docker на основе этого Dockerfile и запустить вашего бота внутри контейнера Docker!

Сборка и запуск

Давайте сначала создадим наш образ docker с помощью docker build. В каталоге вашего проекта выполните следующую команду:

В первый раз этот процесс может занять некоторое время, поэтому подождите несколько минут. Приведенная выше команда, по сути, считывает инструкции из вашего Dockerfile и создает с его помощью образ Docker. Можете заменять my_telegram_bot на свое, назвав образ докер так, как вам удобно.

После создания образа Docker мы, сможем запустить контейнер Docker с docker run:

Если все сделано правильно, то вы увидите, что ваше приложение успешно запустилось! Прежде чем уходить, прочтите несколько полезных базовых команд Docker , которые следует знать:

  • docker run -d <image_id_or_name> как запустить контейнер Docker в отключенном режиме
  • docker ps для составления списка всех запущенных контейнеров
  • docker stop <container_id_or_name> как остановить запущенный контейнер
  • docker rm <container_id_or_name> как удалить контейнер
  • docker images — чтобы перечислить все изображения
  • docker rmi <image_id_or_name> как удалить изображение
  • docker logs <container_id_or_name> для просмотра журналов контейнера

Это основные команды, которые вы можете найти полезными, но есть много других команд, которые вы сможете найти с Документации Docker.

Заключение

Таким образом, мы успешно настроили и запустили Telegram-бота внутри контейнера Docker. В этом руководстве мы пошагово описали процесс создания Dockerfileсоздания образа Docker из этого и, наконец, запуск контейнера Docker на основе этого образа. Кроме того, мы изучили некоторые полезные команды Docker для управления контейнерами и образами.

Продолжая знакомство с Docker, помните, что вам предстоит изучить множество других функций. Документация Docker — это отличное место для оформления заказа, если вы хотите узнать больше о передовых концепциях и передовых практиках Docker. Как всегда, если у вас есть идеи, предложения или отзывы, которыми можно поделиться, не стесняйтесь оставлять их в комментариях или связаться!

Приятного программирования, и если вы хотите автоматизировать процесс развертывания вместе со мной, то следите за обновлениями!

Обсудить мануал можно в нашем телеграм.