Come reindirizzare http su https con le etichette Traefik 2.0 e Docker Compose?


14

Si noti che si tratta di una domanda Traefik V2. Ho avuto una soluzione su V1 ma V2 è un risveglio totale.

Questo sopra dovrebbe reindirizzare http://whoami.mysite.com a http s : //whoami.mysite.com.

  • Il http s sta lavorando bene.
  • L'http non reindirizza a https e genera un errore 404.

Non ci sono altri file. Tutto è in questo Docker-compose.yml per il momento dal momento che è un test per preparare ulteriori distribuzioni.

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"

Risposte:


10

Ora c'è una soluzione funzionante in un tutorial di Gérald Croës su:

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
Ecco il docker-compose.yml dall'articolo github.com/containous/blog-posts/blob/master/…
TheOneRing

1
Notare che avere un acme.json esistente può impedire al middleware di reindirizzare a HTTPS. Rimuovilo se esiste già all'avvio di Traefik.
AymDev,

7

Non è necessario configurare il servizio Traefik stesso. Su Traefik devi solo avere i punti d'accesso a: 443 (sicuro per il web) e: 80 (web)

Poiché Traefik funge solo da entryPoint e non esegue il reindirizzamento, il middleware sul servizio di destinazione lo farà.

Ora configura il tuo servizio di destinazione come segue:

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

Quindi in pratica il flusso va così:

Richiesta: http://sub.domain.com:80 -> traefik (servizio) -> mywebserver-web (router, regola http) -> mywebserver-redirect-web-secure (middleware, reindirizzamento a https) - -> mywebserver-web-secure (router, regola https) -> mywebserver (servizio)


Non sono sicuro che sia il requisito. Il modo in cui lo hai descritto sembra che le richieste vadano nella porta 80 di traefik e lo schema venga modificato in https prima di essere inoltrato al servizio back-end. Ma il servizio back-end non esegue la terminazione https, quindi non verrà eseguito. L'idea sarebbe quella di fare un vero reindirizzamento http in modo che la richiesta torni a traefik sulla porta 443 preservando l'host. In Traefik v1 è stato fatto facilmente tramite la configurazione statica.
Andrei Dascalu,

Questo funziona Questo dovrebbe essere nella documentazione. Devi solo creare un router per la versione http e inserire il middleware di reindirizzamento su quello.
milosa,

2

Ok, ho scoperto ... Ho pensato che i middleware potessero essere dichiarati a livello di Traefik, ma questi devono essere dichiarati a livello di servizio.

Questa linea:

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

Deve essere nelle etichette del servizio whoami.

Un altro punto, non correlato al problema descritto, è che la sfida http deve essere eseguita sulla porta 80.

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

Rimuovere "secure" in "web-secure".


È strano. Ho un middleware di reindirizzamento dichiarato sul servizio Traefik e indicato dal servizio app e funziona.
Izydorr,

Con il codice precedente sembra funzionare ma in realtà l'http non reindirizza a https.
Giovedì

Come ti riferisci al middleware dall'app?
Giovedì

Nel servizio di traefik ho avere un'etichetta che definisce il middleware: traefik.http.middlewares.https-only.redirectscheme.scheme=https e nel servizio app ho un etichette: traefik.http.routers.myapp.rule=Host($ {} APP_HOST ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr

1
Ho tutto nelle etichette. A quanto ho capito, l'uso del middleware richiede due etichette: una per la dichiarazione / configurazione (traefik.http.middlewares.https-only.redirectscheme.scheme = https) e quindi per applicarla al servizio (traefik.http.routers.myapp.middlewares = https-only). La dichiarazione può trovarsi nel servizio app o nel servizio treafik, ad esempio, proprio come faccio io. Si noti che anche se si dichiara un middlewawe nel servizio app, lo si vede nella dashboard insieme ad altri middleware dichiarati in altri luoghi. Forse mi sbaglio, ma penso che tu possa usarne uno in qualsiasi servizio.
Izydorr,

1

Stavo cercando questa risposta quando stavo cercando come reindirizzare tutto su HTTPS tramite Traefik v2.2 e l'opzione migliore per me era l'aggiunta di queste variabili ENV a Traefik e reindirizza automaticamente tutto il traffico su HTTPS.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

Con questo non ho bisogno di aggiungere nulla al middleware.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.