ทำไมไม่ใช้ 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 ทีละตัว