CLI commands

ฟลีต

openclaw fleet

openclaw fleet จัดการอินสแตนซ์ OpenClaw แบบสมบูรณ์ที่เรียกว่า เซลล์ แต่ละเซลล์มี Gateway, สถานะ, ข้อมูลประจำตัว, บัญชีช่องทาง, คอนเทนเนอร์ และพอร์ตโฮสต์ที่รับการเชื่อมต่อผ่านลูปแบ็กเท่านั้นเป็นของตนเอง ใช้หนึ่งเซลล์ต่อหนึ่งขอบเขตความไว้วางใจของผู้เช่าแต่ละราย อย่าใช้ Gateway ที่ใช้ร่วมกันเป็นขอบเขตแบบหลายผู้เช่าที่ไม่ไว้วางใจกัน

Fleet อยู่ในสถานะ ทดลอง ชื่อคำสั่ง แฟล็ก รูปแบบเอาต์พุต และโปรไฟล์คอนเทนเนอร์อาจเปลี่ยนแปลงระหว่างรุ่นโดยไม่มีช่วงแจ้งเลิกใช้ล่วงหน้า

Fleet รองรับ Docker และ Podman อิมเมจเริ่มต้นคือ ghcr.io/openclaw/openclaw:latest

Fleet ได้รับการทดสอบบนโฮสต์ Linux และ macOS ปัจจุบันยังไม่ได้ทดสอบโฮสต์ Windows

เริ่มต้นอย่างรวดเร็ว

bash
openclaw fleet create acmeopenclaw fleet status acmeopenclaw fleet list

fleet create แสดงโทเค็น Gateway ที่สร้างขึ้นเพียงครั้งเดียวพร้อมกับ URL ของเซลล์ ให้จัดเก็บโทเค็นทันที จากนั้นกำหนดค่าบัญชีช่องทางของผู้เช่าแต่ละรายภายในเซลล์ของผู้เช่ารายนั้น

ID ผู้เช่า

ID ผู้เช่าต้องตรงกับ:

text
^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$

รูปแบบนี้อนุญาตให้ใช้อักษรพิมพ์เล็ก ตัวเลข และยัติภังค์ภายใน รวมทั้งหมด 1 ถึง 40 ตัวอักษร ID ต้องขึ้นต้นและลงท้ายด้วยตัวอักษรหรือตัวเลข ระบบจะปฏิเสธอักษรพิมพ์ใหญ่ ขีดล่าง เครื่องหมายทับ จุด ช่องว่าง และสตริงสำหรับการข้ามพาธ เช่น ../acme

ID จะกลายเป็นส่วนหนึ่งของชื่อคอนเทนเนอร์: openclaw-cell-<tenant>

fleet create

สร้างเซลล์และเริ่มทำงาน:

bash
openclaw fleet create acme

สร้างเซลล์ Podman บนพอร์ตคงที่โดยไม่เริ่มทำงาน:

bash
openclaw fleet create acme \  --runtime podman \  --port 19125 \  --no-start

ส่งตัวแปรสภาพแวดล้อมเฉพาะผู้เช่าโดยระบุ --env ซ้ำ:

bash
openclaw fleet create acme \  --env TZ=America/Los_Angeles \  --env OPENCLAW_DISABLE_BONJOUR=1

คีย์สภาพแวดล้อมใช้อักษร ตัวเลข และขีดล่างได้ และห้ามขึ้นต้นด้วยตัวเลข ค่าต้องอยู่ในบรรทัดเดียว เนื่องจาก Fleet ส่งค่าเหล่านี้ผ่านไฟล์สภาพแวดล้อมรันไทม์ที่มีการป้องกัน Fleet ปฏิเสธความพยายามเขียนทับตัวแปรพาธคอนเทนเนอร์และโทเค็น Gateway ที่ได้รับการจัดการ ซึ่งระบุไว้ใน พื้นที่จัดเก็บและโครงร่างคอนเทนเนอร์

ตัวเลือกการสร้าง

ตัวเลือก ค่าเริ่มต้น คำอธิบาย
--image <ref> ghcr.io/openclaw/openclaw:latest อิมเมจคอนเทนเนอร์สำหรับเซลล์
--runtime <runtime> docker CLI ของคอนเทนเนอร์: docker หรือ podman
--port <number> จัดสรรโดยอัตโนมัติจาก 19100 พอร์ตโฮสต์ลูปแบ็ก พอร์ตที่เลือกไว้อย่างชัดเจนต้องไม่เป็นของเซลล์อื่นที่ลงทะเบียนไว้
--memory <value> 2g ขีดจำกัดหน่วยความจำคอนเทนเนอร์ตามไวยากรณ์ของ Docker/Podman
--cpus <value> 2 ขีดจำกัด CPU ของคอนเทนเนอร์
--disk <size> ไม่มี จำกัดเลเยอร์ที่เขียนได้ของคอนเทนเนอร์เมื่อแบ็กเอนด์พื้นที่จัดเก็บรองรับโควตา
--network <mode> bridge โหมดเครือข่ายขาออก: bridge หรือ internal
--pids-limit <number> 512 จำนวนกระบวนการสูงสุดในคอนเทนเนอร์
--env &lt;KEY=VALUE&gt; ไม่มี ส่งตัวแปรสภาพแวดล้อมไปยังเซลล์ ระบุซ้ำสำหรับหลายค่า
--gateway-token <value> โทเค็นเลขฐานสิบหกแบบสุ่ม 32 อักขระ ใช้โทเค็น Gateway ที่ระบุแทนการสร้างใหม่ ดูการจัดการโทเค็น
--no-start เซลล์เริ่มทำงาน สร้างคอนเทนเนอร์โดยไม่เริ่มทำงาน
--json เอาต์พุตที่มนุษย์อ่านได้ แสดงเอาต์พุตที่เครื่องอ่านได้

การจัดสรรอัตโนมัติจะเลือกพอร์ตรีจิสทรีแรกที่ยังไม่ใช้งานซึ่งมีค่าตั้งแต่ 19100 ขึ้นไป Fleet ปฏิเสธ ID ผู้เช่าที่ซ้ำกันและพอร์ตที่ระบุไว้อย่างชัดเจนซึ่งกำหนดให้เซลล์อื่นแล้ว

การอ้างอิงอิมเมจจะถูกส่งเป็นอาร์กิวเมนต์รันไทม์คอนเทนเนอร์หนึ่งรายการ ระบบปฏิเสธการอ้างอิงที่ว่างเปล่าและค่าที่ขึ้นต้นด้วย - เพื่อป้องกันไม่ให้อิมเมจถูกตีความว่าเป็นตัวเลือกของ Docker หรือ Podman

เอนด์พอยต์ Docker หรือ Podman ที่เลือกต้องเป็นแบบภายในเครื่อง Fleet ปฏิเสธบริบท Docker ระยะไกล เอนด์พอยต์ DOCKER_HOST และบริการ Podman ระยะไกล ก่อนจองพอร์ตหรือสร้างสถานะภายในเครื่อง ไม่รองรับโฮสต์เซลล์ระยะไกล

เมื่อ Fleet เริ่มเซลล์ใหม่ คำสั่ง create จะรอประมาณสูงสุดหนึ่งนาทีให้ Gateway ตอบกลับ /healthz หากเซลล์ไม่พร้อมใช้งาน Fleet จะเก็บคอนเทนเนอร์และแถวรีจิสทรีไว้สำหรับ fleet status, fleet logs หรือการลบอย่างชัดเจน --no-start จะข้ามเกตตรวจสอบสถานะนี้ โทเค็น Gateway ที่สร้างขึ้นของเซลล์ใหม่ซึ่งไม่พร้อมใช้งานจะไม่สูญหาย โดยยังคงอยู่ในสภาพแวดล้อมคอนเทนเนอร์ (docker|podman inspect) และเนื่องจากเซลล์ยังไม่ได้ให้บริการทราฟฟิกใด ๆ การใช้ fleet rm --force แล้วสร้างใหม่จึงเป็นทางเลือกที่ปลอดภัยเสมอ

การตรึงด้วยไดเจสต์

คำสั่ง create และ upgrade รองรับการอ้างอิงอิมเมจที่ตรึงด้วยไดเจสต์ เช่น --image ghcr.io/openclaw/openclaw@sha256:<digest> Fleet ส่งการอ้างอิงอิมเมจไปยัง Docker หรือ Podman โดยตรงโดยไม่เปลี่ยนแปลง ซึ่งช่วยให้ผู้ปฏิบัติงานคงเซลล์ไว้กับไบต์อิมเมจที่เปลี่ยนแปลงไม่ได้ แทนที่จะใช้แท็กที่เคลื่อนไหวได้

ผลลัพธ์จากการสร้างประกอบด้วย ID ผู้เช่า ชื่อคอนเทนเนอร์ พอร์ตโฮสต์ โทเค็น Gateway และ URL ภายในเครื่อง แม้จะเป็นเอาต์พุต JSON ก็ให้ถือว่าผลลัพธ์มีข้อมูลลับ เนื่องจากมีโทเค็นอยู่

ขีดจำกัดดิสก์

--disk จำกัดเฉพาะเลเยอร์ที่เขียนได้ของคอนเทนเนอร์ ไดเรกทอรีสถานะและการยืนยันตัวตนแยกตามผู้เช่าที่เมานต์แบบผูกยังคงใช้พื้นที่จัดเก็บของโฮสต์ ให้ใช้โควตาโปรเจกต์ของระบบไฟล์โฮสต์เมื่อไดเรกทอรีเหล่านั้นต้องมีขีดจำกัดตายตัวด้วย

แบ็กเอนด์รันไทม์/พื้นที่จัดเก็บ การรองรับ --disk
Docker overlay2 บน XFS ต้องใช้ตัวเลือกการเมานต์ XFS pquota
Docker btrfs หรือ zfs รองรับโดยไดรเวอร์พื้นที่จัดเก็บ
Podman overlay ต้องใช้พื้นที่จัดเก็บเบื้องหลังแบบ XFS
แบ็กเอนด์อื่น ๆ การสร้างคอนเทนเนอร์ล้มเหลวพร้อมข้อผิดพลาดจากดีมอนและคำแนะนำเกี่ยวกับแบ็กเอนด์ของ Fleet

นโยบายการรับส่งข้อมูลขาออก

โหมด Docker Podman
bridge รองรับ โดยค่าเริ่มต้นไม่มีข้อจำกัดการรับส่งข้อมูลขาออก รองรับ โดยค่าเริ่มต้นไม่มีข้อจำกัดการรับส่งข้อมูลขาออก
internal ถูกปฏิเสธเนื่องจาก Docker ไม่คงพอร์ต Gateway แบบลูปแบ็กที่เผยแพร่ไว้บนเครือข่ายภายใน รองรับ Gateway แบบลูปแบ็กยังคงเผยแพร่อยู่ ขณะที่การรับส่งข้อมูลขาออกถูกบล็อก

สำหรับ Docker ให้ใช้โหมดบริดจ์ต่อไป และบังคับใช้นโยบายขาออกด้วยกฎไฟร์วอลล์ของโฮสต์ เช่น เชน DOCKER-USER

fleet list

แสดงรายการเซลล์ตามลำดับ ID ผู้เช่า:

bash
openclaw fleet listopenclaw fleet lsopenclaw fleet list --json

ตารางประกอบด้วย:

คอลัมน์ ความหมาย
tenant ID ผู้เช่า
state สถานะคอนเทนเนอร์ปัจจุบันจากการตรวจสอบ Docker หรือ Podman unknown หมายความว่ารันไทม์ไม่พร้อมใช้งาน หรือมีคอนเทนเนอร์ที่ใช้ชื่อเซลล์นี้อยู่แต่ป้ายกำกับความเป็นเจ้าของของ Fleet ไม่ตรงกับระเบียนรีจิสทรี (เป็นสัญญาณของการชนกันหรือการดัดแปลง — ให้ตรวจสอบด้วยตนเองก่อนดำเนินการ)
port พอร์ตโฮสต์ลูปแบ็กที่แมปกับ Gateway ของเซลล์
image อิมเมจคอนเทนเนอร์ที่บันทึกไว้
created เวลาที่สร้างเซลล์

แถวรีจิสทรียังคงแสดงอยู่เมื่อ Docker หรือ Podman ไม่พร้อมใช้งาน มีเพียงสถานะปัจจุบันที่เปลี่ยนเป็น unknown

fleet status

ตรวจสอบเซลล์หนึ่งรายการ:

bash
openclaw fleet status acmeopenclaw fleet status acme --json

สถานะรวมแถวรีจิสทรีของ Fleet การตรวจสอบคอนเทนเนอร์ปัจจุบัน และคำขอแบบพยายามให้ดีที่สุดในช่วงเวลาสั้น ๆ ไปยัง:

text
http://127.0.0.1:<host-port>/healthz

ผลการตรวจสอบสถานะคือ ok, failed หรือ skipped /healthz ยืนยันว่า Gateway ยังทำงานอยู่ ไม่ใช่ความพร้อมเต็มรูปแบบของทุกช่องทางหรือ Plugin ที่กำหนดค่าไว้ ระบบจะข้ามการตรวจสอบเมื่อไม่มีเอนด์พอยต์ภายในเครื่องที่ใช้งานได้ให้ตรวจสอบ

fleet logs

สตรีมบันทึกของคอนเทนเนอร์เซลล์โดยตรงไปยังเทอร์มินัล:

bash
openclaw fleet logs acmeopenclaw fleet logs acme --followopenclaw fleet logs acme --tail 200openclaw fleet logs acme --since 10m

Fleet ตรวจสอบป้ายกำกับความเป็นเจ้าของของคอนเทนเนอร์ที่ลงทะเบียนก่อนอ่านบันทึกใด ๆ จึงปฏิเสธคอนเทนเนอร์ภายนอกที่ใช้ชื่อเซลล์ตามที่คาดไว้ สตรีมจะถูกตรึงกับ ID ของคอนเทนเนอร์ที่ตรวจสอบนั้น ดังนั้นการแทนที่พร้อมกันจึงไม่สามารถเปลี่ยนเส้นทางไปยังรุ่นที่ใหม่กว่าได้ กด Ctrl-C เพื่อสิ้นสุด --follow โดยไม่ถือว่าการหยุดโดยผู้ปฏิบัติงานเป็นความล้มเหลวของคำสั่ง เอาต์พุตบันทึกจะถูกส่งผ่านตัวกรองการปกปิดข้อมูล ซึ่งแทนที่โทเค็น Gateway ปัจจุบันของเซลล์ด้วย <redacted> ก่อนที่ข้อมูลใด ๆ จะไปถึงเทอร์มินัล

fleet logs ไม่มีโหมด --json เนื่องจากบันทึกคอนเทนเนอร์เป็นสตรีม stdout/stderr ดิบ สำหรับสคริปต์ ให้จำกัดเอาต์พุตด้วย --tail และใช้การเปลี่ยนเส้นทางหรือไปป์ไลน์ของเชลล์ตามปกติ

fleet start, fleet stop และ fleet restart

ควบคุมเซลล์ที่มีอยู่โดยใช้รันไทม์ที่บันทึกไว้:

bash
openclaw fleet start acmeopenclaw fleet stop acmeopenclaw fleet restart acme

คำสั่งเหล่านี้ดำเนินการกับชื่อคอนเทนเนอร์ที่ลงทะเบียนไว้ คำสั่งจะล้มเหลวหากไม่รู้จักผู้เช่าหรือรันไทม์ที่บันทึกไว้ไม่สามารถดำเนินการนั้นได้

fleet upgrade

ดึงอิมเมจที่บันทึกไว้อีกครั้งและแทนที่คอนเทนเนอร์ของเซลล์:

bash
openclaw fleet upgrade acme

ย้ายเซลล์ไปยังอิมเมจอื่น:

bash
openclaw fleet upgrade acme --image ghcr.io/openclaw/openclaw:<version>

การอัปเกรดจะดึงอิมเมจเป้าหมาย ตรวจสอบคอนเทนเนอร์ที่มีอยู่และเครือข่ายประจำเซลล์ หยุดและนำคอนเทนเนอร์ออก จากนั้นสร้างและเริ่มคอนเทนเนอร์ใหม่ คอนเทนเนอร์ที่แทนที่จะคงพอร์ตโฮสต์ ไดเรกทอรีข้อมูล เครือข่ายบริดจ์ประจำเซลล์ โปรไฟล์รันไทม์ ขีดจำกัดทรัพยากร นโยบายการรีสตาร์ต สภาพแวดล้อมที่ Fleet จัดการ และค่าที่ระบุไว้กับ --env ตั้งแต่แรกไว้เหมือนเดิม สถานะที่เมานต์ไว้จะยังคงอยู่หลังการแทนที่คอนเทนเนอร์ ส่วนสภาพแวดล้อมเริ่มต้นของอิมเมจอาจเปลี่ยนไปตามอิมเมจเป้าหมาย

การแทนที่จะได้รับการยืนยันหลังจาก Gateway ตอบสนองต่อ /healthz บนพอร์ตลูปแบ็กของเซลล์แล้วเท่านั้น ซึ่งตรงกับข้อกำหนดการตรวจสอบสถานะที่ไฟล์ compose อย่างเป็นทางการใช้ คอนเทนเนอร์ที่แทนที่ซึ่งหยุดทำงาน วนล้มซ้ำ หรือไม่พร้อมใช้งานภายในเวลาประมาณหนึ่งนาทีจะถูกนำออก และคอนเทนเนอร์เดิมจะถูกกู้คืน เพื่อไม่ให้อิมเมจที่เสียหายทำให้เซลล์ที่ทำงานอยู่หยุดให้บริการ

โดยเจตนาแล้ว โทเค็น Gateway จะไม่ถูกจัดเก็บไว้ในรีจิสทรีของ Fleet ก่อนนำคอนเทนเนอร์เก่าออก Fleet จะอ่านสภาพแวดล้อมของคอนเทนเนอร์นั้นและส่งต่อ OPENCLAW_GATEWAY_TOKEN ไปยังคอนเทนเนอร์ที่แทนที่ อย่านำคอนเทนเนอร์เก่าออกด้วยตนเองก่อนอัปเกรด หากไม่มีโทเค็นเก็บอยู่ในที่อื่นที่คุณควบคุม

fleet backup และ fleet restore

สำรองข้อมูลเซลล์ที่หยุดอยู่หนึ่งเซลล์:

bash
openclaw fleet stop acmeopenclaw fleet backup acme --out ./acme.tgz

กู้คืนไฟล์เก็บถาวรนั้นไปยังเซลล์ที่ลงทะเบียนไว้:

bash
openclaw fleet restore acme --from ./acme.tgz

คำสั่งเหล่านี้ต้องใช้สิทธิ์ระดับผู้ดำเนินการโฮสต์ ไฟล์เก็บถาวรมีสถานะของผู้เช่าและข้อมูลลับสำหรับการยืนยันตัวตน สร้างขึ้นด้วยโหมด 0600 และต้องจัดเก็บเช่นเดียวกับข้อมูลรับรอง การสำรองข้อมูลจะปฏิเสธเซลล์ที่กำลังทำงาน เพื่อให้บันทึกสถานะ SQLite ได้อย่างสอดคล้องกัน การกู้คืนจะปฏิเสธเซลล์ที่กำลังทำงาน เว้นแต่จะระบุ --force โดยจะแทนที่เฉพาะสถานะของผู้เช่ารายนั้น หมุนเวียนโทเค็น Gateway และแสดงโทเค็นใหม่เพียงครั้งเดียว Fleet สำรองข้อมูลผู้เช่าครั้งละหนึ่งราย การสำรองข้อมูลผู้เช่าทั้งหมดเป็นการดำเนินการแยกต่างหากของผู้ดำเนินการ

การกู้คืนจำเป็นต้องมีคอนเทนเนอร์ที่หยุดอยู่แล้ว เนื่องจากโปรไฟล์รันไทม์ที่ตรวจสอบจากคอนเทนเนอร์นั้นจะกำหนดขีดจำกัด การแมปผู้ใช้ ที่มาของสภาพแวดล้อม และอิมเมจสำหรับคอนเทนเนอร์ที่แทนที่ หากคอนเทนเนอร์ที่ลงทะเบียนไว้ถูกนำออกผ่านช่องทางอื่น ให้เรียกใช้ fleet rm <tenant> --force โดยไม่มี --purge-data ก่อน จากนั้นสร้างเซลล์ใหม่ด้วยอิมเมจที่ต้องการและ --no-start แล้วลองกู้คืนอีกครั้ง การนำออกครั้งแรกจะคงไดเรกทอรีข้อมูลของผู้เช่าทั้งสองแห่งไว้

ทั้งสองคำสั่งรองรับ --max-bytes <bytes> เพื่อจำกัดข้อมูลไฟล์ที่เก็บหรือแตกออก และทั้งสองใช้ขีดจำกัดคงที่หนึ่งล้านเซกเมนต์ของพาธในไฟล์เก็บถาวรเหมือนกัน เพื่อไม่ให้ไฟล์เก็บถาวรอันตรายที่มีเฉพาะเมทาดาทาทำให้ไอโหนดของโฮสต์หมด และเพื่อให้ข้อมูลสำรองทุกรายการที่ยอมรับสามารถกู้คืนได้ การสำรองข้อมูลรองรับ --out <path> และทั้งสองคำสั่งรองรับ --json

ไฟล์เก็บถาวรมีเฉพาะไฟล์ปกติและไดเรกทอรีเท่านั้น การสำรองข้อมูลจะไม่ติดตามหรือจัดเก็บลิงก์สัญลักษณ์ ฮาร์ดลิงก์ ซ็อกเก็ต หรือโหนดอุปกรณ์ และจะรายงานจำนวนรายการที่ข้ามไว้ในผลลัพธ์ การกู้คืนจะปฏิเสธไฟล์เก็บถาวรที่มีรายการประเภทอื่น โครงสร้างลิงก์สัญลักษณ์ที่สร้างใหม่ได้ เช่น node_modules ของพื้นที่ทำงาน ต้องติดตั้งใหม่ภายในเซลล์หลังการกู้คืน

fleet doctor

ตรวจสอบทุกเซลล์หรือผู้เช่าหนึ่งรายโดยไม่เปลี่ยนสถานะรันไทม์หรือระบบไฟล์:

bash
openclaw fleet doctoropenclaw fleet doctor acme --json

Doctor จะตรวจสอบความเป็นโลคัลของรันไทม์ ป้ายกำกับความเป็นเจ้าของ สถานะการทำงาน การเสริมความปลอดภัย ขีดจำกัดทรัพยากร การผูกพอร์ตลูปแบ็ก การมีอยู่ของโทเค็น ความเป็นเจ้าของเครือข่ายและโหมดทราฟฟิกขาออก รวมถึงสิทธิ์ของไดเรกทอรีสถานะส่วนตัว คำเตือนจะอธิบายเซลล์ที่หยุดอยู่หรือความแตกต่างด้านความเป็นเจ้าของ และผลการตรวจสอบใดก็ตามที่ล้มเหลวจะกำหนดรหัสออกของกระบวนการเป็นค่าที่ไม่ใช่ศูนย์

fleet rm

นำเซลล์ที่หยุดอยู่ออกจากรันไทม์และรีจิสทรี โดยเก็บข้อมูลผู้เช่าไว้:

bash
openclaw fleet rm acme

คอนเทนเนอร์ที่กำลังทำงานต้องใช้ --force:

bash
openclaw fleet rm acme --force

นำข้อมูลของเซลล์ออกอย่างถาวรด้วย:

bash
openclaw fleet rm acme --purge-data --force

Fleet จะนำคอนเทนเนอร์ของเซลล์ออกก่อนนำเครือข่ายบริดจ์เฉพาะของเซลล์ออก --purge-data ต้องใช้ร่วมกับ --force ก่อนลบแบบเวียนเกิด Fleet จะแก้พาธรูทที่ Fleet เป็นเจ้าของทั้งสองแห่งและไดเรกทอรีประจำผู้เช่าทั้งสองแห่ง แต่ละเป้าหมายต้องเป็นไดเรกทอรีปลายทางของผู้เช่าที่คาดไว้อย่างตรงกันทั้งหมด อยู่ภายในรูทของตนอย่างเคร่งครัด และต้องไม่ใช่ลิงก์สัญลักษณ์ การตรวจสอบขอบเขตเหล่านี้ป้องกันไม่ให้พาธรีจิสทรีที่เสียหายหรือลิงก์สัญลักษณ์ข้ามผู้เช่าเปลี่ยนเส้นทางการลบไปยังตำแหน่งอื่น

สามารถลองล้างข้อมูลซ้ำได้เมื่อไดเรกทอรีผู้เช่าที่ตรงตามที่คาดไว้ไม่มีอยู่แล้ว ซึ่งช่วยให้การเรียกใช้ครั้งถัดไปล้างข้อมูลต่อจนเสร็จหลังระบบไฟล์ล้มเหลวบางส่วน โดยไม่ผ่อนปรนการตรวจสอบพาธสำหรับไดเรกทอรีที่ยังคงอยู่

การจัดวางพื้นที่จัดเก็บและคอนเทนเนอร์

สถานะของเซลล์และคีย์เข้ารหัสโปรไฟล์การยืนยันตัวตนใช้พาธโฮสต์แยกกันสำหรับผู้เช่าแต่ละราย ภายใต้ไดเรกทอรีสถานะ OpenClaw ที่ใช้งานอยู่:

text
<state-dir>/fleet/cells/<tenant>/<state-dir>/fleet/auth-profile-secrets/<tenant>/

ไดเรกทอรีแรกถูกเมานต์ที่ /home/node/.openclaw ส่วนไดเรกทอรีที่สองถูกเมานต์ที่ /home/node/.config/openclaw ซึ่งตรงกับตำแหน่งเมานต์คีย์เข้ารหัสของการตั้งค่า Docker อย่างเป็นทางการ ดังนั้นคีย์เข้ารหัสจึงไม่ถูกเปิดเผยภายใต้ตำแหน่งเมานต์สถานะทั่วไป และจะไม่รวมอยู่ด้วยเมื่อสำรองหรือแชร์เฉพาะไดเรกทอรีสถานะของเซลล์ ไดเรกทอรีทั้งสองจะยังคงอยู่หลังการนำออกและการอัปเกรดตามปกติ ส่วน fleet rm --purge-data --force จะลบทั้งสองแห่งหลังจากตรวจสอบขอบเขตแยกกัน

ก่อนเริ่มทำงานครั้งแรก Fleet จะกำหนดค่าเริ่มต้นของเซลล์ด้วย gateway.mode=local การยืนยันตัวตนด้วยโทเค็น การผูกกับ LAN ของคอนเทนเนอร์ และต้นทางของ Control UI สำหรับพอร์ตโฮสต์ที่จัดสรรไว้ ค่าโทเค็นจะไม่ถูกเขียนลงในการกำหนดค่านั้น แต่จะคงอยู่ในสภาพแวดล้อมของคอนเทนเนอร์

Fleet จะตรึงพาธคอนเทนเนอร์ของอิมเมจอย่างเป็นทางการด้วยค่าสภาพแวดล้อมต่อไปนี้:

ตัวแปร ค่าในคอนเทนเนอร์
HOME /home/node
OPENCLAW_HOME /home/node
OPENCLAW_STATE_DIR /home/node/.openclaw
OPENCLAW_CONFIG_PATH /home/node/.openclaw/openclaw.json
OPENCLAW_WORKSPACE_DIR /home/node/.openclaw/workspace
OPENCLAW_GATEWAY_TOKEN โทเค็นของเซลล์ที่สร้างขึ้นหรือระบุไว้

โดยค่าเริ่มต้น อิมเมจอย่างเป็นทางการจะใช้ผู้ใช้ node ที่ไม่ใช่ root ซึ่งมี UID 1000 Fleet ทำให้ตำแหน่งเมานต์แบบ bind ส่วนตัว 0700 ยังคงเขียนได้โดยไม่เปิดให้ทุกคนเข้าถึง Docker แบบ rootful จะเรียกใช้เซลล์ด้วย UID และ GID ของผู้ใช้ที่ไม่ใช่ root ซึ่งเป็นผู้เรียกใช้ ส่วน Docker แบบ rootless จะใช้ UID 0 ในคอนเทนเนอร์ ซึ่งแมปกับผู้ใช้โฮสต์ที่ไม่มีสิทธิ์ซึ่งเป็นผู้เรียกใช้ภายในเนมสเปซผู้ใช้ของดีมอน Podman ใช้ keep-id ร่วมกับ UID และ GID ของผู้เรียกใช้ เมื่อ Fleet ทำงานเป็น root กับรันไทม์แบบ rootful ระบบจะคงผู้ใช้ของอิมเมจไว้และกำหนดไฟล์เมานต์เริ่มต้นให้กับ UID/GID 1000

บนโฮสต์ SELinux ตำแหน่งเมานต์ของ Docker และ Podman จะได้รับการติดป้ายกำกับ :Z แบบส่วนตัว หากกู้คืนหรือย้ายข้อมูลของเซลล์ ให้รักษาพาธที่เมานต์แบบ bind ให้ผู้ใช้คอนเทนเนอร์ที่มีผลสามารถเขียนได้ โปรไฟล์นี้เป็นมิตรกับการทำงานแบบ rootless แต่ Docker หรือ Podman ต้องได้รับการกำหนดค่าให้ทำงานแบบ rootless บนโฮสต์อยู่แล้ว Fleet จะไม่แปลงดีมอนแบบ rootful ให้เป็นแบบ rootless

โปรไฟล์ความปลอดภัย

Fleet ใช้โปรไฟล์ต่อไปนี้กับทุกเซลล์:

การควบคุม โปรไฟล์ที่ใช้ เหตุผล
ความสามารถของ Linux --cap-drop=ALL Gateway เป็นกระบวนการ Node.js และไม่จำเป็นต้องเพิ่มความสามารถของ Linux
การยกระดับสิทธิ์ --security-opt no-new-privileges ป้องกันไม่ให้กระบวนการได้รับสิทธิ์เพิ่มผ่านไบนารี setuid หรือ setgid
กระบวนการเริ่มต้น --init เก็บกวาดกระบวนการลูกหลานและส่งต่อสัญญาณวงจรชีวิตของคอนเทนเนอร์
ขีดจำกัดกระบวนการ ค่าเริ่มต้นคือ --pids-limit 512 จำกัดการ fork และการใช้กระบวนการจนหมด
ขีดจำกัดหน่วยความจำ ค่าเริ่มต้นคือ --memory 2g จำกัดการใช้หน่วยความจำของเซลล์
ขีดจำกัด CPU ค่าเริ่มต้นคือ --cpus 2 จำกัดการใช้ CPU ของเซลล์
ดิสก์ของเลเยอร์ที่เขียนได้ --disk ซึ่งเลือกใช้ได้ จำกัดเลเยอร์คอนเทนเนอร์เมื่อแบ็กเอนด์พื้นที่จัดเก็บของรันไทม์รองรับโควตา
นโยบายการรีสตาร์ต --restart unless-stopped รีสตาร์ตเซลล์ที่ล้มเหลวโดยไม่ลบล้างการหยุดโดยเจตนา
การเผยแพร่ผ่านโฮสต์ เฉพาะ 127.0.0.1:<host-port>:18789 ป้องกันไม่ให้ Gateway อยู่บนอินเทอร์เฟซโฮสต์แบบไวลด์การ์ด
เครือข่ายของเซลล์ หนึ่งเครือข่ายบริดจ์หรือเครือข่ายภายในของ Podman ต่อหนึ่งเซลล์ แยกทราฟฟิก IP ของคอนเทนเนอร์และเลือกบล็อกทราฟฟิกขาออกของ Podman ได้
ข้อมูลประจำตัวของคอนเทนเนอร์ การแมปผู้ใช้ให้ตรงกับโฮสต์ ทำให้ตำแหน่งเมานต์แบบ bind ส่วนตัวยังคงเขียนได้โดยไม่ให้สิทธิ์เข้าถึงแก่ทุกคน
สถานะถาวร ตำแหน่งเมานต์ประจำเซลล์ ไม่มีตำแหน่งเมานต์สถานะร่วม เก็บการกำหนดค่า ข้อมูลรับรอง เซสชัน และพื้นที่ทำงานของผู้เช่าไว้ในโครงสร้างข้อมูลของผู้เช่ารายนั้น
คำสั่งคอนเทนเนอร์ node dist/index.js gateway --bind lan --port 18789 รับฟังบนเครือข่ายคอนเทนเนอร์ เพื่อให้การแมปพอร์ตโฮสต์ที่จำกัดเฉพาะลูปแบ็กเข้าถึงได้

Fleet จะไม่เมานต์ /var/run/docker.sock ใช้ --privileged หรือเครือข่ายของโฮสต์ หรือเพิ่มความสามารถใด ๆ บริดจ์ประจำเซลล์เป็นขอบเขตการแยกระหว่างเซลล์ ไม่ใช่ไฟร์วอลล์ขาออก เซลล์ยังคงมีทราฟฟิกเครือข่ายขาออกที่จำเป็นสำหรับผู้ให้บริการและช่องทางต่าง ๆ ให้ตั้งพร็อกซี อุโมงค์ SSH หรือการกำหนดค่า tailnet ไว้หน้าพอร์ตลูปแบ็กให้ตรงกับการปรับใช้ของคุณ http://127.0.0.1:<port> เข้าถึงได้โดยตรงจากโฮสต์ Fleet เท่านั้น

โปรไฟล์นี้แยกคอนเทนเนอร์ของผู้เช่าออกจากกัน แต่ไม่ได้ปกป้องผู้เช่าจากผู้ดำเนินการ Fleet ผู้ดูแลรันไทม์คอนเทนเนอร์ หรือโฮสต์ที่ถูกเจาะระบบ ดูโมเดลความเชื่อถือฉบับสมบูรณ์และตัวเลือกการแยกที่เข้มงวดยิ่งขึ้นได้ที่ การโฮสต์แบบหลายผู้เช่า

การจัดการโทเค็น

โดยค่าเริ่มต้น fleet create จะสร้างโทเค็น Gateway เลขฐานสิบหกแบบสุ่มที่ปลอดภัยทางการเข้ารหัสจำนวน 32 อักขระ และแสดงเพียงครั้งเดียวในผลลัพธ์การสร้าง ให้จัดเก็บไว้ในตัวจัดการข้อมูลลับที่ได้รับอนุมัติและหลีกเลี่ยงการบันทึกผลลัพธ์การสร้างลงในล็อก

--gateway-token จะใส่โทเค็นที่กำหนดเองไว้ในอาร์กิวเมนต์ของกระบวนการภายในเครื่อง ซึ่งอาจถูกเก็บไว้ในประวัติเชลล์หรือมองเห็นได้ในรายการกระบวนการ ควรใช้โทเค็นที่สร้างขึ้น เว้นแต่เวิร์กโฟลว์การจัดการข้อมูลลับที่มีอยู่จำเป็นต้องใช้ค่าที่ระบุไว้

โทเค็นและทุกค่าที่ส่งผ่าน --env จะอยู่ในสภาพแวดล้อมของคอนเทนเนอร์ Fleet จะเขียนค่าเหล่านั้นลงในไฟล์สภาพแวดล้อมชั่วคราวที่มีโหมด 0600 ส่งเฉพาะพาธของไฟล์นั้นให้ Docker หรือ Podman และนำไฟล์ออกหลังคำสั่งรันไทม์ทำงานเสร็จ ค่าที่พิมพ์ลงใน openclaw fleet create --gateway-token ... หรือ --env KEY=VALUE โดยตรงยังคงอาจปรากฏในอาร์กิวเมนต์ของกระบวนการ openclaw ภายนอกและประวัติเชลล์ได้

ค่าของสภาพแวดล้อมคอนเทนเนอร์ไม่ได้ถูกซ่อนจากผู้ดูแลโฮสต์ที่เชื่อถือได้: ผู้ดูแล Docker หรือ Podman สามารถอ่านค่าเหล่านี้ได้ด้วยการตรวจสอบคอนเทนเนอร์ หมายเหตุ "shown once" ของ Fleet อธิบายเอาต์พุตตามปกติของ CLI ไม่ได้หมายความว่าจะป้องกันผู้ดูแลโฮสต์ได้

ที่เกี่ยวข้อง

Was this useful?
On this page

On this page