Так как в данном мануале, основная задача упаковать и докеризировать телеграмм бота, то для примера возьмем готового бота, рассказывающего о погоде. Подробнее о данном проекте можно прочитать на GitHub.
Прежде чем мы погрузимся в мир Docker, обратите внимание, что это руководство предполагает базовое знание следующего:
- Командная строка Linux
- Базовое понимание Python
- Базовое понимание Docker
Обратите внимание, что это руководство можно обобщить и применить к другим программам на python, а не только к Telegram-ботам.
Установка Docker
Неудивительно, что первым шагом к настройке Telegram-бота является установка Docker. В зависимости от вашей операционной системы шаги по установке могут отличаться, в примере я буду использовать VPS на Linux, как установить Docker на VPS, указано в этом руководстве. Приведенные ниже шаги предназначены для Ubuntu но вам следует обратиться к руководству по установке Docker, если вы используете другую операционную систему:
1. Настройте репозиторий apt в Docker.
1 2 3 4 5 6 7 8 9 10 |
sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update |
1 |
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
3. Убедитесь, что установка Docker Engine прошла успешно, запустив образ hello-world.
1 |
sudo docker run hello-world |
Клонируйте проект
Как только мы настроим Docker, приступим к клонированию примера проекта Telegram-бота с помощью следующей команды:
1 |
git clone https://github.com/nsbarsukov/weather-telegram-bot |
Если у вас не установлен Git, то проект можно просто скачать в браузере
После распаковать и загрузить в директорию на сервере.
Настройка проекта
Создание Telegram-бота включает в себя несколько ключевых этапов, которые описаны ниже:
- Установите Telegram и создайте учетную запись: Сначала убедитесь, что на вашем устройстве установлено приложение Telegram и вы создали учетную запись.
- Найдите BotFather: BotFather — официальный бот, который помогает создавать Telegram-ботов и управлять ими. Найдите “BotFather” в приложении Telegram и начните чат с ним.
- Создайте нового бота:
- Отправьте команду “/newbot” BotFather.
- BotFather попросит вас выбрать имя для вашего бота. Это отображаемое имя, которое будет отображаться в контактах и беседах. Введите имя и отправьте его.
- Далее BotFather попросит вас выбрать имя пользователя для вашего бота.
Оно должно заканчиваться на “bot» (например, “weather_bot» или “my_weather_bot”).
Имя пользователя должно быть уникальным.
4. Получите токен бота:
- Если имя пользователя доступно, BotFather подтвердит, что бот создан. В этом сообщении вы увидите абзац, начинающийся словами “Используйте этот токен для доступа к HTTP API”. Длинная строка букв и цифр в этом абзаце — это ваш TELEGRAM_BOT_TOKEN.
- Аккуратно скопируйте этот токен. Он должен выглядеть примерно так:
1 |
123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ |
- Надежно храните этот токен. Любой, у кого есть этот токен, может управлять вашим ботом, поэтому не делитесь им публично.
Перед запуском проекта необходимо установить следующие пакеты на сервер:
- 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"
.
Список всех констант-токенов, которые нужно задать:
- в константе
BOT_TOKEN
подставь токен своего бота (как создать бота и получить токен можно почитать здесь) - в константе
YANDEX_GEOCODER_API_TOKEN
подставь токен для API для перевода географических координат в адрес и наоборот. - в константе
OPEN_WEATHER_API_TOKEN
подставь токен для Open Weather API.
Теперь давайте убедимся, что проект работает, установив необходимые пакеты и затем запустив программу:
1 2 |
pip3 install python-telegram-bot natasha emoji requests python weather_bot.py |
Если программа запущена успешно, вы увидите «экземпляр TeleQR запущен!», напечатанный в консоли.
На данный момент мы получили ТОКЕН бота, развернули и проверили на работоспособность телеграмм бота локально на сервере, теперь наша задача упаковать его в Docker.
Создание Dockerfile
Теперь, когда мы запустили проект, пришло время создать Dockerfile, он необходим для создания образа докер контейнера.
1. Создайте пустой Dockerfile:
В каталоге вашего проекта создайте пустой файл с именем Dockerfile. Этот файл будет содержать инструкции для Docker о том, как создать ваш контейнер.
2. Добавление базового изображения:
Первая строка в файле Dockerfile указывает базовый образ, который будет использоваться нашим контейнером. В данном случае мы используем Python версии 3.10.12 в качестве базового образа мы объявим это в верхней части файла:
1 |
FROM python:3.10.12 |
3. Настройка рабочего каталога:
Далее мы устанавливаем рабочий каталог внутри контейнера docker где будет находиться код нашего приложения:
1 |
WORKDIR /usr/src/app |
4. Копирование файлов в контейнер:
Далее нам нужно скопировать все файлы из нашего локального каталога проекта в контейнер. Каталог включает в себя наши скрипты на Python, файл требований и любые другие файлы проекта. В приведенной ниже команде COPY
первая команда .
представляет наш текущий каталог проекта а второй .
представляет собой docker рабочий каталог контейнера (который мы только что установили с помощью предыдущей команды):
1 |
COPY . . |
Затем мы используем команду RUN
для выполнения mkdir ./images
в рабочем каталоге нашего контейнера docker. Этот шаг специфичен для примера проекта Telegram-бота. мы используем, но вы можете обобщить эту часть Dockerfile для любых других настроек в ваших проектах:
1 |
RUN mkdir ./images |
После настройки файлов проекта мы теперь устанавливаем зависимости, требуемые нашим приложением на Python.
1 |
RUN pip3 install python-telegram-bot natasha emoji requests |
7. Указание команды для запуска приложения:
Наконец, мы указываем команду, которая должна выполняться при запуске контейнера. В данном случае мы запускаем наш скрипт на Python с именем weather_bot.py
1 |
CMD ["python", "-u", "./weather_bot.py"] |
Это было не просто. Но если вы зашли так далеко, то поздравляю! Вы успешно создали Dockerfile для вашего Telegram-бота.
1 2 3 4 5 6 |
FROM python:3.10.12 WORKDIR /usr/src/app COPY . . RUN mkdir ./images RUN pip3 install python-telegram-bot natasha emoji requests CMD ["python", "-u", "./weather_bot.py"] |
Остался последний шаг — создать образ Docker на основе этого Dockerfile и запустить вашего бота внутри контейнера Docker!
Сборка и запуск
Давайте сначала создадим наш образ docker с помощью docker build
. В каталоге вашего проекта выполните следующую команду:
1 |
docker build -t my_telegram_bot . |
В первый раз этот процесс может занять некоторое время, поэтому подождите несколько минут. Приведенная выше команда, по сути, считывает инструкции из вашего Dockerfile и создает с его помощью образ Docker. Можете заменять my_telegram_bot
на свое, назвав образ докер так, как вам удобно.
После создания образа Docker мы, сможем запустить контейнер Docker с docker run:
1 |
docker run my_telegram_bot |
Если все сделано правильно, то вы увидите, что ваше приложение успешно запустилось! Прежде чем уходить, прочтите несколько полезных базовых команд 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. Как всегда, если у вас есть идеи, предложения или отзывы, которыми можно поделиться, не стесняйтесь оставлять их в комментариях или связаться!
Приятного программирования, и если вы хотите автоматизировать процесс развертывания вместе со мной, то следите за обновлениями!
Обсудить мануал можно в нашем телеграм.