Запуск Telegram-бота на основе библиотеки aiogram на Dockhost

В данной статье мы рассмотрим деплой приложения, написанного на Python c использованием библиотеки aiogram.
В качестве примера, возьмём небольшого Telegram-бота, который отвечает на запросы пользователя фразой равной его запросу (echobot). Исходный код данного Telegram-бота можно посмотреть здесь: example-aiogram.
Деплой бота будет производиться на платформе Dockhost. В рамках примера предполагаем, что у пользователя есть учётная запись на платформе.
Подключение репозитория Git
Перед подключением репозитория, в корневой директории необходимо создать Dockerfile со следующим содержимым:
FROM python:3.9
ENV PYTHONUNBUFFERED=1 \
PIP_DISABLE_PIP_VERSION_CHECK=on
WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY . /app
CMD ["python", "main.py"]
Данный Dockerfile использует базовый образ python:3.9, устанавливает все зависимости из файла requirements.txt и копирует содержимое из всего репозитория в папку /app. В качестве основной команды будет использоваться python main.py. В дальнейшем из данного Dockerfile будет собран и запущен контейнер с Telegram-ботом.
Вы можете добавить файл .dockerignore и указать в нём файлы или папки, которые не должны быть скопированы в контейнер.
Теперь в Вашем репозитории есть Dockerfile, и Вы можете подключить его (репозиторий) к платформе Dockhost. Для этого в проекте my-project (проект может быть любым, для примера мы будем использовать my-project, который создаётся по умолчанию при регистрации на платформе) необходимо перейти в раздел «Репозитории Git» и добавить репозиторий.

В нашем примере Git-репозиторий является публичным и не требует авторизации. Для того чтобы подключить приватный Git-репозиторий, необходимо указать имя пользователя и пароль в разделе «Авторизация».

Для подключения приватного репозитория GitHub необходимо использовать Personal access tokens. Как использовать персональный токен смотрите в статье Using a personal access token.
Далее нажмите на кнопку «Применить» и дождитесь завершения процесса подключения репозитория и первой сборки контейнера из репозитория.

Настройка контейнера
Как только процесс сборки будет завершён, в разделе «Контейнеры» появится контейнер Telegram-бота.

Telegram-бот не запустится сразу и в логах будет сообщение об ошибке.

Это связано с тем, что в файле main.py необходимо указать токен в переменной окружения TOKEN.
TOKEN = os.environ.get("TOKEN")
Далее необходимо отредактировать параметры контейнера, для этого нажмите на кнопку «Управлять», чтобы перейти в раздел просмотра контейнера и на открывшейся странице нажмите на кнопку «Редактировать».

В открывшемся модальном окне, в разделе «Переменные окружения», добавьте новую переменную TOKEN со значением, полученным от @BotFather.

Далее нажмите на кнопку «Применить» и дождитесь завершения процесса перезапуска контейнера.

После перезапуска контейнера в логах будет запись об успешном старте приложения. Теперь Telegram-бот полностью настроен и запущен, а благодаря настройке деплоя через Push, при изменении кода платформа Dockhost будет автоматически собирать и запускать новую версию Telegram-бота.
В дальнейшем Вы можете взять за основу наш репозиторий example-aiogram и расширить функционал, при необходимости добавив новые команды и функции.
Если у Вас уже есть свой Telegram-бот, написанный на Python, Вы можете так же просто запустить его на платформе Dockhost, используя пошаговый алгоритм из нашей статьи. Для этого воспользуйтесь примерами Dockerfile и придерживайтесь описанной последовательности действий.
Распространенные ошибки
aiogram.utils.token.TokenValidationError: Token is invalid! It must be 'str' type instead of <class 'NoneType'> type.
Необходимо указать токен, полученный от @BotFather.
Failed to fetch updates - TelegramConflictError: Telegram server says - Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
Запущено несколько экземпляров, необходимо остановить другой экземпляр Telegram-бота.