Ngừng Phụ Thuộc Vào Cloud: Tự Host Gotify Để Nhận Cảnh Báo HomeLab Tức Thì

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

Nhận ra lúc 2 giờ sáng: Tại sao bạn cần một trung tâm thông báo nội bộ

Đó là lúc 2:14 sáng ngày thứ Ba. Tôi thức dậy trong một ngôi nhà lạnh lẽo vì hệ thống tự động hóa điều hòa thông minh đã bị treo. Tôi vớ lấy điện thoại—chẳng có gì cả. Không có cảnh báo từ Home Assistant, không có email từ NAS, và cũng không có thông báo Telegram nào. Nhà cung cấp dịch vụ Internet (ISP) đã bắt đầu “bảo trì định kỳ” vào lúc nửa đêm, làm ngắt kết nối của tôi. Vì các cảnh báo của tôi phụ thuộc vào các API trên nền tảng cloud, chúng thực chất đang “gào thét” vào một khoảng không vô định trong khi các đường ống dẫn nước của tôi có nguy cơ đóng băng.

Đây là cái bẫy HomeLab kinh điển. Chúng ta xây dựng các hệ thống nội bộ phức tạp nhưng lại thuê ngoài phần quan trọng nhất—việc biết khi nào mọi thứ hỏng hóc—cho các dịch vụ bên ngoài. Đêm đó, tôi nhận ra mình cần một máy chủ thông báo nằm ngay tại nơi dữ liệu của tôi đang sống. Tôi cần Gotify.

Hãy coi Gotify như một trình môi giới tin nhắn (message broker) riêng tư, tốc độ cao cho các máy chủ của bạn. Nó cực kỳ nhẹ, thường chỉ tiêu tốn dưới 30MB RAM. Nó cung cấp giao diện web sạch sẽ, ứng dụng Android mạnh mẽ và một API cực kỳ đơn giản. Nếu bạn có thể khởi chạy một container Docker, bạn có thể sở hữu một hệ thống thông báo riêng tư hoạt động trong chưa đầy năm phút.

Bắt đầu nhanh: Gotify trong 300 giây

Tôi coi trọng sự đơn giản hơn là các cấu hình phức tạp. Thiết lập Docker Compose tối giản này là tất cả những gì bạn cần để bắt đầu. Đầu tiên, hãy tạo một nơi lưu trữ cho dữ liệu của bạn.

mkdir -p ~/homelab/gotify/data
cd ~/homelab/gotify

Tiếp theo, hãy đưa cấu hình này vào tệp docker-compose.yml. Tôi đã sử dụng chính thiết lập này trên một chiếc Raspberry Pi 4 trong hơn 14 tháng mà không gặp một lỗi treo máy nào.

version: "3"

services:
  gotify:
    image: gotify/server
    container_name: gotify
    restart: always
    ports:
      - 8080:80
    environment:
      - GOTIFY_DEFAULTUSER_PASS=admin
    volumes:
      - "./data:/app/data"

Triển khai container:

docker-compose up -d

Bây giờ, hãy truy cập trình duyệt tới địa chỉ http://your-server-ip:8080. Sử dụng admin/admin để đăng nhập. Làm ơn, hãy đổi mật khẩu đó ngay lập tức. Giờ đây bạn đã làm chủ hạ tầng thông báo của chính mình.

Khám phá bên trong: Giao tiếp thời gian thực

Gotify không chỉ là một bảng điều khiển cơ bản. Nó sử dụng WebSockets để đẩy tin nhắn đến thiết thiết bị của bạn ngay lập tức. Điều này giúp loại bỏ độ trễ của email và sự không chắc chắn của các bộ lọc thư rác. Khi một ổ đĩa bị hỏng, bạn sẽ biết trong vòng vài mili giây chứ không phải vài phút.

Tạo ứng dụng đầu tiên của bạn

Trong Gotify, một “Application” đóng vai trò như API key của bạn. Bạn không gửi tin nhắn tới “Gotify”; bạn gửi chúng tới một App cụ thể mà bạn đã tạo. Điều này cho phép bạn phân loại các cảnh báo. Tôi thường tạo các App riêng biệt cho:

  • Cơ sở hạ tầng (Infrastructure): Trạng thái UPS, cảnh báo dung lượng đĩa, cảnh báo nhiệt độ.
  • Bảo mật (Security): Các lần thử SSH thất bại, chặn tường lửa.
  • Dịch vụ (Services): Khởi động lại container Docker, trạng thái hoàn tất sao lưu.

Đi tới tab Apps trong giao diện người dùng Gotify, nhấp vào Create Application, đặt tên cho nó như “HomeLab-Monitor” và sao chép Token. Bạn sẽ cần nó cho bước tiếp theo.

Ứng dụng Android

Ứng dụng Android (có sẵn trên F-Droid và Play Store) là nơi Gotify tỏa sáng. Nó duy trì một kết nối WebSocket liên tục, nghĩa là nó không cần Google Firebase Cloud Messaging (FCM) hay tài khoản Google để hoạt động. Nó cứ thế chạy—ngay cả khi internet bị ngắt nhưng Wi-Fi nội bộ vẫn hoạt động. Đối với những ai dùng bản build Android tùy chỉnh hoặc thiết bị không có Google, đây là một “cứu cánh”.

Sử dụng thực tế: Kết nối mọi thứ

Khi máy chủ đã chạy, phần thú vị bắt đầu: làm cho mọi thứ kết nối với nó. Vì Gotify sử dụng một REST API đơn giản, bạn có thể gửi thông báo từ hầu hết mọi thứ có thể chạy lệnh shell hoặc script.

1. Phương pháp Bash Script

Tôi sử dụng cách này cho các tác vụ định kỳ (cron jobs). Nếu việc sao lưu thất bại, tôi muốn biết ngay lập tức. Đây là một lệnh curl đơn giản để gửi thông báo ưu tiên cao:

curl -X POST "http://your-server-ip:8080/message?token=YOUR_APP_TOKEN" \
     -F "title=Sao lưu thất bại" \
     -F "message=Bản sao lưu hàng đêm của /mnt/data đã thất bại lúc $(date)" \
     -F "priority=8"

Trường priority (độ ưu tiên) là chìa khóa. Trong ứng dụng Android, bạn có thể cấu hình các âm thanh thông báo khác nhau dựa trên độ ưu tiên. Ưu tiên 10 có thể kích hoạt báo động lớn cho cảm biến cháy, trong khi ưu tiên 1 là thông báo im lặng cho một bản cập nhật thành công.

2. Tích hợp Python

Nếu bạn đang viết các script tự động hóa tùy chỉnh, Python còn làm cho việc này dễ dàng hơn. Tôi thường dùng cách này để giám sát các tác vụ xử lý dữ liệu chạy lâu.

import requests

def send_gotify_alert(title, message, priority=5):
    url = "http://192.168.1.50:8080/message?token=AmXyZ12345"
    payload = {
        "title": title,
        "message": message,
        "priority": priority
    }
    try:
        requests.post(url, json=payload)
    except Exception as e:
        # Gửi cảnh báo thất bại
        print(f"Gửi cảnh báo thất bại: {e}")

# Thông báo phòng máy chủ nóng
send_gotify_alert("Phòng máy chủ nóng", "Nhiệt độ đã vượt quá 30°C!", 9)

3. Reverse Proxy và SSL

Nếu bạn muốn nhận thông báo khi không ở nhà, bạn cần phải đưa Gotify ra internet. Đừng chỉ mở cổng 8080 trên bộ định tuyến của bạn. Hãy sử dụng một reverse proxy như Nginx Proxy Manager hoặc Caddy để xử lý mã hóa SSL. Gotify cần một kết nối an toàn (HTTPS) để WebSockets hoạt động ổn định trên internet công cộng.

Mẹo thực tế để HomeLab không bị “nhiễu”

Khi mới thiết lập Gotify, I đã mắc sai lầm khi gửi thông báo cho mọi thứ. Cứ mỗi khi một container cập nhật, điện thoại của tôi lại rung lên. Trong vòng 48 giờ, tôi bị rơi vào tình trạng “mệt mỏi vì cảnh báo” (alert fatigue) và bắt đầu phớt lờ điện thoại của mình. Đừng làm vậy. Nó làm mất đi mục đích của một hệ thống cảnh báo.

Mẹo 1: Sử dụng các mức độ ưu tiên một cách khôn ngoan

Định nghĩa một thang đo ưu tiên nghiêm ngặt cho lab của bạn:

  • 0-3 (Thấp): Mang tính thông tin. Không âm thanh, không rung. Hữu ích để kiểm tra nhật ký sau.
  • 4-7 (Trung bình): Cảnh báo bình thường. Âm thanh thông báo tiêu chuẩn. Dùng cho những việc cần chú ý trong ngày, nhưng không phải ngay lập tức.
  • 8-10 (Cao): Nguy cấp. Âm thanh lớn đặc biệt, có thể bỏ qua chế độ ‘Không làm phiền’ nếu được. Dùng cho lỗi phần cứng hoặc vi phạm bảo mật.

Mẹo 2: Sử dụng Markdown

Gotify hỗ trợ Markdown trong nội dung tin nhắn. Bạn có thể chèn các liên kết đến instance Portainer hoặc dashboard Dashy trực tiếp trong thông báo. Nếu một container bị lỗi, hãy đính kèm liên kết dẫn đến logs của nó trong tin nhắn. Nó sẽ giúp bạn tiết kiệm những giây phút quý giá khi đang cố gắng khắc phục sự cố lúc đang di chuyển.

Mẹo 3: Kiểm tra sức khỏe cho chính bộ thông báo

Ai sẽ thông báo cho bạn nếu chính máy chủ thông báo bị sập? Tôi sử dụng một script “nhịp đập” (heartbeat) đơn giản trên một chiếc Raspberry Pi riêng biệt để ping Gotify mỗi giờ. Nếu thất bại, chiếc Pi đó sẽ gửi một email dự phòng hoặc thắp sáng một đèn LED vật lý trong văn phòng của tôi. Trong một HomeLab cấp độ chuyên nghiệp, sự dự phòng không phải là hoang tưởng; đó là một yêu cầu bắt buộc.

Thiết lập Gotify là một trong những nâng cấp về độ ổn định tốt nhất mà tôi từng thực hiện cho hệ thống của mình. Không còn bỏ lỡ cảnh báo, không còn phụ thuộc vào các API bên ngoài và toàn quyền kiểm soát dữ liệu. Nếu bạn đã mệt mỏi với việc tự hỏi liệu hệ thống của mình có thực sự đang chạy hay không, hãy dành 20 phút để thiết lập nó ngay hôm nay.

Share: