Giám sát server bằng Beszel: vì sao VAON chuyển khỏi Grafana
Tóm tắt: Beszel là công cụ giám sát server mã nguồn mở, gồm hub và agent. VAON chuyển giám sát server nội bộ từ Grafana sang Beszel vì dashboard Grafana nhiều chỉ số nhưng rối, ít người mở hằng ngày. Beszel gom mọi server vào một màn hình, có sẵn chỉ số Docker, cảnh báo và S.M.A.R.T., nhưng không xem được log.

Grafana đã gây khó khăn gì cho đội vận hành của VAON?
Grafana không có lỗi. Vấn đề nằm ở cách đội VAON dùng nó trong một sản phẩm trước đây. Grafana thu được rất nhiều chỉ số và cho phép dựng dashboard gần như không giới hạn, nên số màn hình tăng dần theo từng dự án.
Sau một thời gian, đội gặp ba vấn đề:
- Mỗi dự án một dashboard riêng, cùng một chỉ số nhưng tên gọi và đơn vị hơi khác nhau.
- Phần thu thập dữ liệu mỗi người cấu hình một kiểu, thêm một server là phải nhớ lại từng bước.
- Dashboard có rất nhiều panel, trong khi buổi sáng mọi người chỉ cần biết hai điều: server có sống không, ổ đĩa có còn đủ không.
Vấn đề thứ ba nặng nhất. Nhiều chỉ số không phải là xấu. Cái sai là đội không tách màn hình ai cũng xem mỗi ngày khỏi màn hình dùng để đào nguyên nhân khi có sự cố. Kết quả là dashboard chỉ được mở sau khi sự cố đã xảy ra.
Beszel là gì và hoạt động thế nào?
Beszel là công cụ giám sát server nhẹ, mã nguồn mở theo giấy phép MIT, gồm hai thành phần:
| Thành phần | Vai trò |
|---|---|
| Hub | Ứng dụng web xây trên PocketBase, hiển thị dashboard và lưu dữ liệu lịch sử |
| Agent | Chạy trên từng server cần giám sát, gửi chỉ số về hub |
Hub tự lưu dữ liệu, nên không cần dựng thêm cơ sở dữ liệu chuỗi thời gian như Prometheus hay InfluxDB. Theo tài liệu bảo mật chính thức của Beszel, hub và agent kết nối theo một trong hai chiều:
| Cách kết nối | Chiều khởi tạo | Cổng mặc định |
|---|---|---|
| SSH | Hub → agent | 45876 |
| WebSocket | Agent → hub | 8090 |
Kết nối SSH chỉ chấp nhận khoá công khai của hub, không cấp terminal và không nhận lệnh. Vì vậy dù khoá bị lộ, kẻ tấn công cũng không chạy được lệnh trên agent. Với server nằm sau mạng nội bộ mà hub không vào thẳng được, chiều WebSocket (agent chủ động gọi ra) thường dễ mở tường lửa hơn.
Triển khai Beszel cho server nội bộ gồm những bước nào?
Triển khai Beszel chỉ cần Docker Compose trên hub và trên từng server. Quy trình VAON áp dụng:
- Dựng hub bằng một file
docker-compose.ymlvới imagehenrygd/beszel, mở cổng 8090 và gắn thư mục dữ liệu. - Thêm server bằng nút "Add System" trên giao diện hub. Hub sinh sẵn file compose cho agent, gồm khoá công khai (
KEY), token (TOKEN) và địa chỉ hub (HUB_URL). - Chạy agent trên server bằng file compose vừa sao chép. Gắn
/var/run/docker.sockở chế độ chỉ đọc để lấy CPU, RAM, mạng theo từng container. - Đặt cảnh báo cho từng server theo dạng "chỉ số nào, vượt ngưỡng bao nhiêu, trong bao lâu".
- Đăng ký kênh nhận thông báo trong Settings > Notifications bằng URL theo chuẩn Shoutrrr (Slack, Discord, Telegram, Teams…).
Từ phiên bản 0.12.0, Beszel có universal token, cho phép agent tự kết nối mà không cần khai báo server trước trên hub. Với đội vận hành, thêm một server giờ chỉ còn là "đặt file compose rồi chạy". Việc nhỏ, nhưng đội không còn phải nhớ lại từng bước như trước.
Màn hình Beszel cho đội vận hành thấy gì mỗi ngày?
Màn hình tổng quan Beszel xếp mỗi server thành một dòng: CPU, RAM, ổ đĩa, GPU, load average, mạng, thời gian hoạt động. Ô nào có mức sử dụng tăng cao sẽ chuyển thanh sang màu vàng, nên không cần đọc hết các con số vẫn thấy ngay dòng cần chú ý. Tên dự án trong ảnh chụp đã được che.
Ở ảnh chụp phía trên, mục "Active Alerts" đang báo một server môi trường phát triển có dung lượng ổ đĩa vượt 80% liên tục hơn 10 phút. Đây là quy tắc cảnh báo thật đang chạy, không phải dữ liệu mẫu.

Trang chi tiết của từng server hiển thị sẵn biểu đồ theo container Docker. Với Grafana, loại biểu đồ này thường cần cài thêm thành phần thu thập như cAdvisor.

Trên server trong ảnh, các đỉnh CPU, băng thông và lưu lượng mạng Docker xuất hiện gần như cùng thời điểm. Bộ lọc trên biểu đồ Docker giúp khoanh vùng container gây ra đỉnh đó. Beszel không phải lúc nào cũng đủ để tìm ra nguyên nhân gốc, nhưng đủ để quyết định bước điều tra tiếp theo.
Giám sát S.M.A.R.T. ổ cứng với Beszel cần chuẩn bị gì?
S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology) là dữ liệu tự chẩn đoán của ổ cứng, dùng để phát hiện ổ sắp hỏng. Đây là một lý do VAON chọn Beszel cho server nội bộ. Server thuê trên cloud hỏng ổ thì nhà cung cấp xử lý; server vật lý nội bộ thì đội phải tự phát hiện và tự thay.
Lưu ý: máy ảo VPS trên cloud dùng ổ ảo nên không có dữ liệu S.M.A.R.T. Tính năng này chỉ có ý nghĩa với server có ổ cứng vật lý.
Theo hướng dẫn S.M.A.R.T. chính thức của Beszel, cần chuẩn bị:
- Cài
smartmontoolstrên máy chạy agent (smartctltừ bản 7.0). - Với Docker, đổi image agent sang tag
henrygd/beszel-agent:alpine. - Truyền thiết bị ổ đĩa vào container (ví dụ
/dev/sda,/dev/nvme0) và cấp quyềnSYS_RAWIOcho ổ SATA,SYS_ADMINcho ổ NVMe. - Với agent chạy bằng systemd, thêm
AmbientCapabilities,CapabilityBoundingSetvàDeviceAllowvào mục[Service].
Thiết bị phải truyền theo tên ổ (sda, nvme0), không theo tên phân vùng (sda1). Cảnh báo S.M.A.R.T. không có ngưỡng tự chỉnh: Beszel tự gửi thông báo khi phát hiện "failure", với điều kiện đã đăng ký ít nhất một kênh thông báo.
Beszel khác Grafana ở điểm nào?
Beszel và Grafana giải quyết hai bài toán khác nhau. Bảng dưới tóm tắt các khác biệt chính khi dùng cho tầng server:
| Tiêu chí | Beszel | Grafana (kèm Prometheus) |
|---|---|---|
| Thành phần cần dựng | Hub + agent | Grafana + Prometheus + exporter |
| Thêm một server | Chép file compose từ hub rồi chạy | Cài exporter, sửa cấu hình thu thập |
| Chỉ số theo container Docker | Có sẵn | Cần thêm cAdvisor hoặc tương đương |
| Tuỳ biến dashboard | Cố định | Gần như không giới hạn |
| Truy vấn tự do | Không có | PromQL |
| Log, chỉ số trong ứng dụng | Không | Có (qua Loki, exporter của ứng dụng) |
| S.M.A.R.T. | Có sẵn, cảnh báo tự động | Cần thêm exporter riêng |
Nói ngắn gọn: Beszel trả lời câu hỏi "server có khoẻ không", Grafana trả lời được gần như mọi câu hỏi nếu đội đủ thời gian cấu hình.
Khi nào không nên dùng Beszel?
Beszel không phù hợp khi đội cần quan sát bên trong ứng dụng. Cụ thể:
- Beszel không xem được log.
- Beszel không thu chỉ số ứng dụng như số request, độ trễ, độ dài hàng đợi, và không cho thêm chỉ số tự định nghĩa.
- Dashboard cố định, không có truy vấn tự do như PromQL.
- Cảnh báo S.M.A.R.T. không chỉnh được điều kiện.
Với sản phẩm cần theo dõi chi tiết hành vi ứng dụng, Prometheus và Grafana vẫn là lựa chọn hợp lý hơn. VAON chọn Beszel cho tầng server và để phần giám sát ứng dụng cho công cụ khác.
Sau khi chuyển sang Beszel, điều gì thay đổi?
Trước khi chuyển, đội VAON lo rằng ít chỉ số hơn sẽ khiến việc truy nguyên sự cố khó hơn. Đến nay, những gì cần biết ở cấp server đều nằm đủ trong Beszel.
Thay đổi lớn nhất là số người mở dashboard. Vì chỉ có một màn hình tổng quan, người không phụ trách hạ tầng cũng mở ra mỗi sáng, thấy thanh vàng là báo ngay cho người phụ trách. Nếu làm lại từ đầu, việc đầu tiên đội sẽ chốt không phải là thu chỉ số nào, mà là ai mở màn hình đó mỗi sáng và thấy màu vàng thì báo cho ai.
Nếu bạn đang cân nhắc cách giám sát hệ thống sau khi đưa vào vận hành, bạn có thể tham khảo dịch vụ phát triển hệ thống và tư vấn chuyển đổi số của VAON, hoặc liên hệ để được tư vấn miễn phí về kiến trúc vận hành hiện tại.