Как перенаправить http в https с помощью ярлыков Traefik 2.0 и Docker Compose?

14

Обратите внимание, что это вопрос Traefik V2. У меня было решение на V1, но V2 - это полное обновление.

Это выше предполагается перенаправление http://whoami.mysite.com к HTTP s : //whoami.mysite.com.

  • Http s работает хорошо.
  • Http не перенаправляет на https и выдает ошибку 404.

Там нет другого файла. На данный момент все находится в этом Docker-compose.yml, поскольку это тест для подготовки к дальнейшему развертыванию.

version: "3.3"

services:

  traefik:
    image: "traefik:v2.0"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web-secure.address=:443"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge=true"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"
      #- "--certificatesresolvers.myhttpchallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.myhttpchallenge.acme.email=me@mail.com"
      - "--certificatesresolvers.myhttpchallenge.acme.storage=/letsencrypt/acme.json"
    labels:
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.middlewares=redirect-to-https@docker"
      - "traefik.http.routers.whoami-secured.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami-secured.entrypoints=web-secure"
      - "traefik.http.routers.whoami-secured.tls=true"
      - "traefik.http.routers.whoami-secured.tls.certresolver=myhttpchallenge"
Thib
источник

Ответы:

10

Теперь в учебном пособии от Джеральда Кроеса есть рабочее решение по адресу:

https://blog.containo.us/traefik-2-0-docker-101-fc2893944b9d

services:  
  traefik:  
    image: "traefik:v2.0.0"  
    # ...  
    labels:  
      # ...        
      # middleware redirect  
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"  
      # global redirect to https  
      - "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"  
      - "traefik.http.routers.redirs.entrypoints=web"  
      - "traefik.http.routers.redirs.middlewares=redirect-to-https"  
Мартин Гриневецки
источник
1
Вот docker-compose.yml из статьи github.com/containous/blog-posts/blob/master/…
TheOneRing
1
Обратите внимание, что наличие файла acme.json может заблокировать промежуточное программное обеспечение от перенаправления на HTTPS. Удалите его, если он уже существует при запуске Traefik.
АймДев
7

Вам не нужно настраивать сам сервис Traefik. В Traefik вам нужно иметь только точки входа: 443 (веб-защита) и: 80 (веб)

Поскольку Traefik действует только как entryPoint и не будет выполнять перенаправление, промежуточное программное обеспечение в целевой службе сделает это.

Теперь настройте целевой сервис следующим образом:

version: '2'
services:
  mywebserver:
    image: 'httpd:alpine'
    container_name: mywebserver
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.mywebserver-redirect-web-secure.redirectscheme.scheme=https
      - traefik.http.routers.mywebserver-web.middlewares=mywebserver-redirect-web-secure
      - traefik.http.routers.mywebserver-web.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web.entrypoints=web
      - traefik.http.routers.mywebserver-web-secure.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web-secure.tls.certresolver=mytlschallenge
      - traefik.http.routers.mywebserver-web-secure.tls=true
      - traefik.http.routers.mywebserver-web-secure.entrypoints=web-secure
      # if you have multiple ports exposed on the service, specify port in the web-secure service
      - traefik.http.services.mywebserver-web-secure.loadbalancer.server.port=9000

Так что в основном поток выглядит так:

Запрос: http://sub.domain.com:80 -> traefik (служба) -> mywebserver-web (маршрутизатор, правило http) -> mywebserver-redirect-web-secure (промежуточное ПО, перенаправление на https) - -> mywebserver-web-secure (маршрутизатор, правило https) -> mywebserver (служба)

Lars
источник
Не уверен, что это требование. То, как вы это описали, похоже, что запросы поступают в порт 80 traefik, и схема меняется на https, прежде чем перенаправляется в бэкэнд-сервис. Но бэкэнд-сервис не выполняет HTTPS-завершение, поэтому это не удастся. Идея состояла бы в том, чтобы сделать реальное перенаправление http так, чтобы запрос возвращался к traefik на порту 443, сохраняя хост. В Traefik v1 это было легко сделать с помощью статической конфигурации.
Андрей Даскалу
Это работает. Это должно быть в документации. Вам просто нужно сделать маршрутизатор для версии http и установить промежуточное программное обеспечение для перенаправления.
Милоса
2

Хорошо, нашел ... Я предположил, что промежуточное программное обеспечение может быть объявлено на уровне Traefik, но оно должно быть объявлено на уровне обслуживания.

Эта строка:

- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

Должен быть в ярлыках сервиса whoami.

Другой момент, который не связан с описанной проблемой, заключается в том, что вызов http должен выполняться на порте 80.

- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"

Удалите «безопасный» в «веб-безопасный».

Thib
источник
Это странно. У меня есть промежуточное программное обеспечение перенаправления, объявленное в сервисе Traefik и упомянутое из сервиса приложений, и оно работает.
Изыдорр
С предыдущим кодом это работает, но http на самом деле не перенаправляет на https.
Thib
Как вы относитесь к Middleware из приложения?
Thib
В traefik службе у меня есть ярлык , определяющий промежуточное: traefik.http.middlewares.https-only.redirectscheme.scheme=https и в приложении службы у меня есть метки: traefik.http.routers.myapp.rule=Host($ {APP_HOST} ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr
1
У меня есть все на этикетках. Насколько я понимаю, для использования промежуточного программного обеспечения требуются две метки: одна для объявления / настройки (traefik.http.middlewares.https-only.redirectscheme.scheme = https) и затем применяется к службе (traefik.http.routers.myapp.middlewares). = HTTPS-только). Объявление может находиться, например, либо в службе приложений, либо в службе treafik - точно так же, как я это делаю. Обратите внимание, что даже если вы объявляете промежуточную волну в службе приложений, вы видите ее на информационной панели вместе с другими промежуточными программами, объявленными в других местах. Может быть, я ошибаюсь, но я думаю, что вы можете использовать любой из них в любом сервисе.
Изыдорр
1

Я искал этот ответ, когда искал, как перенаправить все в HTTPS через Traefik v2.2, и лучшим вариантом для меня было добавление переменных ENV в Traefik, и оно автоматически перенаправляет весь трафик в HTTPS.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

При этом мне не нужно ничего добавлять в промежуточное ПО.

fperk
источник