CLI commands
ฟลีต
openclaw fleet
openclaw fleet จัดการอินสแตนซ์ OpenClaw แบบสมบูรณ์ที่เรียกว่า เซลล์ แต่ละเซลล์มี Gateway, สถานะ, ข้อมูลประจำตัว, บัญชีช่องทาง, คอนเทนเนอร์ และพอร์ตโฮสต์ที่รับการเชื่อมต่อผ่านลูปแบ็กเท่านั้นเป็นของตนเอง ใช้หนึ่งเซลล์ต่อหนึ่งขอบเขตความไว้วางใจของผู้เช่าแต่ละราย อย่าใช้ Gateway ที่ใช้ร่วมกันเป็นขอบเขตแบบหลายผู้เช่าที่ไม่ไว้วางใจกัน
Fleet อยู่ในสถานะ ทดลอง ชื่อคำสั่ง แฟล็ก รูปแบบเอาต์พุต และโปรไฟล์คอนเทนเนอร์อาจเปลี่ยนแปลงระหว่างรุ่นโดยไม่มีช่วงแจ้งเลิกใช้ล่วงหน้า
Fleet รองรับ Docker และ Podman อิมเมจเริ่มต้นคือ ghcr.io/openclaw/openclaw:latest
Fleet ได้รับการทดสอบบนโฮสต์ Linux และ macOS ปัจจุบันยังไม่ได้ทดสอบโฮสต์ Windows
เริ่มต้นอย่างรวดเร็ว
openclaw fleet create acmeopenclaw fleet status acmeopenclaw fleet listfleet create แสดงโทเค็น Gateway ที่สร้างขึ้นเพียงครั้งเดียวพร้อมกับ URL ของเซลล์ ให้จัดเก็บโทเค็นทันที จากนั้นกำหนดค่าบัญชีช่องทางของผู้เช่าแต่ละรายภายในเซลล์ของผู้เช่ารายนั้น
ID ผู้เช่า
ID ผู้เช่าต้องตรงกับ:
^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$รูปแบบนี้อนุญาตให้ใช้อักษรพิมพ์เล็ก ตัวเลข และยัติภังค์ภายใน รวมทั้งหมด 1 ถึง 40 ตัวอักษร ID ต้องขึ้นต้นและลงท้ายด้วยตัวอักษรหรือตัวเลข ระบบจะปฏิเสธอักษรพิมพ์ใหญ่ ขีดล่าง เครื่องหมายทับ จุด ช่องว่าง และสตริงสำหรับการข้ามพาธ เช่น ../acme
ID จะกลายเป็นส่วนหนึ่งของชื่อคอนเทนเนอร์: openclaw-cell-<tenant>
fleet create
สร้างเซลล์และเริ่มทำงาน:
openclaw fleet create acmeสร้างเซลล์ Podman บนพอร์ตคงที่โดยไม่เริ่มทำงาน:
openclaw fleet create acme \ --runtime podman \ --port 19125 \ --no-startส่งตัวแปรสภาพแวดล้อมเฉพาะผู้เช่าโดยระบุ --env ซ้ำ:
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 <KEY=VALUE> |
ไม่มี | ส่งตัวแปรสภาพแวดล้อมไปยังเซลล์ ระบุซ้ำสำหรับหลายค่า |
--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 ผู้เช่า:
openclaw fleet listopenclaw fleet lsopenclaw fleet list --jsonตารางประกอบด้วย:
| คอลัมน์ | ความหมาย |
|---|---|
tenant |
ID ผู้เช่า |
state |
สถานะคอนเทนเนอร์ปัจจุบันจากการตรวจสอบ Docker หรือ Podman unknown หมายความว่ารันไทม์ไม่พร้อมใช้งาน หรือมีคอนเทนเนอร์ที่ใช้ชื่อเซลล์นี้อยู่แต่ป้ายกำกับความเป็นเจ้าของของ Fleet ไม่ตรงกับระเบียนรีจิสทรี (เป็นสัญญาณของการชนกันหรือการดัดแปลง — ให้ตรวจสอบด้วยตนเองก่อนดำเนินการ) |
port |
พอร์ตโฮสต์ลูปแบ็กที่แมปกับ Gateway ของเซลล์ |
image |
อิมเมจคอนเทนเนอร์ที่บันทึกไว้ |
created |
เวลาที่สร้างเซลล์ |
แถวรีจิสทรียังคงแสดงอยู่เมื่อ Docker หรือ Podman ไม่พร้อมใช้งาน มีเพียงสถานะปัจจุบันที่เปลี่ยนเป็น unknown
fleet status
ตรวจสอบเซลล์หนึ่งรายการ:
openclaw fleet status acmeopenclaw fleet status acme --jsonสถานะรวมแถวรีจิสทรีของ Fleet การตรวจสอบคอนเทนเนอร์ปัจจุบัน และคำขอแบบพยายามให้ดีที่สุดในช่วงเวลาสั้น ๆ ไปยัง:
http://127.0.0.1:<host-port>/healthzผลการตรวจสอบสถานะคือ ok, failed หรือ skipped /healthz ยืนยันว่า Gateway ยังทำงานอยู่ ไม่ใช่ความพร้อมเต็มรูปแบบของทุกช่องทางหรือ Plugin ที่กำหนดค่าไว้ ระบบจะข้ามการตรวจสอบเมื่อไม่มีเอนด์พอยต์ภายในเครื่องที่ใช้งานได้ให้ตรวจสอบ
fleet logs
สตรีมบันทึกของคอนเทนเนอร์เซลล์โดยตรงไปยังเทอร์มินัล:
openclaw fleet logs acmeopenclaw fleet logs acme --followopenclaw fleet logs acme --tail 200openclaw fleet logs acme --since 10mFleet ตรวจสอบป้ายกำกับความเป็นเจ้าของของคอนเทนเนอร์ที่ลงทะเบียนก่อนอ่านบันทึกใด ๆ จึงปฏิเสธคอนเทนเนอร์ภายนอกที่ใช้ชื่อเซลล์ตามที่คาดไว้ สตรีมจะถูกตรึงกับ ID ของคอนเทนเนอร์ที่ตรวจสอบนั้น ดังนั้นการแทนที่พร้อมกันจึงไม่สามารถเปลี่ยนเส้นทางไปยังรุ่นที่ใหม่กว่าได้ กด Ctrl-C เพื่อสิ้นสุด --follow โดยไม่ถือว่าการหยุดโดยผู้ปฏิบัติงานเป็นความล้มเหลวของคำสั่ง เอาต์พุตบันทึกจะถูกส่งผ่านตัวกรองการปกปิดข้อมูล ซึ่งแทนที่โทเค็น Gateway ปัจจุบันของเซลล์ด้วย <redacted> ก่อนที่ข้อมูลใด ๆ จะไปถึงเทอร์มินัล
fleet logs ไม่มีโหมด --json เนื่องจากบันทึกคอนเทนเนอร์เป็นสตรีม stdout/stderr ดิบ สำหรับสคริปต์ ให้จำกัดเอาต์พุตด้วย --tail และใช้การเปลี่ยนเส้นทางหรือไปป์ไลน์ของเชลล์ตามปกติ
fleet start, fleet stop และ fleet restart
ควบคุมเซลล์ที่มีอยู่โดยใช้รันไทม์ที่บันทึกไว้:
openclaw fleet start acmeopenclaw fleet stop acmeopenclaw fleet restart acmeคำสั่งเหล่านี้ดำเนินการกับชื่อคอนเทนเนอร์ที่ลงทะเบียนไว้ คำสั่งจะล้มเหลวหากไม่รู้จักผู้เช่าหรือรันไทม์ที่บันทึกไว้ไม่สามารถดำเนินการนั้นได้
fleet upgrade
ดึงอิมเมจที่บันทึกไว้อีกครั้งและแทนที่คอนเทนเนอร์ของเซลล์:
openclaw fleet upgrade acmeย้ายเซลล์ไปยังอิมเมจอื่น:
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
สำรองข้อมูลเซลล์ที่หยุดอยู่หนึ่งเซลล์:
openclaw fleet stop acmeopenclaw fleet backup acme --out ./acme.tgzกู้คืนไฟล์เก็บถาวรนั้นไปยังเซลล์ที่ลงทะเบียนไว้:
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
ตรวจสอบทุกเซลล์หรือผู้เช่าหนึ่งรายโดยไม่เปลี่ยนสถานะรันไทม์หรือระบบไฟล์:
openclaw fleet doctoropenclaw fleet doctor acme --jsonDoctor จะตรวจสอบความเป็นโลคัลของรันไทม์ ป้ายกำกับความเป็นเจ้าของ สถานะการทำงาน การเสริมความปลอดภัย ขีดจำกัดทรัพยากร การผูกพอร์ตลูปแบ็ก การมีอยู่ของโทเค็น ความเป็นเจ้าของเครือข่ายและโหมดทราฟฟิกขาออก รวมถึงสิทธิ์ของไดเรกทอรีสถานะส่วนตัว คำเตือนจะอธิบายเซลล์ที่หยุดอยู่หรือความแตกต่างด้านความเป็นเจ้าของ และผลการตรวจสอบใดก็ตามที่ล้มเหลวจะกำหนดรหัสออกของกระบวนการเป็นค่าที่ไม่ใช่ศูนย์
fleet rm
นำเซลล์ที่หยุดอยู่ออกจากรันไทม์และรีจิสทรี โดยเก็บข้อมูลผู้เช่าไว้:
openclaw fleet rm acmeคอนเทนเนอร์ที่กำลังทำงานต้องใช้ --force:
openclaw fleet rm acme --forceนำข้อมูลของเซลล์ออกอย่างถาวรด้วย:
openclaw fleet rm acme --purge-data --forceFleet จะนำคอนเทนเนอร์ของเซลล์ออกก่อนนำเครือข่ายบริดจ์เฉพาะของเซลล์ออก --purge-data ต้องใช้ร่วมกับ --force ก่อนลบแบบเวียนเกิด Fleet จะแก้พาธรูทที่ Fleet เป็นเจ้าของทั้งสองแห่งและไดเรกทอรีประจำผู้เช่าทั้งสองแห่ง แต่ละเป้าหมายต้องเป็นไดเรกทอรีปลายทางของผู้เช่าที่คาดไว้อย่างตรงกันทั้งหมด อยู่ภายในรูทของตนอย่างเคร่งครัด และต้องไม่ใช่ลิงก์สัญลักษณ์ การตรวจสอบขอบเขตเหล่านี้ป้องกันไม่ให้พาธรีจิสทรีที่เสียหายหรือลิงก์สัญลักษณ์ข้ามผู้เช่าเปลี่ยนเส้นทางการลบไปยังตำแหน่งอื่น
สามารถลองล้างข้อมูลซ้ำได้เมื่อไดเรกทอรีผู้เช่าที่ตรงตามที่คาดไว้ไม่มีอยู่แล้ว ซึ่งช่วยให้การเรียกใช้ครั้งถัดไปล้างข้อมูลต่อจนเสร็จหลังระบบไฟล์ล้มเหลวบางส่วน โดยไม่ผ่อนปรนการตรวจสอบพาธสำหรับไดเรกทอรีที่ยังคงอยู่
การจัดวางพื้นที่จัดเก็บและคอนเทนเนอร์
สถานะของเซลล์และคีย์เข้ารหัสโปรไฟล์การยืนยันตัวตนใช้พาธโฮสต์แยกกันสำหรับผู้เช่าแต่ละราย ภายใต้ไดเรกทอรีสถานะ OpenClaw ที่ใช้งานอยู่:
<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 ไม่ได้หมายความว่าจะป้องกันผู้ดูแลโฮสต์ได้