Migrate từ OpenClaw sang Hermes: kinh nghiệm thực chiến
Di chuyển một trợ lý AI đang chạy thật sang nền tảng mới là bài toán vận hành, không phải bài toán cài đặt: người dùng vẫn cần nhận tin nhắn hàng ngày, cron job quan trọng không được trượt, và tuyệt đối không lộ secret hay để hai bot giành nhau tin nhắn.
Bài này là quy trình tôi đã đi qua khi chuyển từ OpenClaw sang Hermes Agent trên một VPS sản xuất — gồm 10 pha (P0–P10), kèm danh sách “bãi đất mìn” mà tôi tự dẫm hoặc suýt dẫm.
1. Quy trình Di trú Chi tiết (P0 – P10)
Quy trình được chuẩn hóa qua 10 giai đoạn tuần tự nhằm kiểm soát rủi ro ở từng bước:
P0 — Kết nối SSH và Bảo vệ Phiên làm việc
Trước khi bắt đầu, duy trì phiên làm việc trong tmux để tránh rớt mạng làm ngắt quãng lệnh ghi cấu hình:
tmux new -s agent-migration
P1 — Audit Khảo sát Hệ thống (Read-Only)
Khảo sát tài nguyên hiện có của OpenClaw mà không chạy lệnh ghi:
- Kiểm tra tiến trình:
ps aux | grep openclaw - Kiểm tra crontab hệ thống:
crontab -l - Kiểm tra thư mục dữ liệu và SQLite database:
ls -lh ~/.openclaw/data/
P2 — Snapshot SQLite
Mở database đang chạy bằng cách ghi trực tiếp là rủi ro lớn. Dùng lệnh backup nội bộ của SQLite để có bản nhất quán:
sqlite3 ~/.openclaw/data/claw.db ".backup ~/.openclaw/data/claw_backup_$(date +%Y%m%d).db"
P3 — Thiết lập Thư mục Staging Cô lập
Đồng bộ dữ liệu sang thư mục staging để chuẩn bị chuyển đổi độc lập:
rsync -av --exclude 'node_modules' --exclude '*.log' ~/.openclaw/ ~/.hermes-staging/
P4 — Chạy Thử nghiệm hermes claw migrate (Dry-run)
Sử dụng công cụ di trú tích hợp sẵn của Hermes ở chế độ kiểm tra trước:
hermes claw migrate --source ~/.hermes-staging --dry-run
Lệnh phân tích các model, skills và cấu hình tương thích, đồng thời chỉ ra các file persona cần nạp thủ công.
P5 — Trích xuất Secrets từ SQLite sang .env
Truy vấn các API token lưu trong SQLite của OpenClaw và chuyển vào file .env của Hermes:
sqlite3 ~/.hermes-staging/data/claw.db "SELECT key, value FROM secrets;" > /tmp/secrets.txt
Chuyển các cặp giá trị vào ~/.hermes/.env và xóa ngay file tạm để bảo mật.
P6 — Tách Biệt Bot Token Telegram (Split Token)
Lưu ý về mã lỗi 409 Conflict: Telegram Bot API sử dụng Long Polling. Nếu cả OpenClaw cũ lẫn Hermes staging cùng dùng chung một bot token để lấy tin nhắn (
getUpdates), Telegram sẽ trả mã lỗi HTTP 409 liên tục và cả hai đều không nhận được tin.
Tạo một bot phụ riêng (@YourBot_Staging_Bot) cho giai đoạn thử nghiệm. Chỉ hoán đổi về token chính thức ở bước cutover.
P7 — Tái cấu trúc Cron từ Hai Nguồn
OpenClaw chia tác vụ ở cả SQLite cron_jobs và crontab hệ điều hành. Hermes gộp toàn bộ về cron/jobs.json.
- Phân loại tác vụ: Với tác vụ cố định (in thông báo, chạy bash script), dùng cờ
--scriptkết hợp--no-agentđể chạy thẳng không qua LLM, tiết kiệm 100% token. - Kỹ thuật Herd Stagger: Thêm độ trễ dãn cách giữa các job chạy lúc đầu giờ (00:00:00, 00:00:15…) để tránh nghẽn CPU và nghẽn rate limit API.
P8 — Đồng bộ Cấu hình tương đương (Config Parity)
- Timezone: Cấu hình rõ ràng timezone của hệ thống trong Hermes trước khi tạo job.
- Phân quyền (Approvals): Đặt chế độ
smartcho ban ngày vàcron_mode: approvehoặcdenycho các tác vụ ban đêm. - Home Channel: Khai báo ID chat mặc định trên Telegram để nhận cảnh báo hạ tầng.
P9 — Cutover
Chuyển giao trong khung giờ thấp điểm, mọi lệnh đã luyện sẵn thành checklist:
- Dừng OpenClaw:
systemctl --user stop openclaw - Cập nhật token Telegram chính thức vào
~/.hermes/.env - Khởi động gateway Hermes:
systemctl --user start hermes-gateway - Smoke test: Gửi tin nhắn kiểm tra phản hồi theo
SOUL.md, thử nghiệm 1 lệnh terminal kiểm tra approvals, kích hoạt 1 job thử nghiệm với--repeat 1. - Kịch bản Rollback: Nếu smoke test phát sinh lỗi, dừng Hermes và bật lại OpenClaw trong vòng dưới 60 giây.
P10 — Decommission
Sau 48 giờ chạy ổn trên Hermes mới đụng tay vào hạ tầng cũ:
- Tắt hẳn service cũ:
systemctl --user disable --now openclaw - Dọn các dòng OpenClaw trong crontab (
crontab -e). - Nén lưu trữ
jobs.jsonphục vụ kiểm toán. Tuyệt đối KHÔNG gộp file.envvào kho lưu trữ không mã hóa.
2. Bãi đất mìn: những lỗi tôi tự dẫm hoặc suýt dẫm
| Bẫy | Hiện tượng | Cách xử |
|---|---|---|
| Cron herd kills | Nhiều job cùng giây làm RAM tăng vọt, OOM killer hạ gục gateway luôn. | Herd stagger: dè job ra 5–30 giây. |
| Crontab self-delete | Một tay gõ crontab -r thay vì -e là sạch toàn bộ lịch của máy chủ. | Luôn dùng -e; backup trước (crontab -l > cron.bak). |
| Allowlist false-BLOCKED | Agent báo không chạy được lệnh quen thuộc vì tham số nằm ngoài whitelist. | Đọc journalctl, thêm đúng cú pháp lệnh vào allowlist. |
Venv parity cho hermes send | Cron hệ thống gọi hermes send mà thiếu thư viện venv → lỗi câm. | Trỏ binary tuyệt đối: /home/ubuntu/.hermes/venv/bin/hermes. |
| Session reset trơ | Chờ bot tự reset phiên đêm như OpenClaw, nhưng phiên vẫn giữ nguyên. | Hermes đã bỏ reset theo giờ — muốn mới thì gõ /new. |
Ghi rõ ở đây cho ai đi sau: chỉ mình mục Session reset trơ là tôi thề đã lẩm bẩm “sao bot không nhớ lại được” một buổi sáng trước khi đọc changelog.
Tổng kết
Migration thành công không nằm ở lệnh hermes claw migrate chạy xong, mà ở chất lượng các pha P1–P4: audit kỹ, snapshot sạch, mọi thứ test trên staging trước. Cutover chỉ là 5 phút thực thi checklist.
Số đáng nhớ nhất của đợt tôi làm: từ khi dừng OpenClaw đến khi Hermes trả lời tin nhắn đầu tiên trên Telegram là dưới 2 phút, không mất một cron job nào. Với kịch bản rollback sẵn, rủi ro của cả vụ gần như chỉ còn là tâm lý.