Terraform-এর মাধ্যমে Cloud Run ইনস্ট্যান্সে OpenClaw কীভাবে ডিপ্লয় করবেন

১. ভূমিকা

এক নজরে

এই ল্যাবে, আপনি ডিক্লারেটিভ ইনফ্রাস্ট্রাকচার অ্যাজ কোড (Terraform) ব্যবহার করে Cloud Run ইনস্ট্যান্স-এ OpenClaw-এর একটি সম্পূর্ণ স্থায়ী, প্রোডাকশন-গ্রেড ইনস্ট্যান্স ডিপ্লয় করবেন। এটি একটি ওপেন-সোর্স AI এজেন্ট ফ্রেমওয়ার্ক। আপনি google প্রোভাইডার থেকে google_cloud_run_v2_instance রিসোর্স ব্যবহার করে Cloud Run ইনস্ট্যান্স প্রোভিশন করবেন, এজেন্ট ওয়ার্কস্পেস স্টেট বজায় রাখতে Cloud Storage FUSE-এর মাধ্যমে Google Cloud Storage মাউন্ট করবেন, Google Cloud Secret Manager ব্যবহার করে নিরাপদে API ক্রেডেনশিয়াল ম্যানেজ করবেন এবং সুরক্ষিত ডিভাইস পেয়ারিংয়ের জন্য Cloud Run ইনস্ট্যান্স নেটিভ SSH ব্যবহার করে OpenClaw-এর বিল্ট-ইন ওয়েব UI-এর মাধ্যমে আপনার AI এজেন্টের সাথে ইন্টার‍্যাক্ট করবেন।

শুরু করার আগে, OpenClaw-এর আর্কিটেকচার, টুল ও এজেন্ট ওয়ার্কফ্লো সম্পর্কে জানতে, আপনি OpenClaw ডকুমেন্টেশন এক্সপ্লোর করতে পারেন।

আপনি কী করবেন

  • Terraform (main.tf)-এ আপনার সম্পূর্ণ ইনফ্রাস্ট্রাকচার ডিক্লেরেটিভভাবে সংজ্ঞায়িত করুন, যার মধ্যে API, পরিষেবা অ্যাকাউন্ট, IAM বাইন্ডিং, সিক্রেট, স্টোরেজ বাকেট এবং Cloud Run ইনস্ট্যান্স অন্তর্ভুক্ত।
  • google_cloud_run_v2_instance ব্যবহার করে OpenClaw 2.0+ (ghcr.io/openclaw/openclaw:latest) ডিপ্লয় করুন।
  • Secret Manager-এ অটোমেটিক সুরক্ষিত গেটওয়ে ক্রেডেনশিয়াল তৈরি ও স্টোর করুন।
  • Cloud Storage FUSE-এর মাধ্যমে Cloud Storage বাকেট মাউন্ট করুন এবং টেকসই অবস্থা, ওয়ার্কস্পেস ও SQLite পারসিস্টেন্সের জন্য /home/node/.openclaw সিঙ্ক করুন।
  • OpenClaw Control Web UI-তে ব্রাউজার ডিভাইস পেয়ারিংয়ের অনুরোধ যাচাই ও অনুমোদন করতে gcloud beta run instances ssh ব্যবহার করুন।
  • (ঐচ্ছিক) মেসেজিং চ্যানেল কনফিগার করুন (Telegram অথবা WhatsApp)।
  • (ঐচ্ছিক) Cloud Storage-এ কাস্টম দক্ষতা যোগ করে আপনার এজেন্টের ক্ষমতা বাড়ান।

আপনি কী শিখবেন

  • Terraform ব্যবহার করে কীভাবে Cloud Run ইনস্ট্যান্স ডিক্লেয়ার ও ডিপ্লয় করবেন।
  • Terraform-এ Cloud Storage FUSE ভলিউম মাউন্ট কীভাবে কনফিগার করতে হয়।
  • Cloud Run ইনস্ট্যান্সে এনভায়রনমেন্ট ভেরিয়েবল হিসেবে Secret Manager-এর সিক্রেট কীভাবে নিরাপদে ইনজেক্ট করবেন।
  • Cloud Run ইনস্ট্যান্স নেটিভ SSH ব্যবহার করে কীভাবে OpenClaw 2.0 ডিভাইস যাচাইকরণ ম্যানেজ করবেন।
  • Cloud Run ইনস্ট্যান্সে অনেক বেশিক্ষণ ধরে চলা, স্থায়ী এজেন্ট ওয়ার্কলোড কীভাবে রান করবেন।

২. সেট-আপ ও প্রয়োজনীয়তা

GCP প্রোজেক্ট সেট-আপ

  1. Google Cloud Console-এ সাইন-ইন করুন।
  2. Google Cloud প্রোজেক্ট তৈরি করুন বা বেছে নিন।
  3. আপনার Google Cloud প্রোজেক্টের জন্য বিলিং চালু করা আছে কিনা তা নিশ্চিত করুন।

Cloud Shell খুলুন

Cloud Console-এর উপরের টুলবার থেকে Google Cloud Shell চালু করুন। Cloud Shell-এ Terraform ও Google Cloud SDK আগে থেকেই ইনস্টল করা থাকে।

প্রোজেক্ট ও অঞ্চল সেট করুন

আপনার প্রোজেক্ট আইডি ও অঞ্চল এনভায়রনমেন্ট ভেরিয়েবেল হিসেবে সেট করুন এবং gcloud কনফিগার করুন:

export PROJECT_ID=<YOUR_PROJECT_ID>
export REGION=<YOUR_REGION>

gcloud config set project $PROJECT_ID
gcloud config get project

gcloud বিটা কম্পোনেন্ট ইনস্টল করুন

beta কম্পোনেন্ট ইনস্টল করা আছে কিনা তা নিশ্চিত করুন (Cloud Run ইনস্ট্যান্স SSH এবং লগ স্ট্রিমিংয়ের জন্য প্রয়োজন):

gcloud components install beta --quiet
gcloud components update

Terraform যাচাই করুন

Terraform ইনস্টল করা আছে এবং ভার্সন সংক্রান্ত প্রয়োজনীয়তা পূরণ করে কিনা তা কনফার্ম করুন:

terraform version

আপনি Terraform v1.5.0 বা তার পরের যেকোনও ভার্সন দেখতে পাবেন।

৩. (ঐচ্ছিক) মেসেজিং ইন্টিগ্রেশন সেট-আপ করুন (Telegram বা WhatsApp)

আপনি OpenClaw-কে Telegram বা WhatsApp-এর সাথে কানেক্ট করতে পারবেন। নিচে থেকে বিকল্প ক অথবা বিকল্প খ বেছে নিন।

বিকল্প ক: Telegram বট সেট-আপ করা

  1. Telegram খুলে @BotFather সার্চ করুন।
  2. /newbot কমান্ড পাঠান এবং বটের নাম ও ইউজারনেম নির্দিষ্ট করতে প্রম্পট অনুসরণ করুন।
  3. জেনারেট করা HTTP API টোকেন (যেমন, 123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ) কপি করুন।
  4. Telegram-এ @userinfobot সার্চ করুন, /start পাঠান এবং আপনার সংখ্যাবাচক ইউজার আইডি (যেমন, 8035936176) কপি করুন।

আপনি এই ভ্যালুগুলি আপনার terraform.tfvars ফাইলে Terraform ইনপুট ভেরিয়েবল হিসেবে প্রদান করবেন।

বিকল্প খ: WhatsApp সেট-আপ

  1. আপনার ব্যক্তিগত WhatsApp ফোন নম্বরটি স্পেস বা চিহ্ন ছাড়া আন্তর্জাতিক ফর্ম্যাটে (যেমন, +15551234567) সংগ্রহ করুন।
  2. OpenClaw, WhatsApp চ্যানেল অনুমোদিত তালিকা নীতি অনুযায়ী কানেক্ট করে।

৪. Terraform-এ ইনফ্রাস্ট্রাকচার নির্ধারণ করুন

আমরা Terraform-এ আমাদের সম্পূর্ণ পরিকাঠামো ঘোষণা করব। এর মধ্যে রয়েছে প্রয়োজনীয় Google Cloud API চালু করা, ডেডিকেটেড পরিষেবা অ্যাকাউন্ট ও IAM ভূমিকা তৈরি করা, Secret Manager-এ সিক্রেট তৈরি ও স্টোর করা, Cloud Storage স্টেট বাকেট প্রোভিশন করা, openclaw.json কনফিগারেশন তৈরি করা এবং Cloud Run ইনস্ট্যান্স ডিপ্লয় করা।

১. Terraform ডিরেক্টরি তৈরি করুন

Cloud Shell-এ, আপনার Terraform ফাইলের জন্য একটি ডিরেক্টরি তৈরি করুন এবং এতে নেভিগেট করুন:

mkdir openclaw-terraform && cd openclaw-terraform

২. main.tf তৈরি করুন

main.tf নামের একটি ফাইল তৈরি করুন। এই কনফিগারেশন সব ইনফ্রাস্ট্রাকচার কম্পোনেন্ট নির্ধারণ করতে Google প্রোভাইডার ব্যবহার করে:

terraform {
  required_version = ">= 1.5.0"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = ">= 8.8.0"
    }
    random = {
      source  = "hashicorp/random"
      version = ">= 3.5.0"
    }
  }
}

provider "google" {
  project = var.project_id
  region  = var.region
}

# 1. Enable Required APIs
resource "google_project_service" "services" {
  for_each = toset([
    "run.googleapis.com",
    "secretmanager.googleapis.com",
    "storage.googleapis.com",
    "generativelanguage.googleapis.com",
    "compute.googleapis.com"
  ])
  project            = var.project_id
  service            = each.key
  disable_on_destroy = false
}

# 2. Dedicated Service Account
resource "google_service_account" "openclaw_sa" {
  account_id   = "openclaw-sa"
  display_name = "OpenClaw Service Account"
  depends_on   = [google_project_service.services]
}

# 3. Secret Manager: Gateway Password
resource "random_password" "gateway_password" {
  length  = 32
  special = false
}

resource "google_secret_manager_secret" "gateway_password" {
  secret_id = "openclaw-gateway-password"
  replication {
    auto {}
  }
  depends_on = [google_project_service.services]
}

resource "google_secret_manager_secret_version" "gateway_password" {
  secret      = google_secret_manager_secret.gateway_password.id
  secret_data = random_password.gateway_password.result
}

resource "google_secret_manager_secret_iam_member" "sa_gateway_password" {
  secret_id = google_secret_manager_secret.gateway_password.id
  role      = "roles/secretmanager.secretAccessor"
  member    = "serviceAccount:${google_service_account.openclaw_sa.email}"
}

# 4. Secret Manager: Gemini API Key
resource "google_secret_manager_secret" "gemini_api_key" {
  secret_id = "gemini-api-key"
  replication {
    auto {}
  }
  depends_on = [google_project_service.services]
}

resource "google_secret_manager_secret_version" "gemini_api_key" {
  secret      = google_secret_manager_secret.gemini_api_key.id
  secret_data = var.gemini_api_key
}

resource "google_secret_manager_secret_iam_member" "sa_gemini_api_key" {
  secret_id = google_secret_manager_secret.gemini_api_key.id
  role      = "roles/secretmanager.secretAccessor"
  member    = "serviceAccount:${google_service_account.openclaw_sa.email}"
}

# 5. Optional Secret Manager: Telegram Bot Token
resource "google_secret_manager_secret" "telegram_bot_token" {
  count     = var.telegram_bot_token != "" ? 1 : 0
  secret_id = "telegram-bot-token"
  replication {
    auto {}
  }
  depends_on = [google_project_service.services]
}

resource "google_secret_manager_secret_version" "telegram_bot_token" {
  count       = var.telegram_bot_token != "" ? 1 : 0
  secret      = google_secret_manager_secret.telegram_bot_token[0].id
  secret_data = var.telegram_bot_token
}

resource "google_secret_manager_secret_iam_member" "sa_telegram_bot_token" {
  count     = var.telegram_bot_token != "" ? 1 : 0
  secret_id = google_secret_manager_secret.telegram_bot_token[0].id
  role      = "roles/secretmanager.secretAccessor"
  member    = "serviceAccount:${google_service_account.openclaw_sa.email}"
}

# 6. Cloud Storage Bucket for State Persistence
resource "google_storage_bucket" "openclaw_state" {
  name                        = "openclaw-state-${var.project_id}"
  location                    = var.region
  uniform_bucket_level_access = true
  force_destroy               = true
  depends_on                  = [google_project_service.services]
}

resource "google_storage_bucket_iam_member" "sa_storage" {
  bucket = google_storage_bucket.openclaw_state.name
  role   = "roles/storage.objectUser"
  member = "serviceAccount:${google_service_account.openclaw_sa.email}"
}

# 7. Upload openclaw.json to Cloud Storage Root
resource "google_storage_bucket_object" "openclaw_config" {
  name   = "openclaw.json"
  bucket = google_storage_bucket.openclaw_state.name
  content = jsonencode({
    gateway = {
      mode           = "local"
      port           = 18789
      trustedProxies = ["127.0.0.1", "::1", "169.254.0.0/16", "10.0.0.0/8"]
      bind           = "lan"
      auth = {
        password = "$${OPENCLAW_GATEWAY_PASSWORD}"
      }
      controlUi = {
        allowedOrigins = ["*"]
        enabled        = true
      }
    }
    memory = {
      search = {
        provider = "gemini"
      }
    }
    agents = {
      defaults = {
        model = {
          primary = "google/gemini-3.1-pro-preview"
        }
        sandbox = {
          mode = "off"
        }
      }
    }
    skills = {
      load = {
        extraDirs = ["/mnt/openclaw/skills"]
      }
    }
    channels = {
      telegram = {
        enabled        = var.telegram_bot_token != ""
        defaultAccount = "default"
        accounts = {
          default = {
            enabled   = var.telegram_bot_token != ""
            dmPolicy  = "allowlist"
            allowFrom = var.telegram_user_id != "" ? [var.telegram_user_id] : []
          }
        }
      }
    }
    plugins = {
      entries = {
        google   = { enabled = true }
        telegram = { enabled = var.telegram_bot_token != "" }
      }
    }
  })
}

# 8. Cloud Run Instance
resource "google_cloud_run_v2_instance" "openclaw" {
  name     = "openclaw-instance"
  location = var.region

  ingress              = "INGRESS_TRAFFIC_ALL"
  invoker_iam_disabled = true
  restart_policy       = "ON_FAILURE"
  service_account      = google_service_account.openclaw_sa.email

  containers {
    image = "ghcr.io/openclaw/openclaw:latest"
    args = [
      "/bin/sh",
      "-c",
      "cp /mnt/openclaw/openclaw.json /home/node/.openclaw/ && exec node /app/openclaw.mjs gateway"
    ]

    ports {
      container_port = 18789
    }

    resources {
      limits = {
        cpu    = "4"
        memory = "4Gi"
      }
    }

    env {
      name = "GEMINI_API_KEY"
      value_source {
        secret_key_ref {
          secret  = google_secret_manager_secret.gemini_api_key.secret_id
          version = "latest"
        }
      }
    }

    env {
      name = "OPENCLAW_GATEWAY_PASSWORD"
      value_source {
        secret_key_ref {
          secret  = google_secret_manager_secret.gateway_password.secret_id
          version = "latest"
        }
      }
    }

    dynamic "env" {
      for_each = toset(var.telegram_bot_token != "" ? ["telegram"] : [])
      content {
        name = "TELEGRAM_BOT_TOKEN"
        value_source {
          secret_key_ref {
            secret  = google_secret_manager_secret.telegram_bot_token[0].secret_id
            version = "latest"
          }
        }
      }
    }

    volume_mounts {
      name       = "openclaw-storage"
      mount_path = "/mnt/openclaw"
    }
  }

  volumes {
    name = "openclaw-storage"
    gcs {
      bucket        = google_storage_bucket.openclaw_state.name
      read_only     = false
      mount_options = ["uid=1000", "gid=1000", "file-mode=0700", "dir-mode=0700"]
    }
  }

  depends_on = [
    google_project_service.services,
    google_storage_bucket_object.openclaw_config,
    google_secret_manager_secret_version.gateway_password,
    google_secret_manager_secret_version.gemini_api_key,
    google_secret_manager_secret_iam_member.sa_gateway_password,
    google_secret_manager_secret_iam_member.sa_gemini_api_key,
    google_storage_bucket_iam_member.sa_storage
  ]
}

৩. variables.tf তৈরি করুন

ইনপুট ভেরিয়েবেল নির্দিষ্ট করতে variables.tf নামের একটি ফাইল তৈরি করুন:

variable "project_id" {
  type        = string
  description = "Google Cloud Project ID"
}

variable "region" {
  type        = string
  default     = "us-west1"
  description = "Google Cloud Region for Cloud Run and Storage"
}

variable "gemini_api_key" {
  type        = string
  sensitive   = true
  description = "Gemini API Key from Google AI Studio"
}

variable "telegram_bot_token" {
  type        = string
  default     = ""
  sensitive   = true
  description = "(Optional) Telegram Bot HTTP API Token"
}

variable "telegram_user_id" {
  type        = string
  default     = ""
  description = "(Optional) Telegram User ID for allowlist policy"
}

৪. outputs.tf তৈরি করুন

ডেপ্লয় করা ইনস্ট্যান্স URL, জেনারেট করা গেটওয়ে পাসওয়ার্ড ও স্টোরেজ বাকেট নাম দেখানোর জন্য outputs.tf নামের একটি ফাইল তৈরি করুন:

output "instance_url" {
  description = "Public URL for OpenClaw Cloud Run Instance"
  value       = google_cloud_run_v2_instance.openclaw.urls[0]
}

output "gateway_password" {
  description = "Generated OpenClaw Gateway Password"
  value       = random_password.gateway_password.result
  sensitive   = true
}

output "storage_bucket" {
  description = "Cloud Storage bucket persisting OpenClaw state"
  value       = google_storage_bucket.openclaw_state.name
}

৫. terraform.tfvars তৈরি করুন

Gemini API key পেতে:

  1. Google AI Studio-তে যান এবং আপনার Google অ্যাকাউন্ট দিয়ে সাইন-ইন করুন।
  2. API কী তৈরি করুন বিকল্পে ক্লিক করে আপনার Google Cloud প্রোজেক্ট বেছে নিন।
  3. জেনারেট করা API key কপি করুন।

আপনার প্রোজেক্টের কোঅর্ডিনেট সহ terraform.tfvars নামের একটি ফাইল তৈরি করুন:

project_id     = "YOUR_PROJECT_ID"
region         = "YOUR_REGION"
gemini_api_key = "YOUR_GEMINI_API_KEY"

# Optional: Uncomment if configuring Telegram
# telegram_bot_token = "YOUR_TELEGRAM_BOT_TOKEN"
# telegram_user_id   = "YOUR_TELEGRAM_USER_ID"

৫. Terraform-এর সাহায্যে পরিকাঠামো ডিপ্লয় করা

১. শুরু করুন ও প্রয়োগ করুন

Terraform ওয়ার্কিং ডিরেক্টরি শুরু করুন এবং প্রোভাইডার প্লাগ-ইন ডাউনলোড করুন:

terraform init

ইনফ্রাস্ট্রাকচার ডিপ্লয় করুন:

terraform apply

প্রম্পট করা হলে, প্ল্যান করা রিসোর্স পর্যালোচনা করুন এবং কনফার্ম করতে yes টাইপ করুন।

২. ডিপ্লয়মেন্ট আউটপুট এক্সট্র্যাক্ট করুন

Terraform স্টেট থেকে ইনস্ট্যান্স URL এবং জেনারেট করা গেটওয়ে পাসওয়ার্ড এক্সপোর্ট করুন:

export INSTANCE_URL=$(terraform output -raw instance_url)
export GATEWAY_PASSWORD=$(terraform output -raw gateway_password)

echo "Instance URL: ${INSTANCE_URL}"
echo "Gateway Password: ${GATEWAY_PASSWORD}"

৬. Web UI-এর মাধ্যমে ইন্টার‍্যাক্ট ও Cloud Run SSH-এর মাধ্যমে যাচাই করা

OpenClaw 2.0+ ক্রিপ্টোগ্রাফিক ডিভাইস যাচাইকরণ এনফোর্স করে। নতুন ব্রাউজার থেকে কানেক্ট করার সময়, গেটওয়ে একটি পেয়ারিং অনুরোধ তৈরি করে যা আপনি Cloud Run ইনস্ট্যান্স নেটিভ SSH-এর মাধ্যমে সরাসরি অনুমোদন করেন।

১. OpenClaw কন্ট্রোল UI খুলুন

  1. আপনার ওয়েব ব্রাউজারে $INSTANCE_URL খুলুন।
  2. যাচাইকরণের জন্য প্রম্পট করা হলে, আপনার গেটওয়ে পাসওয়ার্ড ($GATEWAY_PASSWORD) লিখুন।
  3. এটি একটি নতুন ব্রাউজার সেশন হওয়ার কারণে, OpenClaw কন্ট্রোল UI একটি অনুরোধ আইডি (যেমন: b56143fc-1654-49da-a1d8-5d40479ddc66) সহ একটি মুলতুবি থাকা ডিভাইস পেয়ারিং প্রম্পট দেখায়। এই অনুরোধ আইডি কপি করুন।

২. Cloud Run ইনস্ট্যান্সে SSH করা

Cloud Shell-এ, আপনার চালু থাকা ইনস্ট্যান্সে একটি নিরাপদ ইন্টার‍্যাক্টিভ শেল শুরু করুন:

gcloud beta run instances ssh openclaw-instance --region=${REGION}

৩. ডিভাইস পেয়ারিং অনুমোদন করুন

SSH সেশনের মধ্যে, আপনার ব্রাউজার অনুরোধ অনুমোদন করুন:

openclaw devices approve <REQUEST_ID> --password ${GATEWAY_PASSWORD}

৪. আপনার এজেন্টকে প্রম্পট করুন (অ্যাকশনে থাকা ইনস্ট্যান্স)

অনুমোদন পাওয়ার পরে, আপনার ব্রাউজার অবিলম্বে OpenClaw কন্ট্রোল ড্যাশবোর্ডের সাথে কানেক্ট হয়ে যায়!

  1. চ্যাট UI-তে প্রম্পট পাঠিয়ে আপনার OpenClaw এজেন্ট পরীক্ষা করুন, যেমন, "Hello"।
  2. Cloud Run ইনস্ট্যান্সের দীর্ঘস্থায়ী লাইফসাইকেল ও স্থায়ী স্টোরেজ পরীক্ষা করতে, আপনার OpenClaw এজেন্টকে একটি শিডিউল করা, স্বয়ংক্রিয় টাস্ক পারফর্ম করার জন্য প্রম্পট করুন। যেমন, রিলিজের জন্য GitHub রিপোজিটরি মনিটর করা এবং ডাইজেস্ট ড্রাফ্ট করা:
    Check the GitHub repository openclaw/openclaw every hour for the next 24 hours. Track any new releases, merged pull requests, and breaking changes. Save a structured markdown digest titled `daily-release-digest.md` to your workspace, and notify me in this chat with a summary whenever a new release is detected.
    
  3. OpenClaw স্টেট, ওয়ার্কস্পেস ফাইল ও SQLite ডেটাবেস সরাসরি Cloud Storage FUSE-এর মাধ্যমে Cloud Storage-এ সেভ করা হয় বলে শিডিউল করা টাস্ক, কথোপকথনের ইতিহাস ও জেনারেট করা ডাইজেস্ট ফাইল, ইনস্ট্যান্স রিস্টার্ট ও কন্টেনার আপগ্রেড করার পরেও থেকে যায়।

৭. (ঐচ্ছিক) মেসেজিং চ্যানেল ইন্টিগ্রেশন যাচাই করুন

আপনি উপরে উল্লেখ করা ঐচ্ছিক সেট-আপের ধাপগুলিতে Telegram বা WhatsApp কনফিগার করে থাকলে, মেসেজ ডেলিভারি যাচাই করতে পারবেন:

  1. Cloud Shell-এ ইনস্ট্যান্স লগ চেক করুন:
    gcloud beta run instances logs read openclaw-instance --region ${REGION} --limit 20
    
  2. Telegram (বা WhatsApp) খুলে মেসেজ পাঠান (যেমন, /start বা Hello OpenClaw!)।
  3. বটটি openclaw.json-এ অনুমোদিত তালিকার সাথে আপনার ব্যবহারকারীর আইডি যাচাই করবে এবং Gemini ব্যবহার করে উত্তর দেবে!

৮. ইনস্ট্যান্স লগ মনিটর ও পরীক্ষা করা

Cloud Run ইনস্ট্যান্স আপনার কন্টেনার থেকে stdout ও stderr ক্যাপচার করে এবং সরাসরি Google Cloud Logging-এ স্ট্রিম করে। আপনি Cloud Shell বা Cloud Console ব্যবহার করে গেটওয়ে ট্রাফিক মনিটর করতে এবং রিয়েল টাইমে এজেন্ট টুল রান করা দেখতে পারবেন।

১. সাম্প্রতিক ইনস্ট্যান্স লগ পড়ুন

Cloud Shell-এ ইনস্ট্যান্স থেকে সাম্প্রতিক লগ এন্ট্রি ফেচ করতে:

gcloud beta run instances logs read openclaw-instance \
  --region ${REGION} \
  --limit 50

২. লক্ষ্য করার জন্য গুরুত্বপূর্ণ লগ সিগনেচার

আপনার রান করা এজেন্ট পর্যবেক্ষণ করার সময়, নিম্নলিখিত মূল রানটাইম লগ ইভেন্টগুলি দেখুন:

  • [gateway] ready: OpenClaw HTTP এবং WebSocket গেটওয়ে শুরু হয়েছে এবং পোর্ট ১৮৭৮৯-এ শুনছে তা কনফার্ম করে।
  • [gateway] agent model: ...: অ্যাক্টিভ Gemini মডেল দেখায় (যেমন, google/gemini-3.1-pro-preview বা google/gemini-3.5-flash)।
  • [agents/tool-policy]: আপনার নীতি অনুযায়ী অনুমোদিত বা সীমাবদ্ধ টুল দেখায়।
  • [agent/embedded]: এজেন্টের মাধ্যমে এক্সিকিউশন ও টুল ইনভোকেশন ট্রেস করে।

৩. Google Cloud Console-এ লগ পরীক্ষা করুন

এছাড়াও, আপনি Cloud Console-এ Logs Explorer ব্যবহার করে লগ দেখতে ও ফিল্টার করতে পারবেন:

resource.type="cloud_run_instance"
resource.labels.instance_name="openclaw-instance"

৯. (ঐচ্ছিক) স্কিলের মাধ্যমে আপনার এজেন্টের ক্ষমতা বাড়ান

OpenClaw দক্ষতা সমর্থন করে—মডুলার ক্ষমতা প্যাকেজ যা আপনার এজেন্টকে নির্দিষ্ট ওয়ার্কফ্লো, বিশেষায়িত CLI টুল এবং ডোমেন-নির্দিষ্ট নির্দেশাবলী শেখায়।

স্কিল কীভাবে কাজ করে

প্রতিটি স্কিল হল একটি ডিরেক্টরি যাতে একটি SKILL.md ফাইল থাকে। এটি YAML ফ্রন্টম্যাটার দিয়ে শুরু হয় যা মেটাডেটা (name ও description) নির্দিষ্ট করে, তারপরে Markdown নির্দেশাবলী থাকে:

---
name: summarize-logs
description: Summarize Cloud Run error logs into actionable bullet points.
---

# Log Summarizer Skill

When asked to analyze or summarize logs:
1. Parse error stack traces and group similar errors by frequency.
2. Identify root causes such as memory limits, timeouts, or permission errors.
3. Propose concrete remediation steps.
  • name: স্কিল শনাক্তকারী (সরাসরি স্ল্যাশ কমান্ড হিসেবেও কল করা যায়, যেমন /summarize-logs)।
  • description: OpenClaw-এর মডেলকে বলে যে স্বাভাবিক কথোপকথনে কখন এই স্কিল অটোমেটিক চালু করতে হবে।

আপনার Cloud Storage বাকেটে কাস্টম স্কিল যোগ করা

আপনার Cloud Storage বাকেট /mnt/openclaw-এ মাউন্ট করা এবং skills.load.extraDirs-এ কনফিগার করা আছে বলে, gs://${BUCKET_NAME}/skills/-এর অধীনে থাকা স্কিলগুলি অটোমেটিক লোড হয়ে যায় এবং ইনস্ট্যান্স রিস্টার্ট করার পরেও থেকে যায়:

  1. আপনার বাকেটের নাম ফিরিয়ে আনা:
    export BUCKET_NAME=$(terraform output -raw storage_bucket)
    
  2. স্থানীয় স্কিল ডিরেক্টরি তৈরি করুন:
    mkdir -p my-skill
    cat << 'EOF' > my-skill/SKILL.md
    ---
    name: summarize-logs
    description: Summarize Cloud Run error logs into actionable bullet points.
    ---
    
    # Log Summarizer Skill
    
    When asked to analyze or summarize logs, group errors by frequency and suggest actionable fixes.
    EOF
    
  3. Cloud Storage-এ স্কিল আপলোড করা:
    gcloud storage cp -r my-skill gs://${BUCKET_NAME}/skills/
    
  4. চ্যাটে স্কিল ব্যবহার করুন:
    • OpenClaw কন্ট্রোল ওয়েব UI-তে ফিরে যান।
    • আপনি এখন /summarize-logs ব্যবহার করে আপনার এজেন্টকে প্রম্পট করতে পারেন অথবা দক্ষতার বিবরণের সাথে মেলে এমন ন্যাচারাল ল্যাঙ্গুয়েজে প্রশ্ন জিজ্ঞাসা করতে পারেন!

১০. ক্লিন আপ করুন

এই কোডল্যাবে ব্যবহৃত রিসোর্সের জন্য আপনার Google Cloud অ্যাকাউন্টে চার্জ করা এড়াতে, আপনি Terraform ব্যবহার করে এক ধাপে সমস্ত প্রভিশন করা ইনফ্রাস্ট্রাকচার ধ্বংস করতে পারেন:

  1. আপনি নিজের openclaw-terraform ডিরেক্টরিতে আছেন কিনা তা নিশ্চিত করুন:
    cd openclaw-terraform
    
  2. সব রিসোর্স ধ্বংস করুন:
    terraform destroy
    
  3. প্রম্পট করা হলে, যে রিসোর্স সরিয়ে দেওয়া হবে তা পর্যালোচনা করুন এবং কনফার্ম করতে yes টাইপ করুন। Terraform, Cloud Run ইনস্ট্যান্স, Secret Manager সিক্রেট, IAM নীতি বাইন্ডিং, পরিষেবা অ্যাকাউন্ট এবং Cloud Storage বাকেট মুছে দেবে।

১১. উপসংহার

অভিনন্দন! আপনি ডিক্লেরেটিভ Terraform ব্যবহার করে Cloud Run ইনস্ট্যান্সে OpenClaw-এর একটি সুরক্ষিত, সম্পূর্ণ স্থায়ী ইনস্ট্যান্স সফলভাবে ডিপ্লয় করেছেন, যা Cloud Storage স্টেট পারসিস্টেন্স, Secret Manager ক্রেডেনশিয়াল সিকিউরিটি এবং সুরক্ষিত ডিভাইস যাচাইকরণের জন্য Cloud Run ইনস্ট্যান্স নেটিভ SSH দ্বারা সমর্থিত!