DDEV не обслуживает Symfony Mercure-Hub через HTTPS

Я запускаю проект Symfony через drud/ddev (nginx) для локальной разработки. Я делал это много раз раньше, и у меня не было никаких проблем.

В моем недавнем проекте мне пришлось использовать Mercure-Hub для отправки уведомлений с сервера клиенту. Мне потребовался symfony/mercure-bundle через композитор, и я скопировал сгенерированный контент для создания докеров в docker-compose.mercure.yaml (.ddev/docker-compose.mercure.yaml)
После запуска контейнера Mercure-Hub работает без проблем, но доступен только через http.

Моя проблема: у меня только начальные знания в области nginx и docker-compose.

Я благодарна за каждый совет! :)

Действия по воспроизведению

  1. Настройте базовый проект Symfony и запустите его через DDEV.

  2. Требуйте symfony/mercure-bundle.

  3. Скопируйте содержимое docker-compose.yaml и docker-compose.override.yaml в docker-compose.mercure.yaml в папке .ddev (измените порт).

  4. Настройте URL-адрес Mercure-Hub в .env.

  5. Запустите контейнер и посетите [DDEV-URL]:[MERCURE-PORT] / подпишитесь на тему Mercure.

Моя проблема

  • Доступ к Mercure-Hub возможен только через http.

  • Вызов HTTPS получает 'ERR_SSL_PROTOCOL_ERROR'

Мое желание

  • Получите доступ к URL-адресу Mercure-Hub/подпишитесь на темы Mercure через HTTPS.

Что я пробовал

Файлы

ddev config.yaml

name: project-name
type: php
docroot: public
php_version: "8.1"
webserver_type: nginx-fpm
router_http_port: "80"
router_https_port: "443"
xdebug_enabled: true
additional_hostnames: []
additional_fqdns: []
database:
  type: mariadb
  version: "10.4"
nfs_mount_enabled: true
mutagen_enabled: false
use_dns_when_possible: true
composer_version: "2"
web_environment: []
nodejs_version: "16"

docker-compose.mercure.yaml

version: '3'

services:
  ###> symfony/mercure-bundle ###
  mercure:
    image: dunglas/mercure
    restart: unless-stopped
    environment:
      SERVER_NAME: ':3000'
      MERCURE_PUBLISHER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!'
      MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!'
      # Set the URL of your Symfony project (without trailing slash!) as value of the cors_origins directive
      MERCURE_EXTRA_DIRECTIVES: |
        cors_origins http://127.0.0.1:8000
    # Comment the following line to disable the development mode
    command: /usr/bin/caddy run -config /etc/caddy/Caddyfile.dev
    volumes:
      - mercure_data:/data
      - mercure_config:/config
    ports:
      - "3000:3000"
###< symfony/mercure-bundle ###

volumes:
  ###> symfony/mercure-bundle ###
  mercure_data:
  mercure_config:
###< symfony/mercure-bundle ###

.env

###> symfony/mercure-bundle ###
# See https://symfony.com/doc/current/mercure.html#configuration

# The URL of the Mercure hub, used by the app to publish updates (can be a local URL)
MERCURE_URL=http://ddev-pnp-master-mercure-1:3000/.well-known/mercure

# The public URL of the Mercure hub, used by the browser to connect
MERCURE_PUBLIC_URL=http://ddev-pnp-master-mercure-1:3000/.well-known/mercure

# The secret used to sign the JWTs
MERCURE_JWT_SECRET = "!ChangeThisMercureHubJWTSecretKey!"

###< symfony/mercure-bundle ###

Изменить 1

Я изменил свой docker-compose благодаря совету от rfay.
(показана только соответствующая часть ниже)

[...]
services:
  mercure:
    image: dunglas/mercure
    restart: unless-stopped
    expose:
      - "3000"
    environment:
      - SERVER_NAME = ":3000"
      - HTTP_EXPOSE=9998:3000
      - HTTPS_EXPOSE=9999:3000
[...]
  • заменил ports на expose
  • добавил HTTP_EXPOSE и HTTPS_EXPOSE

Проблема с этим

Теперь моя проблема заключается в том, что контейнер не предоставляет никаких портов (см. скриншот рабочего стола докера ниже).

Скриншот порта рабочего стола docker

Привет. Вы должны использовать HTTP_EXPOSE и HTTPS_EXPOSE, чтобы открыть порт с помощью TLS, а не использовать ports. Используйте expose вместо ports, а затем добавьте HTTP_EXPOSE и HTTPS_EXPOSE. Есть много примеров; используйте ddev get --list, чтобы увидеть некоторые поддерживаемые сервисы, и посмотрите документы на ddev.readthedocs.io/en/latest/users/extend/custom-compose-fi‌​les/…

rfay 06.12.2022 21:54

@rfay Привет, спасибо за совет! Я изменил свой docker-compose, но теперь контейнер не предоставляет никаких портов. (см. «Редактировать 1»)

Christian Neugebauer 07.12.2022 16:58

В вашей обновленной ситуации ddev-router привязывается к портам 9999 и 9998, делая их доступными. И ваш контейнер Mercure будет прослушивать порт 3000 (только http) для запросов в докере. Но я вижу ты забыл - VIRTUAL_HOST=$DDEV_HOSTNAME

rfay 07.12.2022 20:16

Добавление - VIRTUAL_HOST=$DDEV_HOSTNAME исправило это! Я, должно быть, проглядел это. Спасибо, что помогли мне! Вы хотите написать ответ, чтобы я мог проголосовать за него? Или я должен написать свой собственный ответ? (Я новичок в использовании stackoverflow для всего, кроме чтения)

Christian Neugebauer 07.12.2022 21:38

Я бы сказал, давай, напиши свой собственный ответ. Пожалуйста, не забудьте указать ссылку на документы. Обратите внимание: если вы считаете, что этот рецепт полезен для других (или для более чем одного поддерживаемого вами проекта), вы можете сделать надстройку ddev, ddev.readthedocs.io/en/latest/users/extend/additional -service‌​es/…

rfay 07.12.2022 22:44
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
5
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение

С помощью rfay я нашел решение (которое заключалось в том, чтобы правильно прочитать документацию ddev, лол).

Что я сделал

  • замена ports на expose
  • добавление VIRTUAL_HOST, HTTP_EXPOSE и HTTPS_EXPOSE под environment
  • добавление container_name и labels (см. код ниже)

Мой последний файл docker-compose.mercure.yaml

version: '3'

services:
  mercure:
    image: dunglas/mercure
    restart: unless-stopped
    container_name: "ddev-${DDEV_SITENAME}-mercure-hub"
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: ${DDEV_APPROOT}
    expose:
      - "3000"
    environment:
      VIRTUAL_HOST: $DDEV_HOSTNAME
      SERVER_NAME: ":3000"
      HTTP_EXPOSE: "9998:3000"
      HTTPS_EXPOSE: "9999:3000"
      MERCURE_PUBLISHER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!'
      MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!'
      MERCURE_EXTRA_DIRECTIVES: |
        cors_origins https://project-name.ddev.site
    # Comment the following line to disable the development mode
    command: /usr/bin/caddy run -config /etc/caddy/Caddyfile.dev
    volumes:
      - mercure_data:/data
      - mercure_config:/config

volumes:
  mercure_data:
  mercure_config:

С этим docker-compose мой контейнер Mercure доступен через HTTPS через порт 9999.

Для получения дополнительной информации см. документацию ddev: https://ddev.readthedocs.io/en/latest/users/extend/custom-compose-files/#docker-composeyaml-examples

Другие вопросы по теме