วิธีเข้าถึง Hermes agent บน VPS ผ่านโทรศัพท์มือถือ
เรียนรู้วิธีเชื่อมต่อ Hermes agent เวอร์ชัน v0.20.0 จากโทรศัพท์มือถือผ่านเครือข่าย mesh หรือ public HTTPS พร้อมขั้นตอนการจัดการสิทธิ์และการเพิกถอนการเข้าถึงเมื่ออุปกรณ์สูญหาย
สามวิธีในการเข้าถึง Hermes agent ของคุณจากโทรศัพท์
ในการเข้าถึง Hermes agent จากโทรศัพท์ คุณสามารถใช้เว็บแดชบอร์ดได้ โดยการตัดสินใจที่สำคัญคือสิ่งที่จะวางไว้หน้าแดชบอร์ดนั้น ตัวเลือกแรกคือการใช้เครือข่าย mesh ส่วนตัว ซึ่งแดชบอร์ดจะฟังเฉพาะที่อยู่ 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 ในเครื่องได้ โดยตั้งค่า URL ระยะไกลไปที่ http://<server-address>:9119 ในเมนู Settings ภายใต้หัวข้อ Gateway หรือ export ค่า HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 ก่อนเริ่มใช้งาน วิธีนี้ช่วยแก้ปัญหาการใช้งานบนแล็ปท็อปเครื่องที่สองได้ แต่ไม่สามารถใช้งานบนโทรศัพท์มือถือได้
ส่วนติดต่อผู้ใช้ที่คุณใช้งานผ่านโทรศัพท์คือ hermes dashboard ซึ่งเป็นอินเทอร์เฟซบนเบราว์เซอร์ มันทำหน้าที่จัดการการตั้งค่า, เซสชัน, งาน cron, ทักษะ, บันทึกการทำงาน (logs) และแพลตฟอร์มการส่งข้อความ อีกทั้งยังมี terminal ฝังอยู่ภายใน โดยเซิร์ฟเวอร์จะเรียกใช้ hermes --tui ผ่าน PTY (pseudo-terminal) และสตรีมผลลัพธ์ออกมาบนหน้าเว็บ บนหน้าจอที่มีขนาดแคบ ตัวสลับเซสชันจะถูกพับเก็บเข้าไปในแผง slide-over ทำให้เลย์เอาต์ยังคงใช้งานได้บนโทรศัพท์
โดยค่าเริ่มต้น แผงควบคุมจะฟังคำสั่งที่ 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 อุปกรณ์ทุกเครื่องที่คุณลงทะเบียนจะได้รับที่อยู่ IP ที่เสถียรและสามารถสื่อสารกันได้โดยตรง โทรศัพท์ของคุณจะเข้าร่วมในเครือข่ายเดียวกันนี้ ทำให้แดชบอร์ดไม่จำเป็นต้องเปิดพอร์ตสาธารณะเลย
บนเซิร์ฟเวอร์:
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 หมายความว่า listening socket จะมีอยู่เฉพาะบนอินเทอร์เฟซของ Tailscale เท่านั้น การสแกนพอร์ตที่ IP สาธารณะของคุณจะไม่พบพอร์ต 9119 เพราะไม่มีบริการใดเปิดรอรับการเชื่อมต่ออยู่ ดังนั้นไฟร์วอลล์จึงไม่ใช่ปราการด่านเดียวที่ปกป้องคุณอีกต่อไป ให้ยืนยันผลลัพธ์ด้วย ss -lntp | grep 9119 อีกครั้ง
ที่อยู่สำหรับการผูก (bind address) ยังเป็นตัวกำหนดการยืนยันตัวตน ซึ่งเป็นจุดที่หลายคนมองข้าม บน 127.0.0.1 แดชบอร์ดจะไม่มีการล็อกอิน แต่บนที่อยู่อื่นๆ ระบบจะบังคับให้ต้องผ่านด่านการยืนยันตัวตน และหากไม่ได้กำหนดค่าผู้ให้บริการ (provider) ไว้ เซิร์ฟเวอร์จะปฏิเสธการเริ่มทำงาน โครงการเรียกสิ่งนี้ว่าการล้มเหลวแบบปิด (failing closed) ให้รันโปรแกรมแบบโต้ตอบ (interactive) ในครั้งแรก ระบบจะเสนอให้ตั้งชื่อผู้ใช้และรหัสผ่านทันที โดยจะบันทึกไว้เป็น dashboard.basic_auth ใน ~/.hermes/config.yaml คุณสามารถกำหนดค่าผู้ให้บริการเดียวกันผ่าน ~/.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 key ของโมเดลของคุณไว้ด้วย ดังนั้นควรเก็บรักษาเป็นความลับด้วย 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 admin console ก่อน และโปรดอ่านข้อตกลงในขณะนั้น: ชื่อเครื่องและชื่อ tailnet DNS ของคุณจะถูกเผยแพร่ไปยังบัญชีแยกประเภท certificate transparency สาธารณะ ซึ่งทุกคนสามารถเข้าถึงได้
ต้นทุนที่ต้องแลกคือการพึ่งพา coordination server แม้ว่าการรับส่งข้อมูลระหว่างโทรศัพท์กับ VPS ของคุณจะถูกเข้ารหัสแบบ end-to-end และไม่ได้ผ่าน Tailscale แต่บัญชีที่ทำหน้าที่ตัดสินว่าอุปกรณ์ใดอยู่ในเครือข่าย Mesh นั้นไม่ได้อยู่บนฮาร์ดแวร์ของคุณ หากประเด็นนี้สำคัญสำหรับคุณ ให้รัน control plane ด้วยตนเองผ่าน Headscale, เซิร์ฟเวอร์ควบคุม Tailscale แบบ self-hosted และชี้ให้ไคลเอนต์เชื่อมต่อโดยใช้ tailscale up --login-server https://headscale.example.com หากคุณต้องการยกเลิกการใช้ Mesh และกำหนดค่า peer ด้วยตนเอง การเปรียบเทียบระหว่าง WireGuard แบบปกติกับ Tailscale จะอธิบายถึงสิ่งที่คุณต้องสูญเสียไปจากการเลือกวิธีนั้น
ทางเลือกที่ 2: การเปิดใช้งาน HTTPS แบบสาธารณะและกับดักที่ซ่อนอยู่
ในบางครั้งการใช้งาน mesh อาจไม่สามารถทำได้ หรือโทรศัพท์ของบริษัทอาจไม่อนุญาตให้ติดตั้ง VPN client ในกรณีนี้ dashboard จะต้องอยู่หลัง reverse proxy ให้ตั้งค่า dashboard ไว้ที่ loopback และปล่อยให้ Caddy เป็นผู้จัดการ certificate:
hermes.example.com {
reverse_proxy 127.0.0.1:9119
}Caddy จะดึงและต่ออายุ certificate ด้วยตัวเอง และ reverse_proxy ของมันจะส่งผ่าน WebSocket upgrades โดยไม่ต้องตั้งค่าเพิ่มเติม ซึ่งเป็นสิ่งที่ terminal ภายใน dashboard จำเป็นต้องใช้ สำหรับ nginx คุณต้องเพิ่ม header Upgrade และ Connection ด้วยตัวเอง และ การออกใบรับรอง Let's Encrypt ด้วย Certbot บน nginx จะครอบคลุมส่วนของ TLS ในงานนี้ ให้ระบุชื่อสาธารณะของ Hermes เพื่อให้ login callbacks ชี้ไปยัง host ที่ถูกต้อง:
dashboard:
public_url: "https://hermes.example.com"ตอนนี้มาถึงส่วนที่เป็นกับดัก ระบบตรวจสอบสิทธิ์ (auth gate) จะอ้างอิงจาก bind address ไม่ใช่ที่อยู่ของคำขอที่ส่งเข้ามา หาก dashboard ถูก bind ไว้ที่ 127.0.0.1 หลัง proxy มันจะมองเห็นเป็น loopback และตัดสินว่าไม่จำเป็นต้อง login ทำให้ใครก็ตามที่ 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) ของตัว dashboard เอง:
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"แม้จะทำอย่างถูกต้องแล้ว ทางเลือกนี้ก็ยังมีระดับความเสี่ยงขั้นต่ำที่คุณไม่สามารถลดลงไปได้อีก หน้า login สาธารณะคือหน้าที่ใครก็สามารถเข้าถึงและโจมตีได้ และเบื้องหลังนั้นคือ shell บน VPS ของคุณ ชื่อผู้ใช้และรหัสผ่านเป็นการป้องกันที่เบาบางเกินไปสำหรับกรณีนี้ นี่คือเหตุผลที่เอกสารแนะนำให้ใช้ OAuth หรือ OIDC สำหรับการ bind แบบสาธารณะ ควรจำกัดอัตราการ login (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 คือเชลล์ และเชลล์สามารถทำทุกอย่างที่บัญชีนั้นได้รับอนุญาตให้ทำได้ ดังนั้นการแจ้งเตือนเพื่อขออนุมัติจากตัว agent จึงเป็นปราการด่านสุดท้ายระหว่างโทรศัพท์ที่ถูกขโมยและปลดล็อกไว้ กับไฟล์ของคุณ ควรใช้บัญชีผู้ใช้เฉพาะที่ไม่ใช่ root สำหรับการใช้งานนี้ โดยใช้การยืนยันตัวตนด้วย key เท่านั้น และควรดำเนินการตามขั้นตอน การเพิ่มความปลอดภัยให้ SSH บน VPS ก่อนที่จะนำ key ไปไว้ในอุปกรณ์ที่คุณพกพาติดตัวไปไหนมาไหน
สิ่งที่ใช้งานไม่ได้บนเครือข่ายมือถือ
มี 4 ประเด็นหลัก ซึ่งไม่ใช่บั๊กที่คุณจะแก้ไขได้ด้วยการตั้งค่า
แดชบอร์ดจะล็อกเอาต์คุณออกเมื่อคุณไม่ได้ใช้งาน ระยะเวลาขึ้นอยู่กับผู้ให้บริการล็อกอิน ผู้ให้บริการชื่อผู้ใช้และรหัสผ่านจะออกเซสชันที่มีอายุ 12 ชั่วโมงตามค่าเริ่มต้น ซึ่งกำหนดโดย session_ttl_seconds ภายใต้ dashboard.basic_auth ส่วนผู้ให้บริการ Nous Portal OAuth จะออก access token ที่มี TTL (time to live) 15 นาที และสัญญา API ปัจจุบันไม่มี refresh token เมื่อ token หมดอายุ หน้าเว็บจะได้รับสถานะ 401 และนำทางกลับไปยัง /login ด้วย token ที่มีอายุ 15 นาที หากคุณเปิดแดชบอร์ดแล้วเก็บโทรศัพท์ไว้ในกระเป๋านาน 20 นาที เมื่อกลับมาคุณจะพบหน้าล็อกอินและสิ่งที่คุณกำลังพิมพ์อยู่จะหายไป ทั้งหมดนี้ไม่ใช่ความผิดปกติ เพียงแค่ต้องล็อกอินใหม่เท่านั้น
เทอร์มินัลแบบฝังตัวไม่รองรับการทำงานเมื่อสลับแท็บไปเบื้องหลัง เซิร์ฟเวอร์จะสร้าง 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 เพื่อให้ทำงานได้อีกครั้งหลังจากการรีบูต ขั้นตอนการติดตั้ง gateway ของตัวติดตั้งสามารถดำเนินการส่วนนี้ให้คุณได้ แต่ไม่มีส่วนใดในตัวติดตั้งที่สร้าง unit สำหรับ hermes dashboard ดังนั้น 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 ซึ่งเป็นค่าเริ่มต้นสำหรับแพลตฟอร์มแชทแบบ DM และคุณสามารถตั้งค่านี้ได้อย่างชัดเจนด้วย 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 อย่าพกโทรศัพท์ที่เชื่อมต่อกับ 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 รวมถึงที่เก็บความลับของตัวมันเอง เช่น ~/.hermes/.env ไว้แล้ว ไฟล์ของโปรเจกต์ .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 ได้ ทั้งนี้มี mobile client จากบุคคลที่สามอยู่จริง แต่เนื่องจากเป็นโค้ดจากภายนอกที่ถือครองข้อมูลรับรอง (credentials) ของ agent ของคุณ โปรดตรวจสอบ source code ก่อนทำการติดตั้ง
ทำไม Hermes dashboard ถึงล็อกเอาต์ฉันบนโทรศัพท์?
ขึ้นอยู่กับผู้ให้บริการล็อกอิน (login provider) โดยผู้ให้บริการ OAuth ของ Nous Portal จะออก access token ที่มี TTL 15 นาที และสัญญา API ปัจจุบันไม่มี refresh token ดังนั้นเมื่อ token หมดอายุ หน้าเว็บจะได้รับสถานะ 401 และนำทางไปยัง /login การสลับเบราว์เซอร์ไปทำงานเบื้องหลังบนโทรศัพท์ทำให้เห็นปัญหานี้ชัดเจน เพราะการใช้งานแอปอื่นนานเกิน 20 นาทีก็เพียงพอที่จะทำให้ token หมดอายุ ส่วนผู้ให้บริการแบบ username และ password จะกำหนด session เริ่มต้นไว้ที่ 12 ชั่วโมง ซึ่งตั้งค่าได้โดย session_ttl_seconds สำหรับผู้ให้บริการนี้ ให้ตั้งค่า HERMES_DASHBOARD_BASIC_AUTH_SECRET เป็นค่าสุ่มที่คงที่ เพื่อให้คีย์การลงนาม session (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 เนื่องจากเอกสารของโครงการระบุว่าผู้ให้บริการรหัสผ่านมีไว้สำหรับเครือข่ายที่เชื่อถือได้และ 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 ซึ่งจะส่งข้อความโดยไม่ต้องเรียกใช้งานโมเดล