SSD Nodes Learn
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-07-24

วิธีติดตั้ง OpenHands บน VPS ด้วย Docker

เรียนรู้วิธีติดตั้ง OpenHands บน VPS โดยใช้ Docker พร้อมแนวทางป้องกันความเสี่ยงจากการ mount Docker socket เพื่อความปลอดภัยสูงสุดในการรัน untrusted code

OpenHands คืออะไร และความเสี่ยงหนึ่งประการที่ต้องทำความเข้าใจเป็นอันดับแรก

OpenHands หรือชื่อเดิมคือ OpenDevin คือ autonomous software-engineering agent คุณสามารถสั่งงานด้วยภาษาทั่วไป จากนั้นระบบจะวางแผนการทำงาน เขียนโค้ด รันคำสั่ง อ่านผลลัพธ์ และทำงานซ้ำจนกว่างานจะเสร็จสิ้น คุณสามารถรันระบบนี้บน server ของตนเองด้วย Docker และเชื่อมต่อกับ language model โดยหากรันบน VPS ระบบจะกลายเป็น coding agent ที่ทำงานแทนคุณในขณะที่คุณไม่ได้อยู่หน้าจอ

มีข้อเท็จจริงหนึ่งที่ต้องนำมาพิจารณาในการตั้งค่าทั้งหมด OpenHands ไม่ได้เพียงแค่แนะนำโค้ด แต่ระบบจะรันโค้ดนั้นด้วย และเพื่อให้ทำเช่นนั้นได้ container ของ controller จะทำการ mount host Docker socket ไว้ที่ /var/run/docker.sock เพื่อให้สามารถสร้าง sandbox containers สำหรับแต่ละงานได้ สิ่งใดก็ตามที่สามารถสื่อสารกับ Docker socket ได้ จะสามารถสร้าง container ใหม่ที่สามารถ mount filesystem ทั้งหมดของ host ได้ ซึ่งหมายความว่าการเข้าถึง socket นี้มีสิทธิเทียบเท่า root บนเครื่องนั้น ดังนั้นควรปฏิบัติกับเครื่องที่รัน OpenHands เสมือนเป็น server ที่รัน untrusted code เพราะนั่นคือสิ่งที่ระบบทำจริง การเลือกวิธี hardening ทั้งหมดด้านล่างนี้อ้างอิงจากหลักการดังกล่าว

สิ่งที่คุณต้องมี

คุณต้องมี VPS ที่รัน Ubuntu 24.04 พร้อม Docker Engine เวอร์ชันล่าสุด, RAM อย่างน้อย 4 GB และ API key สำหรับ language model (OpenAI, Anthropic หรือ Google) หรือใช้ local model ที่รันผ่าน Ollama on the same VPS OpenHands รองรับ model backends จำนวนมาก คุณสามารถเลือกใช้ตามต้องการ หากคุณไม่เคยตั้งค่า container มาก่อน the basics of Docker on a VPS จะครอบคลุมเนื้อหาพื้นฐานที่คู่มือนี้ใช้เป็นฐาน

ติดตั้งด้วย Docker

OpenHands ประกอบด้วย 2 images คือ application image สำหรับรันตัวแอปพลิเคชัน และ agent-server image ที่ระบบจะ pull มาเพื่อรัน sandbox ของแต่ละงาน รันด้วยคำสั่งดังนี้ โดยให้แทนที่ด้วย tag ปัจจุบันจากเอกสารของโปรเจกต์:

docker run -it --rm --pull=always \
  -e AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server \
  -e AGENT_SERVER_IMAGE_TAG=1.26.0-python \
  -e LOG_ALL_EVENTS=true \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v ~/.openhands:/.openhands \
  -p 127.0.0.1:3000:3000 \
  --add-host host.docker.internal:host-gateway \
  --name openhands \
  docker.openhands.dev/openhands/openhands:1.8

รายละเอียดสองประการจะช่วยลดความสับสนได้หนึ่งชั่วโมง: ประการแรก image ของแอปและ agent-server มีเลขเวอร์ชันที่ต่างกันโดยตั้งใจ ดังนั้นห้ามพยายามทำให้เลขตรงกัน ให้ใช้ agent-server tag ที่ระบุคู่กับเวอร์ชันของแอปในเอกสาร ประการที่สอง ให้สังเกตการใช้ -p 127.0.0.1:3000:3000 แทนที่จะเป็น -p 3000:3000 การเปลี่ยนเพียงจุดเดียวนี้คือความแตกต่างระหว่าง Web UI ที่เข้าถึงได้เฉพาะคุณ กับ Web UI ที่คนทั้งอินเทอร์เน็ตสามารถเข้าถึงได้ ซึ่งจะกล่าวถึงในหัวข้อถัดไป

ปิดการเข้าถึง Web UI จากอินเทอร์เน็ตสาธารณะ

OpenHands ให้บริการ interface บน port 3000 เนื่องจาก interface นี้ควบคุม agent ที่รันโค้ด การเปิดเผย interface นี้สู่สาธารณะจึงเป็นการเปิดช่องทางให้ใครก็ตามที่พบเจอสามารถสั่งรันคำสั่งผ่านกระบวนการในเครื่องได้ ให้ bind ไว้ที่ loopback ตามคำสั่งรันด้านบน และเข้าใช้งานผ่าน laptop ของคุณด้วย SSH tunnel:

ssh -L 3000:127.0.0.1:3000 you@your-vps

จากนั้นให้เปิด http://127.0.0.1:3000 บนเครื่องของคุณ การรับส่งข้อมูลจะวิ่งผ่าน SSH session ที่มีอยู่เดิม และจะไม่มีการเปิด port ใหม่บนอินเทอร์เน็ตสาธารณะ สำหรับการตั้งค่าแบบถาวร แนะนำให้ใช้ VPN แทน ไม่ว่าจะวิธีใดก็ตาม ควรตั้งค่า default-deny firewall ไว้หน้าเครื่องเพื่อป้องกันการเปิดเผยข้อมูลโดยไม่ตั้งใจ และโปรดจำไว้ว่า firewall ที่ครอบคลุมเฉพาะ IPv4 จะยังคงเปิด port เดิมไว้บน IPv6 ซึ่งเป็น IPv6 firewall gap ที่ทำให้ผู้ใช้จำนวนมากประสบปัญหา

แยก model key และ credentials ของ repo ออกจากกัน

OpenHands จำเป็นต้องใช้ API key สำหรับ model และมักต้องใช้ token สำหรับการ clone และ push ไปยัง repository ของคุณ ทั้งสองอย่างนี้สามารถใช้จ่ายเงินและกระทำการแทนคุณได้ ดังนั้นควรปฏิบัติกับสิ่งเหล่านี้เหมือนรหัสผ่าน ให้เก็บไว้ใน environment file ที่อนุญาตให้เฉพาะ account ที่ถูกต้องเท่านั้นที่อ่านได้ ห้ามใส่ไว้ในคำสั่งรันเพราะจะปรากฏใน shell history และ process list และห้ามเก็บไว้ในไฟล์ภายใน git repository

รันบนเครื่องที่สามารถลบทิ้งได้ทันที

เนื่องจาก controller จำเป็นต้องถือ Docker socket ไว้ คุณจึงไม่สามารถทำ sandbox เพื่อแยก OpenHands ออกจาก host ได้อย่างสมบูรณ์ วิธีการบรรเทาความเสี่ยงที่แท้จริงคือการแยกด้วยตำแหน่งการติดตั้ง (isolation by placement) โดยให้รัน OpenHands บน VPS เฉพาะทางที่ไม่มีข้อมูลสำคัญอื่น ๆ ไม่ควรรันบน server เครื่องเดียวกับที่ใช้รัน database หรือเว็บไซต์ของคุณ ควรทำ snapshot ไว้ก่อนเริ่มใช้งาน และให้ rebuild จาก snapshot นั้นแทนการเชื่อถือเครื่องที่รันโค้ดที่เขียนโดย agent มาเป็นเวลาหนึ่งสัปดาห์ VPS ราคาถูกที่ใช้งานเฉพาะทางและลบทิ้งได้คือทางเลือกที่เหมาะสมที่สุด

การทำ hardening ให้กับเครื่องที่รันระบบ

ส่วนที่เหลือคือมาตรฐานความปลอดภัยของ server (server hygiene) ซึ่งมีความสำคัญมากกว่าปกติในกรณีนี้เนื่องจากลักษณะงานมีความเสี่ยงสูงกว่าปกติ ให้สร้าง unprivileged admin user แทนการทำงานด้วยสิทธิ์ root ตามแนวทาง running services as an unprivileged user เปลี่ยนการเข้าถึง SSH ให้เป็นแบบ key-only จากนั้นให้รันรายการตรวจสอบด้านล่างและเก็บไว้ในที่ที่คุณสามารถกลับมาดูได้อีกครั้ง

ToolVPS hardening checklist

หากต้องการทำความเข้าใจกลไกการทำงานแทนที่จะเพียงแค่รันคำสั่ง ให้ดูที่ building your own AI agent on a VPS หรือหากต้องการแพลตฟอร์มที่เขียนโค้ดน้อยกว่า self-hosting Dify จะเป็นทางเลือกที่เริ่มต้นได้ง่ายกว่า

FAQ

Is OpenHands safe to run on a server?

สามารถทำได้หากมีการระมัดระวัง แต่มีความเสี่ยงสูงกว่า web app ทั่วไป เนื่องจากระบบมีการเขียนและรันโค้ด และ controller ถือ host Docker socket ซึ่งมีสิทธิเทียบเท่า root บนเครื่อง ให้รันบน VPS เฉพาะทางที่ลบทิ้งได้และไม่มีข้อมูลสำคัญอื่น ๆ ให้ Web UI ทำงานบน loopback ผ่าน SSH tunnel หรือ VPN แยก key ออกจากกัน และทำ hardening ให้กับเครื่อง ห้ามรันระบบนี้ร่วมกับบริการสำคัญอื่น ๆ ของคุณ

Why does OpenHands need the Docker socket?

OpenHands รันแต่ละงานใน sandbox container ใหม่ และจะสั่งให้ host Docker daemon สร้าง container เหล่านั้นโดยการ mount /var/run/docker.sock เข้าไปใน controller สิ่งนี้ทำให้ container ของ controller สามารถควบคุม Docker บน host ได้ ซึ่งเป็นสิ่งที่ทรงพลังและมีความเสี่ยง ดังนั้นตัว host เองจึงต้องถูกปฏิบัติเสมือนเป็นเครื่องที่รัน untrusted code

Can OpenHands use a local model instead of a paid API?

ได้ OpenHands รองรับ local models ที่รันผ่าน Ollama หรือ vLLM ดังนั้นคุณสามารถรันแบบ self-hosted ได้เต็มรูปแบบโดยไม่มีค่าใช้จ่ายต่อ token และไม่มีข้อมูลหลุดออกจาก server ของคุณ คุณต้องมีเครื่องที่มีหน่วยความจำเพียงพอสำหรับ coding model ที่มีประสิทธิภาพ ซึ่งเป็นประเด็นเรื่องขนาดเครื่องแบบเดียวกับที่ระบุไว้ในคู่มือ Ollama

Should I run OpenHands on my main server?

ไม่ควร เนื่องจากระบบรันโค้ดที่เขียนโดย agent และถือ Docker socket ไว้ ให้รันบน VPS แยกต่างหากที่ใช้งานเฉพาะทางและคุณพร้อมที่จะ rebuild ใหม่ การรันร่วมกับ database, เว็บไซต์ หรือบริการอื่น ๆ หมายความว่าความผิดพลาดจาก agent หรือ bug ในระบบอาจเข้าถึงสิ่งที่มันไม่ควรเข้าถึงได้