ให้ website ของเราใช้แบบ HTTPS ง่ายๆ ด้วย Traefik

ให้ website ของเราใช้แบบ HTTPS ง่ายๆ ด้วย Traefik

เดียวนี้ไม่ว่าเราจะทำเว็บไซต์ หรือแอพพลิเคชั่นแบบไหนก็ตามจะต้องให้เรียก url แบบ https หมดแล้ว เพื่อความปลอดภัยของข้อมูลในระดับหนึ่ง และยิ่งเล่น SEO บนเว็บไซต์แล้วละก็ ถ้าไม่ใช้งานแบบ https ถือว่าบาปมากนะจ๊ะ

โดยปกติที่ผมทำสำหรับโปรเจ็คของ Twin synergy จะใช้ nginx ทำ reverse proxy แล้วเรียกไฟล์ SSL ที่ไปสั่งซื้อมาเอง หรือไม่ก็ใช้งาน Let's Encrypt ให้มันสร้างไฟล์ ssl ให้ฟรีๆ แต่มันจะมีอายุแค่สามเดือน ถ้าหมดเราต้องทำการให้มันสร้างใหม่อีกรอบ ซึ่งรำบากนิดหน่อยที่ว่าต้องมาสร้างใหม่ทุกๆ สามเดือน หรือขี้เกียจผมก็จะเขียนสคิปให้มันสร้างใหม่เอง

แต่คราวนี้ผมมีของเล่นใหม่มานำเสนอซึ่งผมได้ลองใช้งานบน production จริงแล้วถือว่าผ่านใช้งานง่าย และถ้าใช้ร่วมกับ Docker แล้วยิ่งง่ายโครตๆ นั้นคือ Traefik นั้นเอง

Traefik คือ HTTP reverse proxy หรือ load balancer ที่จะเป็นตัวค่อยบอกว่าเมื่อเรียก url อะไรมาให้วิ่งไปหา Service ตัวไหน

Traefik architecture
Traefik architecture 

ซึ่ง Traefik จะใช้งาน SSL ของ Let's Encrypt ซึ่งจะทำการสร้าง และต่ออายุให้เราอัตโนมัติเลย สะดวกสุดๆ รายละเอียดเพิ่มเติมไปอ่านเอาเองที่ https://traefik.io/ แต่ผมจะมาสอนใช้งานเบื้องต้น โดยสร้างตัวอย่างเว็บไซต์ nginx ให้อยู่หลัง traefik เพื่อให้เรียกเว็บไซต์แบบ https ได้

1. Folder ของโปรเจ็คจะเป็นแบบนี้

.
├── config
│   ├── acme
│   └── traefik.toml
└── docker-compose.yml

2. ไฟล์ traefik.toml เป็นไฟล์ config ของ traefik 

defaultEntryPoints = ["http", "https"]

[web]
# Port for the status page
address = ":8080"

# Entrypoints, http and https
[entryPoints]
  # http should be redirected to https
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  # https is the default
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

# Enable ACME (Let's Encrypt): automatic SSL
[acme]
# Email address used for registration
email = "test@traefik.io"
storageFile = "/etc/traefik/acme/acme.json"
entryPoint = "https"
onDemand = false
OnHostRule = true

# Enable Docker configuration backend
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "example.com"
watch = true
exposedbydefault = false

สิ่งที่สนใจก็คือ

  • email ให้ใส่อีเมลเราได้เลยเพื่อเป็นตัวสมัครใช้งานของ let's encrypt
  • domain ใส่โดเมนเราลงไป

2. ตัวอย่างไฟล์ docker-compose.yml จะเป็นดังนี้

version: '2'
services:
  traefik:
    image: traefik:lastest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./config/traefik.toml:/etc/traefik/traefik.toml:ro
      - ./config/acme:/etc/traefik/acme
    ports:
     - "80:80"
     - "443:443"
     - "8080:8080"
  nginx-1:
    image: nginx:1-alpine
    labels:
      - traefik.enable=true
      - traefik.backend=backend1
      - traefik.frontend.rule=Host:domain.com
  nginx-2:
    image: nginx:1-alpine
    labels:
      - traefik.enable=true
      - traefik.backend=backend2
      - traefik.frontend.rule=Host:sub.domain.com  

จุดสังเกตุก็คือใน Service ที่สร้างขึ้นมาจะต้องมี labels เป็นตัวบอกเพื่อเรียกใข้งาน traefik 

  • traefik.backend สามารถเปลี่ยนชื่อเรียกได้เอง
  • traefik.frontend.rule เป็นตัวบอกว่าจะใช้งานโดเมนอะไร

3. ลองเรียกใช้งานดู docker-compose up -d

ตัวอย่างเว็บที่เรียกผ่าน traefik
ตัวอย่างเว็บที่เรียกผ่าน traefik

ตัว traefik ก็จะสร้าง SSL มาให้เลยอัตโนมัติ ง่ายสุดๆ

4. แถมสามารถเรียกดู dashboard ได้อีกด้วยผ่าน port 8080 ที่เราเปิดไว้

Traefik dashboard
Traefik dashboard

จริงๆ ลูกเล่นมันมีอีกเยอะลองไปศึกษาเพิ่มเติมได้ ส่วนผมก็ใช้งานกับมันก็ประมาณนี้ สะดวกที่ว่าหากมีโปรเจ็คเล็กๆ ที่ทำกันขึ้นมาจะได้ไม่ต้องเสียเงินซื้อ SSL 

Happy docker :)

0

Add new comment

This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.