Как поднять Telegram WebHook с Aiogram + WebApps на Docker?

Для поднятия Telegram WebHook с помощью Aiogram и WebApps на Docker, вам потребуется следовать нескольким шагам.

1. Сначала вам нужно создать Docker-контейнер, который содержит все необходимое для работы вашего приложения. Для этого можно использовать Dockerfile следующего содержания:

FROM python:3.8

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

2. Вам потребуется создать файл requirements.txt, в котором будут указаны все зависимости вашего приложения. Например:

aiogram==2.14.2
flask==2.0.1

3. Теперь вам нужно создать файл app.py, который будет содержать ваше приложение. Ниже приведен пример простого приложения, использующего Aiogram и Flask:

import logging
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.dispatcher.webhook import get_new_configured_app
from flask import Flask, request

API_TOKEN = 'YOUR_TELEGRAM_API_TOKEN'
WEBAPP_HOST = '0.0.0.0'  # Слушаем все входящие соединения
WEBAPP_PORT = 3000

logging.basicConfig(level=logging.INFO)

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
app = get_new_configured_app(dispatcher=dp, path='webhook')

# Обработчик для приема сообщений
@dp.message_handler()
async def echo(message: types.Message):
    await message.answer(message.text)

# Обработчик для проверки работоспособности сервера
@app.route('/')
def hello_world():
    return 'Hello, World!'

# Обработчик для WebHook
@app.route('/webhook', methods=['POST'])
async def webhook():
    if request.headers.get('content-type') == 'application/json':
        json_string = await request.json
        update = types.Update.to_object(json_string)
        await dp.process_updates([update])
        return 'ok'
    else:
        return 'invalid content-type'

if __name__ == '__main__':
    app.run(host=WEBAPP_HOST, port=WEBAPP_PORT)

4. Теперь вам нужно собрать Docker-образ, выполнив команду docker build -t mytelegramapp . в терминале. Обратите внимание, что mytelegramapp - это имя образа, и вы можете заменить его на любое другое.

5. Далее вам нужно запустить Docker-контейнер, используя команду docker run -p 3000:3000 mytelegramapp. Здесь мы привязываем порт 3000 внутри контейнера к порту 3000 на хосте.

6. Теперь, когда ваш контейнер запущен, вы можете настроить вебхук в Telegram, чтобы он отправлял обновления на ваш WebApp. Для этого вам нужно выполнить следующую команду боту в Telegram:

https://api.telegram.org/bot<YOUR_TELEGRAM_API_TOKEN>/setWebhook?url=<URL_TO_YOUR_WEBAPP>/webhook

Здесь <YOUR_TELEGRAM_API_TOKEN> - это ваш токен API Telegram, а <URL_TO_YOUR_WEBAPP> - это URL-адрес, на котором запущено ваше приложение (например, http://yourdomain.com или http://localhost:3000, если вы запускаете его локально).

В итоге, ваше приложение будет готово к приему и обработке обновлений от Telegram через вебхук. Вы можете использовать Aiogram для создания ботов с различными функциями и обработчиками сообщений, а Flask для создания веб-интерфейса или любых других функций, которые вам необходимы. Docker позволяет вам упаковать все в одну контейнеризированную среду и легко развернуть на любой платформе, где установлен Docker.