Como redirecionar http para https com os rótulos Traefik 2.0 e Docker Compose?

14

Observe que se trata de uma pergunta do Traefik V2. Eu tinha uma solução em V1, mas V2 é uma rewamp total.

Isso acima deve redirecionar http://whoami.mysite.com para http s : //whoami.mysite.com.

  • O http s está trabalhando bem.
  • O http não redireciona para https e gera um erro 404.

Não há outro arquivo. Tudo está neste Docker-compose.yml no momento, pois é um teste para preparar uma implantação adicional.

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"
      - "[email protected]"
      - "--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
fonte

Respostas:

10

Agora existe uma solução de trabalho em um tutorial de Gérald Croës em:

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"  
Martin Hryniewiecki
fonte
11
Aqui é a janela de encaixe-compose.yml do artigo github.com/containous/blog-posts/blob/master/...
TheOneRing
11
Observe que ter um acme.json existente pode impedir o redirecionamento do middleware para HTTPS. Remova-o se ele já existir na inicialização do Traefik.
AymDev 22/03
7

Você não precisa configurar o próprio serviço Traefik. No Traefik, você só precisa ter pontos de entrada para: 443 (seguro pela web) e: 80 (web)

Como o Traefik age apenas como entryPoint e não fará o redirecionamento, o middleware no serviço de destino fará isso.

Agora configure seu serviço de destino da seguinte maneira:

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

Então, basicamente, o fluxo é assim:

Solicitação: http://sub.domain.com:80 -> traefik (serviço) -> mywebserver-web (roteador, regra http) -> mywebserver-redirect-web-secure (middleware, redirecionar para https) - -> mywebserver-web-secure (roteador, regra https) -> mywebserver (serviço)

Lars
fonte
Não tenho certeza se esse é o requisito. Da maneira que você descreveu, parece que os pedidos entram na porta 80 do traefik e o esquema é alterado para https antes de ser encaminhado para o serviço de back-end. Mas o serviço de back-end não faz a terminação https, portanto isso falhará. A idéia seria fazer um redirecionamento http real para que a solicitação retorne ao traefik na porta 443, preservando o host. No Traefik v1, isso foi feito facilmente via configuração estática.
Andrei Dascalu
Isso funciona. Isso deve estar na documentação. Você só precisa criar um roteador para a versão http e colocar o middleware de redirecionamento nela.
milosa 26/01
2

Ok, encontrei ... Presumi que os middlewares pudessem ser declarados no nível do Traefik, mas estes devem ser declarados no nível de serviço.

Está linha :

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

Tem que estar nos rótulos do serviço whoami.

Outro ponto, que não está relacionado ao problema descrito, é que o desafio do http deve ser feito na porta 80.

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

Remova o "seguro" em "seguro da web".

Thib
fonte
É estranho. Tenho o middleware de redirecionamento declarado no serviço Traefik e referido no serviço de aplicativos e funciona.
Izydorr 17/10/19
Com o código anterior, parece funcionar, mas o http não é redirecionado para https.
Thib 17/10/19
Como você se refere ao Middleware do aplicativo?
Thib 17/10/19
No serviço traefik Eu tenho um rótulo que define o middleware: traefik.http.middlewares.https-only.redirectscheme.scheme=https e no serviço aplicativo eu tenho rótulos: traefik.http.routers.myapp.rule=Host($ {} APP_HOST ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr
11
Eu tenho tudo nos rótulos. Pelo que entendi, o uso do middleware requer dois rótulos: um para declaração / configuração (traefik.http.middlewares.https-only.redirectscheme.scheme = https) e depois aplicá-lo ao serviço (traefik.http.routers.myapp.middlewares = somente https). A declaração pode estar localizada no serviço de aplicativo ou no serviço treafik, por exemplo - assim como eu faço. Observe que, mesmo se você declarar um meio de onda no serviço de aplicativo, você o verá no painel junto com outros middlewares declarados em outros lugares. Talvez eu esteja errado, mas acho que você pode usá-los em qualquer serviço.
Izydorr 24/10/19
1

Eu estava procurando por essa resposta quando estava procurando como redirecionar tudo para HTTPS via Traefik v2.2 e a melhor opção para mim foi adicionar essas variáveis ​​ENV ao Traefik e ele redireciona automaticamente todo o tráfego para HTTPS.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

Com isso, não preciso adicionar nada ao middleware.

fperk
fonte