รัน Application บน Synology NAS ด้วย Docker และ Virtual Machine
ข้อดีของ Disk Station Manager (DSM) ที่ติดตั้งอยู่บน Synology NAS ทุกรุ่นคือ การมี Package Centre ให้เราสามารถติดตั้ง Application เพื่อเพิ่มความสามารถให้กับ Synology NAS ของเราให้เก่งมากขึ้นไปอีก แต่ในบาง Application ที่เราอาจจะใช้งาน มันไม่มีใน Package Manager แต่ไม่ต้องกลัว เพราะใน DSM เขามีวิธีการให้เราแล้ว ผ่านการใช้งาน Docker และ Virtual Machine
ปล. จริง ๆ แล้วเว็บนี้ ก็ทำงานอยู่บน Docker ที่อยู่บน Synology NAS นี่แหละ เต็ม ๆ เลย
Virtual Machine
การทำ Virtual Machine เป็นการสร้างเครื่องเสมือนขึ้นมาในระบบ หรือ ก็คือ เหมือนว่า เรามีเครื่องคอมพิวเตอร์จริง ๆ ขึ้นมาเพิ่ม เราสามารถลงโปรแกรม หรือทำงานอะไรก็ได้ เหมือนเรามีเครื่องคอมพิวเตอร์จริง ๆ เครื่องหนึ่ง
การทำ Virtual Machine จริง ๆ มันมีความยากในการ Setup อยู่พอสมควร เช่น การติดตั้งพวกโปรแกรม Hypervisor ไม่ว่าจะเป็นแบบ Type I หรือ II ก็ตาม และยังไม่นับเรื่องของการจัดการ Storage บน Network อีกที่ยุ่งยากมาก ๆ
แต่ปัญหาพวกนี้จะจัดการได้ง่ายขึ้นมาก เพราะ Synology มี Package มาให้เรา ชื่อว่า Virtual Machine Manager (VMM) ซึ่งเราสามารถติดตั้งผ่าน Package Centre ตรง ๆ ได้เลย เพียงแค่กด Install ก็เรียบร้อยแล้ว
จากนั้น เราเปิด Virtual Machine Manager ขึ้นมา เราจะเห็นได้เลยว่า มันเป็นหน้าตาแบบ Graphic ที่โอเคมาก ๆ การสร้าง Virtual Machine นั้นก็ทำได้ง่ายมาก ๆ เราไม่ต้องเขียนอะไรสักอย่างเลย แค่เราเลือกไปที่ Tab Virtual Machine
แล้วกด Create ตัว Wizard จะให้เราเลือกเลยว่า เราจะติดตั้ง OS ประเภทไหน โดยมันรองรับหลาย OS มาก ๆ โดยเฉพาะ OS ที่ได้รับความนิยมสูง ๆ อย่าง Microsoft Windows ยันพวก Linux ใน Distro ต่าง ๆ หรือกระทั่งเป็น DSM เอง ก็ทำได้เหมือนกัน
หรือถ้า OS ที่เราจะลงไม่ได้อยู่ใน List พวกนี้ เราสามารถเลือกเป็น Other ได้ แต่สิ่งที่ VMM จะให้เรามาคือ E1000 NIC สำหรับ Network และ IDE Controller สำหรับ Storage ดังนั้น เราจะลง OS อะไรก็ได้เลย ขอแค่รองรับอุปกรณ์ที่บอกไปแค่นั้นเลย
อันนี้เราเพิ่มให้ E1000 มันเป็น NIC ที่จำลอง NIC ที่ใช้ Chip Intel 82545EM ซึ่งมีการรองรับการใช้งานที่หลากหลาย ตั้งแต่ Windows XP ขึ้นไปเลย เปิดโอกาสให้เราสามารถลง OS ได้กว้างมาก ๆ เรียกว่า แทบทุกตัวเลยก็ว่าได้ นอกจากพวกที่ Customise แปลก ๆ อะนะ
จากนั้น เราสามารถเลือกได้ว่า เราจะให้ Disk Image ไปไว้ใน Volume ไหน สำหรับเครื่องที่อาจจะมีหลาย Volume เราก็อาจจะเลือกให้เหมาะสมกับการทำงานเรา เช่น เครื่องเราเอง เราจะเรียงพวกที่ใช้ I/O จำนวนมาก ๆ ไปใส่ใน Volume ที่เป็น SSD ก็จะทำให้การทำงานมันทำได้เร็วขึ้น
และสุดท้าย เรามาตั้งค่าพวก จำนวน CPU Core และขนาดของ Memory อันนี้ขึ้นกับการใช้งานของเราเลย สิ่งที่เจ๋งคือ เราสามารถกำหนด QoS ของการทำงานได้ด้วย ถือว่าเป็น Feature ที่ดีมาก ๆ
Virtual Machine Manager (VMM)
นอกจาก Feature พื้นฐานอย่างการสร้าง Virutal Machine แล้ว มันยังเก่งกว่านั้นเยอะมาก ๆ อย่างการทำ Cluster เมื่อเรามี Synology NAS หลาย ๆ ตัว เราสามารถรวมกันเป็น Clsuter เดียว เพื่อให้เราจัดการ Virtual Machine ได้ทั้งหมดพร้อม ๆ กันเลย โดยเราสามารถติดตั้งใน Cluster ได้สูงสุด 7 เครื่องด้วยกัน
อีก Feature ที่ชอบเป็นการส่วนตัวคือ การทำ Live Migration หมายความว่า เราสามารถย้าย VM ของเราจาก Synology NAS เครื่องนึง ไปอีกเครื่องนึงได้ โดยไม่ต้องปิดเครื่อง ไม่ว่าจะด้วยเหตุผลอะไรก็ตามเช่น เราอาจจะต้องทำการ Maintenance เครื่องนึง เราก็ย้ายไปไว้อีกเครื่อง หรือ Load ในการทำงานมันสูงเกินไปก็ตาม ถือว่าเป็น Feature ที่ดีมาก ๆ สำหรับ Software ในการจัดการ Virtual Machine สำหรับองค์กร
พอเราทำ Live Migration ได้ นั่นแปลว่า High Availability ก็ต้องมาแล้วละ สิ่งมี่มันทำคือถ้ามันรู้ว่า VM สักตัวหยุดทำงานไป หรือระบบสักอย่างหยุดทำงานไป มันจะทำ Live Migration ไปที่เครื่องที่ว่างอยู่อัตโนมัติ และเริ่มระบบให้เร็วที่สุด เพื่อให้การทำงานขาดตอนให้น้อยที่สุด
หรือถ้าเราอยากจะป้องกัน สร้างความมั่นคงให้มากกว่านั้น เราสามารถใช้งานร่วมกับ Synology High Availability ที่จะมี Feature ของการทำ Failover ไปที่เครื่องที่เหลือที่ยังทำงานอยู่ทันที ถือว่า ทำให้เรามั่นใจได้เลยว่า Service ของเราจะสามารถทำงานได้อย่างต่อเนื่อง แม้ประสบปัญหาที่เราไม่คาดคิดได้
นอกจากนั้น เรายังสามารถสำรองข้อมูลของ VM ที่อยู่ในระบบแบบอัตโนมัติได้อีก ซึ่งมันเป็นการทำ Snapshot ดังนั้น VM ไม่จำเป็นต้องหยุดทำงานเลยด้วยซ้ำ ทำให้การทำงานมันไม่ขาดตอน และ ยังสามารถเลือกเวลา ในการสำรองได้อย่างละเอียด ขึ้นกับความต้องการ และ Policy ในองค์กรของเราได้ทั้งหมด
เราสามารถตั้งได้ยันเรื่องของ Data Retention ว่าเราต้องการให้ข้อมูลที่สำรองมันสำรองไว้นานขนาดไหน เช่นเครื่องนี้ของเราเอง เป็นเครื่องที่ไม่ได้สำคัญอะไรมาก เราเลยตั้งค่าไว้ให้ Snapshot ทุกวันแต่ จะเก็บไว้แค่ 4 Copy เท่านั้น ห่างกัน ประมาณ 1 อาทิตย์ ทำให้เมื่อเกิดเหตุไม่คาดฝัน เราสามารถ Restore VM ของเราย้อนหลังได้สูงสุดเกือบ ๆ เดือนเลยทีเดียว
โดย Feature หลาย ๆ อย่าง เช่น Live Migration หรือ High Availability และการทำ Replication นั้น จะอยู่ใน VMM Pro ที่เราจะต้องซื้อ License เพิ่ม แต่การทำ Virtual Machine ทั่ว ๆ ไป หรือการทำ Snapshot เราสามารถทำได้ในตัวฟรีเลย (ตัว Free จะเก็บ Snapshot ได้สูงสุด 32 เท่านั้น แต่ Pro ได้ถึง 255) ส่วนใหญ่แล้ว ถ้าเราไม่ได้ใช้งานอะไรอลังการมาก ส่วนใหญ่ ตัวฟรีก็ถือว่าเพียงพอกับการใช้งานมาก ๆ แล้ว
Docker
อีกหนึ่งวิธีการทำงานใน Software สมัยใหม่คือการทำเป็น Containerised Application ซึ่ง Software สำหรับการจัดการ และทำพวก Container พวกนี้ขึ้นมา ก็น่าจะหนีไม่พ้น Docker นั่นเอง ซึ่งใน DSM ก็มี Docker Package ให้เราติดตั้ง และใช้งาน Docker ได้เลย
สำหรับ Developer ที่เคยใช้งาน Docker เอง พอรู้ว่า เราสามารถใช้ Docker บน DSM เราว่าน่าจะยิ้มกริมแล้วละ ตอนที่เราได้ยินครั้งแรกคือ ยิ้มกริมเหมือนกัน เพราะมันเปิดโอกาสให้เรารัน Application ได้มหาศาลมาก ๆ จริง ๆ คือ เรารันอะไรก็ได้เลยด้วยซ้ำ
ใน Docker Package บน DSM มีเครื่องมือให้เราจัดการพวก Container อย่างครบครันมาก ๆ ตั้งแต่การสร้าง และ การเปิดปิด Container ต่าง ๆ โดยที่ไม่ต้องใช้งาน Command Line ให้ยุ่งยาก จะเห็นจากรูปได้เลยว่า เราใช้งานมันเยอะมาก ๆ หลาย ๆ Application เราก็รันบนนี้ทั้งหมดเลย
สำหรับพวก Image ที่เราจะเอามาใช้งาน ใน Docker Package ก็มีการเชื่อมต่อกับ Docker Registry ให้เราเรียบร้อยเลย ทำให้เราสามารถ Download พวก Public Image เข้ามาได้เลย เช่น เราเองโหลดพวก Grafana สำหรับการทำ Dashboard หรือจะเป็นพวก Home Assistant สำหรับการทำ Smart Home หรือจะไปสายงานพวก Developer หน่อย ก็พวก Database อย่าง MySQL ก็เอามาลงได้หมดเลย
หรือ ๆ ถ้าเรารัน Application ของเราเอง เช่น เว็บเราเอง ก็มีการเขียน API แยก โดยใช้ Flask บน Python เราก็เอามายัดใส่พวก Waitress แล้วก็อัดลงไปใน Container แล้วเราก็เขียน DockerFile แน่นอนว่า Docker บน DSM ก็รองรับการสร้าง Image จาก DockerFile ด้วยเช่นกัน ก็อำนวยความสะดวกในการสร้าง Container เองค่อนข้างมากเลยทีเดียว
แต่ ๆ ข้อสังเกตของ Docker บน DSM จริง ๆ คือ มันขาดความสามารถในการ Update Version ของ Image ได้ เมื่อก่อน เราใช้งานพวก UnRAID ตัว Docker เขาจะมีการเช็คหา Update ของ Image ถ้ามี เราก็สามารถกดเพื่อ Update ได้เลย แต่ใน DSM เราจะต้องเช็ค Version เอง Download Image ผ่าน Registry เข้ามา และทำการ Reset Container ด้วยตัวเอง อาจจะเป็นอะไรที่ไม่สะดวกนิดหน่อย แต่ก็รับได้
Deploying Focalboard with Docker
เพื่อให้เห็นตัวอย่างว่า การ Deploy Application บน DSM ง่ายขนาดไหน เรามาลอง Deploy อะไรกันหน่อยดีกว่า Application ที่เราเลือกมาทำในวันนี้เป็น Application ที่เราเห็นเพื่อน ๆ แชร์กันใน Facebook เยอะมาก ๆ ว่ามันเข้ามาแทนพวก Notion ที่เราใช้งานได้เลย คือ Focalboard
ซึ่ง DSM ก็มีตัวเลือกให้เรา 2 ทางใหญ่ ๆ ด้วยกันคือ การทำผ่าน VM หรือ Docker ซึ่ง ถ้าเรามาดูกันจริง ๆ การทำผ่าน VM มันจะกินทรัพยากรค่อนข้างเยอะ และ เราไม่ได้มีความจำเป็นต้องแยกเครื่องออกไป หรือ สำรองข้อมูลระดับ VM อะไรขนาดนั้น เลยเข้าไปหาใน Docker Hub ว่ามันมี Offical Image มั้ย ซึ่ง ก็มี ทำให้เราสามารถเอาเข้ามาใช้งานได้ตรง ๆ เลย
ก่อนอื่น ๆ เราจะต้องโหลด Image ของ Focalboard เข้ามาก่อน เข้าไปที่ Docker แล้วไปที่ Tab Repository แล้วพิมพ์หาได้ตรง ๆ เลย จากนั้น ก็ Double Click ที่ Image ที่เราต้องการ ตัว Docker จะทำการโหลด Image เข้ามาในเครื่องของเรา เมื่อเสร็จแล้วจะมี Notification ขึ้นมาว่า Image ได้ทำการโหลดเรียบร้อยแล้ว
เมื่อ Image ได้ทำการโหลดมาเรียบร้อยแล้ว เราสามารถดู Image ที่มีอยู่ในเครื่องได้ในเมนู Image ให้เราเลื่อนหา Image ของ Focalboard และ Double Click เพื่อทำการสร้าง Container จาก Image ที่เราต้องการ
จากนั้น Wizard จะให้เราเลือก Network ของ Container ที่เราต้องการจะสร้าง สำหรับคนที่ใช้ Command Line มา มันก็คือ Option สำหรับการเลือก host หรือ bridge Adapter อันนี้ก็ขึ้นกับ Application ที่เราต้องการทำงานละ แต่สำหรับเคสนี้ เราจะให้มันวิ่งผ่าน NAT ของ Docker เอง เลยเลือกเป็น bridge ปกติตาม Default เลย ต่อไป จะเป็นการตั้งค่าของ Container โดยเราตั้งพวกชื่อ และการตั้งค่าอื่น ๆ อย่าง Autorestart Policy จนไปถึงพวก Filesystem Link และ Environment Variables ต่าง ๆ
หลังจากนั้น จะเป็นการตั้งค่า Port สำหรับ Container นี้เราใช้ bridge Adapter ทำให้เราจะต้องวิ่งผ่าน Docker NAT ทำให้เราสามารถ Bind Port ได้ โดยใน Focalboard มันจะมี 2 Port ออกมาคือ 8000 และ 8092 อันนี้ไปอ่านใน Document ได้นะ ก็ตั้งเป็น Port ที่เราต้องการ และไม่ซ้ำกับ Container อื่น ๆ
ขั้นตอนต่อไป จะให้เราตั้งค่าสำหรับถ้าเราต้องการ Bind File หรือ Folder เข้าไปใน Container เราก็สามารถเลือกจากตรงนี้ได้เลย สำหรับ Container ตัวนี้เราจะไม่ Bind อะไรเลย เราก็กด Next ต่อไปได้เลย
และสุดท้าย เมื่อเราตั้งค่าเสร็จหมดแล้ว มันก็จะแสดงผลสรุปละว่า Container ที่เราจะสร้างขึ้นมามันมี Configuration อะไรบ้าง ถ้ามันไม่ได้เป็นอย่างที่เราตั้ง ก็สามารถย้อนกลับไปตั้งค่าใหม่ให้ถูกต้องได้ หรือถ้าถูกต้องแล้วกด Done ตัว Container ก็จะถูกสร้างขึ้นมาเรียบร้อย
เท่านี้ Focalboard ก็พร้อมใช้งานเรียบร้อยแล้ว เราสามารถเข้าไปที่ Web Browser แล้วเข้าไปที่ IP Address ของ Synology NAS ของเราแล้วตามด้วย Port ที่เราตั้งไว้กับการสร้าง Container ก็สามารถเข้าใช้งานได้แล้ว ถ้าทำจริง ๆ ขั้นตอนพวกนี้ เราสามารถทำได้ภายในเวลาไม่เกิน 4 นาทีเลย เลยจะเห็นได้เลยว่า มันง่าย และ รวดเร็วมาก ๆ เราสามารถขึ้น Application ใหม่ได้อย่างรวดเร็ว และ ง่ายมาก ๆ ลดการพิมพ์ Command Line ได้เยอะ โดยเฉพาะ เมื่อ Configuration ที่ซับซ้อน ตอนพิมพ์ Command ก็น่าจะปวดหัวน่าดูเลยทีเดียว
สรุป
นอกจากที่ Synology NAS จะเป็น NAS สำหรับการเก็บข้อมูลได้แล้ว จากที่ผ่าน ๆ มา เราจะเห็นว่า ทาง Synology มี Package ให้เราเลือกเล่นเยอะมาก ๆ แต่นอกเหนือจากนั้น เราก็ยังสามารถนำ Application จากแหล่งภายนอกเข้ามารัน และใช้งานได้เหมือนกัน โดยการใช้งานผ่าน Virtual Machine หรือจะผ่าน Docker เองก็ได้เหมือนกัน เราจะเห็นพวก Feature ต่าง ๆ พวกนี้ มันทำให้การใช้งานในองค์กร หรือ กระทั่ง การใช้งานในบ้านเอง มันเปิดกว้างขึ้นอย่างไม่น่าเชื่อ เช่น บ้านเราอาจจะรันพวก Home Assistant สำหรับการทำ Smart Home ในบ้านได้ หรือองค์กรเอง อาจจะรันพวก Database อย่าง MySQL บนนี้เลยก็ได้เหมือนกัน
สำหรับ Virtual Machine เอง Synology ก็ทำงานผ่าน Package ที่ชื่อว่า Virtual Machine Manager ทำให้เราสามารถจัดการ VM ได้อย่างง่ายดาย เพียงแค่คลิก ๆ เท่านั้น ลบภาพการทำงานที่ดูยุ่งยากไปได้เลย และมาพร้อมกับ Feature สำหรับการทำงานที่เรียกว่า ครบครัน เช่น Live Migration, High Availability และสิ่งที่สำคัญอย่างการทำ Live Snapshot สำหรับการสำรองข้อมูล
BONUS : External Access
หลังจากที่เราทำการ Deploy Application ขึ้นบน Synology NAS แล้ว ถ้าเราดูที่การเข้าถึง เราจะเห็นว่า เราสามารถเข้าถึงเมื่อเราอยู่ในวง Network เดียวกับ Synology NAS ที่เราติดตั้งเท่านั้น แต่ถามว่า แล้วถ้าเราต้องการที่จะ Expose ออกไปยัง Network ภายนอกให้เราเข้าถึงจากที่ไหนก็ได้ผ่านหน้าเว็บ เราจะทำได้อย่างไร
สิ่งที่เราต้องมีก่อนคือ Public IP ไม่ว่าจะเป็น Static หรือ Dynamic IP Address ก็ได้ สำหรับ Dynamic IP Address อาจจะต้องพึ่งพา DDNS เพื่อให้ง่ายต่อการเข้าถึง ซึ่งใน DSM มี Service สำหรับการทำ DDNS ให้เราหมดแล้ว เราก็สามารถเข้าไปตั้งค่าได้เลย
และสำหรับคนที่ใช้งานแบบ Static และมี Domain Name เราก็สามารถเข้าไปเซ็ต DNS เช่นของเว็บเราเองก็จะอยู่หลัง Cloudflare ใช้ Cloudflare เป็น DNS และ Service สำหรับการป้องกันการโจมตีหลาย ๆ อย่างอยู่ เราก็อาจจะเซ็ตพวก Subdomain ขึ้นมา
เพื่อให้การเชื่อมต่อจากภายนอกเข้ามาใน Synology NAS ของเรา เราก็ต้องเข้าไปตั้งค่า Firewall ให้รับการเชื่อมต่อจากภายนอก และ NAT ให้เข้ามาที่ Synology NAS
สำหรับใครที่อาจจะมีหลาย Application บน Domain หรือเครื่องของเราเอง เราแนะนำให้ติดตั้งพวก Application Portal ไว้ หลักการง่าย ๆ คือ เราจะตั้ง Rule ไว้ ถ้า Hostname ที่ใส่เข้ามาเป็นอะไร เราก็จะให้มันวิ่งไปหา Service ที่เราต้องการได้เลย ซึ่ง เราอาจจะใช้ Web Station ที่เป็น Package ให้เราติดตั้งผ่าน Package Centre
แต่สำหรับเราเอง เรา Migrate มาจากระบบเก่าอย่าง UnRAID ที่มันไม่ได้มีพวกนี้มาให้ เราเลยติดการใช้ SWAG ที่เป็น Nginx Based และเราคุ้นเคยกับ Nginx มากกว่าเลยเลือกใช้ตัวนี้ บน Synology NAS เอง เราก็ทำการ Deploy ผ่าน Docker ด้วยวิธีการที่เราเล่าไปก่อนหน้านี้
และสุดท้าย เราก็สร้าง Rule สำหรับการกรอง Hostname แล้วให้มันวิ่งไปที่ IP Address ของ Synology NAS และ Port ที่เราตั้งเอาไว้ เช่น Focalboard ของเราเป็น 8061 ก็ทำให้เราสามารถเข้า Focalboard ได้จากภายนอกเป็นเหมือนเว็บปกติเลย