Bỏ qua Cloud: Tự Host ntfy trên Docker để Nhận Thông báo Lab Tức thì

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

Vấn đề của hệ thống cảnh báo: Tại sao ntfy chiến thắng

Không có gì tệ hơn việc thức dậy với một máy chủ đã bị sập và nhận ra nó đã ngừng hoạt động từ mười hai giờ trước. Trong nhiều năm, tôi đã dựa vào cảnh báo qua email để giám sát HomeLab của mình. Nhưng email về cơ bản là chậm. Giữa các bước bắt tay SMTP và các bộ lọc thư rác khắt khe, một cảnh báo quan trọng như “Ổ đĩa đầy” có thể mất năm phút mới đến nơi—nếu nó có thể đến được. Các bot Telegram và Discord tốt hơn, nhưng chúng buộc bạn phải tham gia vào hệ sinh thái đám mây và yêu cầu kết nối internet liên tục chỉ để gửi một cảnh báo nội bộ.

Sau khi tình cờ biết đến ntfy (phát âm là notify), tôi đã ngừng vật lộn với các API key. Đây là một dịch vụ pub-sub dựa trên HTTP được tinh giản tối đa, thực hiện một việc duy nhất một cách hoàn hảo: gửi văn bản đến điện thoại của bạn. Bạn không cần tài khoản hay một SDK phức tạp. Nếu bạn có thể viết một lệnh curl, bạn có thể gửi thông báo. Nó đã trở thành cầu nối đáng tin cậy nhất giữa các script chạy ngầm (headless) và túi quần của tôi.

So sánh các phương thức thông báo

Việc chọn đúng công cụ tùy thuộc vào mức độ chấp nhận độ trễ và độ phức tạp của bạn. Đây là cách ntfy so với các phương thức truyền thống.

  • Email (SMTP): Đáng tin cậy cho log, nhưng cực kỳ tệ cho các trường hợp khẩn cấp. Độ trễ thường dao động từ 30 giây đến vài phút.
  • Telegram/Discord Bots: Giàu tính năng và miễn phí. Tuy nhiên, nếu mạng WAN của bạn bị rớt, các script nội bộ không thể báo cho bạn biết là internet đã mất vì chúng không thể kết nối tới API.
  • Gotify: Một lựa chọn self-hosted tuyệt vời. Tôi chuyển sang ntfy chủ yếu vì ứng dụng iOS trau chuốt hơn và hệ thống “dựa trên chủ đề” (topic-based) không yêu cầu cấu hình phía người gửi.
  • ntfy: Nó rất nhẹ và hoạt động qua các yêu cầu PUT/POST đơn giản. Việc truyền tin gần như tức thời, thường đến điện thoại trong vòng chưa đầy 200ms.

Ưu và nhược điểm của Self-Hosting

Ưu điểm

  • Quyền riêng tư: Dữ liệu của bạn không bao giờ chạm đến máy chủ của bên thứ ba. Lịch sử thông báo nằm lại trên ổ SSD của chính bạn.
  • Không rào cản: Để tạo một “chủ đề” (topic) mới, bạn chỉ cần đăng ký nó trong ứng dụng di động. Không cần phải đăng ký một bot mới cho mỗi script nhỏ.
  • Dấu ấn hệ thống cực nhỏ: Container Docker cực kỳ hiệu quả. Trong môi trường của tôi, nó chạy không tải với chưa đầy 20MB RAM và chu kỳ CPU không đáng kể.
  • Khả năng tương thích phổ quát: Nó hoạt động với Bash, Python, Node.js và thậm chí cả phần cứng đơn giản như vi điều khiển ESP32.

Thử thách

  • Truy cập từ xa: Để nhận cảnh báo khi bạn đang ở cửa hàng tạp hóa, bạn phải công khai dịch vụ thông qua Reverse Proxy hoặc một VPN như Tailscale.
  • Bảo mật: Sự đơn giản là con dao hai lưỡi. Nếu không bật kiểm soát truy cập, bất kỳ ai đoán được tên chủ đề của bạn đều có thể đọc được các cảnh báo.

Kiến trúc đề xuất

Đối với một HomeLab sẵn sàng cho sản xuất, hãy chạy ntfy đằng sau một reverse proxy với chứng chỉ SSL. Điều này giúp tin nhắn của bạn được mã hóa khi truyền qua mạng. Tôi sử dụng Docker Compose để quản lý dịch vụ, đảm bảo rằng lịch sử tin nhắn và cài đặt người dùng vẫn tồn tại sau khi khởi động lại hoặc cập nhật container.

Hướng dẫn triển khai từng bước

1. Tổ chức tệp tin

Bắt đầu bằng cách tạo một không gian riêng cho ntfy. Điều này giúp cấu hình và cơ sở dữ liệu tin nhắn của bạn được tổ chức tốt và dễ dàng sao lưu.

mkdir -p ~/docker/ntfy/config
mkdir -p ~/docker/ntfy/cache
cd ~/docker/ntfy

2. Cấu hình Server

Mặc dù ntfy có thể hoạt động ngay lập tức, nhưng tệp server.yml là cần thiết để đảm bảo bảo mật và lưu trữ dữ liệu bền vững. Tạo tệp này tại config/server.yml:

# cấu hình server ntfy
base-url: "https://ntfy.yourdomain.com"
cache-file: "/var/cache/ntfy/cache.db"
attachment-cache-dir: "/var/cache/ntfy/attachments"
auth-file: "/var/lib/ntfy/user.db"
auth-default-access: "deny-all"

Mẹo nhỏ: Hãy đặt auth-default-access thành “read-write” trong 10 phút đầu tiên khi chạy thử, sau đó chuyển nó lại thành “deny-all” sau khi người dùng đã được tạo.

3. Tệp Docker Compose

Tệp YAML này định nghĩa cách container chạy. Nó ánh xạ các thư mục cục bộ chúng ta vừa tạo vào các đường dẫn chính xác bên trong container.

version: "3.8"

services:
  ntfy:
    image: binwiederhier/ntfy
    container_name: ntfy
    command:
      - serve
    environment:
      - TZ=Asia/Ho_Chi_Minh
    volumes:
      - ./cache:/var/cache/ntfy
      - ./config:/etc/ntfy
      - ./lib:/var/lib/ntfy
    ports:
      - 8080:80
    restart: unless-stopped

4. Khởi chạy

Kích hoạt dịch vụ chỉ với một lệnh duy nhất. Nó sẽ sẵn sàng nhận yêu cầu trong vài giây.

docker-compose up -d

Kiểm tra thiết lập của bạn

Bây giờ đến phần thú vị nhất. Cài đặt ứng dụng ntfy trên điện thoại của bạn và đăng ký một chủ đề có tên là lab_alerts. Sau đó, chạy lệnh này từ terminal của bạn:

curl -d "Cập nhật server hoàn tất!" http://localhost:8080/lab_alerts

Nếu mọi thứ được cấu hình đúng, điện thoại của bạn sẽ rung ngay lập tức. Không cần đăng nhập.

Ứng dụng thực tế trong đời sống

Giám sát sao lưu thông minh

Tôi sử dụng một script để giám sát các tác vụ rsync hàng đêm. Nếu sao lưu thất bại, tôi muốn biết điều đó trước khi bắt đầu công việc vào sáng hôm sau. Bằng cách thêm header “Priority”, thông báo sẽ vượt qua cài đặt “Không làm phiền” trên hầu hết các điện thoại.

#!/bin/bash
# Kiểm tra nếu rsync thành công
if rsync -av /mnt/data /mnt/backup; then
  curl -d "Sao lưu thành công" http://ntfy.local/backups
else
  # Gửi cảnh báo ưu tiên cao nếu thất bại
  curl -H "Priority: 5" -H "Tags: skull" -d "SAO LƯU THẤT BẠI!" http://ntfy.local/backups
fi

Cảnh báo Cron Job tự động

Các máy chủ chạy ngầm thường nổi tiếng with những lỗi âm thầm. Bạn có thể bao bọc bất kỳ cron job nào để nó ping cho bạn nếu nó thoát với một mã lỗi.

0 2 * * * /usr/bin/python3 /scripts/db_cleanup.py || curl -d "Script dọn dẹp bị lỗi" http://ntfy.local/alerts

Lời kết về bảo mật

Đừng để máy chủ thông báo của bạn mở toang cho internet. Sau khi xác nhận container đang chạy, hãy tạo ngay một người dùng quản trị:

docker exec -it ntfy ntfy user add --role=admin yourname

Việc khóa máy chủ đảm bảo rằng một người lạ không thể spam điện thoại của bạn hoặc nghe lén log hệ thống. Thiết lập này đã là xương sống cho hệ thống giám sát của tôi trong hơn một năm. Nó nhanh, riêng tư và quan trọng nhất là nó hoạt động cực kỳ ổn định.

Share: