0

我只是通过学习 Symfonys Turbo 实现来学习如何使用 Mercure。

我刚刚学习了 Symfonycasts Turbo 课程,并且通过 symfony 二进制文件/Symfony Local Web Server 使用 Turbo Streams 和 Mercure Hub 没有任何问题。

我的下一步是在我正在与我的团队合作的“真实”项目中尝试整个事情。

由于我们在团队中使用 DDEV 进行本地开发,因此我尝试将 mercure 实施到我的 DDEV 环境中。

我是 docker compose 和 DDEV 的新手,所以我只是尝试按照关于定义自定义服务的 DDEV 文档部分进行操作 ,其中说:

要为您的项目添加自定义配置或其他服务,请在 .ddev 目录中为您的项目创建 docker-compose 文件。ddev 将使用 docker-compose.[servicename].yaml 命名约定处理任何文件,并将它们包含在执行 docker-compose 功能中。

DDEV 文档还指出了以下步骤:

在为您的项目定义附加服务时,我们建议您遵循这些约定,以确保 ddev 处理您的服务的方式与 ddev 处理默认服务的方式相同。

To name containers follow this naming convention ddev-[projectname]-[servicename]

Provide containers with the following labels

* com.ddev.site-name: ${DDEV_SITENAME}

* com.ddev.approot: $DDEV_APPROOT

Exposing ports for service: you can expose the port for a service to be accessible as projectname.ddev.site:portNum while your project is running. This is achieved by the following configurations for the container(s) being added:

* Define only the internal port in the ports section for docker-compose. The hostPort:containerPort convention normally used to expose ports in docker should not be used here, since we are leveraging the ddev router to expose the ports.

然后我查看了Mercure 文档,他们提供了一个示例 docker-compose 服务定义,如下所示:

    # docker-compose.yml
    version: "3.7"
    
    services:
      caddy:
        image: dunglas/mercure
        restart: unless-stopped
        environment:
          # Uncomment the following line to disable HTTPS
          #SERVER_NAME: ':80'
          MERCURE_PUBLISHER_JWT_KEY: '!ChangeMe!'
          MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeMe!'
        # Uncomment the following line to enable the development mode
        #command: /usr/bin/caddy run -config /etc/caddy/Caddyfile.dev
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - caddy_data:/data
          - caddy_config:/config
    
    volumes:
      caddy_data:
  caddy_config:

根据 DDEV 文档,我尝试修改示例配置,结果如下:

    version: "3.7"

services:
  mercure:
    # Name of container using standard ddev convention
    container_name: ddev-${DDEV_SITENAME}-mercure
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
    image: dunglas/mercure
    restart: unless-stopped
    environment:
      # Uncomment the following line to disable HTTPS
#      SERVER_NAME: ':80'
      MERCURE_PUBLISHER_JWT_KEY: '!ChangeMe!'
      MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeMe!'
    # Uncomment the following line to enable the development mode
    #command: /usr/bin/caddy run -config /etc/caddy/Caddyfile.dev
    ports:
      - "80"
      - "443"
    volumes:
      - caddy_data:/data
      - caddy_config:/config

volumes:
  caddy_data:
  caddy_config:

所以我所做的就是按照容器命名惯例加上两个标签加上只定义内部端口。

但这似乎不起作用,因为我无法访问 mercure hubs url,并且当我尝试在我的应用程序中使用 Mercure Hub 时,正如我之前成功所做的那样,使用 Symfony 服务器而不是 DDEv,我收到以下错误消息:

未能发送更新。

谁能帮我通过 DDEV 配置 Mercure 集线器?

显然,当我查看DDEV-contrib已经提供的内容时,这些内容似乎比我的更复杂。

这是他们为弹性搜索提供的示例配置:

version: '3.6'
services:
  elasticsearch:
    container_name: ddev-${DDEV_SITENAME}-elasticsearch
    hostname: ${DDEV_SITENAME}-elasticsearch
    image: elasticsearch:7.10.1
    expose:
      - "9200"
      - "9300"
    environment:
      - cluster.name=docker-cluster
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - VIRTUAL_HOST=$DDEV_HOSTNAME
      - HTTP_EXPOSE=9200:9200
      - HTTPS_EXPOSE=9201:9200
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
    volumes:
      - elasticsearch:/usr/share/elasticsearch/data
      - ".:/mnt/ddev_config"
  web:
    links:
      - elasticsearch:elasticsearch

volumes:
  elasticsearch:

我很感激任何帮助。

4

0 回答 0