AI Agent Hermes Agent DevOps Self-Hosted Automation

Hermes Agent: trợ lý AI cá nhân chạy trên VPS riêng

Ngô Vũ Nhật
5 phút đọc

Self-host một AI agent trên VPS riêng trước hết là vì bạn muốn tự giữ ba thứ: dữ liệu, thời gian phục hồi khi lỗi, và quyền can thiệp trực tiếp khi có sự cố, những thứ khó có được từ một SaaS đóng gói kín. Hermes Agent (viết bằng Python, của Nous Research) là bộ harness tôi đang chạy 24/7, nối với tôi qua Telegram và Discord để nhận việc hàng ngày. Bài này gom những đúc kết từ hơn một năm vận hành trên VPS sản xuất: chỗ nào tôi từng vấp tôi ghi rõ ở chỗ đó.


1. Kiến trúc Gateway 24/7 và Quản lý Session

Khác với các script chạy tạm trong tmux, tiến trình hermes-gateway nên chạy như một systemd user unit để tự phục hồi khi có sự cố. Cấu hình này tôi đã dùng thật:

# ~/.config/systemd/user/hermes-gateway.service
[Unit]
Description=Hermes AI Agent Gateway
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/ubuntu/.hermes
ExecStart=/home/ubuntu/.hermes/venv/bin/hermes gateway run
Restart=always
RestartSec=10
EnvironmentFile=/home/ubuntu/.hermes/.env

[Install]
WantedBy=default.target

Một chi tiết dễ quên: loginctl enable-linger ubuntu. Không bật linger thì service chỉ sống trong phiên SSH của bạn, và tôi đã từng mất vài buổi tối vì gateway im lặng sau khi ngắt SSH. Xem nhật ký bằng journalctl --user -u hermes-gateway -f.

Gateway kết nối liên tục với Telegram (long polling) hoặc Discord (websocket). Khi người dùng gửi tin nhắn, gateway tiếp nhận và giao quyền xử lý cho sessiontool.

Ngữ cảnh của agent được tổ chức thành hai thành phần chính:

  • SOUL.md: tính cách, giọng điệu phản hồi và các đường lối an toàn mà agent không được vượt.
  • Thư mục memories/: ngữ cảnh dài hạn, dạng markdown, tích lũy theo thời gian.

2. Kỹ năng nạp theo ngữ cảnh (Context-driven Skills)

Hermes có khoảng 125 skill markdown đi kèm. Điểm hay của nó là không nhồi toàn bộ tài liệu vào prompt (cách nhanh nhất để đốt context window):

  • Mỗi skill có file frontmatter định nghĩa mục đích và từ khóa nhận diện.
  • Khi người dùng đưa ra yêu cầu (như phân tích log, truy vấn database, kiểm tra SSL), gateway quét bộ chỉ mục và chỉ nạp tài liệu của skill tương ứng vào prompt lượt đó.
  • Sau khi tác vụ kết thúc, ngữ cảnh prompt được dọn dẹp để đảm bảo tốc độ phản hồi và tiết kiệm token.

3. Cron nội bộ và chuyện dàn tải

Các tác vụ định kỳ của trợ lý (tổng hợp commit, kiểm tra hạ tầng mỗi sáng) do cron nội bộ đảm nhiệm, gồm hai mảnh:

  • cron/jobs.json: danh sách job, biểu thức cron, prompt hoặc script, và đích nhận kết quả (chat ID trên Telegram/Discord).
  • deliveries.db (SQLite): lịch sử gửi tin kèm hash nội dung, để khi mạng gián đoạn nó không gửi lại tin trùng.

Cờ --script và --no-agent

Job cố định (in thông báo, chạy backup script) không cần LLM. Cấu hình --script kết hợp --no-agent để gateway chạy thẳng script và đẩy output về Telegram, không gọi LLM. Những job này tốn đúng 0 token.

Dàn tải khi nhiều job cùng mốc (“herd stagger”)

Nhiều cron job cùng kick đầu giờ (00:00) là công thức cho nghẽn CPU hoặc đụng rate limit API. Các job chạy trùng mốc sẽ bị dè nhau ra vài giây (5–30s ngẫu nhiên), đồ thị tài nguyên VPS nhờ đó phẳng thay vì gai. Chỉnh nhỏ nhưng tôi từng thấy nó cứu một buổi sáng với 12 job cùng rơi vào vùng 7:30.


4. Dashboard web và CLI

Ngoài Telegram còn hai kênh điều khiển:

  • Web Dashboard: giao diện quản lý chạy local, xem trạng thái kết nối bot, token tiêu thụ theo ngày, danh sách cron. Ảnh chụp thật của dashboard này ở phía dưới. Lưu ý: chỉ giữ dashboard ở localhost, truy cập qua SSH tunnel (ssh -L 9119:localhost:9119 user@vps-ip), đừng mở ra Internet.

Dashboard web của Hermes Agent: chat, sessions, cron, skills...

  • CLI query nhanh: khi đang ở terminal SSH:
    hermes chat -q "Liệt kê 3 tiến trình đang dùng nhiều RAM nhất"
    Lệnh chạy độc lập, in kết quả ra console rồi thoát, tiện để ghép vào pipeline.

5. Phân quyền (Approvals)

Tra quyền thực thi cho AI là chuyện nên làm từng nấc. Hermes có ba chế độ:

Chế độCách chạyKhi nào dùng
manualMọi lệnh đều dừng chờ bạn bấm xác nhận trên Telegram.Đang thử một công cụ mới, chưa tin.
smartLệnh đọc (ls, cat) tự cho qua; lệnh ghi (rm, reboot) hỏi lại.Chế độ chạy hằng ngày, tôi dùng cái này.
offTự do chạy hết.Chỉ hợp trong container cô lập.

Với cron ban đêm khi không ai trực, cấu hình cron_mode / unattended_mode cho phép chọn sẵn approve hay deny cho từng nhóm lệnh.

Các công cụ tích hợp sẵn: terminal (bash có timeout), execute_code (sandbox Python), browser (trình duyệt headless tự động hóa), và session_search (tìm lại nội dung hội thoại cũ).


6. Quản trị bộ nhớ (Memory)

Để tránh phình to context window, Hermes có trần ngân sách bộ nhớ ngắn hạn:

memory_char_limit: 2200

~2.200 ký tự vừa đủ cho quy ước danh tính và tóm tắt công việc gần nhất. Đây là điểm từng khiến tôi lúng túng: file memory cũ của tôi 64KB, không bao giờ nhồi vừa. Cách làm là giữ file con trỏ và cho agent đọc theo nhu cầu (read-on-demand); tri thức dài hạn thì đưa sang Supermemory self-host, được vector hóa và agent chỉ truy xuất đoạn tương đồng khi cần.

Lời kết

Sau hơn một năm, thứ tôi đánh giá cao nhất ở mô hình này không phải tính năng, mà là quyền kiểm soát: không ai đóng cửa API, không ai thu phí lại theo seat, và khi có sự cố tôi vào thẳng server sửa. Chi phí đổi lấy là công vận hành systemd, cron và backup — với tôi, đó là mức giá hợp lý.

Nếu bạn định bắt đầu, mẹo của tôi: cài manual mode cho tuần đầu, đọc journalctl mỗi ngày, và chỉ nới quyền dần khi bạn hiểu agent của mình chạy gì.