ITCAMP@ITKMITL Web Development — จากวันนั้น สู่วันนี้

Meranote
ITForge
Published in
3 min readDec 23, 2017

TL;DR : จากเดิมที่เว็บไซต์ของไอทีแคมป์ ซึ่งพัฒนาด้วยภาษา PHP มาโดยตลอด และ Host อยู่บน Server ซึ่งรองรับเพียงแค่ภาษา PHP และเมื่อเริ่มใช้ Framework ในการพัฒนา เช่น Laravel ก็เริ่มมีปัญหาในเรื่องของเวอร์ชั่นของ PHP ทำให้เกิดปัญหาต่าง ๆ นา ๆ จึงได้เปลี่ยนโครงสร้างมาใช้ Docker เพื่อรองรับการพัฒนาเว็บด้วยภาษาต่าง ๆ ที่มีีหลากหลายในปัจจุบัน และลดปัญหาที่อาจจะเกิดขึ้่นในอนาคต เช่น การอัพเดทเวอร์ชั่นของตัว Runtime เพื่อให้รองรับ Framework ที่ต้องการใช้งาน

หลังจากที่ได้เข้าทีมพัฒนาเว็บของโครงการ ITCAMP@ITKMITL มาตั้งแต่การจัดในครั้งที่ 12 (เมื่อเดือนธันวาคม ปี ค.ศ. 2015) ในครั้งนั้นผมได้พัฒนาในส่วนของ Front-end และครั้งที่ 13 ได้ทำทั้ง Front-end และ Back-end และในปัจจุบันดูแลในส่วนของเว็บและเซิฟเวอร์ของโครงการ ITCAMP โดยรวม

ในทุก ๆ ครั้งที่มีการจัดโครงการ ITCAMP เราจะพัฒนาเว็บขึ้นมาใหม่ให้ตรงกับธีมของการจัดในครั้งนั้น ๆ โดยจะแบ่งเป็น 2 ฝ่ายหลัก ๆ ในการพัฒนาเว็บคือ ฝ่ายอาร์ต ซึ่งมีหน้าที่ในการออกแบบตกแต่งเว็บ วาดรูปต่าง ๆ และจะส่งแบบให้กับฝ่ายพัฒนาเว็บ ทำการพัฒนาตามแบบที่วางไว้ แต่อีกหน้าที่ของฝ่ายพัฒนาเว็บคือการพัฒนาระบบต่าง ๆ ที่เกี่ยวข้อง เช่น ระบบสมัครเข้าค่าย ระบบคัดเลือกผู้สมัคร เป็นต้น ซึ่งระบบดังกล่าวเราได้พัฒนาขึ้นมาใหม่ในทุก ๆ ครั้งด้วย ทำให้เกิดคำถามว่า “ทำไมเราไม่พัฒนาให้ระบบพวกนี้สามารถใช้ในอนาคตได้ด้วย” ซึ่งสาเหตุหลัก ๆ ที่ยังทำแบบดังกล่าวไม่ได้เพราะว่าในทุก ๆ ครั้งที่มีการจัดโครงการ เราเปลี่ยนทีมที่พัฒนาเว็บอยู่ตลอด มีอยู่เพียงไม่กี่คนภายในทีม (ประมาณ 2–3 คน) ซึ่งเป็นนักศึกษาชั้นปีที่ 1-2 และด้วยระยะเวลาในการพัฒนาที่มีน้อย ทำให้การออกแบบหรือการพัฒนาจะเน้นทำให้สมบูรณ์ไวที่สุด โดยไม่ได้คำนึงถึงการพัฒนาต่อยอดหรือนำกลับมาใช้ในอนาคต ดังนั้นการจะนำระบบเก่ากลับมาใช้อาจจะเสียเวลาในการศึกษาโค้ดเดิมเยอะ หรือในบางส่วนของงานเดิมโค้ดค่อนข้างเละ ยากต่อการศึกษา จึงตัดสินใจที่จะทำใหม่ตั้งแต่ต้น

ระบบหลังบ้านของ ITCAMP ครั้งที่ 13

แต่ในปัจจุบันการพัฒนาระบบและเว็บเริ่มมีความสะดวกและง่ายมากขึ้น เพราะมี Tool และ Framework ต่าง ๆ ซึ่งมีโมดูลที่พร้อมใช้งานโดยที่ไม่ต้องเขียนขึ้นมาใหม่ อย่างเช่น Laravel Framework ซึ่งมีโมดูลต่าง ๆ ที่เพรียบพร้อมต่อการพัฒนา เช่น การทำ URL Routing สร้างโมเดลเก็บข้อมูลลงฐานข้อมูล หรือสร้าง Template สำหรับทำหน้าเว็บหรือแสดงผลข้อมูล เป็นต้น ทำให้ลดระยะเวลาที่ต้องใช้ในการพัฒนาไปได้เยอะ ทำให้การพัฒนาระบบขึ้นมาใหม่ตลอดไม่เป็นปัญหาหลักอีกต่อไป

แต่ปัญหาที่อาจเกิดขึ่้นในอนาคตคือ เซิฟเวอร์ของไอทีแคมป์ในแต่ก่อนเราใช้ร่วมกับเว็บเซิฟเวอร์ของทางคณะ ทำให้การอัพเดทเวอร์ชั่นของ PHP ให้รองรับกับ Framework ที่ต้องการใช้งานเป็นไปได้ค่อนข้างยาก และรวมถึงการคอนฟิกต่าง ๆ ด้วย (เพราะต้องรองรับกับระบบของทางคณะด้วย) ถึงเราจะแยกเซิฟเวอร์ออกกับเว็บคณะแล้ว (ซึ่งเป็นระบบหลัก) ยังคงติดปัญหาในการอัพเดทเวอร์ชั่น PHP อยู่ดี

จากการปรึกษากับเพื่อน 3–4 คน ในตอนแรกผมมีความคิดที่จะออกแบบ พัฒนาระบบและทำเอกสารให้รุ่นถัด ๆ ไปที่จะมาดูแลเว็บของโครงการสามารถนำระบบไปใช้งานได้เรื่อย ๆ แต่เรามองกันว่าในปัจจุบันก็มี Framework ที่ช่วยอำนวยความสะดวกให้พัฒนาได้ง่ายอยู่แล้ว แต่ข้อจำกัดที่อาจเกิดขึ้นคือตัวเซิฟเวอร์ที่รองรับเพียงแค่ PHP เพราะปัจจุบันก็มีภาษาอื่น ๆ ที่สามารถใช้พัฒนาเว็บและระบบได้เยอะ และการคอนฟิกที่อาจจะยุ่งยาก เราจึงตัดสินใจที่จะยกโครงสร้างของเซิฟเวอร์ของโครงการ ITCAMP ใหม่ด้วยการ “ย้ายไปใช้ Docker” เพื่อกำจัดปัญหาเหล่านั้นออกไป

ปลาวาฬหละ น่าร้ากก ❤

สำหรับคนที่ไม่รู้จักว่า Docker คืออะไร ผมจะอธิบายสั้น ๆ ว่า มันก็เหมือนกับ Virtual Machine (VM) นี่หละครับ เพียงแต่ว่า มันเบากว่า โดยใช้เพียงแค่คำสั่ง docker run name\my-image ก็จะทำการสร้าง Container (ก็คือ VM) จาก Image ดังกล่าวขึ้นมา ซึ่งได้บรรจุโปรแกรมและแอปพลิเคชันที่ได้ทำการติดตั้งและคอนฟิกไว้ ทำให้สามารถใช้งานได้ทันที ไม่ต้องเสียเวลาติดตั้งหรือคอนฟิกโปรแกรมเพิ่มเติม (ศึกษาเพิ่มเติมได้ที่ https://docs.docker.com)

ฝั่งซ้ายคือ VM / ฝั่งขวาคือ Docker (Image from: https://blog.netapp.com/blogs/containers-vs-vms/)

จากการย้ายไปใช้ Docker ทำให้ในตอนนี้เราไม่มีข้อจำกัดในเรื่องของการพัฒนาด้วย Tool หรือ Framework ต่าง ๆ อีกต่อไป เช่น ถ้ารุ่นถัดไปอยากใช้ express.js ในการพัฒนา ก็เพียงแค่สร้าง Image ขึ้นมาและทำการ Deploy ได้เลยทันที นอกจากนี้ยังมีข้อดีของการเปลี่ยนมาใช้ Docker คือ เราไม่จำเป็นต้องห่วงในเรื่องของการอัพเดทโปรแกรมหรือในส่วนต่าง ๆ ที่เกี่ยวข้อง เช่น เวอร์ชั่นของ MySQL เพื่อให้รองรับกับระบบเดิมที่มีอยู่ด้วย โดยเพียงแค่ Deploy เวอร์ชั่นใหม่ไปเพิ่มเติมได้ทันที ดังนั้นจากการตัดสินใจดังกล่าวผมจึงเริ่มวางแผนโครงสร้างใหม่ด้วยการสร้างแผนผังจำลองการ Deploy Container โดยเริ่มจากการแบ่ง Zone ของแอปพลิเคชัน และเชื่อมต่อระหว่าง Zone หรือ Container ต่าง ๆ ดังนี้

1.) Supervisor Zone

สำหรับโซนนี้ไว้สำหรับการควบคุมการ Deploy โดยรวม และทำ Proxy ไปยัง Container ต่าง ๆ โดยได้ใช้ Portainer สำหรับการจัดการ Container ผ่าน Web UI และใช้ Træfik ทำ Proxy ซึ่งมีการคอนฟิกที่ค่อนข้างง่ายมาก ๆ และยังสนับสนุนการใช้งานร่วมกับ Docker สำหรับการทำ Proxy ไปยัง Container ต่าง ๆ (แต่ในปัจจุบันใช้ร่วมกับ nginx ด้วย เนื่องจากมีบางกรณีที่ Træfik ยังทำไม่ได้ เช่นการทำ redirect ในบาง URL เป็นต้น)

2.) Service Zone

สำหรับโซนนี้ไว้สำหรับการลงเซอร์วิสต่าง ๆ ที่จะร่วมใช้งานกับแอปพลิเคชัน เช่น ฐานข้อมูล โดยในตอนนี้ได้ทำการ Deploy MySQL, MongoDB และ Sentry.io ไว้

3.) Application Zone

สำหรับโซนนี้ไว้สำหรับการ Deploy แอปพลิเคชัน โดยได้แบ่งออกเป็น 2 โซนย่อย คือ Production Zone เป็นโซนที่แอปพลิเคชันกำลังถูกใช้งานจริง และ Development/Testing Zone สำหรับการพัฒนาและทดสอบระบบ

4.) Monitor/Support Zone

สำหรับโซนนี้เป็นโซนสำหรับการสนับสนุนการดูแลเซิฟเวอร์ เช่น การ Monitoring การทำงานของเซิฟเวอร์ในปัจจุบัน (เช่น CPU, RAM, Disk Usage เป็นต้น) เพืื่อให้สามารถเห็นภาพรวมของสถานะเซิฟเวอร์ในปัจจุบัน

และนี้ก็คือบทสรุปของการเปลี่ยนแปลงโครงสร้างในการพัฒนาเว็บของโครงการ ITCAMP@ITKMITL ซึ่งในปัจจุบันได้ย้ายการพัฒนาเว็บไซต์ของโครงการ ToBeIT@ITKMITL มาไว้ร่วมกันด้วย เนื่องจากสองโครงการนี้การพัฒนาเว็บจะเป็นทีมของนักศึกษาภายในคณะ ซึ่งผมมองเห็นถึงข้อดีในหลาย ๆ อย่างของการย้ายมาใช้งาน Docker ถึงแม้ว่าจะเป็นงานที่มีสเกลขนาดเล็กก็ตาม เช่น

  1. การกำจัดข้อจำกัดเดิมที่สามารถใช้ได้เพีียงแค่ภาษา PHP ในการพัฒนาเท่านั้น ทำให้มีทางเลือกในการพัฒนาที่หลากหลายมากยิ่งขึ้น
  2. การดูแล ติดตั้งและคอนฟิกที่ง่ายและสะดวกยิ่งขึ้น
  3. การรองรับการขยายการใช้งานที่อาจจะเกิดขึ้นในอนาคต

หวังว่าบทความนี้จะเป็นประโยชน์แก่ผู้อ่านและผู้ที่สนใจทุกท่านครับ :D

ขอขอบคุณ
- เบ้นซ์ (@zcotape) สำหรับการสนับสนุนและช่วยดูแลเซิฟเวอร์
- บอล (Theballkyo Ball) และ โอ๊ตธี (@imteerachotj) สำหรับคำแนะนำต่าง ๆ ไม่ว่าจะเป็นในเรื่องของการคอนฟิก Docker และการทำ Proxy กับ Sub-Domain
- ต้น (Tonsai Singhkangwan) สำหรับคำแนะนำในเรื่องของระบบ และเซอร์วิสต่าง ๆ
- Google, Stackoverflow และ Docker Documents สำหรับข้อมูล ขั้นตอนและวิธีทำหรือแก้ปัญหาต่าง ๆ
- กาแฟ ช็อกโกแลต และเค้ก ซึ่งเป็นแหล่งพลังงานชั้นเลิศ ที่ทำให้การพัฒนาเป็นไปได้อย่างราบลื่น ❤
และสุดท้าย คณะเทคโนโลยีสารสนเทศ สจล. ที่ได้มอบเซิฟเวอร์ให้ใช้งานสำหรับโครงการ ITCAMP@ITKMITL และโอกาสในการศึกษาต่าง ๆ ครับ

--

--

Meranote
ITForge
Writer for

Chaniwat Seangchai | ITKMITL#12 | Full-Stack & Game Developer / DevOps | ❤ Sci-fi & Anime