【问题标题】:Docker-compose with automatic lets encrypt sslDocker-compose 自动加密 ssl
【发布时间】:2022-01-06 00:57:37
【问题描述】:

好的,伙计们,这是我非常沮丧的问题:

我需要在上面部署一个带有 ssl 的 mautic 实例。请注意谁的SSL需要自动生成,我要一个完整的docker进程。

我什么都试过了,但是不存在任何直接在 docker 上生成 SSL 的解决方案,我发现的所有东西都使用服务器级别。

我发现最接近的解决方案是使用 ftraefik,但它会与 mautic 发生冲突。

这是我的 docker-compose 文件:

version: "3"

services:
  traefik:
    image: "traefik"
    restart: always
    command:
      - "--api=true"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      - "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ${DATA_FOLDER}/letsencrypt:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro
      
  mauticdb:
    restart: always
    image: percona/percona-server:5.7
    container_name: mauticdb
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MAUTIC_DB_PASSWORD}
    command:
      --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

  mautic:
    restart: always
    image: mautic/mautic:latest
    container_name: mautic
    links:
      - mauticdb:mysql
    depends_on:
      - mauticdb
    ports:
      - 127.0.0.1:80:80
    volumes:
      - mautic_data:/var/www/html
    environment:
      - MAUTIC_DB_HOST=mauticdb
      - MYSQL_PORT_3306_TCP=3306
      - MAUTIC_DB_USER=root
      - MAUTIC_DB_PASSWORD=${MAUTIC_DB_PASSWORD}
      - MAUTIC_DB_NAME=mautic
      - MAUTIC_RUN_CRON_JOBS=true
      - PHP_INI_DATE_TIMEZONE=${GENERIC_TIMEZONE}
    labels:
      - traefik.enable=true 
      # Routes
      - traefik.http.routers.mautic.rule=Host(`${MAUTIC_SUBDOMAIN}.${DOMAIN_NAME}`)
      - traefik.http.routers.mautic-secure.tls=true
      - traefik.http.routers.mautic.entrypoints=websecure
      - traefik.http.routers.mautic.tls.certresolver=mytlschallenge
      # Middlewares
      - traefik.http.middlewares.mautic.headers.SSLRedirect=true
      - traefik.http.middlewares.mautic.headers.contentTypeNosniff=true
      - traefik.http.middlewares.mautic.headers.SSLHost=${DOMAIN_NAME}
      - traefik.http.middlewares.mautic.headers.forceSTSHeader=true
       
volumes:
  mautic_data:
  sslcerts:
  mysql_data:

Traefik 在 80 端口与 Mautic 发生冲突。所以这根本不起作用。

问:如何安装 Traefik 并使用它通过 HTTPS 代理 Mautic 请求?

还有:

如果 Traefik 不是正确的方法,我需要自动生成什么配置,让我们根据 .env 文件中的域进行加密?

对任何工作的人开放。

谢谢;

【问题讨论】:

    标签: linux docker nginx lets-encrypt


    【解决方案1】:

    在不同于 80 的端口上运行 MAUTIC(因为这是 Traefik 使用的)

        ports:
          - "8081:80"
    

    您还可以将 Traefik 配置为仅侦听端口 443:在这种情况下,它将只接受 HTTPS 请求,而 MAUTIC 可以在端口 80 上运行而不会发生冲突。

    【讨论】:

    • 抱歉,如果 Mautic 只监听 80 端口,我如何将 SSL 从 traefik 传递到 Mautic?
    • 您可以从 Traefik 中删除 --entrypoints.web.address=:80" 和相关的 80 端口配置,因此它只接受 HTTPS。顺便说一句,即使 Mautic 在 80 上运行,您也只能将其端口 80 映射到另一个端口,以便 Mautic 容器公开您想要的端口(即 8081)
    • 对不起,Beppe,我真的很困惑。如果 mautic 在端口 80 上侦听,Traefik 在端口 443 上侦听,则 traefik 永远不会拦截 mauti 请求。而且,当它完成时,Mautic 从不使用 https。我根据您的建议部署了 docker,但根本不起作用。
    • Traefik 监听 443,它位于 Mautic 前面:当您有请求时 (mymautic....) 将代理到 Mautic。这是一篇解释该过程的博客文章(代理到另一个应用程序):medium.com/geekculture/…
    • 您调用哪个 URL?你有错误吗?与docker logs 联系以查看每个容器的作用