Bagaimana cara mengarahkan http ke https dengan label Traefik 2.0 dan Docker Compose?

14

Harap dicatat bahwa ini adalah pertanyaan Traefik V2. Saya punya solusi pada V1 tetapi V2 adalah total rewamp.

Ini di atas seharusnya mengarahkan http://whoami.mysite.com ke http s : //whoami.mysite.com.

  • Http s bekerja dengan baik.
  • Http tidak mengalihkan ke https dan meningkatkan kesalahan 404.

Tidak ada file lain. Semua ada di Docker-compose.yml untuk saat ini karena ini adalah ujian untuk mempersiapkan penyebaran lebih lanjut.

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
sumber

Jawaban:

10

Sekarang ada solusi yang berfungsi dalam tutorial dari Gérald Croës di:

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
sumber
1
Ini adalah docker-compose.yml dari artikel github.com/containous/blog-posts/blob/master/…
TheOneRing
1
Perhatikan bahwa memiliki acme.json yang ada dapat memblokir middleware agar tidak dialihkan ke HTTPS. Hapus jika sudah ada di Traefik start up.
AymDev
7

Anda tidak perlu mengkonfigurasi layanan Traefik itu sendiri. Di Traefik Anda hanya perlu memiliki titik masuk ke: 443 (web-secure) dan: 80 (web)

Karena Traefik hanya bertindak sebagai entryPoint dan tidak akan melakukan pengalihan, middleware pada layanan target akan melakukan itu.

Sekarang konfigurasikan layanan target Anda sebagai berikut:

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

Jadi pada dasarnya alirannya seperti ini:

Permintaan: http://sub.domain.com:80 -> traefik (layanan) -> mywebserver-web (router, aturan http) -> mywebserver-redirect-web-secure (middleware, redirect ke https) - -> mywebserver-web-secure (router, https rule) -> mywebserver (layanan)

Lars
sumber
Tidak yakin itu persyaratannya. Cara Anda menggambarkannya, tampaknya permintaan masuk di traefik port 80 dan skema diubah menjadi https sebelum diteruskan ke layanan backend. Tetapi layanan backend tidak melakukan terminasi https, sehingga akan gagal. Idenya adalah untuk membuat pengalihan http yang sebenarnya sehingga permintaan kembali ke traefik pada port 443 menjaga host. Di Traefik v1 itu mudah dilakukan melalui konfigurasi statis.
Andrei Dascalu
Ini bekerja. Ini seharusnya ada dalam dokumentasi. Anda hanya perlu membuat router untuk versi http dan meletakkan redirect middleware.
milosa
2

Ok, ditemukan ... Saya berasumsi bahwa middlewares dapat dideklarasikan pada level Traefik tetapi ini harus dinyatakan pada level layanan.

Garis ini :

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

Harus ada di label layanan whoami.

Poin lain, yang tidak terkait dengan masalah yang dijelaskan, adalah bahwa tantangan http harus dilakukan pada port 80.

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

Hapus "secure" di "web-secure".

Thib
sumber
Ini aneh. Saya memiliki pengalihan middleware yang dinyatakan pada layanan Traefik dan dirujuk dari layanan aplikasi dan berfungsi.
Izydorr
Dengan kode sebelumnya tampaknya berfungsi tetapi http sebenarnya tidak mengarahkan ke https.
Thib
Bagaimana Anda merujuk ke Middleware dari aplikasi?
Thib
Dalam pelayanan traefik saya memiliki label mendefinisikan middleware: traefik.http.middlewares.https-only.redirectscheme.scheme=https dan dalam pelayanan app saya memiliki label: traefik.http.routers.myapp.rule=Host($ {APP_HOST} ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr
1
Saya memiliki semuanya di label. Seperti yang saya pahami, menggunakan middleware memerlukan dua label: satu untuk deklarasi / konfigurasi (traefik.http.middlewares.https-only.redirectscheme.scheme = https) dan kemudian menerapkannya ke layanan (traefik.http.routers.myapp.middlewares = hanya https). Deklarasi tersebut dapat ditempatkan di layanan aplikasi atau di layanan treafik misalnya - sama seperti yang saya lakukan. Perhatikan bahwa meskipun Anda mendeklarasikan middlewawe dalam layanan aplikasi, Anda melihatnya di dashboard bersama dengan middlewares lain yang dideklarasikan di tempat lain. Mungkin saya salah, tetapi saya pikir Anda dapat menggunakan salah satu dari mereka dalam layanan apa pun.
Izydorr
1

Saya sedang mencari jawaban ini ketika saya sedang mencari cara untuk mengarahkan kembali semuanya ke HTTPS melalui Traefik v2.2 dan opsi terbaik bagi saya adalah menambahkan variabel ENV ini ke Traefik dan secara otomatis mengarahkan ulang semua lalu lintas ke HTTPS.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

Dengan ini saya tidak perlu menambahkan apa pun ke middleware.

fperk
sumber