۱. مقدمه
نمای کلی
در این آزمایشگاه، شما یک نمونه کاملاً پایدار و امن از OpenClaw - یک چارچوب عامل هوش مصنوعی متنباز - را در Cloud Run Instances مستقر خواهید کرد. شما مستقیماً با استفاده از رابط کاربری وب داخلی OpenClaw (با امکان اتصال کانالهای پیامرسان مانند تلگرام یا واتساپ ) با عامل هوش مصنوعی خود تعامل خواهید داشت، فضای کاری خانگی آن را با Google Cloud Storage پشتیبانی میکنید و اعتبارنامههای API را با استفاده از Google Cloud Secret Manager به صورت ایمن مدیریت خواهید کرد.
قبل از شروع، میتوانید مستندات OpenClaw را بررسی کنید تا با معماری، ابزارها و گردشهای کاری عامل OpenClaw آشنا شوید.
کاری که انجام خواهید داد
- APIهای مورد نیاز Google Cloud را فعال کنید و یک حساب کاربری سرویس اختصاصی با مجوزهای IAM مورد نیاز ایجاد کنید.
- کلیدهای API و رمزهای عبور دروازه را به طور ایمن در Secret Manager ذخیره کنید.
- یک فایل پیکربندی
openclaw.jsonبا تنظیمات مدل Gemini و رابط کاربری gateway فعال آماده کنید. - یک سطل ذخیرهسازی ابری برای حفظ وضعیت کانتینر آماده کنید.
- (اختیاری) افزونه Cloud Run Sandbox Provider را آپلود کنید تا اجرای کد ایمن و ایزوله از طریق
/usr/local/gcp/bin/sandboxامکانپذیر شود. - OpenClaw را با استفاده از
gcloud beta run instances createمستقر کنید. - با استفاده از رابط کاربری وب داخلی OpenClaw، مستقیماً با عامل هوش مصنوعی آن تعامل داشته باشید.
- (اختیاری) یک کانال پیامرسانی ( تلگرام یا واتساپ ) پیکربندی کنید.
- (اختیاری) با افزودن مهارتهای سفارشی به فضای ذخیرهسازی ابری، قابلیتهای نماینده خود را گسترش دهید.
آنچه یاد خواهید گرفت
- نحوهی استقرار OpenClaw در Cloud Run Instances با رابط کاربری وب داخلی Control آن.
- نحوهی اتصال سطلهای ذخیرهسازی ابری به نمونههای اجرای ابری.
- چگونه میتوان به طور ایمن رمزهای Secret Manager را به عنوان متغیرهای محیطی به Cloud Run تزریق کرد.
- نحوه اجرای بارهای کاری عامل (agent) با مدت زمان طولانی و مداوم در نمونههای ابری (Cloud Run Instances).
- نحوه پیکربندی و آپلود مهارتهای سفارشی عامل در فضای ذخیرهسازی ابری.
۲. تنظیمات و الزامات
راهاندازی پروژه GCP
- وارد کنسول ابری گوگل شوید.
- یک پروژه Google Cloud ایجاد یا انتخاب کنید.
- مطمئن شوید که پرداخت برای پروژه Google Cloud شما فعال است.
پوسته ابری را باز کنید
Google Cloud Shell را از نوار ابزار بالای کنسول ابری فعال کنید.
نصب کامپوننت بتا و تنظیم پروژه
مطمئن شوید که کامپوننت beta برای gcloud beta run instances نصب شده است:
gcloud components install beta --quiet
export PROJECT_ID=<YOUR_PROJECT_ID>
export REGION="us-west1"
فعال کردن API های مورد نیاز Google Cloud
در Cloud Shell، رابطهای برنامهنویسی کاربردی Cloud Run، Secret Manager، Cloud Storage و Gemini را فعال کنید:
gcloud services enable \
run.googleapis.com \
secretmanager.googleapis.com \
storage.googleapis.com \
generativelanguage.googleapis.com \
compute.googleapis.com
۳. (اختیاری) تنظیم ادغام پیامرسانها (تلگرام یا واتساپ)
میتوانید OpenClaw را به تلگرام یا واتساپ متصل کنید. گزینه A یا گزینه B را در زیر انتخاب کنید.
گزینه الف: راهاندازی ربات تلگرام
- تلگرام را باز کنید و
@BotFatherرا جستجو کنید. - دستور
/newbotرا ارسال کنید و دستورالعملها را برای مشخص کردن نام ربات و نام کاربری دنبال کنید. - توکن HTTP API تولید شده را کپی کنید (مثلاً،
123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ). - در تلگرام عبارت
@userinfobotرا جستجو کنید، عبارت/startرا ارسال کنید و شناسه کاربری عددی خود (مثلاً8035936176) را کپی کنید.
گزینه ب: تنظیمات واتساپ
- شماره تلفن شخصی واتساپ خود را در قالب بینالمللی و بدون فاصله یا نماد (مثلاً
+15551234567) دریافت کنید. - OpenClaw از طریق خطمشی لیست مجاز کانالهای واتساپ متصل میشود.
۴. ایجاد حساب کاربری اختصاصی برای سرویس
برای پایبندی به اصل حداقل امتیاز، یک حساب کاربری سرویس IAM اختصاصی برای OpenClaw ایجاد کنید:
export SERVICE_ACCOUNT_NAME="openclaw-sa"
gcloud iam service-accounts create ${SERVICE_ACCOUNT_NAME} \
--display-name="OpenClaw Service Account"
export SERVICE_ACCOUNT="${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
۵. ذخیره اطلاعات کاربری در Secret Manager
ما اعتبارنامههای حساس API را در Google Cloud Secret Manager ذخیره خواهیم کرد تا Cloud Run بتواند آنها را به طور ایمن در زمان بوت به کانتینر تزریق کند.
۱. دریافت و ذخیره کلید API جمینی
- به Google AI Studio مراجعه کنید و با حساب گوگل خود وارد شوید.
- روی ایجاد کلید API کلیک کنید و پروژه Google Cloud خود (
${PROJECT_ID}) را انتخاب کنید. - کلید API تولید شده را کپی کنید.
کلید API را در Secret Manager ذخیره کنید و به حساب کاربری سرویس دسترسی بدهید:
echo -n "YOUR_GEMINI_API_KEY" | gcloud secrets create gemini-api-key \
--data-file=- \
--replication-policy="automatic"
gcloud secrets add-iam-policy-binding gemini-api-key \
--member="serviceAccount:${SERVICE_ACCOUNT}" \
--role="roles/secretmanager.secretAccessor"
۲. ایجاد و ذخیره رمز عبور دروازه
برای محافظت از نمونه OpenClaw که در دسترس عموم است، یک رمز عبور تصادفی ایمن ایجاد کنید و آن را در Secret Manager ذخیره کنید:
export OPENCLAW_GATEWAY_PASSWORD=$(openssl rand -hex 16)
echo "Generated Gateway Password: ${OPENCLAW_GATEWAY_PASSWORD}"
echo -n "${OPENCLAW_GATEWAY_PASSWORD}" | gcloud secrets create openclaw-gateway-password \
--data-file=- \
--replication-policy="automatic"
gcloud secrets add-iam-policy-binding openclaw-gateway-password \
--member="serviceAccount:${SERVICE_ACCOUNT}" \
--role="roles/secretmanager.secretAccessor"
۳. (اختیاری) ایجاد کانال مخفی (تلگرام یا واتساپ)
- برای تلگرام :
echo -n "YOUR_TELEGRAM_BOT_TOKEN" | gcloud secrets create telegram-bot-token \ --data-file=- \ --replication-policy="automatic" gcloud secrets add-iam-policy-binding telegram-bot-token \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role="roles/secretmanager.secretAccessor" - برای واتساپ :
echo -n "YOUR_WHATSAPP_TOKEN_OR_KEY" | gcloud secrets create whatsapp-token \ --data-file=- \ --replication-policy="automatic" gcloud secrets add-iam-policy-binding whatsapp-token \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role="roles/secretmanager.secretAccessor"
۶. آمادهسازی مخزن ذخیرهسازی ابری و پیکربندی openclaw.json
OpenClaw به یک فایل پیکربندی با نام openclaw.json در /home/node/.openclaw/openclaw.json نیاز دارد.
- ایجاد یک فضای ذخیرهسازی ابری و اعطای دسترسی :
export BUCKET_NAME="openclaw-state-${PROJECT_ID}" gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION} gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role="roles/storage.objectUser" - ایجاد
openclaw.json: فایلی با نامopenclaw.jsonدر Cloud Shell ایجاد کنید. بخشchannelsرا بهروزرسانی کنید تا با کانال انتخابی شما (تلگرام یا واتساپ) مطابقت داشته باشد:{ "gateway": { "mode": "local", "port": 18789, "trustedProxies": ["0.0.0.0/0"], "bind": "lan", "auth": { "password": "${OPENCLAW_GATEWAY_PASSWORD}" }, "controlUi": { "dangerouslyDisableDeviceAuth": true, "allowedOrigins": ["*"], "enabled": true } }, "agents": { "defaults": { "model": { "primary": "google/gemini-3.1-pro-preview" }, "sandbox": { "mode": "all", "workspaceAccess": "rw", "backend": "cloud-run-sandbox" } } }, "channels": { "telegram": { "enabled": true, "defaultAccount": "default", "accounts": { "default": { "enabled": true, "dmPolicy": "allowlist", "allowFrom": [ "YOUR_TELEGRAM_USER_ID" ] } } }, "whatsapp": { "enabled": false, "defaultAccount": "default", "accounts": { "default": { "enabled": false, "dmPolicy": "allowlist", "allowFrom": [ "+15551234567" ] } } } }, "plugins": { "load": { "paths": [ "/home/node/.openclaw/plugins" ] }, "entries": { "google": { "enabled": true }, "telegram": { "enabled": true }, "whatsapp": { "enabled": false }, "cloud-run-sandbox-provider": { "enabled": true } } } } openclaw.jsonرا در Cloud Storage Bucket Root آپلود کنید :gcloud storage cp openclaw.json gs://${BUCKET_NAME}/openclaw.json- (اختیاری) بارگذاری افزونه ارائهدهنده سندباکس ابری : وقتی
agents.defaults.sandbox.modeروی"all"تنظیم شده باشد، OpenClaw به طور پیشفرض سعی میکند یک سرویس محلی Docker را برای اجرای ابزار سندباکسشده ایجاد کند. از آنجا که تصاویر کانتینر استاندارد در Cloud Run، Docker را اجرا نمیکنند، میتوانید افزونه ارائهدهنده سندباکس ابری Cloud Run را فعال کنید. هنگامی که با پرچم--sandbox-launcherدر Cloud Run مستقر میشوید، این پلتفرم به طور خودکار فایل باینری سندباکس میکرو-VM بومی gVisor (/usr/local/gcp/bin/sandbox) را تزریق میکند و اجرای کد ایمن و ایزوله شده را در داخل نمونه در حدود ۲۵ میلیثانیه امکانپذیر میسازد.- یک دایرکتوری افزونه محلی ایجاد کنید:
mkdir -p plugins/cloud-run-sandbox-provider -
plugins/cloud-run-sandbox-provider/package.jsonرا ایجاد کنید:{ "name": "cloud-run-sandbox-provider", "version": "1.0.0", "description": "Cloud Run Sandbox Provider for OpenClaw", "type": "module", "main": "index.mjs", "openclaw": { "extensions": [ "./index.mjs" ] } } -
plugins/cloud-run-sandbox-provider/openclaw.plugin.jsonرا ایجاد کنید:{ "id": "cloud-run-sandbox-provider", "name": "Cloud Run Sandbox Provider", "entry": "./index.mjs", "kind": "tool", "activation": { "onStartup": true }, "configSchema": { "type": "object", "properties": {} } } -
plugins/cloud-run-sandbox-provider/index.mjsرا ایجاد کنید:import { spawn } from "node:child_process"; import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; import { registerSandboxBackend } from "openclaw/plugin-sdk/sandbox"; const SANDBOX_BINARY_PATH = process.env.OPENCLAW_SANDBOX_BINARY_PATH || "/usr/local/gcp/bin/sandbox"; function runCommandRaw(command, args, stdin = null) { return new Promise((resolve) => { const child = spawn(command, args, { env: { ...process.env } }); let stdout = Buffer.alloc(0); let stderr = Buffer.alloc(0); child.stdout.on("data", (data) => { stdout = Buffer.concat([stdout, data]); }); child.stderr.on("data", (data) => { stderr = Buffer.concat([stderr, data]); }); child.on("error", (err) => { resolve({ code: -1, stdout, stderr: Buffer.from(err.message) }); }); child.on("close", (code) => { resolve({ code: code ?? 0, stdout, stderr }); }); if (stdin != null) { child.stdin.write(stdin); } child.stdin.end(); }); } async function ensureSandboxRunning(sandboxId, workspaceDir) { const check = await runCommandRaw(SANDBOX_BINARY_PATH, ["exec", sandboxId, "--", "/bin/true"]); if (check.code === 0) { return; } const runArgs = [ "run", "--detach", "--write", "--mount", `type=bind,source=${workspaceDir},destination=${workspaceDir}`, sandboxId ]; const start = await runCommandRaw(SANDBOX_BINARY_PATH, runArgs); if (start.code !== 0) { throw new Error(`Failed to start Cloud Run sandbox ${sandboxId}: ${start.stderr.toString("utf8")}`); } } class CloudRunSandboxHandle { constructor(params) { this.id = "cloud-run-sandbox"; this.runtimeId = params.sessionKey; this.runtimeLabel = `cloud-run-sandbox:${params.sessionKey}`; this.workdir = params.workspaceDir; this.workspaceDir = params.workspaceDir; } async buildExecSpec(params) { const { command, args, workdir, env, usePty } = params; const positional = ["sh", ...(args || [])]; const execArgs = ["exec"]; if (env) { for (const [key, val] of Object.entries(env)) { execArgs.push("-e", `${key}=${val}`); } } const activeWorkdir = workdir || this.workdir; if (activeWorkdir) { execArgs.push("--workdir", activeWorkdir); } execArgs.push( this.runtimeId, "--", "/bin/sh", "-c", command, ...positional ); return { argv: [SANDBOX_BINARY_PATH, ...execArgs], env: { ...process.env }, stdinMode: usePty ? "pipe-open" : "pipe-closed" }; } async runShellCommand(params) { await ensureSandboxRunning(this.runtimeId, this.workspaceDir); const spec = await this.buildExecSpec({ command: params.script, args: params.args, workdir: params.workdir, env: params.env, usePty: params.usePty, }); return new Promise((resolve, reject) => { const child = spawn(spec.argv[0], spec.argv.slice(1), { env: spec.env }); let stdout = Buffer.alloc(0); let stderr = Buffer.alloc(0); child.stdout.on("data", (data) => { stdout = Buffer.concat([stdout, data]); }); child.stderr.on("data", (data) => { stderr = Buffer.concat([stderr, data]); }); child.on("error", reject); child.on("close", (rawCode) => { const code = rawCode ?? 0; if (code !== 0 && !params.allowFailure) { const stderrStr = stderr.toString("utf8"); const summary = stderrStr.trim().split("\n").slice(-3).join(" | ").slice(0, 400); reject(Object.assign( new Error(`Cloud Run sandbox shell exited with code ${code}: ${summary}`), { code, stdout, stderr }, )); return; } resolve({ code, stdout, stderr }); }); if (params.stdin != null) { child.stdin.write(params.stdin); } child.stdin.end(); }); } } export const cloudRunSandboxManager = { async describeRuntime({ entry }) { const check = await runCommandRaw(SANDBOX_BINARY_PATH, ["exec", entry.containerName, "--", "/bin/true"]); return { running: check.code === 0, actualConfigLabel: "cloud-run-sandbox", configLabelMatch: true, }; }, async removeRuntime({ entry }) { await runCommandRaw(SANDBOX_BINARY_PATH, ["delete", entry.containerName, "--force"]); } }; export default definePluginEntry({ id: "cloud-run-sandbox-provider", name: "Cloud Run Sandbox", kind: "tool", register(api) { registerSandboxBackend("cloud-run-sandbox", { factory: async (params) => { const sanitizedSessionKey = params.sessionKey.replace(/[^a-zA-Z0-9-]/g, "-").toLowerCase(); await ensureSandboxRunning(sanitizedSessionKey, params.workspaceDir); return new CloudRunSandboxHandle({ ...params, sessionKey: sanitizedSessionKey }); }, manager: cloudRunSandboxManager }); } }); - پوشه افزونه را در فضای ذخیرهسازی ابری آپلود کنید:
gcloud storage cp -r plugins gs://${BUCKET_NAME}/ - طرحبندی سطل ذخیرهسازی ابری را تأیید کنید : تأیید کنید که ساختار سطل شما شامل
openclaw.jsonدر ریشه و فایلهای افزونه درplugins/cloud-run-sandbox-provider/:gs://${BUCKET_NAME}/ ├── openclaw.json └── plugins/ └── cloud-run-sandbox-provider/ ├── package.json ├── openclaw.plugin.json └── index.mjs
- یک دایرکتوری افزونه محلی ایجاد کنید:
۷. OpenClaw را روی نمونههای Cloud Run مستقر کنید
OpenClaw را با استفاده از gcloud beta run instances create :
gcloud beta run instances create openclaw-instance \
--image ghcr.io/openclaw/openclaw:latest \
--service-account ${SERVICE_ACCOUNT} \
--port 18789 \
--cpu 4 \
--memory 4Gi \
--public \
--sandbox-launcher \
--add-volume mount-path=/home/node/.openclaw,type=cloud-storage,mount-options="uid=1000;gid=1000;file-mode=0700;dir-mode=0700",bucket=${BUCKET_NAME} \
--set-secrets GEMINI_API_KEY=gemini-api-key:latest,OPENCLAW_GATEWAY_PASSWORD=openclaw-gateway-password:latest \
--region ${REGION}
تجزیه پارامترهای کلیدی:
-
--image ghcr.io/openclaw/openclaw:latest: تصویر کانتینر OpenClaw. -
--service-account ...: حساب سرویس اختصاصیopenclaw-saرا ضمیمه میکند. -
--sandbox-launcher: لانچر سندباکس Cloud Run را فعال میکند و فایل باینری/usr/local/gcp/bin/sandboxرا برای اجرای امن و ایزولهشدهی کد توسط gVisor به داخل کانتینر تزریق میکند. -
--add-volume ...: مخزن ذخیرهسازی ابری را مستقیماً در/home/node/.openclawنصب میکند. استفاده ازfile-mode=0700;dir-mode=0700مجوزهای مناسب را برای OpenClaw تضمین میکند. -
--set-secrets ...: اعتبارنامهها را مستقیماً از Secret Manager به متغیرهای محیطی تزریق میکند. (اختیاری: اگر تلگرام را در مراحل اختیاری پیکربندی کردهاید،,TELEGRAM_BOT_TOKEN=telegram-bot-token:latestبه--set-secretsاضافه کنید .) -
--public: دسترسی عمومی به URL را امکانپذیر میکند.
۸. مستقیماً از طریق رابط کاربری وب OpenClaw تعامل داشته باشید
OpenClaw شامل یک رابط کاربری وب داخلی است که به شما امکان میدهد مستقیماً از مرورگر خود، عامل هوش مصنوعی خود را مدیریت و با آن چت کنید:
- آدرس اینترنتی نمونه Cloud Run خود را بازیابی کنید : در Cloud Shell، دستور زیر را اجرا کنید:
gcloud beta run instances describe openclaw-instance \ --region ${REGION} \ --format="value(status.urls[0])" - دسترسی به رابط کاربری کنترل OpenClaw :
- آدرس خروجی (URL) را در مرورگر وب خود باز کنید.
- وقتی در رابط کاربری OpenClaw Control از شما درخواست احراز هویت شد:
- رمز عبور دروازه تولید شده (
${OPENCLAW_GATEWAY_PASSWORD}) را از Secret Manager وارد کنید. - اگر پنجره ورود، فیلدهای نام کاربری و رمز عبور را جداگانه نمایش میدهد، فیلد نام کاربری را خالی بگذارید (یا
adminرا وارد کنید) و در فیلد رمز عبور،${OPENCLAW_GATEWAY_PASSWORD}را وارد کنید.
- رمز عبور دروازه تولید شده (
- شروع به درخواست از نماینده خود کنید :
- پس از احراز هویت، داشبورد کنترل OpenClaw را مشاهده خواهید کرد.
- شما میتوانید مستقیماً از رابط چت، Gemini را فعال کنید، جلسات عامل فعال را مشاهده کنید، فایلهای فضای کاری پایدار را بررسی کنید و ابزارها را مدیریت کنید!
۹. (اختیاری) تأیید ادغام کانالهای پیامرسانی
اگر تلگرام یا واتساپ را در مراحل تنظیمات اختیاری بالا پیکربندی کردهاید، میتوانید دریافت پیام را تأیید کنید:
- بررسی لاگهای نمونه در Cloud Shell:
gcloud run instances logs read openclaw-instance --region ${REGION} --limit 20 - تلگرام (یا واتساپ) را باز کنید و یک پیام ارسال کنید (مثلاً
/startیاHello OpenClaw!). - ربات، شناسه کاربری شما را با استفاده از لیست مجوزهای موجود در
openclaw.jsonاحراز هویت میکند و با استفاده از Gemini پاسخ میدهد!
۱۰. (اختیاری) نماینده خود را با مهارتهایش گسترش دهید
OpenClaw از بستههای ماژولار Skills پشتیبانی میکند که گردشهای کاری خاص، ابزارهای تخصصی CLI و دستورالعملهای خاص دامنه را به اپراتور شما آموزش میدهند.
مهارتها چگونه کار میکنند؟
هر مهارت، یک دایرکتوری حاوی یک فایل SKILL.md است. این فایل با YAML frontmatter که متادیتا ( 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 میگوید چه زمانی به طور خودکار این مهارت را در مکالمه طبیعی فراخوانی کند.
یک مهارت سفارشی به فضای ذخیرهسازی ابری خود اضافه کنید
از آنجا که سطل ذخیرهسازی ابری شما مستقیماً در /home/node/.openclaw نصب شده است، مهارتهایی که در مسیر gs://${BUCKET_NAME}/skills/ قرار دارند، بهطور خودکار هنگام بوت بارگذاری میشوند و در طول راهاندازی مجدد نمونهها همچنان پابرجا میمانند:
- ایجاد یک فهرست مهارتهای محلی :
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 - مهارت را در فضای ذخیرهسازی ابری بارگذاری کنید :
gcloud storage cp -r my-skill gs://${BUCKET_NAME}/skills/ - از مهارت در چت استفاده کنید :
- به رابط کاربری وب OpenClaw Control برگردید.
- اکنون میتوانید با استفاده از
/summarize-logsیا پرسیدن سوالات به زبان طبیعی که با شرح مهارت مطابقت دارند، نماینده خود را مطلع کنید!
۱۱. تمیز کردن
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع مورد استفاده در این آزمایشگاه کد:
- نمونه Cloud Run را حذف کنید :
gcloud beta run instances delete openclaw-instance --region ${REGION} --quiet - حذف اسرار مدیر مخفی :
gcloud secrets delete gemini-api-key --quiet gcloud secrets delete telegram-bot-token --quiet gcloud secrets delete openclaw-gateway-password --quiet - حذف سطل ذخیرهسازی ابری :
gcloud storage rm -r gs://${BUCKET_NAME} - حذف حساب کاربری سرویس اختصاصی :
gcloud iam service-accounts delete ${SERVICE_ACCOUNT} --quiet
۱۲. نتیجهگیری
تبریک! شما با موفقیت یک نمونه امن و کاملاً پایدار از OpenClaw را روی Cloud Run Instances که توسط Cloud Storage، Secret Manager و کانال پیامرسانی دلخواه شما پشتیبانی میشود، مستقر کردید!