Tự xây AI agent kiểu OpenClaw trên server riêng
Tìm hiểu cách xây personal AI agent kiểu OpenClaw, từ shell command đến browser và file, cùng lý do phải harden trước khi cho agent chạy trên server.
OpenClaw thực sự là gì
OpenClaw là một AI agent cá nhân tự host. Bạn chạy nó trên server của mình, kết nối nó với các chat app bạn đang dùng, rồi nó có thể chạy shell command, điều khiển browser, đọc và ghi file, cũng như xử lý các message bạn gửi. OpenClaw được cấp phép theo MIT, ưu tiên local, và có hơn 380,000 GitHub star tính đến giữa năm 2026. Điều này khiến nó trở thành một trong những project có nhiều star nhất trên nền tảng này. Bên dưới phần ồn ào, nó là một tập hợp khá nhỏ các thành phần được kết nối với nhau theo cách hợp lý. Bài viết này phân tích các thành phần đó để bạn hiểu một công cụ như vậy được xây dựng ra sao và những điểm dễ phát sinh vấn đề nằm ở đâu.
Có một cảnh báo cần nêu trước, vì nó ảnh hưởng đến mọi quyết định thiết kế bên dưới. Trong tháng 3 năm 2026, maintainer của OpenClaw đã công bố hàng loạt security advisory: riêng ngày 13 tháng 3 có 22 advisory, và ngày 16 tháng 3 có thêm 5 advisory. Trong cùng tháng, National Vulnerability Database ghi nhận 199 CVE của OpenClaw được công bố. Đợt ngày 13 tháng 3 gồm 2 lỗ hổng nghiêm trọng được chấm 9.9 trên 10. Một trong số đó là lỗi privilege escalation (CVE-2026-32922), cho phép một device chỉ có quyền pairing tạo full admin token. Project này được thiết kế để chính bạn, người vận hành, harden. Một agent có thể chạy mọi command chỉ an toàn ở mức của server nơi nó chạy và các giới hạn bạn đặt xung quanh nó. Hãy ghi nhớ điều đó khi đọc.
Gateway daemon: một process, giữ ở private
Ở trung tâm là một process chạy liên tục, thường được gọi là gateway. Đây là control plane. Nó nhận message, quyết định cần làm gì, chạy tool và gửi response trở lại. Mọi thành phần khác đều kết nối vào nó.
Điều quan trọng nhất về gateway là địa chỉ nó listen. Khi cài OpenClaw trực tiếp trên host, OpenClaw bind vào địa chỉ loopback, 127.0.0.1, nên không thể truy cập từ Internet trừ khi bạn chủ động expose nó. Container image là ngoại lệ: security docs của OpenClaw cho biết chúng mặc định bind ra ngoài. Vì vậy, nếu chạy container, hãy bật authentication và không publish port của nó ra Internet. Dù theo cách nào, hãy giữ gateway ở private. Đây là process duy nhất chuyên chạy command, nên một gateway bị expose sẽ cho bất kỳ ai tìm thấy nó một foothold từ xa vào server của bạn. Khi cần truy cập từ laptop, hãy dùng VPN hoặc SSH tunnel thay vì mở port. Không ai có thể tấn công một port mà họ không thể truy cập.
Bộ kết nối kênh: nhận tin nhắn và gửi phản hồi
Một agent cá nhân chỉ hữu ích khi bạn có thể nói chuyện với nó từ các ứng dụng bạn đang dùng. Đó là nhiệm vụ của các bộ kết nối kênh. Mỗi bộ kết nối giao tiếp với một nền tảng, chẳng hạn như Telegram, WhatsApp, Slack hoặc Discord, bằng bot API hoặc webhook của nền tảng đó.
Cấu trúc của tất cả bộ kết nối đều giống nhau. Bộ kết nối đăng ký một bot với nền tảng, nhận tin nhắn gửi đến của bạn (bằng cách polling nền tảng hoặc nhận webhook do nền tảng gửi đến), chuyển tin nhắn đó cho gateway, rồi gửi phản hồi của gateway trở lại thông qua cùng API. Bộ kết nối là một lớp chuyển đổi mỏng. Nó chuyển đổi sự kiện “đã nhận một tin nhắn Telegram” thành “đây là nội dung văn bản để agent xử lý”, rồi thực hiện chiều ngược lại. Tự xây dựng một bộ kết nối chủ yếu là đọc tài liệu bot của một nền tảng và ánh xạ định dạng tin nhắn của nền tảng đó vào định dạng của gateway.
Vòng lặp giữa brain và tool
Bên trong gateway là phần biến nó thành một agent thay vì một chatbot. Đó là một vòng lặp.
Một message được gửi đến. Gateway gửi message đó cho language model cùng với danh sách các tool mà model được phép sử dụng. Model đọc message rồi quyết định: trả lời trực tiếp hay gọi một tool. Nếu model gọi tool, gateway chạy tool đó, lấy kết quả rồi gửi kết quả lại cho model. Model xem kết quả và quyết định lại. Quy trình này lặp lại cho đến khi model không còn việc cần làm và tạo ra câu trả lời cuối cùng.
Vòng lặp này là toàn bộ ý tưởng của một agent. Nó giống nhau dù agent chạy trong một chat app hay trên terminal. Để biết cách kết nối tool với vòng lặp này theo một chuẩn thống nhất, hãy đọc tiếp kết nối tool qua Model Context Protocol. Về phía model, tự chạy model trên phần cứng của bạn sẽ bổ sung phần còn lại.
Bộ công cụ là cốt lõi và cũng là mối nguy
Các tool là yếu tố khiến OpenClaw mạnh. Một tool chạy lệnh shell, một tool điều khiển trình duyệt, một tool đọc và ghi file. Khi cấp cho vòng lặp ở trên quyền truy cập vào các tool đó, nó có thể thực hiện gần như mọi việc bạn có thể làm trên bàn phím. Khả năng này là toàn bộ sản phẩm, đồng thời cũng là toàn bộ rủi ro.
Một agent có thể chạy bất kỳ lệnh nào và hoạt động dựa trên chỉ thị nhận từ một ứng dụng chat sẽ tạo ra bề mặt tấn công rất lớn. Một chỉ thị độc hại, một cuộc tấn công prompt injection ẩn trong một trang web mà browser tool truy cập, hoặc một bug như các lỗ hổng vào tháng 3 năm 2026 có thể biến “đọc lịch của tôi” thành “xóa các file của tôi”. Vì vậy, các giới hạn không phải là tùy chọn bổ sung. Chạy agent bằng một user riêng, không có đặc quyền và không có sudo, để việc bị xâm nhập không thể leo thang đặc quyền. Đặt các tool nguy hiểm sau một bước phê duyệt để agent phải hỏi trước khi thực hiện thao tác phá hoại. Sandbox việc thực thi tool để một lệnh chạy ngoài kiểm soát bị cô lập. Tách API key của model để nếu bị lộ, kẻ tấn công không thể chiếm tài khoản của bạn. Đồng thời, hãy xem xét các secret khác đang nằm trên cùng box, vì các điểm yếu thực sự của Vaultwarden là admin token và file backup, không phải cơ chế mã hóa; một agent có quyền shell có thể tiếp cận cả hai.
Trước khi expose bất kỳ thứ gì có thể chạy lệnh shell, hãy chủ động xử lý các bước cơ bản. Tạo checklist cho chính box của bạn tại đây, rồi thực hiện từ đầu đến cuối:
Phần về user không có đặc quyền được trình bày chi tiết trong chạy service bằng user không có đặc quyền, còn hướng dẫn đầy đủ để thiết lập an toàn cho project thực tế nằm trong chạy OpenClaw an toàn trên VPS.
Memory dưới dạng plain file
Hầu hết mọi người nghĩ memory của agent nằm trong database. Với OpenClaw thì không. Nó lưu memory dưới dạng plain Markdown file trên disk, và đây là một lựa chọn đáng học theo. File là source of truth; memory engine mặc định duy trì một SQLite search index bên cạnh các file đó, và index này có thể được rebuild từ file.
File rất đơn giản. Không có schema cần migrate, không có service phải duy trì và không cần học query language. File cũng dễ kiểm tra: bạn có thể mở folder để đọc chính xác agent đang ghi nhớ gì về bạn, sửa một ghi chú sai bằng cách edit file hoặc xóa một memory bằng cách xóa file tương ứng. File cũng portable, vì chuyển agent sang server mới chỉ cần copy một directory. Với personal agent dùng cho một user, một folder chứa text file là đủ, đồng thời giúp toàn bộ system dễ hiểu và dễ kiểm soát.
Kỹ năng: cách portable để thêm khả năng
Ngoài các tool tích hợp sẵn, OpenClaw sử dụng một định dạng skill portable để cộng đồng có thể mở rộng khả năng của nó mà không cần thay đổi core. Một skill là một gói độc lập gồm các instruction và đôi khi có cả code, dùng để dạy agent thực hiện một tác vụ mới. Agent sẽ load skill khi tác vụ yêu cầu. Web search thường là skill đầu tiên mọi người thêm vào, và trỏ skill đó vào instance SearXNG của bạn giúp các query không đi qua commercial search API, đồng thời cho thấy rõ trust boundary của skill nằm ở đâu, vì mọi thứ nó trả về đều là text do một người lạ viết.
Giá trị của một định dạng như vậy là các khả năng có thể được chia sẻ. Một người viết skill cho một công việc cụ thể, publish nó, rồi người khác chỉ cần thêm vào. Sự tiện lợi này cũng có rủi ro, vì skill là code do một người lạ viết và agent của bạn sẽ chạy nó mà không do dự. Vì vậy, trước khi load, bạn nên đưa mọi thứ mình không tự viết qua một security scanner do chính bạn host. Nếu tự xây dựng agent, việc định nghĩa sớm một extension format nhỏ và rõ ràng sẽ giúp bạn không phải hard-code từng capability vào core về sau.
Tự chọn model
OpenClaw không phụ thuộc vào một model cụ thể. OpenClaw không tự phát hành model ngôn ngữ. Thay vào đó, nó kết nối với model do bạn chọn. Model đó có thể chạy qua hosted API hoặc do bạn tự vận hành.
Cách tách này ảnh hưởng trực tiếp đến chi phí, quyền riêng tư và mức độ kiểm soát. Hosted API cung cấp các model mạnh nhất mà bạn không phải quản lý phần cứng. Bạn trả phí theo token, và prompt của bạn rời khỏi server. Model self-hosted, được cung cấp bằng công cụ như Ollama, giữ mọi tin nhắn trên máy của bạn. Chi phí chỉ gồm phần cứng và điện, nhưng bạn phải chấp nhận chạy model nhỏ hơn hoặc chậm hơn. Nhiều người kết hợp cả hai cách. Nếu muốn giữ agent hoàn toàn riêng tư, tự host model trên VPS là phần giúp loại bỏ khoảng cách cuối cùng đó. Hermes Agent cũng là một agent self-hosted đáng để so sánh.
Bạn có nên tự xây dựng một agent không?
Bạn có thể tự xây dựng toàn bộ hệ thống này. Các thành phần không quá đặc biệt: một daemon, một vài chat connector, vòng lặp model-and-tools, một thư mục chứa các file Markdown và một định dạng plugin. Hiểu các thành phần này thực sự hữu ích vì nó giúp bạn hiểu rõ mọi agent sẽ sử dụng và xác định chính xác những nơi có rủi ro.
Nhưng với phần lớn mọi người, câu trả lời thực tế là chạy giải pháp chính thức rồi harden nó, thay vì tự xây lại từ đầu. OpenClaw đã giải quyết phần connector, loop và định dạng skill, đồng thời đã được kiểm tra bảo mật thực tế. Bạn nên tập trung công sức vào phần thực sự thuộc trách nhiệm của mình: setup và hardening trên server của chính bạn. Nếu trước tiên bạn muốn học theo lộ trình thực hành, đi qua các khái niệm theo từng giai đoạn sẽ hiệu quả hơn việc đọc source code của agent ngay từ đầu, vì sau mỗi giai đoạn bạn đều hoàn thành được một thành phần thực tế. Hãy tự xây một bản nhỏ để học. Hãy chạy và khóa bảo mật bản chính thức để sử dụng.
Các nền tảng chung được trình bày trong tự xây dựng AI agent trên VPS, còn xây dựng agent với Claude trình bày các ý tưởng tương tự với một model cụ thể làm bộ não.
FAQ
Xây dựng một agent như OpenClaw có khó không?
Từng thành phần riêng lẻ không khó. Một gateway process, một chat connector, một model-and-tools loop và một folder chứa file đều khá dễ triển khai nếu xét riêng. Phần khó là triển khai chúng an toàn. Một agent chạy shell command từ chat message tạo ra một bề mặt tấn công nghiêm trọng. Việc cấu hình sandbox, permission và chạy bằng unprivileged user đúng cách thường tốn nhiều công sức hơn việc nối các feature lại với nhau.
Tại sao OpenClaw lưu memory dưới dạng Markdown file thay vì database?
Vì với một personal agent dùng cho một user, file là đủ và đơn giản hơn nhiều. Không cần chạy database service, memory dễ đọc và sửa thủ công, còn chuyển agent sang server khác chỉ cần copy một directory. Database chỉ đáng dùng khi hệ thống lớn hơn, không phải trong trường hợp này.
Phần nguy hiểm nhất của một personal AI agent là gì?
Đó là các tool cho phép agent thực hiện hành động: chạy shell command, điều khiển browser và ghi file. Đây là lý do bạn xây dựng agent, đồng thời cũng là lý do agent có thể gây hại cho bạn. Làn sóng security advisory của OpenClaw trong tháng 3 năm 2026, gồm 27 advisory được công bố từ ngày 13 đến ngày 16 tháng 3 và 2 lỗi critical được chấm 9.9, là lý do rõ ràng nhất để xử lý tool layer cẩn thận: chạy bằng unprivileged user, yêu cầu kiểm soát đối với action có thể phá hoại và sandbox việc thực thi.
Tôi có cần tự chạy language model để xây dựng agent không?
Không. Các agent như OpenClaw không phụ thuộc vào một model cụ thể, nên bạn có thể kết nối model mình chọn. Đó có thể là hosted API cho các model mạnh nhất hoặc model do bạn tự chạy để có privacy đầy đủ. Self-host bằng Ollama giúp mọi message nằm trên server của bạn, nhưng đổi lại bạn phải chạy một model nhỏ hơn.