Traefik 2.0 और Docker Compose लेबल के साथ http को https में पुनर्निर्देशित कैसे करें?


14

कृपया ध्यान दें कि यह एक ट्राफिक V2 प्रश्न है। मेरे पास वी 1 पर एक समाधान था लेकिन वी 2 कुल रिवाम्प है।

यह ऊपर रीडायरेक्ट माना जाता है http://whoami.mysite.com को http रों //whoami.mysite.com:।

  • Http s अच्छी तरह से काम कर रहा है।
  • Http, https को पुनर्निर्देशित नहीं करता है और एक त्रुटि 404 बढ़ाता है।

कोई दूसरी फाइल नहीं है। सभी इस डॉकटर-कंपोज में हैं। इस समय से यह आगे की तैयारी के लिए एक परीक्षण है।

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

अब Gérald Croës के एक ट्यूटोरियल में एक काम कर समाधान है:

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 पर पुनर्निर्देशित करने से रोका जा सकता है। इसे हटा दें यदि यह पहले से ही ट्राफिक स्टार्ट पर मौजूद है।
अय्यदेव

7

आपको स्वयं ट्राफिक सेवा को कॉन्फ़िगर करने की आवश्यकता नहीं है। ट्राफिक पर आपको केवल एंट्री पॉइंट्स की आवश्यकता है: 443 (वेब-सिक्योर) और: 80 (वेब)

क्योंकि ट्राफिक केवल एंट्रीपॉइंट के रूप में कार्य करता है और रीडायरेक्ट नहीं करेगा, लक्ष्य सेवा पर मिडलवेयर ऐसा करेगा।

अब निम्नलिखित के रूप में अपनी लक्ष्य सेवा को कॉन्फ़िगर करें:

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 -> ट्रैफ़िक (सेवा) -> mywebserver- वेब (राउटर, http नियम) -> mywebserver- रीडायरेक्ट-वेब-सिक्योर (मिडलवेयर, https पर रीडायरेक्ट) -> mywebserver- वेब-सिक्योर (राउटर, https रूल) -> mywebserver (सर्विस)


निश्चित नहीं है कि आवश्यकता है। जिस तरह से आपने इसे वर्णित किया है, ऐसा लगता है कि अनुरोध ट्रैफिक पोर्ट 80 में चला जाता है और बैकवर्ड सेवा में भेजे जाने से पहले योजना को बदलकर https कर दिया जाता है। लेकिन बैकएंड सेवा https समाप्ति नहीं करती है, इसलिए यह विफल हो जाएगी। यह विचार एक वास्तविक http पुनर्निर्देशित करने के लिए होगा, ताकि अनुरोध पोर्ट 443 पर होस्ट करने के लिए ट्रैफ़िक पर वापस जाए। Traefik v1 में जो आसानी से स्थैतिक विन्यास के माध्यम से किया गया था।
आंद्रेई डस्कालु

यह काम। यह प्रलेखन में होना चाहिए। आपको बस http वर्जन के लिए राउटर बनाना होगा और उस पर रीडायरेक्ट मिडलवेयर डालना होगा।
मिलोसा

2

ठीक है, मिला ... मैंने मान लिया था कि मिडवाइफ्स को ट्राफिक स्तर पर घोषित किया जा सकता है, लेकिन इन्हें सेवा स्तर पर घोषित किया जाना चाहिए।

यह रेखा :

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

Whoami सेवा के लेबल में होना चाहिए।

एक अन्य बिंदु, जो वर्णित समस्या से संबंधित नहीं है, यह है कि http चुनौती को पोर्ट 80 पर किया जाना है।

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

"वेब-सिक्योर" में "सुरक्षित" निकालें।


यह बहुत अजीब है। मेरे पास ट्रैफ़िक सेवा पर पुनर्निर्देशन मिडिलवेयर घोषित है और ऐप सेवा से संदर्भित है और यह काम करता है।
इज़ीडोर

पिछले कोड के साथ यह काम करने लगता है लेकिन http वास्तव में https पर पुनर्निर्देशित नहीं होता है।
थिब

आप एप से मिडलवेयर को कैसे देखें?
थिब

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.rtters.yaout.m.mppwares) = https द्वारा केवल)। घोषणा या तो ऐप सेवा में या उदाहरण के लिए treafik सेवा में स्थित हो सकती है - जैसे मैं इसे करता हूं। ध्यान दें कि यदि आप ऐप सेवा में किसी मिडवे की घोषणा करते हैं, तो भी आप इसे अन्य स्थानों पर घोषित किए गए अन्य बिचौलियों के साथ डैशबोर्ड में देखते हैं। शायद मैं गलत हूं, लेकिन मुझे लगता है कि आप उनमें से किसी भी सेवा में उपयोग कर सकते हैं।
इज़ीडोर

1

मैं इस उत्तर की खोज कर रहा था जब मैं देख रहा था कि ट्राईफिक v2.2 के माध्यम से HTTPS को सब कुछ कैसे पुनर्निर्देशित किया जाए और मेरे लिए सबसे अच्छा विकल्प इस ENV चर को ट्राफिक में जोड़ रहा था और यह स्वतः ही HTTPS के लिए सभी ट्रैफ़िक को पुनर्निर्देशित करता है।

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

इससे मुझे मिडलवेयर में कुछ भी जोड़ने की कोई आवश्यकता नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.