Я запускаю проект Symfony через drud/ddev
(nginx) для локальной разработки.
Я делал это много раз раньше, и у меня не было никаких проблем.
В моем недавнем проекте мне пришлось использовать Mercure-Hub для отправки уведомлений с сервера клиенту.
Мне потребовался symfony/mercure-bundle
через композитор, и я скопировал сгенерированный контент для создания докеров в docker-compose.mercure.yaml
(.ddev/docker-compose.mercure.yaml
)
После запуска контейнера Mercure-Hub работает без проблем, но доступен только через http.
Моя проблема: у меня только начальные знания в области nginx и docker-compose.
Я благодарна за каждый совет! :)
Настройте базовый проект Symfony и запустите его через DDEV.
Требуйте symfony/mercure-bundle
.
Скопируйте содержимое docker-compose.yaml
и docker-compose.override.yaml
в docker-compose.mercure.yaml
в папке .ddev
(измените порт).
Настройте URL-адрес Mercure-Hub в .env
.
Запустите контейнер и посетите [DDEV-URL]:[MERCURE-PORT]
/ подпишитесь на тему Mercure.
Доступ к Mercure-Hub возможен только через http.
Вызов HTTPS получает 'ERR_SSL_PROTOCOL_ERROR'
Читаю документацию Mercure-Hub и пытаюсь адаптировать инструкции Docker SSL/HTTPS к моей локальной среде drud/ddev.
Добавление еще одного сервера в конфигурацию nginx, как в Mercure-Cookbook «Использование NGINX в качестве обратного прокси-сервера HTTP/2 перед хабом»
Гугл кучу
Часы проб и ошибок
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"
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 ###
###> 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 ###
Я изменил свой 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
Теперь моя проблема заключается в том, что контейнер не предоставляет никаких портов (см. скриншот рабочего стола докера ниже).
@rfay Привет, спасибо за совет! Я изменил свой docker-compose, но теперь контейнер не предоставляет никаких портов. (см. «Редактировать 1»)
В вашей обновленной ситуации ddev-router привязывается к портам 9999 и 9998, делая их доступными. И ваш контейнер Mercure будет прослушивать порт 3000 (только http) для запросов в докере. Но я вижу ты забыл - VIRTUAL_HOST=$DDEV_HOSTNAME
Добавление - VIRTUAL_HOST=$DDEV_HOSTNAME
исправило это! Я, должно быть, проглядел это. Спасибо, что помогли мне! Вы хотите написать ответ, чтобы я мог проголосовать за него? Или я должен написать свой собственный ответ? (Я новичок в использовании stackoverflow для всего, кроме чтения)
Я бы сказал, давай, напиши свой собственный ответ. Пожалуйста, не забудьте указать ссылку на документы. Обратите внимание: если вы считаете, что этот рецепт полезен для других (или для более чем одного поддерживаемого вами проекта), вы можете сделать надстройку ddev, ddev.readthedocs.io/en/latest/users/extend/additional -servicees/…
С помощью rfay я нашел решение (которое заключалось в том, чтобы правильно прочитать документацию ddev, лол).
ports
на expose
VIRTUAL_HOST
, HTTP_EXPOSE
и HTTPS_EXPOSE
под environment
container_name
и labels
(см. код ниже)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
Привет. Вы должны использовать HTTP_EXPOSE и HTTPS_EXPOSE, чтобы открыть порт с помощью TLS, а не использовать
ports
. Используйтеexpose
вместоports
, а затем добавьтеHTTP_EXPOSE
иHTTPS_EXPOSE
. Есть много примеров; используйтеddev get --list
, чтобы увидеть некоторые поддерживаемые сервисы, и посмотрите документы на ddev.readthedocs.io/en/latest/users/extend/custom-compose-files/…