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