Skip to main content

New Page

Cài đặt OpenClaw bằng Portainer

Mục tiêu

Cài lại OpenClaw từ đầu bằng Portainer để stack có trạng thái Full control, thay vì bị Limited control do được tạo bằng docker compose bên ngoài Portainer.

Sau khi hoàn tất:

OpenClaw chạy bằng Portainer Stack
Container: openclaw-gateway
Port: 18789
Domain: https://oclaw.thanhdv.com
WebSocket URL: wss://oclaw.thanhdv.com
Config: /mnt/dsm/docker/OpenClaw/config
Workspace: /mnt/dsm/docker/OpenClaw/workspace
Auth secret: /opt/appdata/openclaw/auth

1. Xóa sạch OpenClaw cũ

SSH vào Ubuntu VM rồi chạy:

# Dừng stack cũ nếu trước đó cài bằng Docker Compose CLI
cd /opt/stacks/openclaw 2>/dev/null && docker compose down -v --remove-orphans || true

# Xóa mọi container có tên openclaw
docker ps -aq --filter "name=openclaw" | xargs -r docker rm -f

# Xóa network openclaw cũ nếu còn
docker network ls --format '{{.Name}}' | grep -E '^openclaw' | xargs -r docker network rm || true

# Xóa toàn bộ dữ liệu OpenClaw cũ
sudo rm -rf /opt/stacks/openclaw
sudo rm -rf /opt/appdata/openclaw
sudo rm -rf /mnt/dsm/docker/OpenClaw

# Xóa image cũ để Portainer pull lại sạch
docker image rm ghcr.io/openclaw/openclaw:latest 2>/dev/null || true

Kiểm tra lại:

docker ps -a | grep -i openclaw || echo "OK: no openclaw containers"
docker network ls | grep -i openclaw || echo "OK: no openclaw networks"
ls -ld /opt/stacks/openclaw /opt/appdata/openclaw /mnt/dsm/docker/OpenClaw 2>/dev/null || echo "OK: data removed"

2. Tạo lại thư mục sạch

sudo mkdir -p /mnt/dsm/docker/OpenClaw/config
sudo mkdir -p /mnt/dsm/docker/OpenClaw/workspace
sudo mkdir -p /opt/appdata/openclaw/auth

sudo chown -R 1000:1000 /mnt/dsm/docker/OpenClaw
sudo chown -R 1000:1000 /opt/appdata/openclaw

Tạo gateway token mới:

openssl rand -hex 32

Copy token này lại. Lát nữa nhập vào Portainer với biến:

OPENCLAW_GATEWAY_TOKEN

3. Tạo stack OpenClaw trong Portainer

Vào Portainer:

Stacks → Add stack

Thiết lập:

Name: openclaw
Build method: Web editor

Dán compose sau:

services:
  openclaw-gateway:
    image: ghcr.io/openclaw/openclaw:latest
    container_name: openclaw-gateway
    restart: unless-stopped
    init: true

    environment:
      TZ: Asia/Bangkok
      HOME: /home/node

      OPENCLAW_STATE_DIR: /home/node/.openclaw
      OPENCLAW_CONFIG_DIR: /home/node/.openclaw
      OPENCLAW_CONFIG_PATH: /home/node/.openclaw/openclaw.json
      OPENCLAW_WORKSPACE_DIR: /home/node/.openclaw/workspace
      OPENCLAW_AUTH_PROFILE_SECRET_DIR: /home/node/.config/openclaw

      OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}
      OPENCLAW_DISABLE_BONJOUR: "1"

    volumes:
      - /mnt/dsm/docker/OpenClaw/config:/home/node/.openclaw
      - /mnt/dsm/docker/OpenClaw/workspace:/home/node/.openclaw/workspace
      - /opt/appdata/openclaw/auth:/home/node/.config/openclaw

    ports:
      - "18789:18789"

    extra_hosts:
      - "host.docker.internal:host-gateway"

    cap_drop:
      - NET_RAW
      - NET_ADMIN

    security_opt:
      - no-new-privileges:true

    command:
      - node
      - dist/index.js
      - gateway
      - --bind
      - lan
      - --port
      - "18789"

    healthcheck:
      test:
        [
          "CMD",
          "node",
          "-e",
          "fetch('http://127.0.0.1:18789/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
        ]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s

Trong phần Environment variables, thêm:

OPENCLAW_GATEWAY_TOKEN = token vừa tạo

Sau đó bấm:

Deploy the stack

Vì stack được tạo trực tiếp bằng Portainer Web editor, Portainer sẽ có quyền quản lý đầy đủ stack này.


4. Sửa lỗi Missing config sau khi cài mới

Sau khi deploy, container có thể restart liên tục với lỗi:

Missing config. Run `openclaw setup` or set gateway.mode=local

Nguyên nhân là thư mục config mới đang trống, chưa có openclaw.json.

Tạo config thủ công bằng cách chạy trên Ubuntu:

TOKEN="$(docker inspect openclaw-gateway --format '{{range .Config.Env}}{{println .}}{{end}}' | sed -n 's/^OPENCLAW_GATEWAY_TOKEN=//p')"

echo "$TOKEN"

Nếu token hiện ra, chạy tiếp:

docker run --rm -it \
  --user 1000:1000 \
  -e TZ=Asia/Bangkok \
  -e HOME=/home/node \
  -e OPENCLAW_STATE_DIR=/home/node/.openclaw \
  -e OPENCLAW_CONFIG_DIR=/home/node/.openclaw \
  -e OPENCLAW_CONFIG_PATH=/home/node/.openclaw/openclaw.json \
  -e OPENCLAW_WORKSPACE_DIR=/home/node/.openclaw/workspace \
  -e OPENCLAW_AUTH_PROFILE_SECRET_DIR=/home/node/.config/openclaw \
  -e OPENCLAW_GATEWAY_TOKEN="$TOKEN" \
  -e OPENCLAW_DISABLE_BONJOUR=1 \
  -v /mnt/dsm/docker/OpenClaw/config:/home/node/.openclaw \
  -v /mnt/dsm/docker/OpenClaw/workspace:/home/node/.openclaw/workspace \
  -v /opt/appdata/openclaw/auth:/home/node/.config/openclaw \
  ghcr.io/openclaw/openclaw:latest \
  node dist/index.js config set --batch-json '[
    {"path":"gateway.mode","value":"local"},
    {"path":"gateway.bind","value":"lan"},
    {"path":"gateway.controlUi.allowInsecureAuth","value":false},
    {"path":"gateway.controlUi.allowedOrigins","value":[
      "https://oclaw.thanhdv.com",
      "http://127.0.0.1:18789",
      "http://localhost:18789"
    ]},
    {"path":"gateway.trustedProxies","value":["192.168.1.102"]}
  ]'

Trong đó:

192.168.1.102 = IP của Nginx Proxy Manager
192.168.1.103 = IP của Ubuntu VM chạy OpenClaw

Nếu IP NPM khác thì thay lại cho đúng.

Restart container:

docker restart openclaw-gateway

Kiểm tra log:

docker logs --tail 80 openclaw-gateway

Nếu thấy:

[gateway] ready

là OpenClaw Gateway đã chạy thành công.


5. Kiểm tra health

Chạy:

curl -fsS http://127.0.0.1:18789/healthz
curl -fsS http://127.0.0.1:18789/readyz

Nếu trả về trạng thái OK hoặc JSON hợp lệ thì gateway đã sẵn sàng.


6. Cấu hình Nginx Proxy Manager

Trong NPM, tạo hoặc sửa proxy host:

Domain Names: oclaw.thanhdv.com
Scheme: http
Forward Hostname / IP: 192.168.1.103
Forward Port: 18789
Websockets Support: ON
Block Common Exploits: ON

Tab SSL:

Request / chọn SSL certificate
Force SSL: ON
HTTP/2 Support: ON

Tab Advanced:

proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;

OpenClaw Control UI dùng WebSocket nên bắt buộc bật Websockets Support.


7. Truy cập OpenClaw qua domain

Mở trình duyệt:

https://oclaw.thanhdv.com

Điền:

WebSocket URL: wss://oclaw.thanhdv.com
Gateway Token: token mới đã tạo
Password: bỏ trống

Thiết bị hoặc trình duyệt mới có thể cần approve device pairing một lần.


8. Approve thiết bị mới

Nếu đăng nhập bằng thiết bị mới và bị báo pairing, chạy:

docker exec -it openclaw-gateway sh -lc \
'node dist/index.js devices list --url ws://127.0.0.1:18789 --token "$OPENCLAW_GATEWAY_TOKEN"'

Tìm requestId, sau đó approve:

docker exec -it openclaw-gateway sh -lc \
'node dist/index.js devices approve <REQUEST_ID> --url ws://127.0.0.1:18789 --token "$OPENCLAW_GATEWAY_TOKEN"'

Sau đó quay lại browser và bấm Connect lại.

Lưu ý: mỗi thiết bị hoặc browser mới thường cần approve một lần. Thiết bị đã approve thì lần sau không cần, trừ khi xóa cookie/site data, dùng incognito, đổi domain, hoặc reset config/token.


9. Xác nhận Portainer Full Control

Vào:

Portainer → Stacks → openclaw

Stack nên có tab Editor và không còn trạng thái Limited.

Từ thời điểm này, quản lý OpenClaw bằng Portainer:

Portainer → Stacks → openclaw → Editor / Update the stack

Không dùng lại cách cũ:

cd /opt/stacks/openclaw
docker compose up -d

Vì nếu tạo hoặc redeploy ngoài Portainer, stack có thể quay lại trạng thái Limited control.


Ghi chú bảo mật

OpenClaw là agent gateway có thể kết nối tool, file, browser, memory và automation. Không nên public rộng rãi nếu chưa có lớp bảo vệ phù hợp.

Khuyến nghị tối thiểu:

HTTPS bắt buộc
Gateway token bật
Device pairing bật
NPM Access List nếu chỉ dùng nội bộ
Không bật allowInsecureAuth khi dùng domain HTTPS

Với domain https://oclaw.thanhdv.com, WebSocket URL nên luôn là:

wss://oclaw.thanhdv.com