@kkolorid

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

Необходимо поднять на Docker мощностях телеграм бота (aiogram библиотека) с вебхуком (без ngrok) + веб приложение - обертка для Telegram Web Apps этого бота, соответственно (Flask например). При работе с WebApps TG есть особенности - можно подгружать в фрейм только с https. Домен имеется, ssl покупать не хотелось бы (lets encrypted соответственно добавляется в перечень). На данный момент бот без Web Apps работает на ngrok. Бьюсь над nginx + letsencrypted контейнерами под вебхук телеграм бота, о прикручивании туда еще и веб приложения также с https вообще даже думать рано и страшно. Возможно есть смысл бота поднять на самоподписном сертификате, а с вебом уже запариться по поводу letsencrypted, но пока не могу даже так запуститься без ngrok. Направьте пожалуйста. желательно с примерами.

docker-compose.yml
version: '3.7'

services:

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USERNAME}
      MYSQL_PASSWORD: ${MYSQL_USER_PASSWORD}
    ports:
      - "6033:3306"
    restart: on-failure
    volumes:
      - dbdata:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - db
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      PMA_ARBITRARY: 1
    restart: on-failure
    ports:
      - 8081:80

  bot:
    build: .
    command: sh -c "python bot.py"
    depends_on:
      - db
      - phpmyadmin
    env_file:
      - ./.env
    ports:
      - 5000:5000

volumes:
  dbdata:
  • Вопрос задан
  • 709 просмотров
Пригласить эксперта
Ответы на вопрос 1
@kkolorid Автор вопроса
Сильно помог Traefik. Но остановился на добавлнеии веб составляющей.

docker-compose.yml
version: '3.7'

services:

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USERNAME}
      MYSQL_PASSWORD: ${MYSQL_USER_PASSWORD}
    ports:
      - "6033:3306"
    restart: on-failure
    volumes:
      - dbdata:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - db
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      PMA_ARBITRARY: 1
    restart: on-failure
    ports:
      - 8081:80

  bot:
    container_name: bot
    build: .
    command: sh -c "python bot.py"
    depends_on:
      - db
      - phpmyadmin
    env_file:
      - ./.env
    ports:
      - 5000:5000
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.registry.rule=Host(`bot.free-shop24.ru`)"
      - "traefik.http.routers.registry.entrypoints=websecure"
      - "traefik.http.routers.registry.tls.certresolver=myresolver"
      - "traefik.http.routers.registry.middlewares=traefik-compress"

  web:
    container_name: web
    build: ./flask
    depends_on:
      - db
      - phpmyadmin
    ports:
      - 5001:5001
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.registry.rule=Host(`web.free-shop24.ru`)"
      - "traefik.http.routers.registry.entrypoints=websecure"
      - "traefik.http.routers.registry.tls.certresolver=myresolver"
      - "traefik.http.routers.registry.middlewares=traefik-compress"
    restart: unless-stopped

  traefik:
    image: "traefik:v2.4"
    container_name: "traefik"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.myresolver.acme.email=jump.or.jump@gmail.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    networks:
      - bot_default
    volumes:
      - "letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    labels:
      - "traefik.http.middlewares.traefik-compress.compress=true"
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`free-shop24.ru`)"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.tls.certresolver=myresolver"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.middlewares=traefik-compress"

volumes:
  letsencrypt:
  dbdata:

networks:
  bot_default:
    external: true


Бот уже отвечает по поддомену "bot.", но вот добавленный ".web" под Flask дает: service \"web-bot\" error: unable to find the IP address for the container \"/web\": the server is ignored
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы