← กลับ
VPSDeployNode.jsNginx

Deploy Node.js ขึ้น VPS ราคา 100 บาท/เดือน

เอา app ขึ้นจริง ไม่ใช้ Vercel เดือนละ 100 บาทคุ้มกว่าเยอะ ครบทุกขั้น Nginx + SSL ฟรี

2025-11-14อ่าน 5 นาทีใหม่

ทำไมไม่ใช้ Vercel ก็จบ

Vercel/Netlify/Render ใช้ดีจริง — push ก็ deploy เลย แต่:

  • ราคาขึ้นเร็วเมื่อ traffic เพิ่ม — bandwidth, function invocation, build minute คิดเป็นชิ้น
  • เก็บ data ไม่ได้ — ต้องซื้อ database service ต่างหาก
  • มี vendor lock-in — ใช้ feature เฉพาะของแพลตฟอร์มไปเรื่อยๆ ย้ายลำบาก

VPS เช่า 200 บาท/เดือน คุณได้ทั้ง app + database + queue + monitoring + ที่เก็บไฟล์ ครบในเครื่องเดียว เอาไป run side project 5-10 ตัวยังไม่หมด

เลือกเจ้าไหนดี

ราคาช่วงปลายปี 2025 ที่อ้างอิงได้ (ปรับเปลี่ยนได้ตลอด ตรวจสอบที่เว็บอีกที):

| เจ้า | สเปคต่ำสุด | ราคา/เดือน | จุดเด่น | |---|---|---|---| | Hetzner CX22 | 2vCPU, 4GB RAM, 40GB SSD | ~€4 (~155฿) | คุ้มสุด data center อยู่ EU/US | | DigitalOcean | 1vCPU, 1GB RAM, 25GB | $6 (~210฿) | docs ดี community ใหญ่ | | Vultr | 1vCPU, 1GB RAM, 25GB | $5-6 (~175-210฿) | มี data center สิงคโปร์ | | Linode (Akamai) | 1vCPU, 1GB RAM, 25GB | $5 (~175฿) | stable มาก |

ถ้า user ส่วนใหญ่อยู่ไทย → เลือก data center ใน Singapore หรือ Tokyo จะ latency ต่ำที่สุด (~30-60ms)

Hetzner คุ้มจัดด้านราคา แต่ data center อยู่ยุโรป ping จากไทย ~250ms — เหมาะกับ static API หรือ background worker ไม่เหมาะกับ realtime app ที่ user ต้องการ response เร็ว

ขั้นที่ 1: เตรียมเครื่องหลังเปิด VPS

ทันทีที่ provider ส่ง IP มา:

# login ด้วย root ครั้งแรก
ssh root@your-server-ip

# update package
apt update && apt upgrade -y

# สร้าง user ใหม่ (อย่าใช้ root ทำงาน)
adduser deploy
usermod -aG sudo deploy

# copy ssh key จาก root → deploy
mkdir -p /home/deploy/.ssh
cp ~/.ssh/authorized_keys /home/deploy/.ssh/
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys

# ทดสอบ login user ใหม่ (ก่อนปิด root)
exit
ssh deploy@your-server-ip

ขั้นที่ 2: ปิดช่องโหว่พื้นฐาน

# ปิด root login + password auth
sudo nano /etc/ssh/sshd_config

แก้ 2 บรรทัดนี้:

PermitRootLogin no
PasswordAuthentication no
sudo systemctl restart ssh

# ติดตั้ง firewall
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

# ติดตั้ง fail2ban กัน brute force
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban

ขั้นที่ 3: ติดตั้ง Node.js

ใช้ NVM เพื่อสลับ version ได้:

# ดู version ล่าสุดของ nvm ที่ github.com/nvm-sh/nvm/releases
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

# โหลด nvm เข้า shell ปัจจุบัน
source ~/.bashrc

# ติดตั้ง Node 20 LTS
nvm install 20
nvm use 20
nvm alias default 20

# เช็ค
node -v
npm -v

ขั้นที่ 4: เอาโค้ดขึ้น server

# clone จาก GitHub (ถ้า repo private ใช้ deploy key หรือ PAT)
sudo mkdir -p /var/www
sudo chown -R $USER:$USER /var/www
cd /var/www

git clone https://github.com/your-org/myapp.git
cd myapp
npm ci
npm run build

ขั้นที่ 5: รันด้วย PM2

PM2 = process manager ที่ทำให้ app รันต่อหลังปิด terminal และ restart อัตโนมัติเมื่อ crash

sudo npm install -g pm2

# start app
pm2 start npm --name myapp -- start

# ดู status + log
pm2 list
pm2 logs myapp

# ให้ start ตอน server reboot
pm2 startup
# (จะแสดงคำสั่ง sudo ... ให้ก็อปไป run)
pm2 save

ถ้าใช้ Next.js ลอง start แบบ standalone จะกินแรมน้อยกว่า:

# ใน next.config.ts ตั้ง output: 'standalone'
# หลัง build:
pm2 start .next/standalone/server.js --name myapp

ขั้นที่ 6: ตั้ง Nginx Reverse Proxy

sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/myapp

ใส่ config นี้:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    # max upload size
    client_max_body_size 10M;

    location / {
        proxy_pass http://127.0.0.1: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;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 60s;
    }
}
# enable site + ทดสอบ config
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

อย่าลืมตั้ง DNS A record ของโดเมน → IP ของ server ก่อน

ขั้นที่ 7: SSL ฟรีด้วย Certbot

sudo apt install -y certbot python3-certbot-nginx

# ออก cert + แก้ nginx config ให้ใช้ HTTPS อัตโนมัติ
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

# certbot จะตั้ง cron renew ให้เอง ตรวจสอบ
sudo systemctl list-timers | grep certbot

ตอนนี้ https://yourdomain.com ใช้งานได้แล้ว มี SSL จริง ไม่มี warning

ขั้นที่ 8: Logs และการ monitor เบื้องต้น

# log ของ app
pm2 logs myapp

# log ของ nginx
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

# ดูการใช้ resource
htop
df -h        # disk
free -h      # ram

ตั้ง log rotation ของ pm2 ไม่ให้ log ใหญ่จนเต็ม disk:

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7

เช็คลิสต์ก่อนเปิด production

  • [ ] root login ปิด, password auth ปิด
  • [ ] firewall เปิด เปิดแค่ 22/80/443
  • [ ] fail2ban ทำงาน
  • [ ] SSL ทำงาน auto-renew ตั้งแล้ว
  • [ ] backup database ตั้งแล้ว (อ่านวิธี)
  • [ ] monitor uptime ตั้งแล้ว (อ่านวิธี)
  • [ ] env variable ไม่ commit เข้า git (อ่านวิธี)

สรุป

ใช้เวลา 1-2 ชั่วโมงครั้งแรก แต่หลังจากนั้น deploy โปรเจคใหม่บน server เดิมใช้แค่ 5 นาที ราคาเท่าค่ากาแฟ 1 แก้วต่อเดือน

Server เดียวรันหลาย project ได้สบาย — VPS 4GB RAM รัน 5-6 project ที่ traffic ไม่หนักได้พร้อมกัน คุ้มกว่าจ่าย hosting ทีละตัว

← ดูบทความอื่น