ทำไมต้อง monitor
project ที่รันอยู่บน VPS ดูเหมือนปลอดภัย จนกระทั่งวันที่:
- pm2 crash ตอนตี 3 ไม่มีใครรู้จนเช้า
- DNS ของ provider พังครึ่งวัน ลูกค้าด่าใน FB ก่อนถึงจะเริ่มแก้
- SSL หมดอายุเพราะลืมต่อ ตื่นมาเปิดเว็บแสดง "Not Secure"
โหดสุดคือเรื่อง SSL หมดอายุ — Certbot ตั้ง auto renew ไว้แล้วก็จริง แต่บางครั้ง renew fail (โดเมนหมดอายุ, port 80 ปิด, rate limit ของ Let's Encrypt) ถ้าไม่มีระบบเตือน เห็นปัญหาตอนคนแจ้งมาแล้ว
Uptime monitor คือระบบที่ "ส่ง request ไปเช็คเว็บเราทุกๆ X วินาที" ถ้า fail ก็แจ้งเตือนทาง Line/Discord/Email
ทางเลือกในตลาด
| ตัว | ฟรี | self-host | จุดเด่น | |---|---|---|---| | UptimeRobot | ฟรี 50 monitors, 5 นาที | ไม่ได้ | ใช้ง่ายสุด เริ่มใน 1 นาที | | Better Uptime | ฟรี 10 monitors | ไม่ได้ | UI สวย incident page ดี | | Uptime Kuma | ฟรีไม่จำกัด | ได้ | open source, host เอง, ครบฟีเจอร์ | | Healthchecks.io | ฟรี 20 checks | ได้ | เน้น cron job monitor |
Uptime Kuma เด่นที่:
- ไม่จำกัดจำนวน monitor
- check interval ตั้งได้ละเอียดถึง 20 วินาที
- รองรับ notification 90+ ช่องทาง รวม Line, Discord, Slack, Email
- มี status page สาธารณะให้แชร์
- เป็น open source ที่ github.com/louislam/uptime-kuma — ดูแลโดยคนเดียวแต่ active สูง
ติดตั้งด้วย Docker Compose
สร้างโฟลเดอร์แล้วสร้างไฟล์ docker-compose.yml:
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
volumes:
- ./data:/app/data
ports:
- "3001:3001"
restart: unless-stopped
start:
docker compose up -d
docker compose logs -f
เปิด http://your-server-ip:3001 ครั้งแรกจะให้สร้าง admin account
เปิดให้เข้าถึงผ่าน HTTPS
อย่าเปิด port 3001 สาธารณะ ตั้ง Nginx proxy + SSL จะปลอดภัยกว่า
/etc/nginx/sites-available/uptime:
server {
listen 80;
server_name status.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3001;
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;
}
}
sudo ln -s /etc/nginx/sites-available/uptime /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# ออก SSL
sudo certbot --nginx -d status.yourdomain.com
# ปิด port 3001 ใน firewall
sudo ufw deny 3001
ตั้ง Monitor แรก
ใน Uptime Kuma คลิก + Add New Monitor
ตัวเลือก type ที่ใช้บ่อย:
- HTTP(s) — เช็คว่าเว็บตอบ 200 OK
- HTTP(s) - Keyword — เช็คว่ามีคำที่กำหนดใน response (เช่น "OK")
- Ping — ICMP ping
- TCP — เปิด port ได้ไหม
- DNS — DNS resolve เป็นค่าที่ถูกต้องไหม
- Push — server ของเราต้องส่ง heartbeat มาเอง (เช็ค cron job)
ตัวอย่าง monitor เว็บหลัก:
Type: HTTP(s) - Keyword
URL: https://yourdomain.com/health
Keyword: ok
Heartbeat Interval: 60 seconds
Retries: 3
Heartbeat Retry Interval: 60 seconds
ใส่ endpoint /health ใน app เพื่อตอบกลับสถานะที่ลึกกว่าแค่ status code:
// app/api/health/route.ts (Next.js)
import { db } from '@/lib/db'
export async function GET() {
try {
await db.$queryRaw`SELECT 1`
return Response.json({ status: 'ok' })
} catch (e) {
return Response.json({ status: 'fail' }, { status: 500 })
}
}
วิธีนี้เช็คได้ว่าทั้ง app + database ทำงานปกติ
เช็ค SSL หมดอายุ
ตั้ง Monitor ใหม่ type HTTP(s) ของ domain เดิม Uptime Kuma จะแสดงวันที่ SSL จะหมด ถ้าใกล้หมดให้ตั้ง "Certificate Expiry Notification" ที่ 14, 7 วันล่วงหน้า
วิธีตั้ง: หน้า monitor → tab Certificate Expiry → เปิดใช้
แจ้งเตือนผ่าน Line Messaging API
Line Notify ปิดบริการช่วงปลายปี 2025 ใช้ Line Messaging API แทน
ขั้นตอน:
- ไปที่ developers.line.biz สร้าง provider + Messaging API channel
- ใน channel เปิดใช้งาน Long-lived channel access token แล้วก็อปไว้
- เพิ่ม bot เป็นเพื่อนใน Line
- เอา
userIdของตัวเอง (หา id ได้จาก webhook event หรือ API) - ใน Uptime Kuma → Settings → Notifications → Setup Notification
- เลือก type Line Messaging API ใส่ token + userId
ถ้าทำเองยาก ใช้ Discord Webhook ก็ได้ ตั้งง่ายกว่า:
- สร้าง Discord server (หรือใช้ที่มี)
- ในห้อง > Settings > Integrations > Webhooks > New Webhook
- ก็อป URL
- ใน Uptime Kuma ใส่ URL ที่ Notification type Discord
Status Page ให้ทีม / ลูกค้า
หน้า Status Pages → + New Status Page
- เพิ่ม monitor ที่อยากแสดง
- ตั้ง slug เช่น
myapp→ URL จะเป็นstatus.yourdomain.com/status/myapp - เปิด public access
แชร์ link ให้ลูกค้า ใส่ใน footer เว็บ ทีมเห็นสถานะ real-time
Backup ข้อมูล
ข้อมูล Uptime Kuma เก็บใน ./data/kuma.db (SQLite) backup ง่ายๆ:
# ใน folder ที่มี docker-compose.yml
tar czf kuma-backup-$(date +%Y%m%d).tar.gz data/
# upload ขึ้น S3
aws s3 cp kuma-backup-*.tar.gz s3://my-backups/kuma/
ตั้ง cron ให้ backup ทุกวันได้เลย
ปัญหาที่อาจเจอ
Notification ไม่มา → ลอง "Test Notification" ใน Settings ก่อน + ดู log: docker compose logs uptime-kuma
Container restart loop → เกือบทั้งหมดเกิดจาก permission ใน volume แก้:
sudo chown -R 1000:1000 ./data
docker compose restart
RAM กิน 200MB+ ขึ้น → ปกติ Uptime Kuma ใช้ 100-150MB ถ้ามากกว่านั้นอาจมี monitor ที่ pending push notification ลองลด retention history
สรุป
monitoring เป็นเรื่องที่หลายคนเลื่อนทำไปเรื่อยๆ เพราะคิดว่ายังไม่จำเป็น แต่ตอนเกิดเรื่องจริงแล้วไม่มี ก็เสียใจ
Uptime Kuma ตั้ง 10 นาทีแต่ใช้ได้ตลอดอายุ project ไม่มีเหตุผลที่จะไม่ใช้ — โดยเฉพาะถ้ามี VPS อยู่แล้ว มี container เพิ่มอีกตัวกินไม่กี่ MB