🔵 Node.js

คู่มือการทำ Production Deployment: รันโปรเจกต์ด้วย PM2 และ Docker ให้เสถียรเหมือนมือโปร

11 นาที 15 views บันทึกเป็น PDF
คู่มือการทำ Production Deployment: รันโปรเจกต์ด้วย PM2 และ Docker ให้เสถียรเหมือนมือโปร

เรียนรู้วิธีนำโปรเจกต์ขึ้นเซิร์ฟเวอร์จริงให้รันได้ 24 ชั่วโมงด้วย PM2 และใช้ Docker ช่วยคุมสภาพแวดล้อมให้เหมือนกันทุกเครื่อง ลดปัญหาโค้ดพังเมื่อย้ายที่

ทำความรู้จัก Production Deployment ขั้นตอนการเปิดตัวโปรเจกต์สู่โลกกว้าง

เมื่อเราเขียนโปรแกรมจนรันได้บนเครื่องตัวเองแล้ว ขั้นตอนต่อไปที่สำคัญที่สุดคือการทำ Production Deployment (การเอาโค้ดขึ้นเซิร์ฟเวอร์จริงเพื่อให้คนอื่นใช้งานได้) เปรียบเสมือนการเปิดร้านอาหารที่เคยทำกินเองในบ้านให้กลายเป็นร้านที่รับลูกค้าจริง ซึ่งต้องมีการเตรียมความพร้อมมากกว่าแค่การเปิดเครื่องทิ้งไว้

การนำโปรเจกต์ขึ้นสู่ Production (สภาพแวดล้อมใช้งานจริง) ต่างจากการรันในเครื่องเราตรงที่เซิร์ฟเวอร์ต้องทำงานตลอด 24 ชั่วโมงโดยไม่หยุดพัก และต้องรองรับผู้ใช้งานหลายคนพร้อมกัน หากโปรแกรมพังหรือค้างขึ้นมา เราไม่สามารถกดปุ่มสั่งรีสตาร์ทเองได้ตลอดเวลาเหมือนตอนที่นั่งทำงานหน้าคอมพิวเตอร์

หัวใจสำคัญของการทำงานนี้คือการทำให้ระบบมีความเสถียรและดูแลรักษาง่ายที่สุด เราจึงต้องใช้เครื่องมือเข้ามาช่วยจัดการกระบวนการเหล่านี้แทนการทำด้วยมือทั้งหมด เพื่อลดความผิดพลาดที่อาจเกิดขึ้นจากมนุษย์ และทำให้การอัปเดตโค้ดเวอร์ชันใหม่ในอนาคตเป็นเรื่องที่ราบรื่นและปลอดภัย

การจัดการ Process Manager ด้วย PM2 เพื่อให้โปรแกรมรันไม่หยุดพัก

ในโลกของการเขียนโปรแกรมด้วย Node.js (ภาษาที่ใช้รันโค้ด JavaScript บนเซิร์ฟเวอร์) หากโปรแกรมเกิดข้อผิดพลาดขึ้นมา มันจะหยุดทำงานทันทีเหมือนไฟดับ PM2 (เครื่องมือจัดการกระบวนการทำงานของโปรแกรม) จึงเป็นตัวช่วยที่ขาดไม่ได้ เพราะมันจะคอยเฝ้าดูโปรแกรมของเราตลอดเวลา

ถ้าโปรแกรมของเราเกิดค้างหรือพังขึ้นมา PM2 จะทำการรีสตาร์ทโปรแกรมให้โดยอัตโนมัติ ทำให้ผู้ใช้งานแทบไม่รู้สึกว่าระบบมีปัญหา นอกจากนี้มันยังช่วยจัดการเรื่องการบันทึก Log (ประวัติการทำงานของโปรแกรม) ให้เราอ่านย้อนหลังได้ง่ายขึ้นอีกด้วย

การใช้งาน PM2 เริ่มต้นได้ง่ายผ่านคอมมานด์ไลน์ (หน้าจอพิมพ์คำสั่ง) โดยเราเพียงแค่ต้องติดตั้งผ่านตัวจัดการแพ็กเกจแล้วสั่งรันไฟล์หลักของโปรเจกต์ ระบบก็จะถูกนำไปดูแลภายใต้การควบคุมของเครื่องมือนี้ทันที

# ติดตั้ง PM2 ลงในเครื่องแบบทั่วถึง
npm install pm2 -g

# สั่งรันโปรเจกต์ด้วย PM2
pm2 start app.js --name "my-web-app"

# ดูสถานะของโปรแกรมที่รันอยู่
pm2 list

บรรทัดแรกเป็นการติดตั้งโปรแกรมลงในระบบ ส่วนบรรทัดที่สองเป็นการสั่งให้ PM2 เริ่มคุมไฟล์ app.js โดยตั้งชื่อว่า my-web-app เพื่อให้เราเรียกใช้ได้ง่ายในอนาคต ส่วนบรรทัดสุดท้ายคือการตรวจสอบว่าโปรแกรมรันอยู่ไหม

ผลลัพธ์ที่ควรเห็นคือตารางแสดงสถานะโปรแกรมที่บอกว่า status: online และมีการใช้หน่วยความจำเท่าไหร่ หากโปรแกรมของคุณเขียนถูกต้อง มันจะทำงานต่อเนื่องไปเรื่อย ๆ แม้คุณจะปิดหน้าต่าง Terminal (หน้าจอพิมพ์คำสั่ง) ไปแล้วก็ตาม

ข้อควรระวัง สำหรับมือใหม่คืออย่าลืมตั้งค่าให้ PM2 รันตัวเองใหม่หากเครื่องเซิร์ฟเวอร์มีการรีบูต (การปิดและเปิดเครื่องใหม่) ด้วยคำสั่ง pm2 save และ pm2 startup เสมอ เพื่อให้มั่นใจว่าเมื่อไฟฟ้ากลับมา โปรแกรมของคุณจะเริ่มทำงานเองโดยไม่ต้องเข้าไปกดสั่งใหม่

การคอนฟิก Docker Container เพื่อจำลองสภาพแวดล้อมให้เหมือนจริง

ปัญหาคลาสสิกที่โปรแกรมเมอร์เจอบ่อยคือ "รันในเครื่องเราได้ แต่พอเอาขึ้นเซิร์ฟเวอร์แล้วพัง" ซึ่งมักเกิดจากสภาพแวดล้อมไม่เหมือนกัน Docker (เทคโนโลยีที่ใช้สร้างกล่องบรรจุโปรแกรมพร้อมสิ่งที่จำเป็นทั้งหมด) จึงถูกสร้างมาเพื่อแก้ปัญหานี้โดยเฉพาะ ทำให้โปรแกรมรันได้เหมือนกันทุกที่

การใช้ Docker เปรียบเสมือนการย้ายบ้านโดยยกบ้านทั้งหลังไปวางที่ใหม่ รวมถึงเฟอร์นิเจอร์และระบบน้ำไฟครบชุด เราไม่ต้องกังวลว่าเครื่องเซิร์ฟเวอร์จะขาดโปรแกรมเสริมตัวไหน เพราะเราได้แพ็กทุกอย่างใส่ Container (หน่วยบรรจุโปรแกรมที่แยกตัวออกมาอิสระ) ไว้เรียบร้อยแล้ว

ขั้นตอนการใช้งานคือเราต้องสร้างไฟล์ชื่อ Dockerfile ไว้ในโฟลเดอร์โปรเจกต์ เพื่อบอก Docker ว่าต้องติดตั้งอะไรบ้างและรันคำสั่งไหนเป็นหลัก สิ่งนี้ช่วยให้เพื่อนร่วมทีมหรือเซิร์ฟเวอร์ปลายทางรันโปรเจกต์ได้ทันทีโดยไม่ต้องตั้งค่าใหม่ให้เสียเวลา

# ใช้ Node.js เวอร์ชัน 18 เป็นฐาน
FROM node:18

# กำหนดโฟลเดอร์ทำงานในกล่อง
WORKDIR /app

# คัดลอกไฟล์โปรเจกต์เข้าไป
COPY . .

# ติดตั้งโปรแกรมเสริมที่จำเป็น
RUN npm install

# เปิดใช้งานพอร์ตที่ต้องการ
EXPOSE 3000

# สั่งรันโปรแกรม
CMD ["node", "app.js"]

โค้ดชุดนี้เริ่มจากการเลือกฐานของระบบปฏิบัติการ แล้วสร้างโฟลเดอร์ /app ขึ้นมาเพื่อเก็บโค้ดของเรา จากนั้นทำการคัดลอกไฟล์ทั้งหมด ติดตั้งตัวช่วยที่ระบุไว้ใน package.json และกำหนดให้รันไฟล์ app.js เมื่อกล่องเริ่มทำงาน

ผลลัพธ์ที่ได้คือภาพจำลองของระบบที่พร้อมใช้งาน คุณสามารถสั่ง docker build -t my-app . เพื่อสร้างกล่องโปรเจกต์ขึ้นมา และสั่ง docker run -p 3000:3000 my-app เพื่อทดสอบรันโปรแกรมในกล่องที่สร้างเสร็จแล้วได้ทันที

สิ่งที่มือใหม่มักพลาดคือการใส่ไฟล์ที่ไม่จำเป็น เช่น ไฟล์แคชหรือไฟล์เก็บรหัสผ่านเข้าไปในกล่อง ให้ใช้ไฟล์ชื่อ .dockerignore เพื่อระบุรายชื่อไฟล์หรือโฟลเดอร์ที่ไม่ต้องการให้ Docker นำเข้าไปด้วย เพื่อให้ขนาดของกล่องเล็กลงและปลอดภัยมากขึ้น

แนวทางการ Deploy บน Cloud และการเลือกเซิร์ฟเวอร์ที่เหมาะสม

การเลือกที่วางโปรเจกต์หรือ Cloud (บริการเช่าคอมพิวเตอร์ผ่านอินเทอร์เน็ต) เป็นขั้นตอนที่น่าตื่นเต้นที่สุด สำหรับโปรเจกต์เริ่มต้นเราไม่จำเป็นต้องใช้ของแพงหรือซับซ้อน เลือกใช้ VPS (เซิร์ฟเวอร์ส่วนตัวเสมือน) ที่จ่ายเงินเป็นรายเดือนในราคาประหยัดก็เพียงพอแล้ว

เมื่อได้เซิร์ฟเวอร์มาแล้ว สิ่งที่เราต้องทำคือการเข้าถึงผ่าน SSH (วิธีสื่อสารกับเซิร์ฟเวอร์ผ่านเครือข่ายอย่างปลอดภัย) เพื่อเข้าไปติดตั้ง Docker และคัดลอกโค้ดของเราขึ้นไปรัน วิธีนี้ช่วยให้คุณได้เรียนรู้การจัดการเซิร์ฟเวอร์แบบเบื้องต้นซึ่งเป็นทักษะที่โปรแกรมเมอร์เก่ง ๆ ทุกคนต้องมี

ลองนึกภาพว่าคุณกำลังเช่าห้องเก็บของหนึ่งห้อง คุณต้องมีกุญแจ (SSH Key) เพื่อไขเข้าไปจัดระเบียบและวางโปรเจกต์ของคุณไว้ในนั้น การทำแบบนี้จะทำให้คุณเข้าใจว่าเบื้องหลังของเว็บไซต์ที่คนใช้งานอยู่นั้น มีขั้นตอนการทำงานอย่างไรบ้าง และต้องดูแลรักษาอย่างไรไม่ให้ระบบล่ม

  • เลือกผู้ให้บริการที่น่าเชื่อถือและมีคู่มือการใช้งานชัดเจน
  • เริ่มต้นจากแผนการใช้งานที่ราคาถูกที่สุดเพื่อเรียนรู้ก่อน
  • อย่าลืมตั้งค่า Firewall (ระบบป้องกันการเข้าถึงจากภายนอก) เพื่อความปลอดภัย
  • หมั่นอัปเดตระบบปฏิบัติการบนเซิร์ฟเวอร์อย่างสม่ำเสมอ

การฝึก Deploy บนเซิร์ฟเวอร์จริงจะทำให้คุณเห็นภาพชัดเจนว่าโปรแกรมของคุณเมื่อเจอโลกภายนอกแล้วจะเกิดปัญหาอะไรบ้าง เช่น ปัญหาเรื่องความเร็วเน็ตหรือปัญหาเรื่องหน่วยความจำ ซึ่งเป็นบทเรียนที่หาไม่ได้จากการเขียนโค้ดในเครื่องตัวเองเพียงอย่างเดียว

การวางแผนดูแลรักษาระบบหลัง Deploy และการแก้ปัญหาเบื้องต้น

งานของโปรแกรมเมอร์ไม่ได้จบลงแค่ตอนที่โปรแกรมรันได้บนเน็ตแล้ว แต่การ Maintenance (การดูแลรักษาระบบให้ทำงานได้ปกติ) คือจุดที่วัดความเป็นมืออาชีพ คุณต้องคอยตรวจสอบว่าระบบยังทำงานดีอยู่ไหมและมีบั๊ก (ข้อผิดพลาดของโปรแกรม) โผล่ออกมาตอนไหน

เมื่อโปรแกรมรันบนเซิร์ฟเวอร์ คุณควรมีวิธีการดึงข้อมูล Log ออกมาดูเสมอ เพราะถ้ามีผู้ใช้งานรายงานว่าเข้าเว็บไม่ได้ คุณต้องรู้สาเหตุทันทีว่าเกิดจากอะไร เช่น ฐานข้อมูลเชื่อมต่อไม่ได้หรือหน่วยความจำเต็ม การเตรียมพร้อมรับมือกับปัญหาเหล่านี้ล่วงหน้าจะช่วยลดความเครียดได้เยอะ

ทำความคุ้นเคยกับการตรวจสอบสถานะของเซิร์ฟเวอร์ผ่านคำสั่งง่าย ๆ เช่น top หรือ htop เพื่อดูว่ามีโปรแกรมไหนกินทรัพยากรเครื่องมากเกินไปไหม การเป็นโปรแกรมเมอร์ที่ดูแลระบบได้เองจะทำให้คุณเป็นที่ต้องการของทีมงานอย่างมาก เพราะคุณคือคนที่พึ่งพาได้ในยามวิกฤต

# ตรวจสอบการใช้งานของโปรแกรมด้วย PM2
pm2 monit

# ดูประวัติการทำงานย้อนหลัง
pm2 logs my-web-app --lines 50

คำสั่งแรกจะเปิดหน้าจอแบบกราฟิกสวยงามให้เราเห็นการทำงานของ CPU และ RAM ของโปรแกรมแบบเรียลไทม์ ส่วนคำสั่งที่สองเป็นการดึงข้อมูลการทำงาน 50 บรรทัดล่าสุดออกมาดู เพื่อวิเคราะห์ว่ามีข้อความแจ้งเตือนความผิดพลาด (Error) เกิดขึ้นในช่วงเวลาไหน

ผลลัพธ์คือคุณจะเห็นข้อมูลการตอบสนองของระบบ หากมีข้อความสีแดงปรากฏขึ้นมา นั่นคือสัญญาณเตือนให้คุณเข้าไปตรวจสอบโค้ดในจุดนั้นทันที การฝึกอ่าน Log บ่อย ๆ จะทำให้คุณเก่งขึ้นในการเดาทางว่าบั๊กมักจะเกิดขึ้นที่ไหนและเกิดจากอะไร

คำแนะนำสำคัญ คือควรตั้งแจ้งเตือนผ่านช่องทางต่าง ๆ เช่น อีเมลหรือแอปแชทหากระบบล่ม การทำแบบนี้ช่วยให้คุณแก้ไขปัญหาได้ก่อนที่ผู้ใช้งานจะรู้ตัว และเป็นการสร้างมาตรฐานการทำงานที่เป็นมืออาชีพให้กับตัวเองตั้งแต่ก้าวแรกของการเป็นโปรแกรมเมอร์

สรุปแนวทางการเตรียมตัวก้าวสู่ระดับมืออาชีพ

การทำ Production Deployment ไม่ใช่เรื่องที่น่ากลัวอย่างที่คิด หากคุณค่อย ๆ ฝึกฝนและทำความเข้าใจเครื่องมืออย่าง PM2 และ Docker ตั้งแต่วันนี้ คุณจะพบว่ามันเป็นทักษะที่ช่วยเปิดโอกาสในหน้าที่การงานได้มหาศาล เพราะบริษัทส่วนใหญ่ต้องการคนที่ทำได้มากกว่าแค่เขียนโค้ด แต่รวมถึงการส่งมอบงานให้ถึงมือผู้ใช้ด้วย

สมมติว่าคุณมีโปรเจกต์เว็บส่วนตัวหนึ่งอัน ให้ลองทำตามขั้นตอนทั้งหมดนี้คือ 1) เขียน Dockerfile ให้รันได้ 2) ติดตั้ง PM2 บนเซิร์ฟเวอร์ราคาประหยัด 3) ตั้งค่าให้ระบบรีสตาร์ทตัวเองอัตโนมัติ และ 4) ฝึกอ่าน Log ทุกสัปดาห์ เพียงเท่านี้คุณก็มีประสบการณ์ที่เหนือกว่าโปรแกรมเมอร์ทั่วไปแล้ว

จงจำไว้ว่าไม่มีใครเก่งมาตั้งแต่เกิด ทุกคนเคยผ่านการทำระบบล่มหรือทำเครื่องค้างมาทั้งนั้น สิ่งสำคัญไม่ใช่การทำให้ระบบสมบูรณ์แบบตั้งแต่วันแรก แต่คือการเรียนรู้ที่จะแก้ไขและป้องกันปัญหาให้ดีขึ้นในทุกครั้งที่ Deploy งานใหม่ขึ้นไป ขอให้สนุกกับการเดินทางในสายอาชีพนี้และอย่าหยุดที่จะทดลองทำสิ่งใหม่ ๆ ครับ

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

เปลี่ยนโปรเจกต์ Node.js เป็น TypeScript: วิธีตั้งค่าและใช้งานสำหรับมือใหม่
Node.js

เปลี่ยนโปรเจกต์ Node.js เป็น TypeScript: วิธีตั้งค่าและใช้งานสำหรับมือใหม่

อยากเปลี่ยนจาก Node.js มาใช้ TypeScript แต่ไม่รู้เริ่มยังไง? บทความนี้สอนตั้งค่า tsconfig.json, การรันด้วย tsx และการทำ Type Checking ให้ Express แบบเข้าใจง่าย

1 week ago 9 นาที
12 views
สอนเขียน Automated Testing ด้วย Jest และ Supertest สำหรับมือใหม่
Node.js

สอนเขียน Automated Testing ด้วย Jest และ Supertest สำหรับมือใหม่

เลิกทดสอบโค้ดด้วยมือแบบเดิม ๆ มาหัดเขียน Automated Testing ด้วย Jest และ Supertest เพื่อเช็กฟังก์ชันและ API ให้ทำงานถูกต้องแม่นยำ ลดบั๊กกวนใจ

1 week ago 9 นาที
15 views
เจาะลึก Real-time Communication ด้วย Socket.IO และความต่างระหว่าง WebSockets vs HTTP
Node.js

เจาะลึก Real-time Communication ด้วย Socket.IO และความต่างระหว่าง WebSockets vs HTTP

อยากทำระบบแชตหรือแจ้งเตือนแบบเรียลไทม์ไหม? มาเรียนรู้พื้นฐาน WebSockets และวิธีใช้ Socket.IO เพื่อส่งข้อมูลทันทีโดยไม่ต้องรีเฟรชหน้าเว็บกัน

1 week ago 10 นาที
12 views