หนึ่งในความผิดพลาดที่พบบ่อยที่สุดของผู้ดูแล 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 มีดังนี้:

ตัวอย่างในทางปฏิบัติ: 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

Service Availability Alerts

Security Alerts

การตั้ง 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 เสียอีก

คำถามที่พบบ่อย (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