Як перенаправити 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"

Відповіді:


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

1
Зауважте, що наявність наявного acme.json може блокувати проміжне програмне забезпечення від переадресації на HTTPS. Видаліть її, якщо вона вже існує при запуску Traefik.
AymDev

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 (послуга)


Не впевнений, що це вимога. Способом, який ви описали, схоже, що запити надходять у порт 80 traefik і схема змінюється на https перед тим, як переадресовуватись на сервіс бекенда. Але сервіс доповнення не робить завершення https, тому це не вдасться. Ідея полягала б у тому, щоб зробити фактичне перенаправлення http, щоб запит повернувся до traefik на порту 443 із збереженням хоста. У Traefik v1 це було легко зробити за допомогою статичної конфігурації.
Андрій Даскалу

Це працює. Це повинно бути в документації. Вам просто потрібно зробити маршрутизатор для http-версії і поставити на це посереднє програмне забезпечення для переадресації.
milosa

2

Гаразд, знайдено ... Я припускав, що середній рівень може бути оголошений на рівні Traefik, але вони повинні бути оголошені на рівні обслуговування.

Цей рядок:

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

Потрібно бути на етикетках служби whoami.

Ще один момент, який не пов'язаний з описаною проблемою, полягає в тому, що виклик http повинен бути виконаний на порту 80.

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

Видаліть "захищений" у "веб-захищений".


Це дивно. У мене є проміжне програмне забезпечення для переадресації, оголошене на сервісі Traefik і посилається на сервіс додатків, і воно працює.
Ізидорр

З попереднім кодом він, здається, працює, але http насправді не перенаправляє на https.
Thib

Як ви посилаєтесь на проміжне програмне забезпечення з програми?
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

З цим мені не потрібно нічого додавати до програмного забезпечення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.