วิธีเชื่อมต่อ Hermes agent บน VPS ผ่านสมาร์ทโฟนของคุณ
เรียนรู้วิธีเข้าถึง Hermes agent บน VPS จากโทรศัพท์มือถือผ่าน private mesh หรือ HTTPS endpoint พร้อมขั้นตอนการจัดการสิทธิ์และการเพิกถอนการเข้าถึงเมื่ออุปกรณ์สูญหายสำหรับ v0.20.0
สามวิธีในการเข้าถึง Hermes agent จากโทรศัพท์ของคุณ
ในการเข้าถึง Hermes agent จากโทรศัพท์ คุณสามารถใช้เว็บแดชบอร์ดของมันได้ โดยการตัดสินใจที่สำคัญคือสิ่งที่จะวางไว้หน้าแดชบอร์ดนั้น ตัวเลือกที่หนึ่งคือการใช้ private mesh network ซึ่งแดชบอร์ดจะฟังเฉพาะที่อยู่ Tailscale เท่านั้นและไม่มีพอร์ตใดเปิดออกสู่สาธารณะ ตัวเลือกที่สองคือการใช้ public endpoint ที่อยู่หลัง reverse proxy พร้อม TLS (transport layer security) และการล็อกอิน ซึ่งการล็อกอินนี้จะเป็นปราการด่านเดียวที่ปกป้องการเข้าถึง terminal ของเซิร์ฟเวอร์คุณ ตัวเลือกที่สามคือการใช้ SSH (secure shell) จากแอป terminal ซึ่งใช้การตั้งค่าที่น้อยที่สุดและให้สิทธิ์การเข้าถึงมากที่สุด
คู่มือนี้เริ่มต่อจากจุดที่ การรัน Hermes agent บน VPS ของคุณเอง สิ้นสุดลง โดยที่ agent ได้รับการติดตั้งและตอบสนองผ่าน command line เรียบร้อยแล้ว และตอนนี้คุณต้องการใช้งานมันผ่านอุปกรณ์พกพาของคุณ
คำสั่งด้านล่างนี้เขียนขึ้นโดยอ้างอิงกับ tag v2026.8.3 ซึ่งเผยแพร่เมื่อวันที่ 3 สิงหาคม 2026 และระบุไว้ว่าเป็น v0.20.0 ในบันทึกประจำรุ่น (release notes) เนื่องจาก Hermes มีการออกรุ่นบ่อยครั้ง คุณควรล็อกเวอร์ชันของเครื่องไว้ที่ tag แทนการติดตาม main โดยตัวติดตั้งรองรับการระบุ commit:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --commit 3c27eb6234bf
hermes versionhermes version จะแสดงสิ่งที่ติดตั้งอยู่จริง ให้เปรียบเทียบกับ tag ก่อนที่คุณจะเชื่อถือ flag ใดๆ ในหน้านี้
สิ่งที่ repository นี้มีให้และสิ่งที่ไม่มี
ใน repository ของ Hermes ไม่มีแอปพลิเคชันสำหรับ iOS หรือ Android โดยตัว client แบบ native คือ hermes desktop (หรือชื่อเรียกคือ hermes gui) ซึ่งเป็นแอปพลิเคชัน Electron สำหรับ macOS, Windows และ Linux ตัวโปรแกรมสามารถเชื่อมต่อกับ agent ระยะไกลแทนการใช้ agent ในเครื่องได้ โดยให้ตั้งค่า remote URL เป็น http://<server-address>:9119 ในเมนู Settings ภายใต้หัวข้อ Gateway หรือ export ค่า HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 ก่อนเริ่มใช้งาน วิธีนี้ช่วยแก้ปัญหาการใช้งานบนแล็ปท็อปเครื่องที่สอง แต่ไม่สามารถใช้งานบนโทรศัพท์ได้
ส่วนติดต่อผู้ใช้ที่คุณสามารถใช้งานผ่านโทรศัพท์ได้คือ hermes dashboard ซึ่งเป็นอินเทอร์เฟซผ่านเบราว์เซอร์ โดยทำหน้าที่จัดการการตั้งค่า, เซสชัน, cron jobs, ทักษะ (skills), log และแพลตฟอร์มการส่งข้อความ อีกทั้งยังมีการฝัง terminal มาให้ด้วย โดยเซิร์ฟเวอร์จะเรียกใช้ hermes --tui ผ่าน PTY (pseudo-terminal) และสตรีมผลลัพธ์เข้ามาในหน้าเว็บ บนหน้าจอที่มีขนาดแคบ ตัวสลับเซสชันจะถูกพับเก็บเป็นแผง slide-over ทำให้เลย์เอาต์ยังคงใช้งานบนโทรศัพท์ได้
โดยค่าเริ่มต้น dashboard จะฟังการเชื่อมต่อที่ 127.0.0.1:9119 และเปิดแท็บเบราว์เซอร์บนตัวเซิร์ฟเวอร์เอง ซึ่งไม่มีประโยชน์หากใช้งานบน VPS (virtual private server) แบบ headless ให้เริ่มการทำงานโดยไม่เปิดเบราว์เซอร์และตรวจสอบ socket ดังนี้:
hermes dashboard --no-open
ss -lntp | grep 9119การฟังการเชื่อมต่อที่ 127.0.0.1:9119 จะเข้าถึงได้จากภายในเซิร์ฟเวอร์เท่านั้น ส่วนการฟังการเชื่อมต่อที่ 0.0.0.0:9119 จะเข้าถึงได้จากทุกเครือข่ายที่เครื่องเชื่อมต่ออยู่ รวมถึงเครือข่ายสาธารณะ บรรทัดเดียวนี้เป็นตัวตัดสินว่าระบบของคุณเปิดเผยต่อภายนอกมากน้อยเพียงใด ดังนั้นควรตรวจสอบให้แน่ชัดแทนการคาดเดาเอาเอง
ทางเลือกที่ 1: เครือข่ายส่วนตัวแบบ Mesh ด้วย Tailscale
ให้เลือกวิธีนี้หากไม่มีเหตุผลจำเป็นอื่น Tailscale คือ Mesh VPN (Virtual Private Network) ที่สร้างบนพื้นฐานของ WireGuard อุปกรณ์ทุกเครื่องที่คุณลงทะเบียนจะมีที่อยู่คงที่และสื่อสารกันได้โดยตรง โทรศัพท์ของคุณจะเข้าร่วมเครือข่ายเดียวกัน ทำให้แดชบอร์ดไม่จำเป็นต้องเปิดพอร์ตสาธารณะเลย
บนเซิร์ฟเวอร์:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4ติดตั้งแอป Tailscale บนโทรศัพท์และลงชื่อเข้าใช้ด้วยบัญชีเดียวกัน จากนั้นใช้ tailscale status บนเซิร์ฟเวอร์เพื่อดูรายการอุปกรณ์ที่เชื่อมต่อตามชื่อ ตอนนี้ให้ผูก (bind) แดชบอร์ดเข้ากับที่อยู่ที่ tailscale ip -4 แสดงไว้:
hermes dashboard --host 100.101.102.103 --port 9119 --no-openการผูกกับที่อยู่ของเครือข่าย Mesh แทนที่จะเป็น 0.0.0.0 หมายความว่า socket ที่รอรับการเชื่อมต่อจะอยู่บนอินเทอร์เฟซของ Tailscale เท่านั้น การสแกนพอร์ตบน IP สาธารณะของคุณจะไม่พบพอร์ต 9119 เพราะไม่มีบริการใดรอรับการเชื่อมต่ออยู่ ดังนั้น Firewall จึงไม่ใช่ปราการด่านเดียวของคุณอีกต่อไป ยืนยันผลลัพธ์ด้วย ss -lntp | grep 9119 อีกครั้ง
ที่อยู่สำหรับผูก (bind address) ยังเป็นตัวกำหนดการยืนยันตัวตน ซึ่งเป็นส่วนที่หลายคนมองข้าม บน 127.0.0.1 แดชบอร์ดจะไม่มีการล็อกอิน แต่บนที่อยู่อื่นๆ ระบบจะบังคับให้ผ่านประตูการยืนยันตัวตน และหากไม่ได้ตั้งค่าผู้ให้บริการไว้ เซิร์ฟเวอร์จะปฏิเสธการเริ่มทำงาน โครงการเรียกสิ่งนี้ว่าการล้มเหลวแบบปิด (failing closed) ให้รันแบบโต้ตอบ (interactive) ในครั้งแรก ระบบจะเสนอให้ตั้งชื่อผู้ใช้และรหัสผ่านทันที ผลลัพธ์จะถูกเขียนลงใน ~/.hermes/.env:
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=you
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=scrypt$16384$8$1$...
HERMES_DASHBOARD_BASIC_AUTH_SECRET=a-long-random-stringสร้าง secret นั้นด้วย openssl rand -hex 32 แล้วไม่ต้องแก้ไขอะไรอีก มันถูกใช้สำหรับเซ็นชื่อใน session cookie ดังนั้นหากเปลี่ยนค่านี้ อุปกรณ์ทุกเครื่องจะถูกบังคับให้ออกจากระบบ ไฟล์เดียวกันนี้ยังเก็บ API keys ของโมเดลไว้ด้วย ดังนั้นควรจำกัดสิทธิ์ให้เป็นส่วนตัวด้วย chmod 600 ~/.hermes/.env
ตรวจสอบประตูการเข้าถึงจากเครื่องอื่นในเครือข่าย Mesh ก่อนที่คุณจะเชื่อใจมัน:
curl -s http://100.101.102.103:9119/api/status | jq '.auth_required, .auth_providers'true ตามด้วย ["basic"] หมายความว่าระบบป้องกันเปิดใช้งานอยู่และผู้ให้บริการรหัสผ่านเป็นผู้ตอบสนอง เอกสารของโครงการระบุไว้อย่างชัดเจนเกี่ยวกับผู้ให้บริการรายนี้ว่า: ออกแบบมาสำหรับเครือข่ายที่เชื่อถือได้หรือ VPN เท่านั้น ไม่เหมาะสำหรับแดชบอร์ดที่เปิดรับอินเทอร์เน็ตสาธารณะ ซึ่งบนเครือข่าย Mesh สถานการณ์ของคุณก็เป็นไปตามเงื่อนไขนี้พอดี
สำหรับการใช้งาน HTTPS ภายใน tailnet ให้ส่งต่อพอร์ตไปยัง Tailscale:
sudo tailscale serve --bg localhost:9119
sudo tailscale serve statusTailscale จะทำ TLS termination ด้วยใบรับรองที่ออกให้สำหรับชื่อ MagicDNS ของเครื่องนั้นๆ ทำให้เบราว์เซอร์หยุดแจ้งเตือนและ session cookie จะได้รับ flag Secure ให้เปิดใช้งาน MagicDNS และ HTTPS Certificates ในหน้า DNS ของคอนโซลผู้ดูแลระบบ Tailscale ก่อน และโปรดอ่านคำยืนยันในหน้านั้นด้วย: ชื่อเครื่องและชื่อ tailnet ของคุณจะถูกเผยแพร่ไปยังบัญชีแยกประเภท certificate transparency สาธารณะ ซึ่งทุกคนสามารถอ่านได้
ต้นทุนที่ต้องแลกคือเซิร์ฟเวอร์ประสานงาน (coordination server) การรับส่งข้อมูลระหว่างโทรศัพท์และ VPS ของคุณจะถูกเข้ารหัสแบบ end-to-end และไม่ได้ผ่าน Tailscale แต่บัญชีที่ตัดสินว่าอุปกรณ์ใดเป็นส่วนหนึ่งของเครือข่ายไม่ได้อยู่บนฮาร์ดแวร์ของคุณ หากประเด็นนี้สำคัญ ให้รัน control plane ด้วยตนเองผ่าน Headscale ซึ่งเป็นเซิร์ฟเวอร์ควบคุม Tailscale ที่โฮสต์เอง และชี้ไคลเอนต์ไปยังเซิร์ฟเวอร์นั้นโดยใช้ tailscale up --login-server https://headscale.example.com หากคุณต้องการยกเลิกการใช้ Mesh และตั้งค่า peer ด้วยตนเอง การเปรียบเทียบระหว่าง WireGuard แบบปกติกับ Tailscale จะครอบคลุมถึงสิ่งที่คุณต้องสูญเสียไปหากเลือกวิธีนั้น
ทางเลือกที่ 2: การเปิดใช้งาน HTTPS แบบสาธารณะและกับดักที่ซ่อนอยู่
ในบางครั้งการใช้งาน mesh อาจไม่สามารถทำได้ โทรศัพท์ของบริษัทอาจไม่อนุญาตให้ติดตั้ง VPN client ในกรณีนี้แดชบอร์ดจะต้องอยู่หลัง reverse proxy ให้รันแดชบอร์ดบน loopback และปล่อยให้ Caddy เป็นผู้จัดการ certificate:
hermes.example.com {
reverse_proxy 127.0.0.1:9119
}Caddy จะดึงและต่ออายุ certificate ด้วยตัวเอง และ reverse_proxy ของมันจะส่งผ่าน WebSocket upgrades โดยไม่ต้องตั้งค่าเพิ่มเติม ซึ่งเป็นสิ่งที่ terminal ในตัวของแดชบอร์ดต้องการ สำหรับ nginx คุณต้องเพิ่ม header Upgrade และ Connection ด้วยตนเอง และ การออก certificate ของ Let's Encrypt ด้วย Certbot บน nginx จะครอบคลุมส่วนงานด้าน TLS ในส่วนนี้ ให้ระบุชื่อสาธารณะของ Hermes เพื่อให้ login callbacks ชี้ไปยังโฮสต์ที่ถูกต้อง:
dashboard:
public_url: "https://hermes.example.com"ตอนนี้คือกับดัก ประตูกั้นการยืนยันตัวตนจะตรวจสอบจาก bind address ไม่ใช่จากที่อยู่ที่คำขอส่งมา แดชบอร์ดที่ผูกไว้กับ 127.0.0.1 หลัง proxy จะมองเห็นเป็น loopback และตัดสินใจว่าไม่จำเป็นต้องล็อกอิน จึงให้บริการแก่ใครก็ตามที่ proxy ยอมให้ผ่านเข้ามา ตรวจสอบสิ่งที่คุณเผยแพร่ออกไปจริง ๆ:
curl -s https://hermes.example.com/api/status | jq '.auth_required'หากผลลัพธ์แสดงเป็น false แสดงว่าอินเทอร์เน็ตเข้าถึง terminal บนเซิร์ฟเวอร์ของคุณได้ผ่าน URL เพียงลิงก์เดียว โดยไม่มีการเจาะระบบเกิดขึ้นและไม่มีข้อความแจ้งเตือนใน log มีวิธีแก้ไขสองประการที่คุณควรเลือกใช้อย่างน้อยหนึ่งวิธี: ให้ใส่การยืนยันตัวตนไว้ที่ proxy โดยใช้ Authentik ในฐานะผู้ให้บริการ single sign-on แบบ self-hosted ไว้ด้านหน้าผ่าน forward auth หรือกำหนดค่า OIDC (OpenID Connect) ของตัวแดชบอร์ดเอง:
HERMES_DASHBOARD_OIDC_ISSUER=https://auth.example.com/application/o/hermes/
HERMES_DASHBOARD_OIDC_CLIENT_ID=hermes-dashboard
HERMES_DASHBOARD_OIDC_SCOPES="openid profile email"แม้จะทำอย่างถูกต้องแล้ว ทางเลือกนี้ยังมีระดับความปลอดภัยขั้นต่ำที่คุณไม่สามารถลดลงไปได้อีก หน้าล็อกอินสาธารณะเป็นหน้าที่ใครก็สามารถเข้าถึงและโจมตีได้ และด้านหลังหน้านั้นคือ shell บน VPS ของคุณ ชื่อผู้ใช้และรหัสผ่านเป็นการป้องกันที่เบาบางเกินไปสำหรับกรณีนี้ นี่คือเหตุผลที่เอกสารแนะนำให้ใช้ OAuth หรือ OIDC สำหรับการ bind แบบสาธารณะ ให้จำกัดอัตราการล็อกอิน (rate limit), รักษา ufw ให้ปิดกั้นทุกอย่างยกเว้นพอร์ตของ proxy และ SSH และตรวจสอบ access log เป็นระยะ
ทางเลือกที่ 3: การใช้ SSH และ mosh จากเทอร์มินัลบนมือถือ
วิธีที่ใช้ความพยายามน้อยที่สุดคือการติดตั้งแอปเทอร์มินัลบนโทรศัพท์ นำเข้า SSH key และใช้ส่วนติดต่อข้อความของตัว agent โดยตรง
ssh you@vps.example.com
tmux new -A -s phone
hermes --tuitmux new -A -s phone จะเชื่อมต่อเข้ากับเซสชันที่ชื่อ phone หรือสร้างเซสชันใหม่หากยังไม่มีอยู่ เพื่อให้ตัว agent ทำงานต่อไปได้แม้การเชื่อมต่อจะหลุด และคุณจะกลับมายังจุดเดิมได้ในครั้งถัดไป รูปแบบนี้เป็นวิธีเดียวกับที่ใช้ในการ ควบคุม Claude Code จากโทรศัพท์
การใช้ SSH ปกติผ่านเครือข่ายมือถือมักไม่สะดวกนัก เพราะการเชื่อมต่อจะหลุดทุกครั้งที่โทรศัพท์เปลี่ยนหมายเลข IP หรือเข้าสู่โหมดพักหน้าจอ Mosh ช่วยแก้ปัญหานี้ได้ โดยทำงานผ่าน UDP (user datagram protocol) และซิงค์สถานะของเทอร์มินัลแทนการส่งข้อมูลแบบ byte stream ทำให้เซสชันยังคงอยู่แม้คุณจะเดินออกจาก Wi-Fi ไปยังเครือข่ายเซลลูลาร์:
sudo apt install -y mosh
sudo ufw allow 60000:61000/udpจากโทรศัพท์ ให้รันคำสั่ง mosh you@vps.example.com โดย Mosh จะเริ่มการทำงานของ mosh-server ผ่านการล็อกอิน SSH ที่มีอยู่เดิม จากนั้นจะย้ายเซสชันไปใช้ UDP ในช่วงพอร์ต 60000 ถึง 61000 ซึ่งเป็นเหตุผลว่าทำไมจึงจำเป็นต้องเปิดพอร์ตในช่วงดังกล่าว
ความเสี่ยงด้านความปลอดภัยคือประเด็นสำคัญ เซสชัน SSH ก็คือเชลล์ (shell) และเชลล์สามารถทำทุกอย่างที่บัญชีผู้ใช้นั้นทำได้ ดังนั้นการแจ้งเตือนเพื่อขออนุมัติจาก agent จึงเป็นปราการด่านสุดท้ายระหว่างโทรศัพท์ที่ถูกปลดล็อกและขโมยไป กับไฟล์ข้อมูลของคุณ ควรใช้บัญชีผู้ใช้เฉพาะที่ไม่ใช่ root สำหรับงานนี้ โดยใช้การยืนยันตัวตนด้วย key เท่านั้น และควรดำเนินการตามขั้นตอน การเพิ่มความปลอดภัยให้ SSH บน VPS ก่อนที่จะนำ key ไปไว้ในอุปกรณ์ที่คุณพกพาติดตัวไปไหนมาไหน
สิ่งที่ใช้งานไม่ได้บนเครือข่ายมือถือ
มีอยู่ 4 ประการ และไม่มีข้อใดเป็นบั๊กที่คุณสามารถแก้ไขได้ด้วยการตั้งค่า
แดชบอร์ดจะล็อกเอาต์คุณออกเมื่อคุณไม่ได้ใช้งาน Access token มีค่า TTL (time to live) อยู่ที่ 15 นาที และสัญญา API ปัจจุบันยังไม่มีระบบ refresh token เมื่อ token หมดอายุ หน้าเว็บจะได้รับสถานะ 401 และนำทางกลับไปยัง /login หากคุณเปิดแดชบอร์ดทิ้งไว้แล้วเก็บโทรศัพท์ใส่กระเป๋านานยี่สิบนาที เมื่อกลับมาดูอีกครั้งคุณจะพบหน้าจอล็อกอินและข้อมูลที่กำลังพิมพ์อยู่จะหายไป ทั้งหมดนี้ไม่ใช่ความผิดปกติ เพียงแค่ล็อกอินใหม่อีกครั้ง
เทอร์มินัลแบบฝังตัวไม่สามารถคงสถานะได้เมื่อสลับแท็บไปเบื้องหลัง เซิร์ฟเวอร์จะสร้าง TUI (text user interface) ขึ้นมาหลัง PTY และปิดการทำงานอย่างสมบูรณ์เมื่อปิดแท็บ การเปิดใหม่จะเป็นการสร้างเซสชันใหม่ทั้งหมด เบราว์เซอร์บนมือถือจะยกเลิกการทำงานของแท็บที่อยู่เบื้องหลังเพื่อคืนหน่วยความจำ ดังนั้นการสลับไปใช้แอปอื่นนานเกินไปจะทำให้เทอร์มินัลนั้นสิ้นสุดลง ประวัติการแชทของคุณยังคงปลอดภัยเนื่องจากเซสชันถูกจัดเก็บไว้บนเซิร์ฟเวอร์และ hermes sessions list ยังคงแสดงข้อมูลเหล่านั้นอยู่ แต่ตัวเทอร์มินัลเองไม่สามารถเชื่อมต่อกลับเข้าไปใหม่ได้ หากคุณต้องการเซสชันที่คงอยู่ถาวร ให้ใช้ tmux ผ่าน SSH แทน
การเชื่อมต่อที่ไม่ได้ใช้งานจะถูกตัดเงียบๆ ผู้ให้บริการเครือข่ายมือถือจะตัดการเชื่อมต่อ TCP ที่ไม่ได้ใช้งานเพื่อคืนพื้นที่ในตาราง NAT (network address translation) และโทรศัพท์จะหยุดการรับส่งข้อมูลเครือข่ายเกือบทั้งหมดเมื่อหน้าจอดับลง WebSocket ที่เงียบไปสักพักมักจะถูกตัดการเชื่อมต่อแล้วเมื่อคุณปลดล็อกหน้าจอ และหน้าเว็บจะเชื่อมต่อใหม่ก็ต่อเมื่อคุณแตะหน้าจอเท่านั้น นี่คือเหตุผลที่ mosh ให้ความรู้สึกที่ดีกว่า SSH บนโทรศัพท์ เพราะมันไม่มีการเชื่อมต่อที่ต้องคอยรักษาไว้
ไม่มีการแจ้งเตือนแบบ push ทั้งแดชบอร์ดและเซสชัน SSH ไม่สามารถปลุกโทรศัพท์ของคุณได้ เนื่องจากไม่มีแอป Hermes ติดตั้งอยู่ในอุปกรณ์ จึงไม่มีช่องทางเชื่อมต่อไปยังบริการ push ของแพลตฟอร์ม เมื่อการทำงานของ agent ที่ใช้เวลานานเสร็จสิ้น คุณจะทราบผลก็ต่อเมื่อคุณกลับมาตรวจสอบด้วยตนเองเท่านั้น
การแจ้งเตือนจะถูกส่งผ่าน messaging gateway
วิธีแก้ไขสำหรับปัญหาล่าสุดคือการใช้ gateway ซึ่งเป็นช่องทางในการเข้าถึง agent ที่แตกต่างออกไปโดยสิ้นเชิง hermes gateway จะเชื่อมต่อ agent เข้ากับแพลตฟอร์มรับส่งข้อความต่างๆ รวมถึง Telegram, Discord, Slack, WhatsApp, Signal และอีเมล จากนั้นคุณจะสามารถสื่อสารกับ agent ได้ภายในแอปพลิเคชันที่มีช่องทาง push notification บนโทรศัพท์ของคุณอยู่แล้ว ซึ่งจัดการการส่งข้อมูลเบื้องหลังและการเชื่อมต่อเครือข่ายที่ไม่เสถียรได้เป็นอย่างดี
hermes gateway setup
hermes gateway install
hermes gateway statushermes gateway install จะลงทะเบียน gateway ให้เป็น systemd service เพื่อให้ทำงานต่อได้หลังจากรีบูตเครื่อง ตัวติดตั้ง Hermes ไม่ได้สร้าง service unit ให้คุณ ดังนั้น hermes dashboard จะไม่กลับมาทำงานเองหลังจากรีสตาร์ท คุณต้องเขียน unit สำหรับส่วนประกอบที่คุณใช้งาน โดยสามารถดูรายละเอียดเกี่ยวกับไฟล์ดังกล่าวได้ที่ การเขียน systemd services และ timers บน VPS
งานที่ตั้งเวลาไว้สามารถส่งผลลัพธ์ในลักษณะเดียวกันได้โดยไม่ต้องมีการโต้ตอบ:
hermes send -t telegram -s "Backup report" -f /home/you/report.txtการอนุญาตสิทธิ์ในที่นี้จะใช้หลักการปฏิเสธไว้ก่อน (deny by default) หากไม่ได้ตั้งค่า allowlist และไม่ได้กำหนดค่า GATEWAY_ALLOW_ALL_USERS ผู้ใช้ทุกคนจะถูกปฏิเสธการเข้าถึง ซึ่งเป็นจุดเริ่มต้นที่ถูกต้อง คุณสามารถระบุบัญชีที่ต้องการอนุญาตได้ใน ~/.hermes/.env:
TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789หรือเลือกเปิดใช้งานการจับคู่ด้วยรหัส (code-based pairing) แทนการวาง numeric ID โดยการตั้งค่า unauthorized_dm_behavior: pair ใน ~/.hermes/config.yaml เมื่อบัญชีที่ไม่รู้จักส่งข้อความถึง agent ระบบจะส่งรหัส 8 ตัวอักษรกลับไป และจะไม่มีการดำเนินการใดๆ จนกว่าคุณจะอนุมัติ:
hermes pairing list
hermes pairing approve telegram ABC12DEF
hermes pairing revoke telegram 123456789รหัสจะมีอายุการใช้งานหนึ่งชั่วโมง ผู้ใช้สามารถขอรหัสใหม่ได้ทุกๆ สิบนาที และหากป้อนรหัสผิดพลาดครบห้าครั้ง บัญชีนั้นจะถูกล็อกทันที
การจำกัดขอบเขตความเสียหายเมื่อโทรศัพท์ถูกขโมย
โทรศัพท์ที่สามารถเข้าถึง agent ของคุณได้ คือโทรศัพท์ที่สามารถรันคำสั่งบนเซิร์ฟเวอร์ของคุณได้ และโทรศัพท์เป็นสิ่งที่สูญหายได้ คุณควรตัดสินใจตั้งแต่ตอนนี้ว่าผู้ที่ถือโทรศัพท์เครื่องนั้นจะสามารถทำอะไรได้บ้าง
คงการอนุมัติไว้เสมอ approvals.mode มีค่าเริ่มต้นเป็น smart ซึ่งจะเรียกใช้โมเดลเสริมเพื่อประเมินความเสี่ยงและอนุมัติเฉพาะคำสั่งที่มีความเสี่ยงต่ำโดยอัตโนมัติ การตั้งค่าเป็น off จะมีผลเหมือนกับการรันทุกอย่างด้วย --yolo และ HERMES_YOLO_MODE=1 จะดำเนินการผ่าน environment variable อย่าพกพาโทรศัพท์ที่เชื่อมต่อกับ agent ในสถานะดังกล่าว ให้ตั้งค่า approvals.cron_mode: deny เพื่อไม่ให้งานที่ตั้งเวลาไว้สามารถอนุมัติด้วยตนเองในขณะที่คุณกำลังนอนหลับ
approvals:
mode: smart
cron_mode: denyจำกัดขอบเขตที่ agent สามารถสร้างความเสียหายได้ terminal.backend: docker จะรันคำสั่งภายใน container ที่ตัด Linux capabilities ทั้งหมดออกยกเว้นรายการที่กำหนดไว้สั้นๆ พร้อมทั้งตั้งค่า no-new-privileges และจำกัดจำนวน process เพื่อให้ container กลายเป็นขอบเขตแทนที่จะเป็น prompt ปกติ terminal.cwd จะกำหนด working directory ให้คงที่ HERMES_WRITE_SAFE_ROOT จะจำกัด write_file และ patch ให้อยู่เฉพาะในไดเรกทอรีที่คุณระบุเท่านั้น และการเขียนข้อมูลภายนอกไดเรกทอรีเหล่านี้จะถูกบล็อกโดยไม่มีการอนุมัติใดๆ มายกเลิกได้
export HERMES_WRITE_SAFE_ROOT=/home/you/projects:/home/you/.hermesHermes บล็อกการเขียนลงใน ~/.ssh, ~/.aws, ~/.kube และ /etc/sudoers โดยอัตโนมัติ รวมถึงปฏิเสธการเขียนไฟล์ .env ลงในดิสก์ทุกกรณี และปฏิเสธรายการคำสั่งที่เป็นอันตรายอย่างเด็ดขาดไม่ว่าการตั้งค่าการอนุมัติของคุณจะเป็นอย่างไร ให้ถือว่าสิ่งนี้เป็นเพียงมาตรฐานขั้นต่ำ ไม่ใช่แผนการป้องกันทั้งหมดของคุณ ให้รัน agent ในฐานะผู้ใช้ทั่วไป ห้ามรันในฐานะ root โดยเด็ดขาด ตรรกะเดียวกันนี้ใช้กับ coding agent ใดๆ ที่ปล่อยให้รันโดยไม่มีผู้ดูแล และ การรัน Claude Code อย่างปลอดภัยบน VPS ได้อธิบายรายละเอียดในส่วนนี้ไว้แล้ว
จากนั้นให้จดบันทึกขั้นตอนการเพิกถอนสิทธิ์ไว้ก่อนที่คุณจะจำเป็นต้องใช้ การลบอุปกรณ์ออกจาก Tailscale admin console จะตัดการเข้าถึงเครือข่าย mesh ทันที การเปลี่ยนค่า HERMES_DASHBOARD_BASIC_AUTH_SECRET และรีสตาร์ทบริการจะทำให้ session ของ dashboard บนทุกอุปกรณ์หมดอายุลง เนื่องจากค่าดังกล่าวใช้สำหรับลงนามใน session cookie การลบ public key ของโทรศัพท์ออกจาก ~/.ssh/authorized_keys จะเป็นการยุติการเข้าถึงผ่าน SSH ส่วน hermes pairing revoke telegram <user-id> จะเป็นการลบบัญชีผู้ใช้งาน หากอุปกรณ์นั้นเก็บข้อมูลใดๆ ที่สามารถอ่าน provider keys ของคุณได้ ให้ยกเลิกคีย์เหล่านั้นด้วย hermes auth logout <provider> และออกคีย์ใหม่จากผู้ให้บริการ
ตรวจสอบผลลัพธ์แทนการคาดเดา คำสั่งเหล่านี้เป็นคำสั่งที่ต้องรันบนเครื่องของคุณเอง และสิ่งที่แสดงผลออกมาจะขึ้นอยู่กับการตั้งค่าของคุณ:
tailscale status
hermes pairing list
hermes logs gateway -n 100
hermes status --deeplog จะถูกเก็บไว้ที่ ~/.hermes/logs/ ให้อ่าน log เหล่านี้หลังจากเกิดเหตุการณ์ และควรอ่านเป็นครั้งคราวแม้ในเวลาที่ไม่มีเหตุการณ์ใดๆ เกิดขึ้นก็ตาม
FAQ
มีแอปพลิเคชัน Hermes บนมือถืออย่างเป็นทางการสำหรับ iOS หรือ Android หรือไม่?
ไม่มี Hermes repository มีเพียง command line interface, web dashboard และ Electron desktop client สำหรับ macOS, Windows และ Linux เท่านั้น ไม่มีการสร้าง build สำหรับ iOS หรือ Android โดยตรงจากผู้พัฒนา หากใช้งานผ่านโทรศัพท์ คุณสามารถใช้ web dashboard ผ่านเบราว์เซอร์, SSH client หรือแพลตฟอร์มรับส่งข้อความที่เชื่อมต่อผ่าน hermes gateway ได้ ทั้งนี้มีแอปพลิเคชันจากบุคคลที่สามอยู่จริง แต่เนื่องจากเป็นโค้ดที่ไม่ได้พัฒนาโดยทีมงานหลักและต้องถือครองข้อมูลรับรอง (credentials) ของ agent ของคุณ โปรดตรวจสอบซอร์สโค้ดก่อนทำการติดตั้ง
ทำไม Hermes dashboard ถึงล็อกเอาต์ฉันออกจากระบบบนโทรศัพท์?
Access token มีระยะเวลา TTL 15 นาที และสัญญา API ปัจจุบันยังไม่มีระบบ refresh token เมื่อ token หมดอายุ หน้าเว็บจะได้รับสถานะ 401 และเปลี่ยนเส้นทางไปยัง /login การสลับแอปเบราว์เซอร์ไปไว้เบื้องหลังบนโทรศัพท์ทำให้เกิดปัญหานี้ได้ง่าย เพราะการใช้งานแอปอื่นเกิน 20 นาทีก็เพียงพอที่จะทำให้ token หมดอายุ ให้ตั้งค่า HERMES_DASHBOARD_BASIC_AUTH_SECRET เป็นค่าสุ่มที่คงที่เพื่อให้ session signing key ไม่เปลี่ยนแปลงทุกครั้งที่รีสตาร์ท ซึ่งจะช่วยขจัดสาเหตุที่สองของการถูกล็อกเอาต์ออกจากระบบ
ฉันสามารถเปิดใช้งาน Hermes dashboard บนอินเทอร์เน็ตสาธารณะได้อย่างปลอดภัยหรือไม่?
ทำได้เฉพาะเมื่อคุณมีการยืนยันตัวตนที่ตรวจสอบด้วยตนเองแล้วเท่านั้น ระบบ auth gate จะทำงานตาม bind address ดังนั้น dashboard ที่ผูกไว้กับ 127.0.0.1 ซึ่งอยู่หลัง reverse proxy จะไม่ร้องขอการล็อกอินจากอินเทอร์เน็ต ให้รันคำสั่ง curl -s https://your-host/api/status | jq '.auth_required' และตรวจสอบผลลัพธ์ที่ได้ ควรใช้ OAuth หรือ OIDC แทนการใช้ username และ password เนื่องจากเอกสารของโครงการระบุว่า password provider เหมาะสำหรับเครือข่ายที่เชื่อถือได้และ VPN เท่านั้น การใช้ private mesh จะช่วยตัดปัญหาเรื่องนี้ไปได้โดยสิ้นเชิง ซึ่งเป็นเหตุผลว่าทำไมจึงเป็นค่าเริ่มต้นที่แนะนำ
ฉันจำเป็นต้องมีบัญชี Tailscale หรือสามารถ self-host control plane เองได้หรือไม่?
คุณสามารถ self-host ได้ Headscale เป็น implementation แบบโอเพนซอร์สของ Tailscale coordination server ซึ่ง Tailscale client อย่างเป็นทางการสามารถเชื่อมต่อได้ด้วย tailscale up --login-server https://headscale.example.com จากนั้นคุณจะเป็นผู้ควบคุมรายการอุปกรณ์ที่ได้รับอนุญาตให้เข้าสู่ mesh เอง ข้อแลกเปลี่ยนคือคุณต้องดูแลและสำรองข้อมูลเซิร์ฟเวอร์นั้นด้วยตนเอง และในขณะที่เซิร์ฟเวอร์ล่ม คุณจะไม่สามารถลงทะเบียนหรือยืนยันตัวตนอุปกรณ์ใหม่ได้
ฉันจะรับการแจ้งเตือนบนโทรศัพท์เมื่อ agent ทำงานเสร็จได้อย่างไร?
ให้ใช้ messaging gateway เนื่องจาก dashboard และ SSH ไม่มีวิธีปลุกโทรศัพท์ให้ตื่นขึ้นมาได้ เพราะไม่มีแอป Hermes บนอุปกรณ์เพื่อรับ push notification ให้เชื่อมต่อ agent เข้ากับ Telegram, Signal, Discord หรือแพลตฟอร์มอื่นที่รองรับผ่าน hermes gateway setup แล้วปล่อยให้แอปของแพลตฟอร์มเหล่านั้นเป็นผู้ส่งการแจ้งเตือน นอกจากนี้ยังสามารถใช้ cron job เพื่อส่งข้อความแจ้งเตือนผ่าน hermes send -t telegram -s "Job done" -f /path/to/report.txt ซึ่งจะส่งข้อความโดยไม่ต้องเรียกใช้งานโมเดล