Deploy Beszel trên Docker: Dashboard Giám Sát Server Nhẹ cho HomeLab (Cài Đặt 5 Phút)

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Đang 2 giờ sáng. Cái NAS HomeLab của tôi ì ạch kinh khủng, quạt quay như tua bin, mà tôi chẳng biết cái gì đang ngốn tài nguyên. Tôi đã cài Grafana + Prometheus — hoặc tôi tưởng vậy — cho đến khi phát hiện ra scraper đã âm thầm chết từ ba ngày trước. Không có cảnh báo. Không có dữ liệu. Chỉ là một dashboard trống rỗng chế giễu tôi lúc 2 giờ sáng.

Đêm đó tôi phát hiện ra Beszel. Mười phút sau tôi có thể thấy chính xác container Docker nào đang tra tấn CPU. Không phải vì Beszel có phép màu, mà vì nó thực sự chạy ổn định.

Bắt Đầu Nhanh: Chạy Beszel Trong 5 Phút

Beszel sử dụng kiến trúc hub-agent. Hub là dashboard web bạn tương tác; các Agent nhẹ chạy trên từng server bạn muốn theo dõi. Với một máy duy nhất, bạn chạy cả hai trên cùng một host.

Tạo thư mục làm việc và tạo file docker-compose.yml sau:

mkdir ~/beszel && cd ~/beszel
version: "3"

services:
  beszel:
    image: henrygd/beszel
    container_name: beszel
    restart: unless-stopped
    ports:
      - "8090:8090"
    volumes:
      - ./beszel-data:/beszel_data

  beszel-agent:
    image: henrygd/beszel-agent
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - PORT=45876
      - KEY=          # Để trống tạm thời — điền vào sau khi cài Hub

Khởi động Hub trước:

docker compose up beszel -d

Mở http://your-server-ip:8090 và tạo tài khoản admin. Sau đó vào Systems → Add System và nhập:

  • Host: localhost (hoặc IP server của bạn nếu truy cập từ xa)
  • Port: 45876

Beszel sẽ tạo ra một public key. Sao chép nó, dán vào docker-compose.yml tại phần KEY=, rồi khởi động agent:

docker compose up beszel-agent -d

Làm mới dashboard. Trong khoảng 30 giây bạn sẽ thấy CPU, RAM, disk và network theo thời gian thực. Đơn giản chỉ vậy thôi.

Tìm Hiểu Sâu Hơn: Beszel Hoạt Động Như Thế Nào

Kiến Trúc Hub và Agent

Hub chạy trên PocketBase — một backend single-binary tích hợp sẵn cơ sở dữ liệu SQLite. Đó là lý do Hub chỉ chiếm khoảng 12–18 MB RAM khi nhàn rỗi trong setup của tôi. Không cần metric store riêng, không phải điều chỉnh scrape interval của Prometheus, không cần lo version plugin Grafana.

Agent kết nối ngược về Hub qua SSH tunnel sử dụng cặp khóa ed25519. KEY bạn sao chép trong quá trình cài đặt là public key của Hub — agent dùng nó để xác thực và mở một kênh mã hóa. Dữ liệu metrics của bạn không bao giờ truyền qua HTTP thuần, điều này quan trọng khi các agent nằm ở nhiều phân đoạn mạng khác nhau.

Những Gì Được Giám Sát Mà Không Cần Cấu Hình Thêm

  • Mức sử dụng CPU (xem chi tiết từng core trong màn hình chi tiết)
  • Mức sử dụng RAM và swap
  • Mức sử dụng disk và I/O theo từng mount point
  • Băng thông mạng theo từng interface
  • Uptime hệ thống và load average
  • Thống kê container Docker — CPU và RAM theo từng container
  • Thống kê GPU cho card NVIDIA và AMD, nếu có

Việc mount Docker socket (/var/run/docker.sock:/var/run/docker.sock:ro) là thứ mở khóa số liệu ở cấp container. Xóa nó đi nếu bạn không cần — agent vẫn theo dõi tài nguyên host tốt mà không cần đến nó.

Sử Dụng Nâng Cao: Cài Đặt HomeLab Đa Server

Thêm Server Từ Xa

Đây là lúc nó thực sự hữu ích. Bốn máy trong setup của tôi — hai server Ubuntu, một Raspberry Pi 5 và một node Proxmox cũ — tất cả đều báo cáo về một Hub duy nhất. Mỗi agent chiếm khoảng 5–15 MB RAM và hầu như không gây tải cho CPU. Trên mỗi máy từ xa, bạn chỉ cần deploy agent. Không cần hub, không cần cơ sở dữ liệu, không cần web server gì cả.

File docker-compose.yml tối giản cho một node từ xa:

version: "3"

services:
  beszel-agent:
    image: henrygd/beszel-agent
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - PORT=45876
      - KEY=your_hub_public_key_here

Thích cài trực tiếp thay vì dùng Docker? Agent được phân phối dưới dạng một file binary duy nhất:

curl -sL https://get.beszel.dev/agent | bash

Bọc nó trong một systemd service để tự động khởi động lại sau khi reboot:

sudo tee /etc/systemd/system/beszel-agent.service <<EOF
[Unit]
Description=Beszel Agent
After=network.target

[Service]
Environment="PORT=45876"
Environment="KEY=your_hub_public_key_here"
ExecStart=/usr/local/bin/beszel-agent
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now beszel-agent

Quay lại Hub, thêm hệ thống từ xa qua Systems → Add System, nhập IP từ xa và port 45876, nó sẽ kết nối trong vài giây.

Cảnh Báo và Thông Báo Webhook

Beszel hỗ trợ webhook gửi ra ngoài, vì vậy bạn có thể chuyển cảnh báo đến Discord, Slack, hoặc bất kỳ thứ gì chấp nhận POST request. Vào Settings → Notifications, thêm webhook URL của bạn, rồi tạo quy tắc cảnh báo theo từng hệ thống.

Thiết lập cảnh báo Discord khi CPU vượt quá 85% trong năm phút chỉ mất khoảng hai phút:

  1. Tạo Discord webhook trong cài đặt kênh của bạn
  2. Dán webhook URL vào cài đặt thông báo của Beszel
  3. Trong quy tắc cảnh báo của hệ thống, đặt CPU > 85% trong 5 phút

Ngưỡng cảnh báo theo từng hệ thống nghĩa là Raspberry Pi của bạn — vốn chạy nóng hơn dưới tải — có thể có ngưỡng CPU thoải mái hơn so với server chính. Không còn bị làm phiền liên tục bởi ngưỡng cài sẵn cho phần cứng khác.

Kinh Nghiệm Thực Tế từ Môi Trường Production

Ba tháng chạy trong môi trường production. Không có gì âm thầm bị hỏng. Không scraper nào chết qua đêm, không cơ sở dữ liệu time-series nào phình to quá 20 GB, không có monitoring stack nào cần watchdog riêng.

Những điều tôi rút ra được từ thực tế:

Ghim phiên bản image cho bất kỳ thứ gì bạn phụ thuộc vào. :latest ổn cho việc thử nghiệm. Trong production, hãy khóa phiên bản cụ thể:

image: henrygd/beszel:0.9.0

Sao lưu beszel-data hàng ngày. Tất cả — tài khoản, hệ thống, số liệu lịch sử — đều nằm trong một thư mục đó. Một lệnh rsync đơn giản là đủ:

rsync -av ~/beszel/beszel-data/ /mnt/backup/beszel-data/

Đặt Hub sau một reverse proxy. Đừng để lộ port 8090 trực tiếp. Caddy làm TLS trở nên đơn giản:

monitor.yourdomain.com {
    reverse_proxy localhost:8090
}

Kiểm tra port 45876 có thể truy cập được từ Hub đến Agent. Có máy nằm sau firewall không? Hãy mở đúng port đó, hoặc chạy tất cả trên mạng Tailscale. Đó là setup của tôi — lưu lượng monitoring nằm trên mạng overlay riêng tư và không bao giờ chạm đến internet công cộng.

Dùng biểu đồ băng thông mạng để phát hiện lưu lượng bất thường. Đây là tính năng tôi dùng nhiều nhất. Một đêm nọ biểu đồ cho thấy một máy đang đẩy dữ liệu liên tục 40 MB/s lúc 3 giờ sáng — một backup job bị cấu hình sai đang tải lên lại cùng một dataset mỗi giờ. Beszel phát hiện ra trong 30 giây. Không có nó, tôi sẽ chỉ nhận ra vấn đề khi nhìn vào hóa đơn hosting một tháng sau.

So sánh Beszel với bộ Grafana + Prometheus đầy đủ không thực sự công bằng — chúng là những công cụ khác nhau cho những vấn đề khác nhau. Grafana có lý khi bạn cần tương quan log, số liệu business tùy chỉnh, hoặc pipeline cảnh báo kích hoạt khắc phục tự động.

Nhưng để theo dõi sức khỏe server và container HomeLab một cách tổng quan, Beszel cắt giảm khoảng 80% độ phức tạp vận hành với chỉ khoảng 5% chi phí tài nguyên. Trong setup của tôi, việc gỡ bỏ TIG stack khỏi máy chủ monitoring đã giải phóng gần 800 MB RAM — điều mà bộ chuyển mã Plex của tôi rất vui mừng được thừa hưởng.

Share: