Tất cả bài viết
14 tháng 3, 2026·5 phút đọc·ERPFit Team
monitoringinfrastructuretypescriptuptime-kuma
Cách chúng tôi giám sát 19+ dịch vụ bằng Uptime Kuma và TypeScript

Cách chúng tôi giám sát 19+ dịch vụ bằng Uptime Kuma và TypeScript

Quy trình giám sát thực tế cho hạ tầng SME — từ setup Uptime Kuma đến health check scripts và cảnh báo qua Telegram.

Mục lục

Khi bạn quản lý hạ tầng cho nhiều khách hàng — website, API, email server, database — câu hỏi không phải "có sự cố không" mà là "bao lâu mới biết có sự cố". Mục tiêu của chúng tôi: dưới 5 phút.

Tại sao Uptime Kuma

Trước Uptime Kuma, chúng tôi thử Datadog, UptimeRobot, và Hetrix. Vấn đề chung: hoặc đắt (Datadog — hàng trăm đô/tháng cho một team nhỏ), hoặc giới hạn số monitor ở free tier (UptimeRobot — 50 monitors), hoặc thiếu tính năng cần thiết.

Uptime Kuma là self-hosted, mã nguồn mở, chạy trên Docker. Không giới hạn monitors, không phí hàng tháng. Cài đặt mất 5 phút:

docker run -d --restart=always \
  -p 3001:3001 \
  -v uptime-kuma:/app/data \
  --name uptime-kuma \
  louislam/uptime-kuma:1

Giao diện web đẹp, dễ dùng. Hỗ trợ nhiều loại monitor: HTTP(S), TCP, DNS, Docker container, và push-based monitors cho các script tự viết.

Chúng tôi monitor gì

19+ endpoints, chia thành 3 nhóm:

Nhóm 1: Website & API (HTTP monitors)

Kiểm tra HTTP status code + response time. Interval: 60 giây. Bao gồm:

  • Website khách hàng (WordPress, static sites)
  • API endpoints (health check routes)
  • Admin panels (ERPNext, Mautic, HestiaCP)

Nhóm 2: SSL Certificates

Uptime Kuma tự động kiểm tra ngày hết hạn SSL certificate. Cảnh báo trước 14 ngày khi cert sắp hết hạn. Hầu hết cert tự renew qua Let's Encrypt, nhưng đôi khi auto-renewal thất bại — không có monitoring thì chỉ biết khi khách hàng gọi báo "trang web hiện cảnh báo bảo mật".

Nhóm 3: Custom health checks (Push monitors)

Một số thứ không kiểm tra được bằng HTTP request đơn giản. Ví dụ: backup hoàn tất chưa? Database có đang chạy không? Disk còn bao nhiêu dung lượng?

Cho những trường hợp này, chúng tôi dùng push monitors. Script chạy theo cron, kiểm tra điều kiện, rồi gửi heartbeat về Uptime Kuma nếu mọi thứ ổn:

// health-check.ts — chạy mỗi 5 phút qua cron
const checks = [
  checkDiskSpace('/'),           // > 20% free
  checkPostgresConnection(),     // can connect
  checkBackupAge('/backups/'),   // < 25 hours old
]

const results = await Promise.all(checks)
const allPassed = results.every(r => r.ok)

if (allPassed) {
  // Gửi heartbeat về Uptime Kuma push URL
  await fetch(UPTIME_KUMA_PUSH_URL)
}

Nếu script không gửi heartbeat trong 10 phút — Uptime Kuma đánh dấu service là DOWN và gửi cảnh báo.

Cảnh báo qua Telegram

Email notification chậm — đặc biệt ban đêm. Chúng tôi dùng Telegram Bot cho cảnh báo vì:

  • Push notification tức thì trên điện thoại
  • Có thể tạo group chat cho từng nhóm dịch vụ
  • Miễn phí, không giới hạn tin nhắn
  • API đơn giản — một HTTP POST là xong

Uptime Kuma có sẵn Telegram integration — chỉ cần tạo bot, lấy token và chat ID, nhập vào settings. Khi service DOWN, tin nhắn đến trong vài giây.

Health check scripts bằng TypeScript

Ngoài Uptime Kuma, chúng tôi có health check scripts riêng chạy bằng Bun, kiểm tra sâu hơn những thứ Uptime Kuma không cover:

Backup verification

Sao lưu chạy hàng ngày bằng cron. Nhưng cron job thất bại thì không ai biết — trừ khi bạn kiểm tra.

// verify-backups.ts
import { readdir, stat } from 'node:fs/promises'

async function checkBackupAge(dir: string, maxAgeHours = 25) {
  const files = await readdir(dir)
  const latest = files
    .filter(f => f.endsWith('.tar.gz'))
    .sort()
    .pop()

  if (!latest) return { ok: false, error: 'No backup files found' }

  const info = await stat(`${dir}/${latest}`)
  const ageHours = (Date.now() - info.mtimeMs) / (1000 * 60 * 60)

  return {
    ok: ageHours < maxAgeHours,
    file: latest,
    ageHours: Math.round(ageHours * 10) / 10,
  }
}

Script chạy mỗi 6 giờ. Nếu backup mới nhất cũ hơn 25 giờ (cho phép 1 giờ buffer so với daily cron), gửi cảnh báo.

Disk space monitoring

VPS hết disk space là nguyên nhân phổ biến nhất gây sự cố — database crash, logs không ghi được, container không start. Kiểm tra đơn giản nhưng thiết yếu.

Database connection check

Không chỉ kiểm tra port có mở không — mà thực sự kết nối và chạy một query nhỏ (SELECT 1). Nếu PostgreSQL đang chạy nhưng quá tải (connection pool hết), HTTP port check vẫn pass nhưng app thì không hoạt động.

Kết quả thực tế

Trong 12 tháng qua:

  • Phát hiện 3 sự cố SSL certificate renewal thất bại — trước khi cert hết hạn
  • Phát hiện 2 lần VPS hết disk space — trước khi database crash
  • Phát hiện 1 lần ISP routing issue — biết trước khách hàng gọi
  • Thời gian trung bình từ sự cố đến cảnh báo: dưới 3 phút

Không có giám sát, những sự cố này chỉ được phát hiện khi khách hàng gọi — thường là vài giờ sau, khi thiệt hại đã xảy ra.

Chi phí

Uptime Kuma chạy trong Docker container trên server hiện có. Không tốn thêm chi phí hosting. Telegram Bot miễn phí. Health check scripts viết một lần, chạy mãi.

Tổng chi phí giám sát 19+ dịch vụ: $0/tháng.

So với Datadog ($23/host/tháng), hay UptimeRobot Pro ($7/tháng cho 50 monitors) — self-hosted monitoring là lựa chọn rõ ràng cho SME.

Bài học

Giám sát không cần phức tạp. Bạn không cần Prometheus + Grafana + AlertManager cho 20 dịch vụ. Uptime Kuma + vài script TypeScript + Telegram Bot — đủ để ngủ yên ban đêm.

Điều quan trọng không phải tool — mà là monitor đúng thứ và cảnh báo đúng người. Kiểm tra backup thường bị bỏ quên nhất — mọi người setup cron backup rồi quên, cho đến khi cần restore mới phát hiện backup đã ngừng chạy từ 3 tháng trước.

Chia sẻ:𝕏FBin