Màn hình laptop Windows 11 hiển thị giao diện quản lý TrueNAS và Proxmox, minh họa một home lab điển hình
Máy Tính

Tự động hóa Home Lab Từ Xa: Kết Nối Home Assistant và Tines Qua Email

Với vai trò là một chuyên gia công nghệ, tôi luôn bị cuốn hút bởi việc kết nối các dịch vụ khác nhau để tạo ra những giải pháp độc đáo. Một trong số đó là Tines, một nền tảng tự động hóa tập trung vào bảo mật, cung cấp nhiều tính năng hữu ích ngay cả trong phiên bản miễn phí. Tuy nhiên, tính năng Tines Tunnel – một giải pháp tương tự Cloudflare Tunnel cho phép kết nối an toàn với mạng nội bộ – lại bị giới hạn sau lớp thuê bao trả phí, vốn được thiết kế dành riêng cho các doanh nghiệp lớn.

Điều này đã thôi thúc tôi tìm kiếm một giải pháp thay thế. Tôi tự hỏi, liệu có cách nào để xây dựng một “tunnel” của riêng mình, tận dụng sức mạnh của Home Assistant và các tự động hóa sẵn có? Với tài khoản Nabu Casa, Home Assistant cho phép tạo các webhook công khai, trong khi Tines có khả năng thực hiện các yêu cầu HTTP và tự host các webhook. Bằng cách kết nối hai nền tảng này, chúng ta có thể thiết lập một kênh giao tiếp hai chiều an toàn, cung cấp chức năng tương tự như một tunnel, mặc dù không linh hoạt bằng nhưng hoàn toàn đủ để thực hiện nhiệm vụ.

Cần lưu ý rằng đây là một thử nghiệm thú vị, một minh chứng cho khả năng của công nghệ hơn là một giải pháp thiết yếu cho tất cả mọi người. Mục tiêu chính là khám phá, học hỏi và vượt qua các giới hạn hiện có, tạo ra những điều mới mẻ chỉ “vì chúng ta có thể”.

Lên ý tưởng dự án và hoạch định chiến lược

Khám phá những khả năng ngoài Home Assistant thông thường

Sau khi thiết lập được kênh giao tiếp hai chiều an toàn giữa Tines và Home Assistant, bước tiếp theo là lên ý tưởng cho một dự án cụ thể. Home Assistant vốn đã tích hợp gần như mọi thiết bị trong ngôi nhà của tôi, khiến việc nghĩ ra một ý tưởng độc đáo – điều mà Home Assistant không thể tự mình thực hiện một cách dễ dàng – trở nên khá thách thức.

Đó là lúc tôi phát hiện ra hai tính năng thú vị của Tines: “Send email” (Gửi email) và “Receive email” (Nhận email). Đúng như tên gọi, “Send email” cho phép gửi email, còn “Receive email” sẽ tạo một địa chỉ email ngẫu nhiên để bạn có thể gửi yêu cầu đến. Vậy thì, điều gì sẽ xảy ra nếu tôi có thể gửi lệnh qua email, sau đó nhận lại phản hồi từ Tines, chứa thông tin được yêu cầu hoặc xác nhận hành động đã hoàn tất? Có thể nói email là API nguyên thủy, nên việc thử nghiệm ý tưởng này nghe có vẻ rất hấp dẫn.

Cuối cùng, tôi quyết định thực hiện hai trường hợp thử nghiệm (proof-of-concept): đầu tiên là tương tác với mô hình LLM tự host (self-hosted LLM) của mình và nhận phản hồi qua email; thứ hai là điều khiển các container Proxmox đang chạy trong home lab của tôi, cho phép tôi khởi động, dừng hoặc khởi động lại chúng từ xa. Mặc dù có những lo ngại về bảo mật với phương pháp này, nhưng tôi sẽ giải thích cách tôi đã xử lý chúng. Với một kế hoạch rõ ràng, việc triển khai hóa ra lại dễ dàng một cách đáng ngạc nhiên.

Màn hình laptop Windows 11 hiển thị giao diện quản lý TrueNAS và Proxmox, minh họa một home lab điển hìnhMàn hình laptop Windows 11 hiển thị giao diện quản lý TrueNAS và Proxmox, minh họa một home lab điển hình

Xử lý lệnh nhận được qua Email một cách thông minh

Đảm bảo tính xác thực của dữ liệu gửi đến Home Assistant

Email là một giao thức phức tạp với nhiều thành phần giúp đảm bảo rằng người gửi thực sự là người họ nói. Ví dụ, nếu bạn nhận được email từ “[email protected]”, làm sao bạn có thể xác minh rằng đó thực sự đến từ tôi? Việc giả mạo địa chỉ email rất dễ dàng, và nếu tôi sử dụng email để điều khiển home lab, tôi cần phải chắc chắn rằng các lệnh đó thực sự đến từ tôi chứ không phải từ một kẻ mạo danh.

Khi nói đến email, có một số công nghệ có thể chứng minh tính xác thực của người gửi. Hai trong số đó là SPF (Sender Policy Framework) và DKIM (DomainKeys Identified Mail). SPF là một kiểm tra đơn giản để đảm bảo địa chỉ IP đã gửi email được miền (domain) đó ủy quyền. Điều này đã khó giả mạo, đòi hỏi tấn công man-in-the-middle, chiếm quyền BGP, hoặc chính sách SPF kém được triển khai trên tên miền để vượt qua.

DKIM, mặt khác, khó vượt qua hơn nhiều. DKIM cung cấp một chữ ký số với mỗi email được gửi, và chữ ký này có thể được so sánh với khóa công khai liên quan đến miền. Nếu khớp, email đến từ một người gửi hợp lệ và không bị can thiệp. Bằng cách kết hợp cả hai với DMARC (Domain-based Message Authentication, Reporting & Conformance), hệ thống trở nên vô cùng mạnh mẽ, chỉ thiếu một bước là bạn tự thêm một khóa bí mật vào email mà chỉ bạn biết để kiểm tra. Nếu tôi sử dụng hệ thống này lâu dài, tôi chắc chắn sẽ triển khai thêm bước đó.

Khi bạn gửi email đến địa chỉ Tines cung cấp, các kết quả kiểm tra này đều có sẵn trong các header của email. Do đó, chúng ta chỉ cần kiểm tra xem “spf=pass”, “dkim=pass”, và “dmarc=pass” có tồn tại trong đối tượng “Authentication-Results” hay không. Nếu không, chúng ta có thể tạo một luồng thất bại để gửi email thông báo cho tôi, và nếu chúng vượt qua, chúng ta tiếp tục với các bước còn lại.

Sơ đồ luồng tự động hóa của Tines, minh họa các bước kiểm tra xác thực email (SPF, DKIM, DMARC) trước khi xử lý lệnhSơ đồ luồng tự động hóa của Tines, minh họa các bước kiểm tra xác thực email (SPF, DKIM, DMARC) trước khi xử lý lệnh

Trích xuất và phân tích lệnh

Các bước tiếp theo trong luồng tự động hóa của chúng ta khá đơn giản. Đầu tiên, chúng ta cần trích xuất các lệnh từ tiêu đề (subject) và nội dung (body) của email. Sau đó, chúng ta thiết lập một luồng đi đến các “triggers” khác nhau. Triggers về cơ bản là một chuỗi các khối “if-else”, nơi chúng ta có thể kích hoạt dựa trên một lệnh và có một loạt các lệnh này cùng nhau dựa trên văn bản mà chúng ta trích xuất.

Khi nói đến việc trích xuất văn bản, Tines làm điều này khá dễ dàng. Bạn có thể truyền một chuỗi từ một biến đã khai báo, hoặc bạn có thể trích xuất từ một đối tượng JSON, và còn nhiều tùy chọn khác nữa. Chúng ta sẽ trích xuất từ tham số “receive_email_action.body”, nhưng có một vấn đề nhỏ: nội dung email trông như thế này (dấu ngoặc nhọn đã được thay thế bằng dấu ngoặc vuông thông thường):

"(div dir="ltr")104(/div)n"

Chúng ta chỉ muốn phần “104”, nhưng việc chỉ lấy nội dung bên trong thẻ div là khá khó khăn. May mắn thay, Tines cũng hỗ trợ biểu thức chính quy (regex), vì vậy chúng ta có thể sử dụng biểu thức sau để lấy văn bản bên trong thẻ div một cách nhất quán:

<div[^>]*> s*w+s+(.*?) </div>

Biểu thức này sẽ cung cấp cho chúng ta chính xác văn bản bên trong thẻ div và gán nó vào một biến. Dòng tiêu đề thì dễ hơn, và regex duy nhất chúng ta cần là “.*”. Cuối cùng, các triggers chỉ đơn giản kiểm tra xem văn bản được trích xuất là gì, và phản ứng tương ứng dựa trên việc nó là “proxmox start”, “proxmox stop”, hoặc “proxmox reboot”.

Sơ đồ luồng Tines tiếp tục xử lý, trích xuất lệnh từ email và sử dụng các triggers để gửi yêu cầu HTTP đến Home AssistantSơ đồ luồng Tines tiếp tục xử lý, trích xuất lệnh từ email và sử dụng các triggers để gửi yêu cầu HTTP đến Home Assistant

Bước tiếp theo có thể được cải thiện đáng kể bằng cách kết nối mọi thứ vào một yêu cầu HTTP duy nhất. Tuy nhiên, ở đây tôi thực hiện một yêu cầu HTTP từ Tines đến webhook Home Assistant của mình, với khóa của đối tượng JSON được gửi là “start”, “stop” hoặc “reboot”, và giá trị là số được trích xuất từ email.

Để cải thiện hơn nữa và giảm số lượng khối đang sử dụng, tôi có thể tạo khóa được gửi trong đối tượng JSON một cách linh động dựa trên lệnh, và giữ tất cả trong một khối yêu cầu HTTP duy nhất trong Tines. Nhưng còn về phía Home Assistant? Các lệnh phải được xử lý ở đâu đó, vì vậy chúng ta sẽ chuyển sang phần kết nối tất cả lại với nhau.

Nâng cao trải nghiệm Home Assistant của bạn

Giao diện ứng dụng Home Assistant trên máy tính bảng hiển thị tình trạng sức khỏe hệ thống Raspberry Pi, cho thấy khả năng giám sát thiết bị thông minhGiao diện ứng dụng Home Assistant trên máy tính bảng hiển thị tình trạng sức khỏe hệ thống Raspberry Pi, cho thấy khả năng giám sát thiết bị thông minh

Thiết lập Home Assistant cho hệ thống tự động hóa

Chỉ cần một quy trình tự động hóa duy nhất

Đầu tiên và quan trọng nhất, tôi đang sử dụng tích hợp Proxmox VE HACS, một phiên bản nâng cao của tích hợp Proxmox tích hợp sẵn. Việc thiết lập có phần hơi dài dòng, nhưng nó cho phép bạn điều khiển tất cả các máy ảo (VM) và container LXC của mình từ Home Assistant.

Để bắt đầu, chúng ta tạo một tự động hóa (automation) trong Home Assistant, được kích hoạt dựa trên một webhook. Điều này sẽ tự động tạo webhook cho bạn. Tôi chỉ thiết lập nó cho LXC ở đây, nhưng việc điều chỉnh để điều khiển các máy ảo cũng khá dễ dàng. Chúng ta có thể tận dụng thực tế rằng mọi cảm biến được tạo bởi tích hợp đều tuân theo cùng một định dạng:

button.lxc_(name)_(number)_(start/stop/reboot)

Với tích hợp của chúng ta, chúng ta định nghĩa các biến sau:

  • action: có thể là start, stop, hoặc reboot
  • number: giá trị trong payload được gửi từ Tines
  • button_entity: lặp qua tất cả các nút, kiểm tra:
    • các nút bắt đầu bằng “button.lxc_”
    • các nút kết thúc bằng “_(action)”
    • các nút có chứa “number”
  • status_sensor: cảm biến liên quan đến dịch vụ, để xác nhận xem hành động của chúng ta có hoạt động hay không

Với thiết lập này, chúng ta có thể gửi một lệnh như “proxmox start 104” qua email đến Tines, lệnh này sẽ được trích xuất và sau đó gửi đến webhook Home Assistant của chúng ta. Lệnh được diễn giải, các biến được thiết lập và chúng ta nhấn biến “button_entity”.

Cuối cùng, chúng ta đợi 15 giây, sau đó thăm dò cảm biến trạng thái (status_sensor). Nếu nó trả về giá trị mong muốn, chúng ta gửi một lệnh rest_command đến webhook Tines của chúng ta. Lệnh này sẽ kích hoạt một email thông báo hành động thành công hay thất bại, bằng cách kiểm tra xem giá trị mong muốn có khớp với giá trị thực tế hay không.

Cấu hình tự động hóa trong Home Assistant để điều khiển Proxmox LXC thông qua webhook nhận từ TinesCấu hình tự động hóa trong Home Assistant để điều khiển Proxmox LXC thông qua webhook nhận từ Tines

Các nền tảng tự động hóa mở ra những cách thức mới để điều khiển home lab của bạn

Hãy thẳng thắn mà nói: đây là một “giải pháp” được thiết kế quá mức phức tạp cho một vấn đề thực sự không tồn tại. Tuy nhiên, tôi thực hiện nó để chỉ ra cách một công cụ như Tines có thể được sử dụng để tự động hóa việc điều khiển home lab của bạn. Thông qua Home Assistant như một dạng tunnel, bạn có thể kích hoạt giao tiếp hai chiều giữa home lab và nền tảng Tines dựa trên đám mây. Điều này có thể hữu ích theo nhiều cách khác thông qua các công cụ như tích hợp command_line để gửi hướng dẫn đến các máy chủ hoặc container khác trong mạng của bạn.

Đối với những người lo ngại về bảo mật khi sử dụng một công cụ tự động hóa dựa trên đám mây, Tines đặt bảo mật lên hàng đầu. Nền tảng đám mây của họ tuân thủ SOC2 Type 2, mặc dù “tuân thủ” là một chủ đề khác vì không có cơ quan tập trung nào thực hiện các cuộc kiểm toán đó. Tuy nhiên, hãy yên tâm rằng Tines được xây dựng trên nền tảng tự động hóa và bảo mật. Các tài khoản Community Edition, mà tôi đang sử dụng ở đây, chỉ lưu giữ nhật ký trong bảy ngày. Điều này có những hạn chế, chẳng hạn như các tự động hóa dài hạn bị giới hạn trong một tuần, nhưng cũng rất tuyệt vì dữ liệu của bạn sẽ biến mất sau một tuần.

Triển khai một hệ thống như thế này đòi hỏi sự cẩn trọng đặc biệt đối với việc bảo vệ dữ liệu và cách các lệnh của bạn được gọi. Tuy nhiên, nền tảng này được xây dựng để cung cấp loại chức năng đó cho các doanh nghiệp lớn. Một số người thích kiểm soát mọi thứ cục bộ, điều này hoàn toàn dễ hiểu. Đối với những người đó, một công cụ như n8n phù hợp hơn với trường hợp sử dụng của bạn.

Bạn có ý tưởng nào khác để kết nối các dịch vụ tự động hóa và điều khiển home lab một cách sáng tạo không? Hãy chia sẻ ý kiến của bạn trong phần bình luận bên dưới!

Related posts

Wi-Fi 8 và Wi-Fi 7: Khi nào nâng cấp là cần thiết, hay chỉ là “cuộc đua số chấm” vô nghĩa?

Administrator

PowerToys Command Palette Sắp Có Tính Năng Ghim Ứng Dụng Tương Tự Start Menu

Administrator

pfSense và OPNsense: Lựa Chọn Tường Lửa Phần Cứng Nào Tốt Hơn Cho Home Lab Của Bạn?

Administrator