---
read_when:
    - คุณโฮสต์โดเมนความเชื่อถือของผู้เช่าหลายรายบนเครื่องเดียว
    - คุณต้องสร้าง ตรวจสอบ อัปเกรด หรือลบเซลล์ในฟลีต
summary: เอกสารอ้างอิง CLI สำหรับจัดเตรียมและจัดการเซลล์ OpenClaw ที่แยกจากกันสำหรับผู้เช่าแต่ละราย
title: ฟลีต
x-i18n:
    generated_at: "2026-07-16T19:03:57Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: be589500e4715541f175caf0d5135a96baee4874e64c60c8b6f188ff1f70bc9f
    source_path: cli/fleet.md
    workflow: 16
---

# `openclaw fleet`

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

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

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

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

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

```bash
openclaw fleet create acme
openclaw fleet status acme
openclaw 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 ที่ได้รับการจัดการ ซึ่งระบุไว้ใน [พื้นที่จัดเก็บและโครงร่างคอนเทนเนอร์](#storage-and-container-layout)

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

| ตัวเลือก                    | ค่าเริ่มต้น                               | คำอธิบาย                                                                                    |
| ------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `--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 ที่ระบุแทนการสร้างใหม่ ดู[การจัดการโทเค็น](#token-handling) |
| `--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 list
openclaw fleet ls
openclaw fleet list --json
```

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

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

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

## `fleet status`

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

```bash
openclaw fleet status acme
openclaw 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 acme
openclaw fleet logs acme --follow
openclaw fleet logs acme --tail 200
openclaw 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 acme
openclaw fleet stop acme
openclaw 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 acme
openclaw 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 doctor
openclaw 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 ผู้ดูแลรันไทม์คอนเทนเนอร์ หรือโฮสต์ที่ถูกเจาะระบบ ดูโมเดลความเชื่อถือฉบับสมบูรณ์และตัวเลือกการแยกที่เข้มงวดยิ่งขึ้นได้ที่ [การโฮสต์แบบหลายผู้เช่า](/gateway/multi-tenant-hosting)

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

โดยค่าเริ่มต้น `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 ไม่ได้หมายความว่าจะป้องกันผู้ดูแลโฮสต์ได้

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

- [การโฮสต์แบบหลายผู้เช่า](/gateway/multi-tenant-hosting)
- [Docker](/th/install/docker)
- [Podman](/th/install/podman)
- [ความปลอดภัยของ Gateway](/th/gateway/security)
