Tất cả bài viết
14 tháng 3, 2026·6 phút đọc·Long Nguyen · CTO, ERPFit·Cập nhật 17 tháng 6, 2026
monitoringinfrastructuretypescriptuptime-kuma
Giám sát 19+ dịch vụ với Uptime Kuma và TypeScript

Giám sát 19+ dịch vụ với Uptime Kuma và TypeScript

Cách chúng tôi giám sát 19+ dịch vụ với chi phí $0/tháng và phát hiện sự cố dưới 3 phút: Uptime Kuma self-hosted, health check scripts và cảnh báo 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 (tự host trên server của mình), 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. Đây cũng là một mảnh trong bộ công cụ mã nguồn mở chúng tôi dùng để vận hành toàn bộ hạ tầng:

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". Đây cũng là một phần trong cách chúng tôi bảo mật website khách hàng.

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 (Uptime Kuma chờ script chủ động báo về thay vì tự gọi đi). Script chạy theo cron, kiểm tra điều kiện, rồi gửi heartbeat (tín hiệu "tôi vẫn sống") 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 — số kết nối đồng thời — đã 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 (dữ liệu nội bộ):

  • 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 (dữ liệu nội bộ — chạy ghép trên server sẵn có).

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. Nếu bạn muốn chúng tôi lo phần hạ tầng này, xem dịch vụ website & hosting của ERPFit.

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.

Câu hỏi thường gặp

Uptime Kuma có miễn phí không?
Có. Uptime Kuma là phần mềm mã nguồn mở, miễn phí hoàn toàn và self-hosted. Bạn chạy nó trong một Docker container trên server sẵn có, không giới hạn số monitor và không có phí hàng tháng. Toàn bộ hệ giám sát 19+ dịch vụ của chúng tôi tốn $0/tháng (dữ liệu nội bộ).
Push monitor khác HTTP monitor như thế nào?
HTTP monitor để Uptime Kuma chủ động gọi đến URL và kiểm tra status code. Push monitor thì ngược lại: script của bạn chủ động gửi heartbeat (tín hiệu "tôi vẫn sống") về Uptime Kuma. Push monitor hợp với những thứ HTTP không kiểm tra được như backup, disk space hay database.
Bao lâu thì phát hiện được sự cố?
Trong 12 tháng qua, thời gian trung bình từ lúc sự cố xảy ra đến lúc nhận cảnh báo là dưới 3 phút (dữ liệu nội bộ). HTTP monitor chạy interval 60 giây, còn cảnh báo gửi qua Telegram Bot đến điện thoại gần như tức thì, kể cả ban đêm.
Uptime Kuma có theo dõi hạn SSL certificate không?
Có. Uptime Kuma tự động đọc ngày hết hạn của SSL certificate và cảnh báo trước 14 ngày. Hầu hết cert tự gia hạn qua Let's Encrypt, nhưng auto-renewal đôi khi thất bại — tính năng này đã giúp chúng tôi bắt 3 lần cert sắp hết hạn (dữ liệu nội bộ).
Tại sao không dùng Datadog hay Prometheus?
Datadog tính $23/host/tháng (dữ liệu nội bộ) — quá đắt cho SME. Prometheus + Grafana + AlertManager thì quá phức tạp cho khoảng 20 dịch vụ. Với quy mô đó, Uptime Kuma cộng vài script TypeScript là đủ và dễ vận hành hơn nhiều.
LN
Long Nguyen
CTO, ERPFit

CTO của ERPFit. Trực tiếp xây dựng và vận hành hạ tầng kỹ thuật, bộ công cụ Craft và nền tảng dịch vụ cho doanh nghiệp Việt Nam.

Chia sẻ:𝕏FBin