Skip to content

บันทึกการย้ายบล็อกและใช้งาน HTTPS จาก Let’s encrypt โดยใช้ Docker

บล็อกนี้ผมใช้ WordPress และ MySQL การ Dockerize เลยง่ายหน่อยเพราะมี official image ให้ใช้เลย ส่วนการทำ HTTPS ด้วย Let’s encrypt ก็ง่ายเช่นกันเพราะมี docker-letsencrypt-nginx-proxy-companion ให้ใช้ การสร้าง virtual host และ issue domain/sub-domain ที่ต้องการใช้งาน HTTPS ก็ทำได้ง่ายโดยการกำหนด env variable ตอนสั่ง docker run

Backup the database

เดิมผมติดตั้ง MySQL ผ่าน apt-get  โดยปกติ data ทั้งหมดของ MySQL จะอยู่ /var/lib/mysql  ก็ compress เป็น tar.gz แล้ว scp ไปที่เครื่องใหม่

ถ้ากลัวไม่ชัวร์ก็ใช้ phpmyadmin หรือ MySQL client dump เป็นไฟล์ .sql ออกมาด้วยก็ได้

Backup WordPress files

เนื่องจากบล็อกเก่าผมมีรูปภาพที่อัปโหลดไว้และติดตั้ง plugin ไว้หลายตัว ขี้เกียจติดตั้งและ config ที่เครื่องใหม่อีกเลย copy ออกมาทั้งเว็บ โดย compress เป็น tar.gz เสร็จแล้วก็ scp ไปที่เครื่องใหม่เหมือนเดิม

Pointing domain to the new server

เพื่อไม่ให้เสียเวลาในระหว่างที่เรา config Docker ให้ไปแก้ NameServer ของ อย่างของผมจากเดิม khasathan.in.th ชี้ไปที่ ns1.digitalocean.com, ns2.digitalocean.com ก็แก้เป็น ns1.vultr.com, ns2.vultr.com

เสร็จแล้วเข้าไปที่ admin console ของ Vultr add domain name ใหม่ที่ DNS > Add Domain เพิ่ม record A, CNAME, NS, MX (ถ้าจะใช้อีเมล) ให้เรียบร้อย ไม่ต้องห่วงว่าจะใส่ไม่ถูกเพราะ Vultr จะ generate สำคัญๆ ไว้ให้แล้วแค่กรอก domain name กับ IP address ก็พอ

แนะนำว่าให้ set TTL น้อยๆ (ใส่ได้น้อยสุดคือ 120) เพื่อให้ domain name ชี้มาที่ server ใหม่เร็วขึ้น

Install docker-gen

Remote เข้าไปที่เครื่องใหม่ติดตั้ง docker-gen ก่อนเนื่องจากเราต้องใช้งานร่วมกับ docker-letsencrypt-nginx-proxy-companion

ตัวโปรแกรมเขียนด้วย Golang ด้วยความขี้เกียจ build ใหม่ผมเลยไปโหลดแบบ binary แตกไฟล์ออกมาก็ copy ไปที่ /usr/bin  เพื่อให้เรียกได้จากทุก path

Locating files and folders

ดาวน์โหลด nginx.tmpl ไฟล์มาไว้ที่ working directory หรือ path ไหนก็ได้ขอแค่เวลารัน container ชี้มาให้ถูกก็พอ ของผมก็เอาไว้ที่ home dir หลังจาก ssh เข้าไปที่เครื่องใหม่ที่จะย้ายไปนั่นแหละ

สำหรับไฟล์ที่ backup มา แตกไฟล์ไปไว้ที่ที่ต้องการตามสะดวก สำหรับผม ผมสร้างโฟลเดอร์ชื่อเดียวกับ domain หลักข้างในมีโฟลเดอร์ www/, mysql/

  • certs สำหรับเก็บ certification, credential files ต่างๆ ของ Let’s encrypt
  • www สำหรับเก็บ WordPress files
  • mysql สำหรับเก็บ MySQL data

Setting up Nginx, Proxy and Let’s encrypt containers

เนื่องจากใน doc ของ docker-letsencrypt-nginx-proxy-companion แนะนำให้รัน nginx และ let’s encrypt container แยกกัน (เป็นเหตุผลว่าทำไมเราต้องการ docker-gen เพื่อ generate file จาก metadata) ในเมื่อเป็นวิธีที่ doc แนะนำก็ทำตามละกันยุ่งยากขึ้นมาหน่อยแต่น่าจะยืดหยุ่นกว่าในการปรับเปลี่ยนอะไรภายหลัง

1. Run nginx container

2. Run nginx-gen container

3. Run nginx-letsencrypt container

Setting up the website

1. Run MySQL container

รัน MySQL container โดยระบุ database name, username, password ที่ต้องการ

2. Run WordPress container

สำหรับ WordPress container จะมีที่ยุ่งยากนิดหน่อยคือต้อง map volume เนื่องจากผมต้องการใช้ config และ plugin เก่า ดังนั้นเลยต้อง map volume โฟลเดอร์ wp-content/, images/ และ docs/ ด้วย

ส่วน env variable ที่ต้องใส่เพิ่มแบ่งเป็นหลักๆ 3 ส่วน คือ 1) ส่วนการสร้าง virtual host 2) ส่วนการ issue certificate กับ Let’s encrypt และ 3) ส่วน config ของ WordPress อย่างเช่น database connection

VIRTUAL_HOST และ LETSENCRYPT_HOST ผมใส่ไปทั้ง khasathan.in.th และ www.khasathan.in.th เพราะต้องการให้สามารถเข้าเว็บได้แม้จะระบุหรือไม่ระบุ www ข้างหน้า ซึ่งจริงๆ แล้ว www ไม่ควรมีเพราะการมี www หน้า domain จะถือเป็น sub-domain ซึ่งถือว่าเป็นคนละเว็บแล้ว แต่ผู้ใช้โดยทั่วไปคุ้นเคยแบบนี้เลยต้องใส่ไป

ส่วน LETSENCRYPT_EMAIL จะเป็นอีเมลที่ไม่มีอยู่จริงก็ได้แต่แนะนำให้ใส่เป็น root@yourdomain.com จะดีกว่า

Optional step: Running phpmyadmin

ถ้าต้องการจัดการ database ด้วย GUI อาจจะรัน phpmyadmin โดย link กับ MySQL container ที่รันขึ้นมาก่อนหน้านี้ก็ได้ จัดการเสร็จก็ stop หรือ remove ทิ้ง

 

หมายเหตุ  /PATH_TO ในคำสั่ง docker run คือ path ที่ต้องเปลี่ยน

 

Let’s encrypt limitations

  • Domain name ที่มีชื่อเหมือนกัน suffix แต่มี suffix ต่างกัน เช่น example.com, example.in.th, example.net จะขอ certificate ได้ 20/week
  • Domain name เดียวกันขอบ sub-domain เช่น blog.example.com, www.exmaple.com, docs.example.com จะขอได้ 5/week
  • กรณีที่ domain name นั้นมี sub-domain มากๆ จะ limit ให้ทำได้แค่ 100 sub-domain เท่านั้น

ส่วนรายละเอียดอื่นๆ ดูได้จาก document https://letsencrypt.org/docs/rate-limits

Links

Be First to Comment

Leave a Reply

Your email address will not be published.