หนึ่งในความผิดพลาดที่พบบ่อยที่สุดของผู้ดูแล VPS มือใหม่คือ รู้ว่าเซิร์ฟเวอร์มีปัญหา "หลังจากที่มันพังไปแล้ว" ไม่ว่าจะเป็น CPU พุ่ง 100% จนเว็บตอบสนองช้า, RAM เต็มจน process ถูก kill, หรือ Disk เต็มจน Database เขียนข้อมูลไม่ได้ ปัญหาเหล่านี้ทั้งหมดแก้ได้ด้วยการตั้ง Monitoring Alerts ที่ดี ให้ระบบแจ้งเตือนก่อนที่จะเกิดเหตุการณ์วิกฤต
บทความนี้จะพาตั้งค่า Alert System บน Linux VPS ตั้งแต่เลือกเครื่องมือ กำหนด threshold แจ้งเตือนทาง Email, Telegram และ Line รวมถึงตัวอย่าง config พร้อมใช้สำหรับ CPU, Memory, Disk และ Service ที่ล่ม เหมาะสำหรับ VPS ที่รัน WordPress, Node.js, Docker หรือแอปพลิเคชันธุรกิจใดๆ
ทำไม Monitoring Alerts ถึงสำคัญกว่าแค่ Dashboard
หลายคนมี Grafana Dashboard สวยงาม มีกราฟ CPU Memory แบบ real-time แต่ถ้าต้องคอยนั่งดูหน้าจออยู่ตลอด มันก็ไม่มีประโยชน์เมื่อเกิดปัญหาตอนกลางดึก Alert System ที่ดีทำงานแทนสายตาของคุณโดยอัตโนมัติ และแจ้งให้รู้ทันทีเมื่อตัวเลขเกินขีดที่กำหนด
ความแตกต่างระหว่าง Monitoring กับ Alerting มีดังนี้:
- Monitoring — เก็บข้อมูล metric ต่างๆ เช่น CPU%, RAM ที่ใช้, I/O throughput แบบ real-time และประวัติย้อนหลัง
- Alerting — ตรวจสอบ metric เทียบกับ threshold ที่กำหนด แล้วส่ง notification ออกไปทาง channel ที่ต้องการ
- ทำงานร่วมกัน — ระบบที่ดีต้องมีทั้งสอง Monitoring บอกว่า "เกิดอะไรขึ้น" ส่วน Alerting บอกว่า "ต้องทำอะไรตอนนี้"
ตัวอย่างในทางปฏิบัติ: Disk เต็ม 90% เมื่อตอน 2 ทุ่ม ถ้ามีแค่ Dashboard คุณอาจไม่รู้จนถึงเช้า แต่ถ้ามี Alert ระบบจะส่ง Telegram มาหาคุณทันที คุณ SSH เข้าไปลบ log file เก่า Disk กลับมา 60% ก่อนที่ Database จะหยุดเขียนข้อมูล ความเสียหายเป็นศูนย์
เครื่องมือ Monitoring Alert บน Linux VPS ที่แนะนำ
มีตัวเลือกหลายแบบสำหรับการตั้ง Alert บน VPS ขึ้นอยู่กับความต้องการและความซับซ้อนที่ยอมรับได้:
| เครื่องมือ | ความยาก | เหมาะกับ | Notification |
|---|---|---|---|
| Netdata | ง่าย | VPS เดี่ยว เริ่มต้น | Email, Telegram, Slack, PagerDuty |
| Prometheus + Alertmanager | กลาง–สูง | หลาย server, custom metrics | Email, Telegram, Webhook, PagerDuty |
| Zabbix | สูง | องค์กร, infrastructure ขนาดใหญ่ | Email, SMS, Webhook |
| Shell Script + Cron | ง่าย (DIY) | Alert เฉพาะจุด ไม่ต้องการ dashboard | Email, Telegram, Line Notify |
สำหรับ VPS ทั่วไปที่ใช้ Ubuntu/Debian แนะนำเริ่มจาก Netdata เพราะติดตั้งได้ใน 1 คำสั่ง มี dashboard ในตัว และ alert configuration ค่อนข้างยืดหยุ่น ส่วน Prometheus ใช้เมื่อต้องการ control เต็มรูปแบบหรือมีหลาย server ที่ต้อง monitor
ติดตั้งและตั้งค่า Alert ด้วย Netdata
Netdata เป็นเครื่องมือ monitoring ที่ติดตั้งง่ายที่สุดสำหรับ Linux VPS โดยมี built-in alert system และ dashboard แบบ real-time โดยไม่ต้องตั้งค่าฐานข้อมูลหรือ component เพิ่มเติม
ติดตั้ง Netdata
wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh sudo bash /tmp/netdata-kickstart.sh --stable-channel --disable-telemetry
หลังติดตั้ง Netdata จะ run อยู่ที่ http://your-vps-ip:19999 (ควรตั้ง firewall ไม่ให้ public เข้าถึงโดยตรง)
ตั้งค่า Notification ผ่าน Telegram
แก้ไขไฟล์ /etc/netdata/health_alarm_notify.conf:
# เปิด Telegram notification SEND_TELEGRAM="YES" TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN_HERE" TELEGRAM_CHAT_ID="YOUR_CHAT_ID_HERE" # ระดับ alert ที่จะส่ง (warning, critical หรือทั้งคู่) DEFAULT_RECIPIENT_TELEGRAM="YOUR_CHAT_ID_HERE"
ปรับแต่ง Alert Rule สำหรับ CPU
ไฟล์ alert config อยู่ที่ /etc/netdata/health.d/ สร้างไฟล์ใหม่สำหรับ CPU:
# /etc/netdata/health.d/cpu-custom.conf alarm: cpu_usage_warning on: system.cpu lookup: average -15m unaligned of user,system,softirq,irq,guest units: % every: 1m warn: $this > 80 crit: $this > 90 delay: down 15m multiplier 1.5 max 1h info: CPU usage สูงกว่า threshold ที่กำหนด to: sysadmin
Reload config ด้วย:
sudo kill -USR2 $(pidof netdata)
ตั้งค่า Prometheus + Alertmanager สำหรับ Alert ขั้นสูง
สำหรับผู้ที่ต้องการ control เต็มรูปแบบหรือมีหลาย VPS Prometheus + Alertmanager เป็นตัวเลือกที่ดีกว่า แม้จะซับซ้อนกว่า แต่ยืดหยุ่นมากกว่ามาก
ติดตั้ง Node Exporter (เก็บ metric)
# ดาวน์โหลด Node Exporter wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar xf node_exporter-1.7.0.linux-amd64.tar.gz sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/ # สร้าง systemd service sudo tee /etc/systemd/system/node_exporter.service <<'EOF' [Unit] Description=Node Exporter After=network.target [Service] User=node_exporter ExecStart=/usr/local/bin/node_exporter Restart=on-failure [Install] WantedBy=multi-user.target EOF sudo useradd -rs /bin/false node_exporter sudo systemctl enable --now node_exporter
ตัวอย่าง Alert Rule สำหรับ Memory และ Disk
# /etc/prometheus/rules/server_alerts.yml
groups:
- name: server_alerts
rules:
# Memory ใกล้เต็ม
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Memory usage สูงบน {{ $labels.instance }}"
description: "Memory ถูกใช้ไป {{ printf \"%.1f\" $value }}%"
# Disk ใกล้เต็ม
- alert: DiskSpaceLow
expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Disk ใกล้เต็มบน {{ $labels.instance }}"
description: "Disk {{ $labels.mountpoint }} ใช้ไป {{ printf \"%.1f\" $value }}%"
# Service ล่ม (instance ไม่ตอบสนอง)
- alert: InstanceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} ไม่ตอบสนอง"
description: "{{ $labels.instance }} ล่มมาแล้ว 1 นาที"
ตั้งค่า Alertmanager ให้ส่งผ่าน Telegram
หลังติดตั้ง Alertmanager แล้ว ตั้งค่า config ให้ส่งแจ้งเตือนผ่าน Telegram:
# /etc/alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: 'telegram-notifications'
receivers:
- name: 'telegram-notifications'
telegram_configs:
- bot_token: 'YOUR_BOT_TOKEN'
chat_id: YOUR_CHAT_ID
parse_mode: 'HTML'
message: |
<b>{{ .Status | toUpper }}</b> - {{ .GroupLabels.alertname }}
{{ range .Alerts }}
<b>Instance:</b> {{ .Labels.instance }}
<b>Details:</b> {{ .Annotations.description }}
{{ end }}
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
ส่วน inhibit_rules ป้องกัน Warning spam เมื่อ Critical alert ถูกส่งไปแล้ว ช่วยลด alert fatigue ได้มาก
วิธีตั้ง Alert ด้วย Shell Script + Cron (วิธีง่ายที่สุด)
สำหรับผู้ที่ไม่ต้องการ install tool เพิ่ม สามารถเขียน Shell Script เพื่อส่ง alert ผ่าน Telegram ด้วย cron ได้เลย วิธีนี้ไม่ต้องพึ่ง third-party software และเข้าใจง่ายที่สุด
#!/bin/bash
# /opt/monitor/check_resources.sh
TELEGRAM_TOKEN="YOUR_BOT_TOKEN"
CHAT_ID="YOUR_CHAT_ID"
HOSTNAME=$(hostname)
send_alert() {
local msg="$1"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
-d parse_mode="HTML" \
-d text="${msg}" >/dev/null
}
# ตรวจ CPU (เฉลี่ย 5 นาที)
CPU_LOAD=$(awk '{print $1}' /proc/loadavg)
CPU_CORES=$(nproc)
CPU_PERCENT=$(echo "scale=0; $CPU_LOAD * 100 / $CPU_CORES" | bc)
if [ "$CPU_PERCENT" -gt 90 ]; then
send_alert "🔴 <b>[CRITICAL] CPU Alert</b> - ${HOSTNAME}\nCPU Load: ${CPU_PERCENT}% (Cores: ${CPU_CORES})"
elif [ "$CPU_PERCENT" -gt 80 ]; then
send_alert "🟡 <b>[WARNING] CPU Alert</b> - ${HOSTNAME}\nCPU Load: ${CPU_PERCENT}% (Cores: ${CPU_CORES})"
fi
# ตรวจ Memory
MEM_TOTAL=$(grep MemTotal /proc/meminfo | awk '{print $2}')
MEM_AVAIL=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
MEM_USED_PCT=$(echo "scale=0; (($MEM_TOTAL - $MEM_AVAIL) * 100) / $MEM_TOTAL" | bc)
if [ "$MEM_USED_PCT" -gt 90 ]; then
send_alert "🔴 <b>[CRITICAL] Memory Alert</b> - ${HOSTNAME}\nMemory Used: ${MEM_USED_PCT}%"
elif [ "$MEM_USED_PCT" -gt 80 ]; then
send_alert "🟡 <b>[WARNING] Memory Alert</b> - ${HOSTNAME}\nMemory Used: ${MEM_USED_PCT}%"
fi
# ตรวจ Disk (root partition)
DISK_USED=$(df / | awk 'NR==2{print $5}' | sed 's/%//')
if [ "$DISK_USED" -gt 90 ]; then
send_alert "🔴 <b>[CRITICAL] Disk Alert</b> - ${HOSTNAME}\nDisk /: ${DISK_USED}% used"
elif [ "$DISK_USED" -gt 80 ]; then
send_alert "🟡 <b>[WARNING] Disk Alert</b> - ${HOSTNAME}\nDisk /: ${DISK_USED}% used"
fi
ตั้ง Permission และเพิ่มใน cron:
chmod +x /opt/monitor/check_resources.sh # เพิ่มใน crontab ให้รันทุก 5 นาที crontab -e # เพิ่มบรรทัดนี้: */5 * * * * /opt/monitor/check_resources.sh
เคล็ดลับสำคัญ — ป้องกัน Alert Spam: ถ้า CPU พุ่งทุก 5 นาทีเป็นเวลาหลายชั่วโมง คุณจะได้รับ Telegram message หลายสิบข้อความ ใช้ไฟล์ lock หรือตรวจสอบว่า alert เดิมถูกส่งไปแล้วภายใน timeframe ที่กำหนดก่อนส่งซ้ำ ตัวอย่าง: if [ ! -f /tmp/cpu_alert_sent ] || [ $(( $(date +%s) - $(stat -c %Y /tmp/cpu_alert_sent) )) -gt 3600 ]; then send_alert "..."; touch /tmp/cpu_alert_sent; fi วิธีนี้จะส่งซ้ำไม่ก่อน 1 ชั่วโมง
Alert ที่ควรตั้งบน VPS ทุกตัว (Checklist)
ไม่ว่าจะใช้เครื่องมือไหน alert เหล่านี้ควรมีในทุก VPS ที่ใช้งานจริง:
System Resource Alerts
- CPU Usage Warning — ค่าเฉลี่ย 15 นาที > 80% (Warning), > 90% (Critical)
- Memory Usage — RAM ใช้ไปมากกว่า 85% (Warning), > 95% (Critical)
- Disk Space — Disk root หรือ data partition > 80% (Warning), > 90% (Critical)
- Disk I/O — I/O wait สูงผิดปกติต่อเนื่อง อาจเป็นสัญญาณ Disk กำลังจะเสีย
- Swap Usage — Swap > 50% แปลว่า RAM ไม่พอ ควรพิจารณา upgrade
Service Availability Alerts
- Web Server ล่ม — Nginx/Apache ไม่ตอบสนอง (HTTP 5xx หรือ connection refused)
- Database ล่ม — MySQL/PostgreSQL ไม่ accept connection
- SSH Port ปิด — อาจเป็น firewall rule ผิดหรือ sshd crash
- Application Down — Node.js / PHP-FPM process ไม่รัน
Security Alerts
- Failed SSH Login จำนวนมาก — Brute force attack
- Unauthorized Root Login — ใครก็ตาม login เป็น root สำเร็จ
- Port Scan Detected — ผ่าน fail2ban หรือ iptables log
การตั้ง alert ครบทั้ง 3 หมวดนี้ทำให้คุณรู้สถานะเซิร์ฟเวอร์แบบ 360 องศา ไม่ใช่แค่ system resource
ตรวจสอบว่า Alert ทำงานถูกต้อง
หลังตั้งค่าแล้ว ต้องทดสอบก่อนนำไปใช้งานจริง เพราะ alert ที่ตั้งผิดหรือ notification ที่ไม่ทำงานจริง แย่กว่าไม่มี alert เลย เพราะทำให้เกิดความมั่นใจที่ผิดพลาด (False Sense of Security)
ทดสอบ Telegram Notification
# ทดสอบส่ง message ผ่าน curl โดยตรงก่อน
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
-d text="✅ ทดสอบ Alert จาก VPS $(hostname) สำเร็จ"
ทดสอบ CPU Alert ด้วย stress
# ติดตั้ง stress-ng sudo apt install stress-ng -y # กด CPU ให้ถึง threshold เพื่อทดสอบ alert stress-ng --cpu 4 --timeout 300s & # รอดูว่าได้รับ Telegram message ภายใน 5-15 นาที # หยุด stress test ด้วย kill %1
ตรวจ Log ของ Alertmanager
# ดู log real-time sudo journalctl -u alertmanager -f # หรือ Netdata notification log tail -f /var/log/netdata/health.log
Best Practices สำหรับการตั้งค่า Alert Thresholds
การตั้ง threshold ที่ดีไม่ใช่แค่การใส่ตัวเลข 80% หรือ 90% แล้วจบ แต่ต้องปรับให้เหมาะกับลักษณะ workload จริงของแต่ละ server มิฉะนั้นจะเกิดปัญหา Alert Fatigue คือได้รับแจ้งเตือนบ่อยจนชินและเริ่มเพิกเฉย ซึ่งอันตรายกว่าไม่มี alert เสียอีก
- วัด Baseline ก่อนตั้ง Threshold: ดูกราฟ CPU/Memory ย้อนหลัง 7–14 วันเพื่อรู้ค่าปกติ (baseline) ของ server ถ้า CPU ปกติอยู่ที่ 40–60% การตั้ง warning ที่ 70% สมเหตุสมผลกว่า 80%
- ใช้ Average ไม่ใช่ Instantaneous Peak: CPU spike 1 วินาทีเป็นเรื่องปกติ ให้วัดค่าเฉลี่ย 5–15 นาที เพื่อกรอง false alarm
- แยก Warning กับ Critical ให้ชัด: Warning = ต้องติดตาม แต่ยังไม่ฉุกเฉิน; Critical = ต้องแก้ทันที ให้ส่งไปคนละ channel เช่น Warning → Email, Critical → Telegram/Phone
- ทบทวน Threshold ทุกไตรมาส: Traffic เพิ่มขึ้นตามเวลา threshold ที่เหมาะ 3 เดือนก่อนอาจต่ำเกินไปแล้วในวันนี้ ตั้ง calendar reminder ทบทวนทุก 3 เดือน
- ทดสอบ Alert ทุก 1–2 เดือน: Notification channel เช่น Telegram Bot Token อาจ expire หรือ Chat ID เปลี่ยน ให้ส่ง test alert เป็นประจำเพื่อยืนยันว่าระบบยังทำงานได้
คำถามที่พบบ่อย (FAQ)
ควรตั้ง threshold CPU alert ไว้ที่เท่าไรดี
สำหรับเซิร์ฟเวอร์ทั่วไปแนะนำ Warning ที่ 80% และ Critical ที่ 90% ค่าเฉลี่ยควรวัดช่วง 5–15 นาที ไม่ใช่ spike ชั่วคราว เพราะ CPU พุ่งสั้นๆ เป็นเรื่องปกติ หากแจ้งเตือนบ่อยเกิน (Alert Fatigue) ให้เพิ่ม duration เป็น 10 นาทีก่อน ค่อยปรับ threshold ตามลักษณะ workload จริง
Netdata กับ Prometheus + Alertmanager ต่างกันอย่างไร
Netdata เหมาะสำหรับ VPS เดี่ยวที่ต้องการ real-time dashboard + alert พร้อมกัน ติดตั้งง่าย 1 คำสั่ง ใช้งานได้ทันที ส่วน Prometheus + Alertmanager เหมาะกับสภาพแวดล้อมที่มีหลาย server หรือต้องการ custom metric จาก application เอง ยืดหยุ่นกว่าแต่ตั้งค่าซับซ้อนกว่า สำหรับ VPS เดี่ยวเริ่มต้น Netdata ตอบโจทย์ได้ดีกว่า
ทำไม Alert ที่ตั้งไว้ไม่ถูกส่งมาทั้งที่ CPU สูงมาก
สาเหตุที่พบบ่อยได้แก่ Notification channel ตั้งค่าผิด เช่น Telegram Bot Token หรือ Chat ID ผิด, Alert rule มี syntax error ทำให้ Alertmanager ไม่ load rule, VPS ไม่มีอินเตอร์เน็ตขาออกเพราะ firewall block port 443, หรือ alert อยู่ใน Inhibit/Silence state โดยไม่ตั้งใจ ให้ตรวจ log ของ Alertmanager และทดสอบด้วย amtool alert add ก่อนนำไปใช้งานจริง
วิธีส่ง Alert ผ่าน Telegram Bot ทำอย่างไร
สร้าง Bot ผ่าน @BotFather บน Telegram รับ Token มา แล้ว add bot เข้า group หรือ chat ที่ต้องการรับแจ้งเตือน ดึง Chat ID ด้วยการเรียก https://api.telegram.org/bot<TOKEN>/getUpdates จากนั้นตั้งค่าใน Alertmanager receivers หรือ Netdata notification โดยระบุ token และ chat_id ทดสอบโดยส่ง test message ผ่าน curl ก่อนใช้งานจริง
VPS KVM ประสิทธิภาพสูงของ AsiaGB
AsiaGB VPS Root Access เต็มรูปแบบ Docker MySQL Python Node.js เริ่มต้น 500 บาท/เดือน
ดูแพ็กเกจ VPS