คู่มือ Deploy Node.js บน DigitalOcean Droplet 2026
A practical, step-by-step guide to deploying a production Node.js application on a DigitalOcean Droplet using nvm, PM2, Nginx, and Let's Encrypt.
การ deploy Node.js application ขึ้น production ไม่ได้จบแค่คำสั่ง npm start แต่ต้องมีระบบดูแลให้แอปรันต่อเนื่องแม้ server รีสตาร์ท มี reverse proxy จัดการ traffic และมี HTTPS ป้องกันข้อมูลระหว่างทาง คู่มือนี้พาไล่ทีละขั้นตอนบน DigitalOcean Droplet ตั้งแต่เตรียมเครื่อง ติดตั้ง Node.js ผ่าน nvm รันแอปด้วย PM2 ตั้งค่า Nginx เป็น reverse proxy จนถึงเปิด SSL ฟรีด้วย Let's Encrypt — ครบทุกคำสั่งที่ใช้งานได้จริง
สารบัญ
เตรียม Droplet + ติดตั้ง Node.js (nvm)
ก่อนติดตั้งอะไรทั้งหมด ต้องเลือกขนาด Droplet ให้เหมาะกับงานก่อน สำหรับ Node.js API หรือเว็บแอปขนาดเล็ก-กลาง DigitalOcean Basic Droplet แบบ 1 GiB RAM / 1 vCPU / 25 GB SSD ราคา $6/เดือน เพียงพอสำหรับทดสอบและงานที่ traffic ไม่สูงมาก ส่วนงาน production จริงที่ต้องรัน build process หรือมี concurrent connection เยอะขึ้น แนะนำขยับเป็น 2 GiB RAM / 2 vCPU / 60 GB SSD ราคา $18/เดือน เพราะมี vCPU สองตัวให้ PM2 รันแบบ cluster mode ได้ ถ้าผู้ใช้งานหลักอยู่ในไทย เลือก region sgp1 (Singapore) จะได้ latency ต่ำที่สุด รองลงมาคือ blr1 (Bangalore) เมื่อสร้าง Droplet เสร็จ (เลือก Ubuntu LTS image) ให้ SSH เข้าเครื่องแล้วอัปเดตระบบก่อนเสมอด้วย apt update && apt upgrade -y จากนั้นสร้าง user ใหม่แทนการใช้ root ตรง ๆ ด้วย adduser deploy && usermod -aG sudo deploy แล้วเปิด Cloud Firewall ของ DigitalOcean ซึ่งใช้งานฟรีไม่มีค่าใช้จ่ายเพิ่ม เพื่อจำกัด port ที่เปิดให้เหลือเฉพาะ SSH (22), HTTP (80) และ HTTPS (443) ขั้นตอนถัดมาคือติดตั้ง Node.js ผ่าน nvm (Node Version Manager) แทนการติดตั้งจาก apt repository ตรง ๆ เพราะ nvm ทำให้สลับเวอร์ชัน Node.js ได้ง่ายและได้เวอร์ชันใหม่กว่าเสมอ รันคำสั่ง curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash แล้ว source shell profile ใหม่ด้วย source ~/.bashrc จากนั้นติดตั้ง Node.js เวอร์ชัน LTS ล่าสุดด้วย nvm install --lts และตั้งให้เป็นเวอร์ชัน default ด้วย nvm use --lts ตรวจสอบว่าติดตั้งสำเร็จด้วย node -v และ npm -v หากเครื่องที่เลือกมี RAM แค่ 512 MiB หรือ 1 GiB การรัน npm install ของ dependency ที่เยอะอาจทำให้ process ถูกฆ่าเพราะหน่วยความจำไม่พอ แนะนำเพิ่ม swap file สัก 1-2 GB ไว้ล่วงหน้าเพื่อความปลอดภัย
Before installing anything, you need to choose a Droplet size that matches your workload. For a small to medium Node.js API or web app, DigitalOcean's Basic Droplet with 1 GiB RAM / 1 vCPU / 25 GB SSD at $6/month is sufficient for testing and low-traffic applications. For production workloads that require build processes or handle many concurrent connections, step up to 2 GiB RAM / 2 vCPU / 60 GB SSD at $18/month so PM2 can run in cluster mode across both cores. If your primary users are in Thailand, select the sgp1 (Singapore) region for the lowest latency, with blr1 (Bangalore) as the next best option. Once you've created your Droplet (choose Ubuntu LTS image), SSH in and update the system first with apt update && apt upgrade -y. Create a non-root user instead of running everything as root with adduser deploy && usermod -aG sudo deploy, then enable DigitalOcean's Cloud Firewall, which is free and lets you restrict access to just SSH (22), HTTP (80), and HTTPS (443). Next, install Node.js via nvm (Node Version Manager) rather than using apt directly, since nvm lets you switch versions easily and always have the latest. Run curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash, then source the updated shell profile with source ~/.bashrc. Install the latest LTS version with nvm install --lts and set it as default with nvm use --lts. Verify the installation with node -v and npm -v. If your machine has only 512 MiB or 1 GiB of RAM, running npm install on large dependency sets may kill the process due to memory exhaustion. To be safe, add a 1-2 GB swap file beforehand.
- Basic Droplet 1 GiB RAM ($6/เดือน) พอสำหรับทดสอบ, 2 GiB/2 vCPU ($18/เดือน) แนะนำสำหรับ production ที่ต้องการ cluster mode
- เลือก region sgp1 (Singapore) สำหรับผู้ใช้ในไทย latency ต่ำสุด รองลงมาคือ blr1 (Bangalore)
- สร้าง non-root user ด้วย adduser + usermod -aG sudo แล้วเปิด Cloud Firewall ฟรีจำกัด port 22/80/443
รัน Node.js app ด้วย PM2
จากที่เราทดสอบจริง — pM2 เป็น process manager สำหรับ Node.js ที่ทำหน้าที่ดูแลให้แอปรันอยู่เบื้องหลังตลอดเวลา รีสตาร์ทอัตโนมัติเมื่อ crash และรองรับการรันหลาย instance พร้อมกันบนเครื่องเดียว ติดตั้งแบบ global ด้วย npm install -g pm2 จากนั้น clone โค้ดโปรเจกต์ลงเครื่อง เช่น git clone https://github.com/user/myapp.git && cd myapp แล้วติดตั้ง dependency ด้วย npm install --production ถ้าโปรเจกต์ต้อง build (เช่น TypeScript หรือ frontend bundle) ให้รัน npm run build ก่อน เมื่อพร้อมแล้วสั่งรันแอปด้วย pm2 start app.js --name myapp PM2 จะรันแอปเป็น background process ทันทีและตั้งชื่อ process ว่า myapp เพื่อให้จัดการง่ายในภายหลัง ตรวจสอบสถานะ process ทั้งหมดด้วย pm2 list ดู log แบบ real-time ด้วย pm2 logs myapp หรือเปิด dashboard ตรวจ CPU/memory ด้วย pm2 monit สำหรับ Droplet ที่มี 2 vCPU ขึ้นไป สามารถใช้ cluster mode เพื่อดึงประสิทธิภาพทุก core มาใช้ได้ด้วยคำสั่ง pm2 start app.js -i max --name myapp ซึ่ง PM2 จะสร้าง worker process เท่าจำนวน CPU core อัตโนมัติและกระจาย request แบบ round-robin สำหรับโปรเจกต์ที่ซับซ้อนขึ้น เช่นต้องตั้งค่า environment variable หรือ argument พิเศษ ควรใช้ ecosystem file แทนการพิมพ์คำสั่งยาว ๆ ทุกครั้ง สร้างไฟล์ ecosystem.config.js กำหนด name, script, instances, env และค่าอื่น ๆ แล้วรันด้วย pm2 start ecosystem.config.js วิธีนี้ทำให้ deploy ซ้ำหรือย้ายไป Droplet ใหม่ทำได้ตรงกันทุกครั้งเพราะ config อยู่ในไฟล์เดียวที่ commit เก็บไว้ใน repository ได้
- ติดตั้ง PM2 ด้วย npm install -g pm2 แล้วรันแอปด้วย pm2 start app.js --name myapp
- ตรวจสถานะด้วย pm2 list, ดู log แบบ real-time ด้วย pm2 logs, เปิด dashboard ด้วย pm2 monit
- Droplet 2 vCPU ขึ้นไปใช้ cluster mode ได้ด้วย pm2 start app.js -i max เพื่อใช้ทุก core
- โปรเจกต์ที่ต้องตั้งค่า env/argument ซับซ้อน ควรใช้ ecosystem.config.js แทนการพิมพ์คำสั่งตรง ๆ
- โปรเจกต์ TypeScript/frontend build ต้อง npm run build ก่อน pm2 start เสมอ
ตั้งค่า Nginx เป็น Reverse Proxy
Node.js app ที่รันด้วย PM2 มักผูก port ภายใน เช่น 3000 ซึ่งไม่ควรเปิดให้ผู้ใช้เข้าตรง ๆ การตั้ง Nginx เป็น reverse proxy ช่วยให้เว็บใช้ port มาตรฐาน 80/443 ได้ตามปกติ รองรับหลายแอปบน Droplet เดียวผ่าน domain ที่ต่างกัน และยังใช้เป็นจุดต่อ SSL certificate ได้ง่ายในขั้นตอนถัดไป ติดตั้ง Nginx ด้วย apt install nginx -y จากนั้นสร้างไฟล์ config ใหม่ที่ /etc/nginx/sites-available/myapp โดยเนื้อหา server block ตัวอย่างเป็นดังนี้ server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ส่วน header Upgrade และ Connection สำคัญมากถ้าแอปใช้ WebSocket เช่น Socket.io เพราะถ้าไม่ใส่ การเชื่อมต่อแบบ real-time จะหลุดหรือ fallback ไปใช้ polling แทน เมื่อสร้างไฟล์เสร็จให้เปิดใช้งานด้วยการ symlink ไปที่ sites-enabled ด้วย ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/ ก่อน reload ทุกครั้งควรตรวจ syntax ก่อนด้วย nginx -t ถ้าไม่มี error ให้ reload service ด้วย systemctl reload nginx สุดท้ายอย่าลืมเปิด firewall ให้ Nginx รับ traffic HTTP/HTTPS ได้ด้วย ufw allow 'Nginx Full' ถ้ามีหลายแอปบน Droplet เดียวกัน ทำซ้ำขั้นตอนเดิมโดยสร้างไฟล์ config ใหม่แยกตาม domain และตั้ง proxy_pass ไปที่ port ที่ต่างกันของแต่ละแอปที่ PM2 รันอยู่
- ติดตั้ง Nginx ด้วย apt install nginx แล้วสร้าง server block ใน /etc/nginx/sites-available/
- proxy_pass ชี้ไปที่ port ภายในที่แอป Node.js รันอยู่ เช่น http://localhost:3000
- ต้องใส่ header Upgrade/Connection ถ้าแอปใช้ WebSocket ไม่งั้น real-time connection จะหลุด
- ตรวจ syntax ด้วย nginx -t ก่อน reload ทุกครั้งเพื่อกัน config ผิดพลาดทำเว็บล่ม
- เปิด firewall ด้วย ufw allow 'Nginx Full' เพื่อให้รับ traffic port 80/443 ได้
เปิด SSL ด้วย Let's Encrypt
หลังจาก Nginx proxy ใช้งานได้ปกติผ่าน HTTP แล้ว ขั้นตอนถัดไปคือเปิด HTTPS ด้วย Let's Encrypt ซึ่งออก certificate ให้ฟรีและต่ออายุอัตโนมัติได้ เครื่องมือที่ใช้คือ Certbot ปลั๊กอินสำหรับ Nginx โดยเฉพาะ ติดตั้งด้วย apt install certbot python3-certbot-nginx -y ก่อนรันต้องแน่ใจว่า domain ที่จะขอ certificate ได้ชี้ DNS A record มาที่ IP ของ Droplet เรียบร้อยแล้ว ไม่งั้น Certbot จะ verify ไม่ผ่าน เมื่อ DNS พร้อมให้รันคำสั่ง certbot --nginx -d yourdomain.com -d www.yourdomain.com Certbot จะถามอีเมลสำหรับแจ้งเตือนก่อน certificate หมดอายุ แล้วแก้ไขไฟล์ Nginx config ให้อัตโนมัติ เพิ่ม block listen 443 พร้อม certificate path และ redirect จาก HTTP ไป HTTPS ให้เสร็จสรรพ certificate ของ Let's Encrypt มีอายุ 90 วัน แต่ Certbot จะติดตั้ง systemd timer หรือ cron job ให้ตรวจสอบวันละสองครั้งและต่ออายุอัตโนมัติเมื่อใกล้หมดอายุ (โดยทั่วไปจะต่อให้เมื่อเหลืออายุน้อยกว่า 30 วัน) ทดสอบว่า auto-renew ทำงานถูกต้องหรือไม่โดยไม่ต้องรอจริงด้วย certbot renew --dry-run ถ้าคำสั่งรันผ่านโดยไม่มี error แปลว่าระบบต่ออายุอัตโนมัติพร้อมใช้งาน ข้อควรระวังคือ port 80 ต้องเปิดอยู่เสมอ แม้หลังเปิด HTTPS แล้ว เพราะขั้นตอน verify domain ของ Let's Encrypt (HTTP-01 challenge) ต้องใช้ port นี้ ถ้า firewall บล็อก port 80 ไว้ การต่ออายุ certificate อัตโนมัติจะล้มเหลวโดยไม่มีการแจ้งเตือนทันที จนกว่า certificate จะหมดอายุจริง
- ติดตั้ง Certbot ด้วย apt install certbot python3-certbot-nginx ก่อนขอ certificate
- DNS A record ของ domain ต้องชี้มาที่ IP Droplet ให้เรียบร้อยก่อนรัน certbot --nginx
- certbot --nginx -d yourdomain.com -d www.yourdomain.com ออก certificate และแก้ Nginx config ให้อัตโนมัติ
- certificate อายุ 90 วัน ต่ออายุอัตโนมัติผ่าน systemd timer ทดสอบด้วย certbot renew --dry-run
Auto-restart และ Log Management
จุดที่ผู้ใช้มักถามมาคือ ขั้นตอนที่หลายคนพลาดหลัง deploy เสร็จคือลืมตั้งให้ PM2 เริ่มแอปใหม่อัตโนมัติเมื่อ Droplet รีสตาร์ท ซึ่งเกิดขึ้นได้ตลอดเวลา ทั้งจาก reboot ปกติของ maintenance หรือไฟดับที่ data center ทำให้ต้องรันคำสั่งสองคำสั่งคู่กันเสมอ หลัง pm2 start ครั้งแรก คือ pm2 startup ซึ่งจะ generate คำสั่ง systemd service ให้ (ต้อง copy คำสั่งที่ได้มารันอีกทีด้วย sudo) แล้วตามด้วย pm2 save เพื่อบันทึก process list ปัจจุบันไว้ เมื่อ Droplet รีสตาร์ท systemd จะเรียก PM2 ขึ้นมาและ PM2 จะโหลด process list ที่ save ไว้กลับมารันใหม่ทั้งหมด โดยอัตโนมัติ ไม่ต้อง SSH เข้าไปสั่ง pm2 start เองทุกครั้ง ด้าน log management PM2 จะเก็บ stdout/stderr ของทุก process ไว้ที่ ~/.pm2/logs/ โดย default แต่ถ้าปล่อยไว้นานไฟล์ log จะโตขึ้นเรื่อย ๆ จนกินพื้นที่ SSD จนเต็มได้ โดยเฉพาะ Droplet ขนาดเล็กที่มี storage จำกัดอยู่แล้ว วิธีแก้คือติดตั้ง module pm2-logrotate ด้วย pm2 install pm2-logrotate ซึ่งจะหมุนไฟล์ log อัตโนมัติตามขนาดหรือช่วงเวลา ที่ตั้งไว้ พร้อมบีบอัดไฟล์เก่าเป็น .gz ให้ด้วย ปรับค่าตั้งต้นได้ เช่นจำกัดขนาดไฟล์สูงสุดต่อไฟล์และจำนวนไฟล์ที่เก็บย้อนหลัง สำหรับการ monitor ว่าแอป crash บ่อยแค่ไหน PM2 จะ restart process ให้อัตโนมัติทุกครั้งที่ crash โดย default อยู่แล้ว แต่ถ้า restart ถี่ผิดปกติ (เช่นเกิน 15 ครั้งใน 1 นาที) PM2 จะหยุดพยายามและเปลี่ยนสถานะเป็น errored เพื่อป้องกัน infinite restart loop ซึ่งเป็นสัญญาณว่าต้องเข้าไปดู log หาสาเหตุจริงจัง ไม่ใช่ปล่อยให้ restart ไปเรื่อย ๆ
- รัน pm2 startup แล้วตามด้วย pm2 save ทุกครั้งหลัง deploy เพื่อให้แอปรันกลับอัตโนมัติเมื่อ Droplet reboot
- PM2 เก็บ log ไว้ที่ ~/.pm2/logs/ โดย default ถ้าไม่จัดการอาจกิน SSD จนเต็มบน Droplet ขนาดเล็ก
- ติดตั้ง pm2 install pm2-logrotate เพื่อหมุนและบีบอัด log อัตโนมัติ
- PM2 restart process อัตโนมัติเมื่อ crash แต่ถ้า restart ถี่เกิน 15 ครั้ง/นาที จะหยุดและเข้าสถานะ errored
เมื่อไหร่ควรใช้ฟีเจอร์นี้ (Use Case จริง)
การ deploy Node.js บน Droplet เองแบบในคู่มือนี้เหมาะกับสถานการณ์ที่ต้องการควบคุม server เต็มรูปแบบ เช่น ต้องปรับแต่ง Nginx config ละเอียด รันหลายแอปหรือหลาย service ร่วมกันบนเครื่องเดียว มี background worker หรือ cron job ที่ต้องรันควบคู่กับ web server หรือมี WebSocket connection จำนวนมากที่ต้องการ persistent connection แบบเจาะจง ซึ่งบางครั้งจัดการเองบน Droplet ได้ยืดหยุ่นกว่า platform สำเร็จรูป อีกเหตุผลหนึ่งคือเรื่องต้นทุน ระยะยาว Basic Droplet เริ่มต้น $6/เดือน สามารถรันได้หลายแอปพร้อมกันถ้าจัดสรร resource ดี ต่างจาก App Platform ที่คิดราคาต่อ container instance แยกกัน เช่น container ขนาด shared 1vCPU/1GiB เริ่มที่ $10/เดือนต่อแอปเดียว ในทางกลับกัน ถ้าทีมไม่มีเวลาดูแล server เอง ไม่อยากจัดการเรื่อง OS update, security patch, SSL renewal หรือ scaling ด้วยตัวเอง DigitalOcean App Platform ซึ่งเป็น managed PaaS จะเหมาะกว่า เพราะ deploy จาก Git ได้ตรง ๆ ระบบจัดการ SSL, scaling, และ zero-downtime deploy ให้อัตโนมัติทั้งหมด แลกกับความยืดหยุ่นที่น้อยกว่า และควบคุมระดับ OS ไม่ได้ กล่าวโดยสรุป Droplet + PM2 + Nginx เหมาะกับทีมที่มีความรู้ด้าน DevOps อยู่แล้ว ต้องการ custom infrastructure หรือรันหลาย service ร่วมกันเพื่อประหยัดต้นทุนต่อแอป เช่น SaaS backend ขนาดกลาง, API สำหรับ mobile app, webhook receiver, หรือระบบ real-time อย่าง chat/notification service ส่วนทีมที่ต้องการ ความเร็วในการ deploy โดยไม่อยากยุ่งกับการดูแล server เลย ควรพิจารณา App Platform แทนตั้งแต่แรก
- เหมาะกับทีมที่ต้องการ custom Nginx config, รันหลายแอป/service ร่วมกันบน Droplet เดียว หรือมี cron/background worker
- เหมาะกับงานที่ต้องการ WebSocket persistent connection จำนวนมาก เช่น chat หรือ notification service
- ต้นทุนระยะยาวมักถูกกว่าถ้ารันหลายแอปบน Droplet เดียว เทียบกับ App Platform ที่คิดราคาต่อ container
- ถ้าไม่มีเวลาดูแล server เอง ไม่อยากจัดการ patch/scaling เอง ควรพิจารณา App Platform แทน
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
ข้อผิดพลาดที่พบบ่อยที่สุดหลัง deploy คือลืมรัน pm2 startup && pm2 save ทำให้แอปหายไปทันทีที่ Droplet reboot โดยไม่มีการแจ้งเตือนใด ๆ ผู้ใช้มักรู้ตัวก็ต่อเมื่อเว็บล่มไปแล้วหลายชั่วโมง วิธีป้องกันคือตรวจสอบด้วย pm2 list หลังทุกครั้งที่มีการ maintenance หรือ reboot Droplet เพื่อยืนยันว่า process ยังรันอยู่ ปัญหาที่สองคือ Nginx proxy ไม่ส่ง header Upgrade/Connection ทำให้แอปที่ใช้ WebSocket เช่น Socket.io เชื่อมต่อไม่ติดหรือหลุดบ่อย ทั้งที่ทดสอบตอน local ทำงานปกติดี อาการนี้สังเกตได้จาก browser console ที่ขึ้น error การเชื่อมต่อ WebSocket ล้มเหลว วิธีแก้คือตรวจสอบ server block ใน Nginx config ให้มี proxy_set_header Upgrade $http_upgrade; และ proxy_set_header Connection 'upgrade'; ครบถ้วน ปัญหาที่สามคือ port conflict หรือ error EADDRINUSE เวลารันแอปใหม่ทับ port เดิมที่ยังมี process ค้างอยู่ ตรวจสอบ process ที่ใช้ port นั้นด้วย lsof -i :3000 แล้ว kill หรือใช้ pm2 delete myapp ก่อน start ใหม่ ปัญหาที่สี่คือลืมเปิด firewall ให้ Nginx หลังติดตั้งใหม่ ทำให้เข้าเว็บจากภายนอกไม่ได้ทั้งที่ service รันอยู่ปกติ ต้องตรวจสอบด้วย ufw status ว่ามี rule อนุญาต Nginx Full หรือ port 80/443 อยู่หรือไม่ ปัญหาสุดท้ายที่พบบ่อยคือ certificate ต่ออายุอัตโนมัติล้มเหลว เพราะ firewall หรือ Nginx config บล็อก port 80 ไว้หลังจากเปิด HTTPS ทำให้ Let's Encrypt HTTP-01 challenge ทำไม่สำเร็จ ต้องเปิด port 80 ทิ้งไว้เสมอแม้ site จะ redirect ไป HTTPS แล้วก็ตาม และควรตั้งเตือนตรวจสอบ certbot certificates เป็นระยะเพื่อดูวันหมดอายุล่วงหน้า
- ลืม pm2 startup && pm2 save ทำให้แอปไม่กลับมารันหลัง Droplet reboot — ตรวจด้วย pm2 list เป็นระยะ
- Nginx ไม่ส่ง header Upgrade/Connection ทำให้ WebSocket หลุด — ต้องเพิ่มใน proxy config ให้ครบ
- Error EADDRINUSE จาก port conflict — เช็คด้วย lsof -i :PORT แล้ว pm2 delete ก่อน start ใหม่
แนวทางปฏิบัติที่ดีที่สุด (Best Practices)
ด้านความปลอดภัย ควรปิดการ login ด้วย password ผ่าน SSH แล้วใช้ SSH key แทนทั้งหมด พร้อมสร้าง non-root user สำหรับงานประจำวันและใช้ sudo เมื่อจำเป็นเท่านั้น เปิด DigitalOcean Cloud Firewall ซึ่งใช้งานฟรีไม่มีค่าใช้จ่ายเพิ่ม ควบคู่กับ ufw บนเครื่องเพื่อจำกัด port ที่เปิดให้เหลือเฉพาะที่จำเป็นจริง ๆ ด้าน configuration ไม่ควร hardcode ค่า sensitive เช่น database password หรือ API key ไว้ในโค้ดตรง ๆ ให้ใช้ environment variable ผ่านไฟล์ .env ร่วมกับ library อย่าง dotenv และเพิ่ม .env ใน .gitignore เสมอเพื่อไม่ให้หลุดขึ้น repository ด้าน monitoring DigitalOcean มี Monitoring และ 1 Uptime Check ให้ใช้ฟรีต่อบัญชี ควรเปิดใช้เพื่อดู CPU, memory, disk usage ของ Droplet แบบ real-time และรับแจ้งเตือนถ้าเว็บ down ก่อนที่ user จะแจ้งมาเอง ด้าน backup ก่อนทำการเปลี่ยนแปลงใหญ่ เช่นอัปเกรด Node.js เวอร์ชันหลักหรือแก้ database schema ควรสร้าง Droplet snapshot ไว้ก่อนเสมอ ซึ่งคิดค่าใช้จ่ายเพียง $0.06 ต่อ GiB ต่อเดือน ถูกกว่าความเสียหายที่อาจเกิดจากการ rollback ไม่ได้มาก ด้าน performance ถ้า Droplet มี 2 vCPU ขึ้นไป ควรใช้ PM2 cluster mode เสมอเพื่อดึงประสิทธิภาพทุก core มาใช้แทนที่จะปล่อยให้ Node.js รันแบบ single thread เปล่า ๆ สุดท้ายด้าน network ถ้าจำเป็นต้องมี IP คงที่สำหรับ whitelist กับระบบภายนอก Reserved IP ที่ผูกกับ Droplet ที่ใช้งานอยู่ไม่มีค่าใช้จ่ายเพิ่ม แต่ถ้าปล่อยไว้แบบไม่ผูกกับ Droplet ใดเลย จะเริ่มคิดค่าใช้จ่าย $5 ต่อเดือน จึงควรผูก Reserved IP กับ Droplet ที่ใช้งานจริงอยู่เสมอ ไม่ปล่อยว่างไว้เฉย ๆ
- ปิด SSH password login ใช้ SSH key เท่านั้น + สร้าง non-root user สำหรับงานประจำวัน
- เก็บค่า sensitive ใน .env ผ่าน dotenv และเพิ่ม .env ใน .gitignore เสมอ ห้าม hardcode ในโค้ด
- เปิด DigitalOcean Cloud Firewall (ฟรี) คู่กับ ufw และเปิดใช้ Monitoring + Uptime Check ฟรีต่อบัญชี
- สร้าง Droplet snapshot ($0.06/GiB/เดือน) ก่อนทำการเปลี่ยนแปลงใหญ่เสมอ เผื่อต้อง rollback
- ใช้ PM2 cluster mode บน Droplet 2 vCPU ขึ้นไป และผูก Reserved IP กับ Droplet ที่ใช้งานจริงเพื่อไม่ต้องเสีย $5/เดือน