ApexHuasคู่มือช่างเว็บ GitHub repo

บทที่ 10 — Server, โดเมน และ HTTPS

เว็บที่ deploy แล้วต้องอยู่บนคอมพิวเตอร์สักเครื่องที่เปิดตลอด 24 ชั่วโมง มีเน็ต และคนทั่วโลกเข้าถึงได้ — เครื่องนั้นเรียกว่า server และเราเช่ามันจาก cloud

เครื่องที่เว็บนี้รันอยู่จริง

รายการ ค่าจริงของโปรเจกต์นี้
ผู้ให้บริการ Google Cloud (Compute Engine)
ชื่อเครื่อง apexhuas
ที่ตั้ง สิงคโปร์ (asia-southeast1) — ใกล้ไทย เว็บโหลดเร็ว
สเปก 2 vCPU, RAM 2 GB, ดิสก์ 30 GB
ระบบปฏิบัติการ Debian 13
เลข IP 34.143.223.60
โดเมน apexhuas.choiceflowhub.com

ทำไมต้องแยกเครื่องของตัวเอง: โปรเจกต์นี้มีกฎว่างานลูกค้าต้องไม่ไปปนกับเครื่องที่รันของส่วนตัว — เวลาส่งมอบงานหรือให้สิทธิ์ใครเข้าถึงจะได้ไม่พันกัน

ตามรอย request หนึ่งอัน

นี่คือสิ่งที่เกิดขึ้นภายในเสี้ยววินาที ตั้งแต่คนพิมพ์ URL จนเห็นหน้าเว็บ กดถัดไปเพื่อเดินทีละขั้น

จากคนพิมพ์ URL จนได้หน้าเว็บ (~0.3 วินาที)

1. พิมพ์ชื่อเว็บ

คนพิมพ์ apexhuas.choiceflowhub.com แต่คอมพิวเตอร์คุยกันด้วยเลข IP ไม่ใช่ชื่อ — จึงต้องแปลงก่อน

1 / 7

Caddy ทำอะไรให้บ้าง

หน้าที่ของ Caddy (คลิกดูทีละอย่าง)

คลิกชั้นใดก็ได้เพื่อดูรายละเอียด

DNS: ทำไมต้องรอ และคำที่ต้องรู้

คำ ความหมาย
A record บอกว่าชื่อนี้ → IP นี้ (เราสร้าง apexhuas34.143.223.60)
subdomain ชื่อย่อยหน้าโดเมนหลัก เช่น learn ใน learn.choiceflowhub.com สร้างกี่อันก็ได้ฟรี
TTL นานแค่ไหนที่เครื่องอื่นจะจำคำตอบเก่าไว้ ตั้ง Auto ไว้ก็พอ
DNS only / Proxied ของ Cloudflare — "DNS only" คือชี้ตรงไปเครื่องเรา เหมาะกับกรณีนี้เพราะให้ Caddy จัดการ HTTPS เอง

สำคัญ: ต้องตั้ง DNS ให้ชี้มาที่เครื่องก่อน Caddy ถึงจะขอใบรับรอง HTTPS ได้ เพราะผู้ออกใบรับรองจะยิงกลับมาตรวจว่าเราเป็นเจ้าของโดเมนนั้นจริง — ถ้ายังไม่ตั้ง DNS จะเห็น error เรื่องใบรับรองตลอด

เข้าไปดู server ตอนมีปัญหา

# เข้าเครื่อง
ssh -i ~/.ssh/google_compute_engine [email protected]

# ดูว่าอะไรรันอยู่บ้าง
sudo docker compose -f ~/apexhuas/compose.yaml ps

# ดู log ของเว็บ (ล่าสุด 50 บรรทัด)
sudo docker compose -f ~/apexhuas/compose.yaml logs --tail=50 app

# ดูพื้นที่ดิสก์ (เต็มแล้วเว็บล่มได้)
df -h /

SSH key คืออะไร: กุญแจคู่หนึ่ง — ครึ่งหนึ่ง (public) ฝากไว้บน server อีกครึ่ง (private) เก็บในเครื่องคุณห้ามให้ใคร เวลาเชื่อมต่อ ระบบจะจับคู่กันเอง ไม่ต้องใช้รหัสผ่าน ปลอดภัยกว่ามาก

เว็บล่ม — ไล่ดูตรงไหนก่อน

ไล่จากนอกเข้าใน

  • 1. เปิดเว็บดูเอง ได้ error อะไร
  • 2. DNS ยังชี้ถูกไหม (dig)
  • 3. container ยังรันอยู่ไหม (docker ps)
  • 4. log ของเว็บพ่นอะไรออกมา (docker logs)
  • 5. ดิสก์เต็มหรือ RAM หมดไหม (df -h, free -h)

สิ่งที่ไม่ควรทำ

  • รีสตาร์ททุกอย่างทันทีโดยไม่ดู log — หลักฐานหายหมด
  • แก้ไฟล์บน server ตรง ๆ แล้วไม่ commit — ครั้งหน้า deploy ทับหาย
  • ลบ container ทิ้งเพราะคิดว่าสร้างใหม่ได้
  • เดาว่าน่าจะเป็นที่โค้ด ทั้งที่ยังไม่ได้เปิด log ดู

เช็คความเข้าใจ

บทหน้า: ต่อท่อสุดท้าย — merge แล้ว deploy เองอัตโนมัติทำงานยังไง