← กลับ
MonitoringDevOpsSelf-hosted

Monitoring App ด้วย Uptime Kuma ฟรี 100%

ติดตั้ง 5 นาที app down ปุ๊บ Line เด้งทันที ไม่ต้องรอลูกค้ามาบอก self-host เก็บข้อมูลของตัวเอง

2026-02-22อ่าน 7 นาทีใหม่

ทำไมต้อง 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 แทน

ขั้นตอน:

  1. ไปที่ developers.line.biz สร้าง provider + Messaging API channel
  2. ใน channel เปิดใช้งาน Long-lived channel access token แล้วก็อปไว้
  3. เพิ่ม bot เป็นเพื่อนใน Line
  4. เอา userId ของตัวเอง (หา id ได้จาก webhook event หรือ API)
  5. ใน Uptime Kuma → SettingsNotificationsSetup Notification
  6. เลือก type Line Messaging API ใส่ token + userId

ถ้าทำเองยาก ใช้ Discord Webhook ก็ได้ ตั้งง่ายกว่า:

  1. สร้าง Discord server (หรือใช้ที่มี)
  2. ในห้อง > Settings > Integrations > Webhooks > New Webhook
  3. ก็อป URL
  4. ใน 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

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