AI & AUTOMATION

Hướng dẫn toàn tập: triển khai OpenClaw AI Gateway trên Google Cloud Platform

Bạn có bao giờ thầm nghĩ: “Giá mà mình có một một đội ngũ AI riêng, luôn túc trực, hiểu ý và chỉ phục vụ mỗi mình mình”?

Điều đó không còn là viễn tưởng. Với sự kết hợp giữa Google Cloud Platform (GCP)OpenClaw, bạn có thể sở hữu ngay một “Trạm chỉ huy AI” mạnh mẽ, hoạt động bền bỉ 24/7 mà không lo ngốn chi phí phần cứng.

Không chỉ là một chatbot, đây là một hệ thống Multi-Agent thực thụ: nơi các AI chuyên biệt tự động phối hợp xử lý công việc, từ viết code, phân tích dữ liệu đến quản lý hạ tầng. Tất cả được vận hành trên cloud của Google, bảo vệ bởi lớp khiên Cloudflare Zero Trust vững chắc, đảm bảo dữ liệu và quyền truy cập chỉ thuộc về duy nhất một người: BẠN.

Bài viết này sẽ hướng dẫn bạn từ A đến Z cách xây dựng hệ thống đó. Hãy mở terminal lên, và bắt đầu hành trình tạo ra J.A.R.V.I.S của riêng mình.

Yêu cầu trước khi bắt đầu

Để thực hiện theo hướng dẫn này, bạn cần chuẩn bị:

  • Một tài khoản Google Cloud đã kích hoạt thanh toán (billing).
  • Một tên miền (domain) để cấu hình Cloudflare Tunnel.
  • Một tài khoản Cloudflare có quyền truy cập Zero Trust.

Phần 1: Khởi tạo máy chủ ảo trên Google Cloud

1. Tạo project và bật các API cần thiết

Mở terminal hoặc Cloud Shell và chạy lần lượt các lệnh sau:

gcloud projects create <PROJECT_ID>; --name="OpenClaw Gateway"
gcloud config set project <PROJECT_ID>;
gcloud billing projects link <PROJECT_ID>; --billing-account=<BILLING_ID>;
gcloud services enable compute.googleapis.com aiplatform.googleapis.com

2. Tạo máy ảo (VM instance)

Cấu hình khuyến nghị là e2-medium (2 vCPU, 4 GB RAM), ổ đĩa 30 GB SSD, chạy Debian 12:

gcloud compute instances create openclaw-gateway \
    --zone=<ZONE>; \
    --machine-type=e2-medium \
    --boot-disk-size=30GB \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --scopes=cloud-platform

Lưu ý quan trọng: Tham số --scopes=cloud-platform là bắt buộc. Nếu thiếu, OpenClaw sẽ không thể sử dụng Vertex AI và bạn sẽ gặp lỗi ACCESS_TOKEN_SCOPE_INSUFFICIENT.

3. Truy cập vào máy ảo

gcloud compute ssh openclaw-gateway --zone=<ZONE>;

Phần 2: Cài đặt Docker

Sau khi SSH vào VM, tiến hành cài đặt Docker:

sudo apt-get update
sudo apt-get install -y git curl ca-certificates
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER

Sau khi chạy xong, bạn cần thoát ra và đăng nhập lại để quyền nhóm Docker có hiệu lực:

exit
gcloud compute ssh openclaw-gateway --zone=<ZONE>;
docker --version

Phần 3: Triển khai OpenClaw

1. Tải mã nguồn và khởi tạo

git clone https://github.com/openclaw/openclaw.git ~/openclaw
cd ~/openclaw
mkdir -p ~/.openclaw ~/.openclaw/workspace

2. Chạy script cài đặt

chmod +x docker-setup.sh
./docker-setup.sh --non-interactive

3. Kiểm tra trạng thái

docker compose ps
curl -s http://localhost:18789 | head -5

Nếu cả hai lệnh đều trả về kết quả bình thường, OpenClaw đã sẵn sàng hoạt động trên máy chủ nội bộ.

Phần 4: Thiết lập CLIProxyAPI (backend xử lý mô hình ngôn ngữ)

CLIProxyAPI đóng vai trò là lớp trung gian để OpenClaw gọi đến các mô hình AI (Claude, Gemini…) thông qua một proxy thống nhất:

git clone https://github.com/router-for-me/CLIProxyAPI.git ~/CLIProxyAPI
cd ~/CLIProxyAPI
mkdir -p auths logs
nano config.yaml
sudo docker compose up -d

Hãy cấu hình file config.yaml theo hướng dẫn của CLIProxyAPI trước khi khởi chạy.

Phần 5: Bảo mật truy cập bằng Cloudflare Tunnel

Thay vì mở port trực tiếp ra internet (tiềm ẩn rủi ro bảo mật), chúng ta sử dụng Cloudflare Tunnel để tạo một kênh truy cập an toàn.

1. Tạo tunnel trên Cloudflare Dashboard

  1. Đăng nhập vào Cloudflare Zero Trust.
  2. Vào mục Networks, chọn Tunnels, nhấn Create a tunnel.
  3. Đặt tên tunnel (ví dụ: openclaw-gateway).
  4. Sao chép Tunnel Token (chuỗi bắt đầu bằng eyJh...).

2. Chạy Cloudflared trên máy chủ

sudo docker run -d \
    --name cloudflared \
    --restart unless-stopped \
    --network openclaw_default \
    cloudflare/cloudflared:latest \
    tunnel --no-autoupdate run --token <TUNNEL_TOKEN>;

Tham số --network openclaw_default cho phép container Cloudflared kết nối trực tiếp đến container OpenClaw mà không cần đi qua mạng host.

3. Cấu hình tên miền công khai (public hostname)

Trong Cloudflare Dashboard, vào phần cấu hình tunnel và thêm một public hostname:

TrườngGiá trị
Subdomainopenclaw (hoặc tên tùy chọn)
DomainTên miền của bạn
TypeHTTP
URLopenclaw-gateway:18789

Nếu Cloudflared và OpenClaw chạy trên cùng một Docker network, hãy sử dụng tên container (openclaw-gateway:18789). Nếu chạy độc lập, dùng localhost:18789.

4. Cấu hình trustedProxies cho OpenClaw

Đây là bước nhiều người bỏ qua và gặp lỗi 403 Forbidden. OpenClaw cần biết rằng các request đến từ Cloudflare proxy là đáng cậy.

Chỉnh sửa file ~/.openclaw/openclaw.json:

{
  "gateway": {
    "mode": "local",
    "trustedProxies": [
      "172.18.0.1",
      "172.16.0.0/12",
      "10.0.0.0/8",
      "192.168.0.0/16",
      "127.0.0.1"
    ]
  }
}

Phần 6: Xác thực bằng Google SSO qua Cloudflare Access (tùy chọn)

Nếu bạn muốn thêm một lớp bảo mật nữa, hãy bật Cloudflare Access với xác thực qua tài khoản Google.

1. Tạo OAuth credentials trên Google Cloud Console

  1. Truy cập Google Cloud Console > Credentials.
  2. Tạo OAuth client ID loại Web application.
  3. Thêm Authorized redirect URI:
https://<TEAM_NAME>.cloudflareaccess.com/cdn-cgi/access/callback
  1. Lưu lại Client ID và Client Secret.

2. Kết nối Google login vào Cloudflare

  1. Trong Cloudflare Zero Trust, vào Settings > Authentication.
  2. Thêm phương thức đăng nhập Google, nhập Client ID và Client Secret.

3. Tạo ứng dụng Access

  1. Vào Access > Applications > Add an application.
  2. Chọn Self-hosted, cấu hình tên miền trỏ đến openclaw.<tên-miền-của-bạn>.
  3. Tạo policy cho phép các email cụ thể truy cập.

Sau khi hoàn tất, mỗi khi truy cập giao diện web của OpenClaw, hệ thống sẽ yêu cầu đăng nhập bằng tài khoản Google đã được phê duyệt.

Phần 7: Cấu hình tổng thể cho OpenClaw

File cấu hình chính

File ~/.openclaw/openclaw.json là nơi bạn khai báo toàn bộ thông tin về model, provider, agent và kênh giao tiếp:

{
  "gateway": {
    "mode": "local",
    "trustedProxies": ["172.18.0.1", "10.0.0.0/8", "127.0.0.1"]
  },
  "models": {
    "providers": {
      "proxypal": {
        "baseUrl": "http://host.docker.internal:8317/v1",
        "apiKey": "<PROXY_KEY>",
        "api": "openai-completions",
        "models": [
          {"id": "claude-sonnet-4-5", "name": "Claude Sonnet 4.5"},
          {"id": "gemini-3-pro-preview", "name": "Gemini 3 Pro"}
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "proxypal/claude-sonnet-4-5",
        "fallbacks": ["proxypal/gemini-3-pro-preview"]
      }
    }
  }
}

2. Biến môi trường

File ~/openclaw/.env chứa các thông tin nhạy cảm:

OPENCLAW_GATEWAY_TOKEN=<auto-generated>
GOOGLE_CLOUD_PROJECT=<PROJECT_ID>
GOOGLE_CLOUD_LOCATION=us-central1
ANTHROPIC_API_KEY=<PROXY_KEY>
ANTHROPIC_BASE_URL=http://host.docker.internal:8317/v1

Cảnh báo bảo mật: Tuyệt đối không commit file .env lên bất kỳ repository công khai nào. Hãy thêm .env vào .gitignore ngay từ đầu.

Phần 8: Kích hoạt Vertex AI và các công cụ bổ sung

1. Cấp quyền IAM cho service account

PROJECT_ID=$(gcloud config get-value project)
SA=$(gcloud compute instances describe openclaw-gateway --zone=<ZONE> \
  --format="get(serviceAccounts[0].email)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SA" \
  --role="roles/aiplatform.user"

2. Cài đặt các gói Python cần thiết

sudo docker exec openclaw-openclaw-gateway-1 bash -c "
  apt-get update && apt-get install -y python3-pip chromium
  pip3 install google-cloud-aiplatform cognee playwright --break-system-packages
  /home/node/.local/bin/playwright install chromium
"

3. Kiểm tra

# Kiểm tra Vertex AI
sudo docker exec openclaw-openclaw-gateway-1 python3 -c "
import vertexai
vertexai.init(location='us-central1')
print('Vertex AI ready')
"

# Kiểm tra Playwright
sudo docker exec openclaw-openclaw-gateway-1 python3 -c "
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
  browser = p.chromium.launch(headless=True)
  print('Playwright ready')
  browser.close()
"

Phần 9: Thiết lập hệ thống đa agent với Telegram

Đây là tính năng nổi bật nhất của OpenClaw: bạn có thể vận hành nhiều agent AI độc lập, mỗi agent gắn với một bot Telegram riêng biệt.

1. Tạo bot trên Telegram

Chat với @BotFather để tạo các bot mới. Mỗi agent cần một bot riêng. Lưu lại token của từng bot.

2. Cấu hình đa agent

Cập nhật file ~/.openclaw/openclaw.json với cấu trúc sau:

{
  "agents": {
    "defaults": {
      "model": {
        "primary": "proxypal/claude-sonnet-4-5"
      },
      "maxConcurrent": 4
    },
    "list": [
      {
        "id": "main",
        "name": "Javis",
        "default": true,
        "model": "proxypal/claude-opus-4-5-thinking"
      },
      {
        "id": "lena",
        "name": "Lena",
        "model": "proxypal/gemini-3-pro-high"
      }
    ]
  },
  "bindings": [
    {"agentId": "main", "match": {"channel": "telegram", "accountId": "javis"}},
    {"agentId": "lena", "match": {"channel": "telegram", "accountId": "lena"}}
  ],
  "tools": {
    "agentToAgent": {
      "enabled": true,
      "allow": ["main", "lena"]
    }
  },
  "channels": {
    "telegram": {
      "enabled": true,
      "accounts": {
        "javis": {"botToken": "<JAVIS_BOT_TOKEN>"},
        "lena": {"botToken": "<LENA_BOT_TOKEN>"}
      },
      "groupPolicy": "open",
      "streamMode": "partial"
    }
  }
}

3. Tạo thư mục riêng cho mỗi agent (tùy chọn)

for AGENT in main lena; do
  sudo docker exec openclaw-openclaw-gateway-1 mkdir -p /home/node/.openclaw/agents/$AGENT
  sudo docker exec openclaw-openclaw-gateway-1 mkdir -p /home/node/.openclaw/workspace-$AGENT
done

4. Phê duyệt người dùng Telegram

Khi có người nhắn tin cho bot lần đầu, họ sẽ nằm trong danh sách chờ duyệt:

# Xem danh sách chờ
sudo docker compose exec openclaw-gateway openclaw pairing list telegram --pending

# Phê duyệt
sudo docker compose exec openclaw-gateway openclaw pairing approve telegram <USER_ID>

5. Kiểm tra hoạt động đa agent

sudo docker logs openclaw-openclaw-gateway-1 --since 1m 2>&1 | grep -E "telegram|agent"

Kết quả mong đợi sẽ hiển thị các dòng thông báo mỗi bot Telegram đã khởi động thành công.

Phần 10: Truy cập giao diện quản trị

Lấy token

cat ~/openclaw/.env | grep TOKEN

Truy cập giao diện web

Mở trình duyệt và truy cập https://openclaw.<tên-miền-của-bạn>/. Dán token vào phần cài đặt để xác thực, hoặc truy cập trực tiếp qua URL kèm token:

https://openclaw.<tên-miền-của-bạn>/?token=<TOKEN>

Cấu trúc thư mục tham khảo

~/openclaw/
├── docker-compose.yml
├── .env
└── Dockerfile

~/.openclaw/
├── openclaw.json
├── agents/
│   ├── main/agent.yaml
│   └── lena/agent.yaml
├── devices/
│   ├── paired.json
│   └── pending.json
└── workspace/

Xử lý sự cố thường gặp

Hiện tượngNguyên nhân và cách khắc phục
Lỗi ACCESS_TOKEN_SCOPE_INSUFFICIENTVM thiếu scope cloud-platform. Cần tạo lại VM với tham số --scopes=cloud-platform.
Lỗi token_mismatchXóa file paired.json, pending.json rồi restart container và xóa localStorage trên trình duyệt.
Lỗi Proxy headers from untrustedThêm dải IP phù hợp vào mảng trustedProxies trong file cấu hình.
Lỗi Unknown model: anthropic/...Khi sử dụng proxy, phải dùng tiền tố proxypal/ thay vì anthropic/.
Bot Telegram không phản hồiKiểm tra docker compose ps, đảm bảo container đang chạy và cấu hình "enabled": true.
Lỗi 403 Forbidden từ CloudflareKiểm tra lại policy trong Cloudflare Access, đảm bảo email của bạn nằm trong danh sách được phép.
Vòng lặp chuyển hướng (redirect loop)Kiểm tra lại cấu hình trustedProxies.

Khôi phục toàn bộ (nuclear reset)

Trong trường hợp cần làm lại từ đầu phần xác thực thiết bị:

sudo docker exec openclaw-openclaw-gateway-1 bash -c "
  echo {} > /home/node/.openclaw/devices/paired.json
  echo {} > /home/node/.openclaw/devices/pending.json
"
sudo docker compose restart openclaw-gateway

Đồng thời xóa localStorage trên trình duyệt.

Các lệnh thao tác nhanh

# Kết nối SSH
gcloud compute ssh openclaw-gateway --zone=<ZONE>

# Xem log gần nhất
sudo docker logs openclaw-openclaw-gateway-1 --since 5m

# Khởi động lại OpenClaw
cd ~/openclaw && sudo docker compose restart openclaw-gateway

# Dựng lại toàn bộ container
sudo docker compose down && sudo docker compose up -d

# Xem log Cloudflare Tunnel
sudo docker logs cloudflared --since 5m

Sau khi hoàn thành các bước trên, bạn đã có một hệ thống AI agent hoàn chỉnh: chạy ổn định trên hạ tầng Google Cloud, được bảo vệ bởi Cloudflare, và có thể điều khiển linh hoạt qua giao diện web lẫn Telegram. Từ đây, bạn có thể mở rộng thêm nhiều agent, tích hợp thêm các công cụ tự động hóa, hoặc xây dựng quy trình làm việc phức tạp hơn tùy theo nhu cầu.

Mình cũng có tạo script cài tự động, ae tham khảo nhé:

#!/usr/bin/env bash
# =============================================================================
#  setup_openclaw_gcp.sh
#  Script tự động hóa triển khai OpenClaw AI Gateway trên GCP VM
#  Dựa trên hướng dẫn: https://github.com/lktiep/OpenClawGCP
#
#  Cách sử dụng:
#    chmod +x setup_openclaw_gcp.sh
#    ./setup_openclaw_gcp.sh
#
#  Lưu ý: Chạy script này SAU KHI đã SSH vào GCP VM (Debian 12).
# =============================================================================

set -euo pipefail

# --- Màu sắc cho output ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# --- Hàm tiện ích ---
log_info()    { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn()    { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error()   { echo -e "${RED}[ERROR]${NC} $1"; }
log_section() { echo -e "\n${CYAN}========== $1 ==========${NC}\n"; }

# --- Biến cấu hình (người dùng có thể thay đổi) ---
OPENCLAW_DIR="$HOME/openclaw"
OPENCLAW_CONFIG_DIR="$HOME/.openclaw"
CLIPROXY_DIR="$HOME/CLIProxyAPI"

# Tên container OpenClaw (mặc định sau khi chạy docker-setup.sh)
OPENCLAW_CONTAINER="openclaw-openclaw-gateway-1"

# =============================================================================
# PHẦN 1: Kiểm tra và cài đặt các gói hệ thống cơ bản
# =============================================================================
install_prerequisites() {
    log_section "Phần 1: Cài đặt các gói cơ bản"

    log_info "Cập nhật danh sách gói..."
    sudo apt-get update -qq

    log_info "Cài đặt git, curl, ca-certificates..."
    sudo apt-get install -y -qq git curl ca-certificates > /dev/null 2>&1

    log_info "Các gói cơ bản đã sẵn sàng."
}

# =============================================================================
# PHẦN 2: Kiểm tra và cài đặt Docker
# =============================================================================
install_docker() {
    log_section "Phần 2: Kiểm tra Docker"

    # Kiểm tra Docker đã được cài chưa
    if command -v docker &> /dev/null; then
        local docker_version
        docker_version=$(docker --version 2>/dev/null || echo "unknown")
        log_info "Docker đã được cài đặt: $docker_version"
    else
        log_warn "Docker chưa được cài đặt. Đang tiến hành cài đặt..."

        # Cài Docker bằng script chính thức
        curl -fsSL https://get.docker.com | sudo sh

        log_info "Docker đã cài đặt xong."
    fi

    # Thêm user hiện tại vào group docker (nếu chưa có)
    if ! groups "$USER" | grep -q '\bdocker\b'; then
        log_info "Thêm user '$USER' vào group docker..."
        sudo usermod -aG docker "$USER"

        log_warn "====================================================="
        log_warn "BẠN CẦN ĐĂNG XUẤT VÀ ĐĂNG NHẬP LẠI"
        log_warn "để quyền Docker có hiệu lực."
        log_warn ""
        log_warn "Chạy lệnh sau để đăng nhập lại:"
        log_warn "  exit"
        log_warn "  gcloud compute ssh openclaw-gateway --zone=<ZONE>"
        log_warn ""
        log_warn "Sau đó chạy lại script này."
        log_warn "====================================================="
        exit 0
    fi

    # Kiểm tra Docker daemon có đang chạy không
    if ! docker info &> /dev/null; then
        log_warn "Docker daemon chưa chạy. Đang khởi động..."
        sudo systemctl start docker
        sudo systemctl enable docker
    fi

    log_info "Docker daemon đang hoạt động bình thường."
}

# =============================================================================
# PHẦN 3: Clone và triển khai OpenClaw
# =============================================================================
deploy_openclaw() {
    log_section "Phần 3: Triển khai OpenClaw"

    # Kiểm tra thư mục OpenClaw đã tồn tại chưa
    if [ -d "$OPENCLAW_DIR" ]; then
        log_warn "Thư mục $OPENCLAW_DIR đã tồn tại."
        read -rp "Bạn có muốn xóa và clone lại không? (y/N): " confirm
        if [[ "$confirm" =~ ^[Yy]$ ]]; then
            log_info "Xóa thư mục cũ..."
            rm -rf "$OPENCLAW_DIR"
        else
            log_info "Giữ nguyên thư mục hiện tại, bỏ qua bước clone."
        fi
    fi

    # Clone repo nếu thư mục chưa tồn tại
    if [ ! -d "$OPENCLAW_DIR" ]; then
        log_info "Clone repository OpenClaw..."
        git clone https://github.com/openclaw/openclaw.git "$OPENCLAW_DIR"
    fi

    # Tạo thư mục cấu hình
    log_info "Tạo thư mục cấu hình OpenClaw..."
    mkdir -p "$OPENCLAW_CONFIG_DIR"
    mkdir -p "$OPENCLAW_CONFIG_DIR/workspace"
    mkdir -p "$OPENCLAW_CONFIG_DIR/agents"
    mkdir -p "$OPENCLAW_CONFIG_DIR/devices"

    # Chạy script setup
    cd "$OPENCLAW_DIR"

    if [ -f "docker-setup.sh" ]; then
        log_info "Chạy docker-setup.sh (chế độ non-interactive)..."
        chmod +x docker-setup.sh
        ./docker-setup.sh --non-interactive
    else
        log_error "Không tìm thấy file docker-setup.sh trong $OPENCLAW_DIR"
        log_info "Thử khởi chạy bằng docker compose trực tiếp..."
        docker compose up -d
    fi

    # Đợi container khởi động
    log_info "Đợi container khởi động (30 giây)..."
    sleep 30

    # Kiểm tra trạng thái
    log_info "Kiểm tra trạng thái các container..."
    docker compose ps

    log_info "Kiểm tra OpenClaw gateway..."
    if curl -s --max-time 10 http://localhost:18789 > /dev/null 2>&1; then
        log_info "OpenClaw gateway đã hoạt động tại http://localhost:18789"
    else
        log_warn "Chưa nhận được phản hồi từ gateway. Có thể cần thêm thời gian khởi động."
        log_warn "Kiểm tra log: docker logs $OPENCLAW_CONTAINER --since 2m"
    fi
}

# =============================================================================
# PHẦN 4: Clone CLIProxyAPI (backend LLM proxy)
# =============================================================================
deploy_cliproxy() {
    log_section "Phần 4: Thiết lập CLIProxyAPI (tùy chọn)"

    read -rp "Bạn có muốn cài CLIProxyAPI (proxy cho các model LLM) không? (y/N): " confirm
    if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
        log_info "Bỏ qua bước cài CLIProxyAPI."
        return
    fi

    if [ -d "$CLIPROXY_DIR" ]; then
        log_warn "Thư mục $CLIPROXY_DIR đã tồn tại, bỏ qua bước clone."
    else
        log_info "Clone repository CLIProxyAPI..."
        git clone https://github.com/router-for-me/CLIProxyAPI.git "$CLIPROXY_DIR"
    fi

    cd "$CLIPROXY_DIR"
    mkdir -p auths logs

    log_warn "====================================================="
    log_warn "BẠN CẦN CẤU HÌNH FILE config.yaml TRƯỚC KHI KHỞI CHẠY."
    log_warn ""
    log_warn "  nano $CLIPROXY_DIR/config.yaml"
    log_warn ""
    log_warn "Sau khi cấu hình xong, chạy:"
    log_warn "  cd $CLIPROXY_DIR && sudo docker compose up -d"
    log_warn "====================================================="
}

# =============================================================================
# PHẦN 5: Cài đặt các gói Python bổ sung vào container OpenClaw
# =============================================================================
install_python_packages() {
    log_section "Phần 5: Cài đặt thư viện Python vào container"

    # Kiểm tra container có đang chạy không
    if ! docker ps --format '{{.Names}}' | grep -q "$OPENCLAW_CONTAINER"; then
        log_error "Container '$OPENCLAW_CONTAINER' không tìm thấy hoặc chưa chạy."
        log_warn "Hãy đảm bảo OpenClaw đã được triển khai thành công (Phần 3)."
        log_warn "Kiểm tra bằng lệnh: docker compose ps"
        return 1
    fi

    log_info "Cài đặt các gói hệ thống trong container (python3-pip, chromium)..."
    sudo docker exec "$OPENCLAW_CONTAINER" bash -c "
        apt-get update -qq && \
        apt-get install -y -qq python3-pip chromium > /dev/null 2>&1
    " || {
        log_warn "Không thể cài gói hệ thống. Container có thể dùng image khác."
    }

    log_info "Cài đặt thư viện Python: google-cloud-aiplatform, cognee, playwright..."
    sudo docker exec "$OPENCLAW_CONTAINER" bash -c "
        pip3 install --quiet \
            google-cloud-aiplatform \
            cognee \
            playwright \
            --break-system-packages 2>/dev/null || \
        pip3 install --quiet \
            google-cloud-aiplatform \
            cognee \
            playwright
    "

    log_info "Cài đặt Chromium cho Playwright..."
    sudo docker exec "$OPENCLAW_CONTAINER" bash -c "
        playwright install chromium 2>/dev/null || \
        /home/node/.local/bin/playwright install chromium 2>/dev/null || \
        python3 -m playwright install chromium
    " || {
        log_warn "Không thể cài Playwright Chromium tự động."
        log_warn "Thử chạy thủ công trong container."
    }

    # Kiểm tra kết quả
    log_info "Kiểm tra Vertex AI SDK..."
    if sudo docker exec "$OPENCLAW_CONTAINER" python3 -c "
import vertexai
vertexai.init(location='us-central1')
print('Vertex AI SDK: OK')
" 2>/dev/null; then
        log_info "Vertex AI SDK hoạt động bình thường."
    else
        log_warn "Vertex AI SDK chưa sẵn sàng."
        log_warn "Có thể do chưa cấp quyền IAM cho service account."
        log_warn "Chạy lệnh sau trên máy local (không phải trong VM):"
        log_warn "  gcloud projects add-iam-policy-binding <PROJECT_ID> \\"
        log_warn "    --member='serviceAccount:<SA_EMAIL>' \\"
        log_warn "    --role='roles/aiplatform.user'"
    fi

    log_info "Kiểm tra Playwright..."
    if sudo docker exec "$OPENCLAW_CONTAINER" python3 -c "
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    print('Playwright: OK')
    browser.close()
" 2>/dev/null; then
        log_info "Playwright hoạt động bình thường."
    else
        log_warn "Playwright chưa sẵn sàng. Có thể cần cài thêm dependencies."
    fi
}

# =============================================================================
# PHẦN 6: Tạo file cấu hình mẫu
# =============================================================================
create_sample_config() {
    log_section "Phần 6: Tạo file cấu hình mẫu"

    local config_file="$OPENCLAW_CONFIG_DIR/openclaw.json"

    # Không ghi đè nếu file đã tồn tại
    if [ -f "$config_file" ]; then
        log_warn "File $config_file đã tồn tại, không ghi đè."
        log_info "Nếu muốn tạo lại, hãy xóa file cũ trước: rm $config_file"
        return
    fi

    log_info "Tạo file cấu hình mẫu tại $config_file..."

    cat > "$config_file" << 'CONFIGEOF'
{
  "gateway": {
    "mode": "local",
    "trustedProxies": [
      "172.18.0.1",
      "172.16.0.0/12",
      "10.0.0.0/8",
      "192.168.0.0/16",
      "127.0.0.1"
    ]
  },
  "models": {
    "providers": {
      "proxypal": {
        "baseUrl": "http://host.docker.internal:8317/v1",
        "apiKey": "<THAY_BANG_API_KEY_CUA_BAN>",
        "api": "openai-completions",
        "models": [
          {"id": "claude-sonnet-4-5", "name": "Claude Sonnet 4.5"},
          {"id": "gemini-3-pro-preview", "name": "Gemini 3 Pro"}
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "proxypal/claude-sonnet-4-5",
        "fallbacks": ["proxypal/gemini-3-pro-preview"]
      },
      "maxConcurrent": 4
    },
    "list": [
      {
        "id": "main",
        "name": "Javis",
        "default": true,
        "model": "proxypal/claude-sonnet-4-5"
      }
    ]
  },
  "channels": {
    "telegram": {
      "enabled": false,
      "accounts": {
        "javis": {
          "botToken": "<THAY_BANG_BOT_TOKEN_TELEGRAM>"
        }
      },
      "groupPolicy": "open",
      "streamMode": "partial"
    }
  }
}
CONFIGEOF

    log_info "File cấu hình mẫu đã được tạo."
    log_warn "====================================================="
    log_warn "QUAN TRONG: Bạn cần chỉnh sửa file cấu hình"
    log_warn "trước khi sử dụng:"
    log_warn ""
    log_warn "  nano $config_file"
    log_warn ""
    log_warn "Thay thế các giá trị:"
    log_warn "  - <THAY_BANG_API_KEY_CUA_BAN>"
    log_warn "  - <THAY_BANG_BOT_TOKEN_TELEGRAM>"
    log_warn ""
    log_warn "TUYET DOI KHONG chia se API Key cua ban voi bat ky ai!"
    log_warn "====================================================="
}

# =============================================================================
# PHẦN 7: Hiển thị thông tin tổng kết
# =============================================================================
show_summary() {
    log_section "Hoàn tất cài đặt"

    echo -e "${GREEN}"
    echo "  ============================================="
    echo "   OpenClaw AI Gateway - Cài đặt hoàn tất"
    echo "  ============================================="
    echo -e "${NC}"

    echo "  Thư mục OpenClaw:     $OPENCLAW_DIR"
    echo "  Thư mục cấu hình:     $OPENCLAW_CONFIG_DIR"
    echo "  File cấu hình chính:  $OPENCLAW_CONFIG_DIR/openclaw.json"
    echo ""

    # Lấy token nếu có
    local env_file="$OPENCLAW_DIR/.env"
    if [ -f "$env_file" ]; then
        local token
        token=$(grep -oP 'OPENCLAW_GATEWAY_TOKEN=\K.*' "$env_file" 2>/dev/null || echo "")
        if [ -n "$token" ]; then
            echo -e "  Gateway Token:        ${YELLOW}$token${NC}"
        fi
    fi

    echo ""
    echo "  Các bước tiếp theo:"
    echo "  -------------------------------------------"
    echo "  1. Chỉnh sửa file cấu hình:"
    echo "       nano $OPENCLAW_CONFIG_DIR/openclaw.json"
    echo ""
    echo "  2. Thiết lập Cloudflare Tunnel (xem bài hướng dẫn)."
    echo ""
    echo "  3. Khởi động lại OpenClaw sau khi cấu hình:"
    echo "       cd $OPENCLAW_DIR && docker compose restart openclaw-gateway"
    echo ""
    echo "  4. Truy cập giao diện web:"
    echo "       http://localhost:18789 (nội bộ)"
    echo "       https://openclaw.<ten-mien-cua-ban> (qua Cloudflare)"
    echo ""
    echo "  Các lệnh hữu ích:"
    echo "  -------------------------------------------"
    echo "  Xem log:       docker logs $OPENCLAW_CONTAINER --since 5m"
    echo "  Khởi động lại: cd $OPENCLAW_DIR && docker compose restart"
    echo "  Dừng hệ thống: cd $OPENCLAW_DIR && docker compose down"
    echo ""
}

# =============================================================================
# MAIN: Chạy toàn bộ quy trình
# =============================================================================
main() {
    echo -e "${CYAN}"
    echo "  ============================================="
    echo "   OpenClaw GCP - Script cài đặt tự động"
    echo "   Phiên bản: 1.0.0"
    echo "   Nguồn: github.com/lktiep/OpenClawGCP"
    echo "  ============================================="
    echo -e "${NC}"

    # Kiểm tra hệ điều hành
    if [ ! -f /etc/debian_version ]; then
        log_warn "Script này được thiết kế cho Debian/Ubuntu."
        log_warn "Hệ điều hành hiện tại có thể không tương thích."
        read -rp "Bạn có muốn tiếp tục không? (y/N): " confirm
        if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
            log_info "Đã hủy."
            exit 0
        fi
    fi

    # Chạy từng phần theo thứ tự
    install_prerequisites    # Phần 1: Gói cơ bản
    install_docker           # Phần 2: Docker
    deploy_openclaw          # Phần 3: OpenClaw
    deploy_cliproxy          # Phần 4: CLIProxyAPI (tùy chọn)
    install_python_packages  # Phần 5: Thư viện Python
    create_sample_config     # Phần 6: File cấu hình mẫu
    show_summary             # Phần 7: Tổng kết

    log_info "Script hoàn tất. Chúc bạn sử dụng OpenClaw vui vẻ!"
}

# Chạy hàm main
main "$@"

Nguồn tham khảo: lktiep/OpenClawGCP

Duy Nghiện
Hãy làm khán giả, đừng làm nhân vật chính :)

You may also like

Nhận thông báo qua email
Nhận thông báo cho
guest

0 Bình luận
Mới nhất
Cũ nhất Nhiều like nhất
Phản hồi nội tuyến
Xem tất cả bình luận