Containers
Docker
Docker اختیاری است. فقط اگر یک Gateway کانتینری میخواهید یا میخواهید جریان Docker را اعتبارسنجی کنید، از آن استفاده کنید.
آیا Docker برای من مناسب است؟
- بله: یک محیط Gateway ایزوله و موقتی میخواهید یا میخواهید OpenClaw را روی میزبانی بدون نصبهای محلی اجرا کنید.
- خیر: روی دستگاه خودتان اجرا میکنید و فقط سریعترین چرخه توسعه را میخواهید. بهجای آن از جریان نصب معمول استفاده کنید.
- نکته Sandboxing: بکاند پیشفرض sandbox وقتی sandboxing فعال باشد از Docker استفاده میکند، اما sandboxing بهطور پیشفرض خاموش است و نیازی ندارد کل Gateway در Docker اجرا شود. بکاندهای sandbox مبتنی بر SSH و OpenShell نیز در دسترس هستند. Sandboxing را ببینید.
پیشنیازها
- Docker Desktop (یا Docker Engine) + Docker Compose v2
- حداقل ۲ GB RAM برای ساخت image (
pnpm installممکن است روی میزبانهای ۱ GB با کد خروج ۱۳۷ بهدلیل OOM کشته شود) - فضای دیسک کافی برای imageها و لاگها
- اگر روی VPS/میزبان عمومی اجرا میکنید، بهویژه سیاست فایروال Docker
DOCKER-USERرا در سختسازی امنیتی برای قرارگیری در معرض شبکه بازبینی کنید.
Gateway کانتینری
ساخت image
از ریشه مخزن، اسکریپت راهاندازی را اجرا کنید:
./scripts/docker/setup.shاین کار image Gateway را بهصورت محلی میسازد. برای استفاده از یک image ازپیشساخته بهجای آن:
export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"./scripts/docker/setup.shimageهای ازپیشساخته ابتدا در
GitHub Container Registry
منتشر میشوند.
GHCR رجیستری اصلی برای خودکارسازی انتشار، استقرارهای پینشده،
و بررسیهای منشأ است. همان جریان انتشار همچنین یک mirror رسمی
Docker Hub در openclaw/openclaw برای میزبانهایی منتشر میکند که Docker Hub را ترجیح میدهند:
export OPENCLAW_IMAGE="openclaw/openclaw:latest"./scripts/docker/setup.shاز ghcr.io/openclaw/openclaw یا openclaw/openclaw استفاده کنید. از mirrorهای اجتماعی
Docker Hub پرهیز کنید، زیرا OpenClaw زمانبندی انتشار، بازسازیها،
یا سیاست نگهداری آنها را کنترل نمیکند. tagهای رسمی رایج: main، latest،
<version> (مثلاً 2026.2.26)، و نسخههای beta مانند
2026.2.26-beta.1. tagهای beta، latest یا main را جابهجا نمیکنند.
اجرای دوباره در محیط airgapped
روی میزبانهای آفلاین، ابتدا image را منتقل و بارگذاری کنید:
docker load -i openclaw-image.tarexport OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"./scripts/docker/setup.sh --offline--offline بررسی میکند که OPENCLAW_IMAGE از قبل بهصورت محلی وجود داشته باشد،
pullها و buildهای ضمنی Compose را غیرفعال میکند، سپس جریان راهاندازی معمول مانند
همگامسازی .env، اصلاح مجوزها، onboarding، همگامسازی پیکربندی Gateway،
و راهاندازی Compose را اجرا میکند.
اگر OPENCLAW_SANDBOX=1 باشد، راهاندازی آفلاین همچنین imageهای sandbox پیشفرض پیکربندیشده
و فعال برای هر agent را روی daemon پشت
OPENCLAW_DOCKER_SOCKET بررسی میکند. imageهای مرورگر مبتنی بر Docker نیز باید
label قرارداد مرورگر فعلی OpenClaw را داشته باشند. وقتی یک image ضروری موجود نباشد یا
ناسازگار باشد، setup بهجای گزارش موفقیت با sandbox غیرقابلاستفاده،
بدون تغییر پیکربندی sandbox خارج میشود.
تکمیل onboarding
اسکریپت setup، onboarding را بهطور خودکار اجرا میکند. این اسکریپت:
- برای کلیدهای API ارائهدهنده درخواست میکند
- یک token برای Gateway تولید میکند و آن را در
.envمینویسد - دایرکتوری کلید محرمانه auth-profile را ایجاد میکند
- Gateway را از طریق Docker Compose راهاندازی میکند
هنگام setup، onboarding پیش از شروع و نوشتنهای پیکربندی از طریق
openclaw-gateway بهطور مستقیم اجرا میشوند. openclaw-cli برای دستورهایی است که پس از
وجود داشتن کانتینر Gateway اجرا میکنید.
باز کردن Control UI
http://127.0.0.1:18789/ را در مرورگر خود باز کنید و shared secret پیکربندیشده
را در Settings وارد کنید. اسکریپت setup بهطور پیشفرض یک token در .env مینویسد؛
اگر پیکربندی کانتینر را به احراز هویت با password تغییر دهید، همان
password را استفاده کنید.
دوباره به URL نیاز دارید؟
docker compose run --rm openclaw-cli dashboard --no-openپیکربندی کانالها (اختیاری)
از کانتینر CLI برای افزودن کانالهای پیامرسان استفاده کنید:
# WhatsApp (QR)docker compose run --rm openclaw-cli channels login # Telegramdocker compose run --rm openclaw-cli channels add --channel telegram --token "<token>" # Discorddocker compose run --rm openclaw-cli channels add --channel discord --token "<token>"جریان دستی
اگر ترجیح میدهید هر مرحله را خودتان بهجای استفاده از اسکریپت setup اجرا کنید:
docker build -t openclaw:local -f Dockerfile .docker compose run --rm --no-deps --entrypoint node openclaw-gateway \ dist/index.js onboard --mode local --no-install-daemondocker compose run --rm --no-deps --entrypoint node openclaw-gateway \ dist/index.js config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789"]}]'docker compose up -d openclaw-gatewayمتغیرهای محیطی
اسکریپت setup این متغیرهای محیطی اختیاری را میپذیرد:
| متغیر | هدف |
|---|---|
OPENCLAW_IMAGE |
استفاده از image راهدور بهجای ساخت محلی |
OPENCLAW_IMAGE_APT_PACKAGES |
نصب بستههای apt اضافی هنگام build (جداشده با فاصله) |
OPENCLAW_IMAGE_PIP_PACKAGES |
نصب بستههای Python اضافی هنگام build (جداشده با فاصله) |
OPENCLAW_EXTENSIONS |
پیشنصب وابستگیهای Plugin هنگام build (نامهای جداشده با فاصله) |
OPENCLAW_DOCKER_BUILD_NODE_OPTIONS |
بازنویسی گزینههای Node برای source-build محلی |
OPENCLAW_DOCKER_BUILD_TSDOWN_MAX_OLD_SPACE_MB |
بازنویسی heap مربوط به tsdown در source-build محلی، بر حسب MB |
OPENCLAW_DOCKER_BUILD_SKIP_DTS |
رد کردن خروجی declaration هنگام buildهای image محلی فقط runtime |
OPENCLAW_EXTRA_MOUNTS |
bind mountهای اضافی میزبان (با کاما جداشده: source:target[:opts]) |
OPENCLAW_HOME_VOLUME |
ماندگار کردن /home/node در یک volume نامگذاریشده Docker |
OPENCLAW_SANDBOX |
انتخاب bootstrap برای sandbox (1, true, yes, on) |
OPENCLAW_SKIP_ONBOARDING |
رد کردن مرحله onboarding تعاملی (1, true, yes, on) |
OPENCLAW_DOCKER_SOCKET |
بازنویسی مسیر socket Docker |
OPENCLAW_DISABLE_BONJOUR |
غیرفعال کردن تبلیغ Bonjour/mDNS (در Docker بهطور پیشفرض 1) |
OPENCLAW_DISABLE_BUNDLED_SOURCE_OVERLAYS |
غیرفعال کردن overlayهای bind-mount منبع Pluginهای bundled |
OTEL_EXPORTER_OTLP_ENDPOINT |
endpoint مشترک collector مبتنی بر OTLP/HTTP برای export OpenTelemetry |
OTEL_EXPORTER_OTLP_*_ENDPOINT |
endpointهای OTLP ویژه signal برای traces، metrics، یا logs |
OTEL_EXPORTER_OTLP_PROTOCOL |
بازنویسی protocol مربوط به OTLP. امروز فقط http/protobuf پشتیبانی میشود |
OTEL_SERVICE_NAME |
نام service استفادهشده برای resourceهای OpenTelemetry |
OTEL_SEMCONV_STABILITY_OPT_IN |
انتخاب attributeهای معنایی آزمایشی GenAI جدیدتر |
OPENCLAW_OTEL_PRELOADED |
رد کردن شروع SDK دوم OpenTelemetry وقتی یکی از پیش بارگذاری شده است |
image رسمی Docker، Homebrew را همراه خود ندارد. هنگام onboarding، OpenClaw
نصبکنندههای وابستگی skill فقط مخصوص brew را وقتی در یک کانتینر Linux
بدون brew اجرا میشود پنهان میکند؛ این وابستگیها باید از طریق یک image سفارشی
فراهم شوند یا بهصورت دستی نصب شوند. برای وابستگیهایی که از بستههای Debian در دسترساند، هنگام build image از
OPENCLAW_IMAGE_APT_PACKAGES استفاده کنید. نام قدیمی
OPENCLAW_DOCKER_APT_PACKAGES هنوز پذیرفته میشود.
برای وابستگیهای Python، از OPENCLAW_IMAGE_PIP_PACKAGES استفاده کنید. این کار هنگام build image
python3 -m pip install --break-system-packages را اجرا میکند، بنابراین
نسخههای package را pin کنید و فقط از indexهای package که به آنها اعتماد دارید استفاده کنید.
source buildها مقدار پیشفرض OPENCLAW_DOCKER_BUILD_NODE_OPTIONS را
--max-old-space-size=8192 قرار میدهند و
OPENCLAW_DOCKER_BUILD_TSDOWN_MAX_OLD_SPACE_MB را unset میگذارند تا wrapper مربوط به tsdown بتواند
محدودیتهای حافظه کانتینر را رعایت کند. همچنین بهطور پیشفرض
OPENCLAW_DOCKER_BUILD_SKIP_DTS=1 را تنظیم میکنند، زیرا imageهای runtime پس از build،
فایلهای declaration را prune میکنند. اگر Docker خطاهای ResourceExhausted، cannot allocate memory گزارش کرد یا هنگام tsdown متوقف شد، محدودیت حافظه builder در Docker را افزایش دهید یا
با heapهای صریح کوچکتر دوباره تلاش کنید، برای مثال
OPENCLAW_DOCKER_BUILD_NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_DOCKER_BUILD_TSDOWN_MAX_OLD_SPACE_MB=4096.
نگهدارندگان میتوانند منبع Plugin bundled را در برابر یک image بستهبندیشده با mount کردن
یک دایرکتوری منبع Plugin روی مسیر منبع بستهبندیشده آن آزمایش کنند، برای مثال
OPENCLAW_EXTRA_MOUNTS=/path/to/fork/extensions/synology-chat:/app/extensions/synology-chat:ro.
آن دایرکتوری منبع mountشده، bundle کامپایلشده متناظر
/app/dist/extensions/synology-chat را برای همان شناسه Plugin بازنویسی میکند.
مشاهدهپذیری
export مربوط به OpenTelemetry از کانتینر Gateway به collector مبتنی بر OTLP شما خروجی است. این کار به پورت Docker منتشرشده نیاز ندارد. اگر image را بهصورت محلی میسازید و میخواهید exporter bundled مربوط به OpenTelemetry داخل image در دسترس باشد، وابستگیهای runtime آن را اضافه کنید:
export OPENCLAW_EXTENSIONS="diagnostics-otel"export OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4318"export OTEL_SERVICE_NAME="openclaw-gateway"./scripts/docker/setup.shPlugin رسمی @openclaw/diagnostics-otel را از ClawHub در
نصبهای Docker بستهبندیشده پیش از فعال کردن export نصب کنید. imageهای سفارشی source-built همچنان میتوانند
منبع Plugin محلی را با
OPENCLAW_EXTENSIONS=diagnostics-otel اضافه کنند. برای فعال کردن export، Plugin
diagnostics-otel را در config مجاز و فعال کنید، سپس
diagnostics.otel.enabled=true را تنظیم کنید یا از مثال config در export OpenTelemetry استفاده کنید.
headerهای احراز هویت collector از طریق
diagnostics.otel.headers پیکربندی میشوند، نه از طریق متغیرهای محیطی Docker.
metrics مربوط به Prometheus از پورت Gateway که از قبل منتشر شده استفاده میکند. نصب کنید
clawhub:@openclaw/diagnostics-prometheus، Plugin
diagnostics-prometheus را فعال کنید، سپس scrape کنید:
http://<gateway-host>:18789/api/diagnostics/prometheusاین route با احراز هویت Gateway محافظت میشود. یک پورت عمومی جداگانه
/metrics یا مسیر reverse-proxy بدون احراز هویت در معرض قرار ندهید. metrics مربوط به Prometheus را ببینید.
بررسیهای سلامت
endpointهای probe کانتینر (بدون نیاز به احراز هویت):
curl -fsS http://127.0.0.1:18789/healthz # livenesscurl -fsS http://127.0.0.1:18789/readyz # readinessتصویر Docker شامل یک HEALTHCHECK داخلی است که /healthz را ping میکند.
اگر بررسیها همچنان شکست بخورند، Docker کانتینر را بهعنوان unhealthy علامتگذاری میکند و
سامانههای ارکستراسیون میتوانند آن را راهاندازی دوباره یا جایگزین کنند.
نمای عمیق سلامت احراز هویتشده:
docker compose exec openclaw-gateway node dist/index.js health --token "$OPENCLAW_GATEWAY_TOKEN"LAN در برابر loopback
scripts/docker/setup.sh بهطور پیشفرض OPENCLAW_GATEWAY_BIND=lan را تنظیم میکند تا دسترسی میزبان به
http://127.0.0.1:18789 با انتشار پورت Docker کار کند.
lan(پیشفرض): مرورگر میزبان و CLI میزبان میتوانند به پورت منتشرشده Gateway دسترسی داشته باشند.loopback: فقط فرایندهای داخل فضای نام شبکه کانتینر میتوانند مستقیماً به Gateway دسترسی داشته باشند.
ارائهدهندگان محلی میزبان
وقتی OpenClaw در Docker اجرا میشود، 127.0.0.1 داخل کانتینر خود کانتینر است،
نه ماشین میزبان شما. برای ارائهدهندگان هوش مصنوعی که روی میزبان اجرا میشوند از host.docker.internal استفاده کنید:
| ارائهدهنده | URL پیشفرض میزبان | URL راهاندازی Docker |
|---|---|---|
| LM Studio | http://127.0.0.1:1234 |
http://host.docker.internal:1234 |
| Ollama | http://127.0.0.1:11434 |
http://host.docker.internal:11434 |
راهاندازی Docker همراه، از آن URLهای میزبان بهعنوان پیشفرضهای onboarding
برای LM Studio و Ollama استفاده میکند، و docker-compose.yml، host.docker.internal را برای
Docker Engine روی Linux به Gateway میزبان Docker نگاشت میکند. Docker Desktop از قبل
همین hostname را روی macOS و Windows فراهم میکند.
سرویسهای میزبان نیز باید روی نشانیای گوش دهند که از Docker قابل دسترسی باشد:
lms server start --port 1234 --bind 0.0.0.0OLLAMA_HOST=0.0.0.0:11434 ollama serveاگر از فایل Compose یا فرمان docker run خودتان استفاده میکنید، همان نگاشت میزبان را
خودتان اضافه کنید، برای مثال
--add-host=host.docker.internal:host-gateway.
پشتوانه Claude CLI در Docker
تصویر رسمی Docker برای OpenClaw، Claude Code را از پیش نصب نمیکند. Claude Code را داخل کاربر کانتینری که OpenClaw را اجرا میکند نصب کنید و وارد شوید، سپس home همان کانتینر را پایدار کنید تا ارتقاهای تصویر، binary یا وضعیت احراز هویت Claude را پاک نکنند.
برای نصبهای جدید Docker، پیش از اجرای setup یک volume پایدار برای /home/node فعال کنید:
export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"export OPENCLAW_HOME_VOLUME="openclaw_home"./scripts/docker/setup.shبرای نصب Docker موجود، ابتدا stack را متوقف کنید و پیش از اجرای دوباره setup، مقادیر فعلی
Docker .env را دوباره بارگذاری کنید. اسکریپت setup خودش .env را نمیخواند؛
بلکه .env را از shell فعلی و پیشفرضها بازنویسی میکند. برای .env تولیدشده، اجرا کنید:
set -a. ./.envset +aexport OPENCLAW_HOME_VOLUME="${OPENCLAW_HOME_VOLUME:-openclaw_home}"./scripts/docker/setup.shاگر .env شما مقادیری دارد که shell نمیتواند source کند، ابتدا مقادیر موجودی را که
به آنها تکیه دارید بهصورت دستی دوباره export کنید، مانند OPENCLAW_IMAGE، پورتها، حالت bind،
مسیرهای سفارشی، OPENCLAW_EXTRA_MOUNTS، sandbox، و تنظیمات skip-onboarding.
overlay تولیدشده، volume مربوط به home را برای هر دو سرویس openclaw-gateway و
openclaw-cli mount میکند.
فرمانهای باقیمانده را با overlay تولیدشده Compose اجرا کنید تا هر دو سرویس
home پایدار را mount کنند. اگر راهاندازی شما از docker-compose.override.yml هم استفاده میکند،
آن را پیش از docker-compose.extra.yml وارد کنید.
Claude Code را در همان home پایدار نصب کنید:
docker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ --entrypoint sh openclaw-cli -lc \ 'curl -fsSL https://claude.ai/install.sh | bash'نصبکننده native، binary مربوط به claude را زیر
/home/node/.local/bin/claude مینویسد. به OpenClaw بگویید از همان مسیر کانتینر استفاده کند:
docker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ openclaw-cli config set \ agents.defaults.cliBackends.claude-cli.command \ /home/node/.local/bin/claudeاز داخل همان home پایدار کانتینر وارد شوید و بررسی کنید:
docker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ --entrypoint /home/node/.local/bin/claude openclaw-cli auth logindocker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ --entrypoint /home/node/.local/bin/claude openclaw-cli auth status --textdocker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ openclaw-cli models auth login \ --provider anthropic --method cli --set-defaultdocker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ openclaw-cli models list --provider anthropicپس از آن، میتوانید از پشتوانه همراه claude-cli استفاده کنید:
docker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ openclaw-cli agent \ --agent main \ --model claude-cli/claude-sonnet-4-6 \ --message "Say hello from Docker Claude CLI"OPENCLAW_HOME_VOLUME نصب native مربوط به Claude Code را زیر
/home/node/.local/bin و /home/node/.local/share/claude، بهعلاوه تنظیمات Claude Code
و وضعیت احراز هویت را زیر /home/node/.claude و /home/node/.claude.json پایدار نگه میدارد.
پایدار کردن فقط /home/node/.openclaw برای استفاده دوباره از Claude CLI کافی نیست. اگر
بهجای volume مربوط به home از OPENCLAW_EXTRA_MOUNTS استفاده میکنید، همه این
مسیرهای Claude را در هر دو سرویس Docker mount کنید.
Bonjour / mDNS
شبکه bridge در Docker معمولاً multicast مربوط به Bonjour/mDNS
(224.0.0.251:5353) را بهطور قابل اعتماد forward نمیکند. بنابراین راهاندازی Compose همراه
بهطور پیشفرض OPENCLAW_DISABLE_BONJOUR=1 را تنظیم میکند تا Gateway دچار crash-loop نشود یا هنگام
drop شدن ترافیک multicast توسط bridge، تبلیغ خود را مکرراً راهاندازی دوباره نکند.
برای میزبانهای Docker از URL منتشرشده Gateway، Tailscale، یا wide-area DNS-SD استفاده کنید.
OPENCLAW_DISABLE_BONJOUR=0 را فقط وقتی تنظیم کنید که با host networking، macvlan،
یا شبکه دیگری اجرا میکنید که مشخص است multicast مربوط به mDNS در آن کار میکند.
برای نکات مشکلساز و عیبیابی، کشف Bonjour را ببینید.
ذخیرهسازی و پایداری
Docker Compose، OPENCLAW_CONFIG_DIR را به /home/node/.openclaw،
OPENCLAW_WORKSPACE_DIR را به /home/node/.openclaw/workspace، و
OPENCLAW_AUTH_PROFILE_SECRET_DIR را به /home/node/.config/openclaw bind-mount میکند، بنابراین این
مسیرها پس از جایگزینی کانتینر باقی میمانند. وقتی هر متغیری تنظیم نشده باشد، فایل همراه
docker-compose.yml به زیر ${HOME}، یا وقتی خود HOME هم موجود نباشد به /tmp
fallback میکند. این کار مانع میشود docker compose up در محیطهای bare، مشخصات volume با
source خالی منتشر کند.
آن دایرکتوری config که mount شده جایی است که OpenClaw این موارد را نگه میدارد:
openclaw.jsonبرای config رفتاریagents/<agentId>/agent/auth-profiles.jsonبرای احراز هویت OAuth/API-key ذخیرهشده ارائهدهنده.envبرای secretهای runtime مبتنی بر env مانندOPENCLAW_GATEWAY_TOKEN
دایرکتوری کلید secret مربوط به auth-profile، کلید رمزنگاری محلی استفادهشده برای
مواد token پروفایل احراز هویت مبتنی بر OAuth را ذخیره میکند. آن را همراه با وضعیت میزبان Docker خود نگه دارید،
اما جدا از OPENCLAW_CONFIG_DIR.
Pluginهای قابل دانلود نصبشده، وضعیت package خود را زیر home نصبشده OpenClaw ذخیره میکنند، بنابراین سوابق نصب Plugin و ریشههای package پس از جایگزینی کانتینر باقی میمانند. راهاندازی Gateway درختهای dependency مربوط به bundled-plugin را تولید نمیکند.
برای جزئیات کامل پایداری در استقرارهای VM، ببینید Docker VM Runtime - چه چیزی کجا پایدار میماند.
نقاط داغ رشد دیسک: media/، فایلهای JSONL نشست، پایگاهداده SQLite وضعیت مشترک،
ریشههای package مربوط به Plugin نصبشده، و logهای فایل چرخشی
زیر /tmp/openclaw/ را زیر نظر بگیرید.
helperهای shell (اختیاری)
برای مدیریت روزمره آسانتر Docker، ClawDock را نصب کنید:
mkdir -p ~/.clawdock && curl -sL https://raw.githubusercontent.com/openclaw/openclaw/main/scripts/clawdock/clawdock-helpers.sh -o ~/.clawdock/clawdock-helpers.shecho 'source ~/.clawdock/clawdock-helpers.sh' >> ~/.zshrc && source ~/.zshrcاگر ClawDock را از مسیر raw قدیمیتر scripts/shell-helpers/clawdock-helpers.sh نصب کردهاید، فرمان نصب بالا را دوباره اجرا کنید تا فایل helper محلی شما مکان جدید را دنبال کند.
سپس از clawdock-start، clawdock-stop، clawdock-dashboard و غیره استفاده کنید. برای همه فرمانها
clawdock-help را اجرا کنید.
برای راهنمای کامل helper، ClawDock را ببینید.
فعال کردن sandbox عامل برای Docker gateway
export OPENCLAW_SANDBOX=1./scripts/docker/setup.shمسیر socket سفارشی (مثلاً Docker بدون root):
export OPENCLAW_SANDBOX=1export OPENCLAW_DOCKER_SOCKET=/run/user/1000/docker.sock./scripts/docker/setup.shاسکریپت فقط پس از گذراندن پیشنیازهای sandbox، docker.sock را mount میکند. اگر
راهاندازی sandbox نتواند کامل شود، اسکریپت agents.defaults.sandbox.mode
را به off بازنشانی میکند. نوبتهای code-mode مربوط به Codex همچنان در حالی که sandbox
OpenClaw فعال است به Codex
workspace-write محدود میمانند؛ socket مربوط به Docker میزبان را داخل کانتینرهای sandbox عامل mount نکنید.
Automation / CI (غیرتعاملی)
تخصیص pseudo-TTY مربوط به Compose را با -T غیرفعال کنید:
docker compose run -T --rm openclaw-cli gateway probedocker compose run -T --rm openclaw-cli devices list --jsonیادداشت امنیتی شبکه مشترک
openclaw-cli از network_mode: "service:openclaw-gateway" استفاده میکند تا فرمانهای CLI
بتوانند از طریق 127.0.0.1 به Gateway دسترسی داشته باشند. این را بهعنوان یک مرز اعتماد مشترک
در نظر بگیرید. config مربوط به compose، قابلیتهای NET_RAW/NET_ADMIN را حذف میکند و
no-new-privileges را روی هر دو openclaw-gateway و openclaw-cli فعال میکند.
خرابیهای DNS در Docker Desktop داخل openclaw-cli
بعضی راهاندازیهای Docker Desktop پس از حذف NET_RAW، در lookupهای DNS از sidecar
شبکه مشترک openclaw-cli شکست میخورند، که هنگام فرمانهای مبتنی بر npm مانند
openclaw plugins install بهصورت EAI_AGAIN ظاهر میشود.
فایل compose سختسازیشده پیشفرض را برای عملیات عادی Gateway نگه دارید. override
محلی زیر وضعیت امنیتی کانتینر CLI را با بازگرداندن قابلیتهای پیشفرض Docker
آزادتر میکند، بنابراین فقط برای فرمان CLI یکبارهای که به دسترسی registry بسته نیاز دارد از آن استفاده کنید،
نه بهعنوان invocation پیشفرض Compose خود:
printf '%s\n' \ 'services:' \ ' openclaw-cli:' \ ' cap_drop: !reset []' \ > docker-compose.cli-no-dropped-caps.local.yml docker compose -f docker-compose.yml -f docker-compose.cli-no-dropped-caps.local.yml run --rm openclaw-cli plugins install <package>اگر از قبل یک کانتینر طولانیاجرای openclaw-cli ساختهاید، آن را
با همان override دوباره ایجاد کنید. docker compose exec و docker exec نمیتوانند
قابلیتهای Linux را روی کانتینری که از قبل ساخته شده تغییر دهند.
مجوزها و EACCES
تصویر بهعنوان node (uid 1000) اجرا میشود. اگر خطاهای permission روی
/home/node/.openclaw دیدید، مطمئن شوید bind mountهای میزبان شما متعلق به uid 1000 هستند:
sudo chown -R 1000:1000 /path/to/openclaw-config /path/to/openclaw-workspaceهمین عدم تطابق میتواند بهصورت هشدار Plugin مانند
blocked plugin candidate: suspicious ownership (... uid=1000, expected uid=0 or root)
و سپس plugin present but blocked ظاهر شود. یعنی uid فرایند و مالک
دایرکتوری Plugin که mount شده با هم ناسازگارند. ترجیح دهید کانتینر را با uid پیشفرض 1000 اجرا کنید
و مالکیت bind mount را اصلاح کنید. فقط زمانی
/path/to/openclaw-config/npm را به root:root تغییر مالکیت دهید که عمداً
OpenClaw را در بلندمدت بهعنوان root اجرا میکنید.
بازسازیهای سریعتر
Dockerfile خود را طوری مرتب کنید که لایههای dependency cache شوند. این کار از اجرای دوباره
pnpm install جلوگیری میکند مگر اینکه lockfileها تغییر کنند:
FROM node:24-bookwormRUN curl -fsSL https://bun.sh/install | bashENV PATH="/root/.bun/bin:${PATH}"RUN corepack enableWORKDIR /appCOPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./COPY ui/package.json ./ui/package.jsonCOPY scripts ./scriptsRUN pnpm install --frozen-lockfileCOPY . .RUN pnpm buildRUN pnpm ui:installRUN pnpm ui:buildENV NODE_ENV=productionCMD ["node","dist/index.js"]گزینههای کانتینر برای کاربران حرفهای
تصویر پیشفرض با اولویت امنیت ساخته شده و بهصورت کاربر غیرریشه node اجرا میشود. برای یک
کانتینر کاملتر:
- ماندگار کردن
/home/node:export OPENCLAW_HOME_VOLUME="openclaw_home" - گنجاندن وابستگیهای سیستم:
export OPENCLAW_IMAGE_APT_PACKAGES="git curl jq" - گنجاندن وابستگیهای Python:
export OPENCLAW_IMAGE_PIP_PACKAGES="requests==2.32.5 humanize==4.14.0" - گنجاندن Playwright Chromium:
export OPENCLAW_INSTALL_BROWSER=1 - یا نصب مرورگرهای Playwright در یک volume ماندگار:
bash docker compose run --rm openclaw-cli \ node /app/node_modules/playwright-core/cli.js install chromium - ماندگار کردن دانلودهای مرورگر: از
OPENCLAW_HOME_VOLUMEیاOPENCLAW_EXTRA_MOUNTSاستفاده کنید. OpenClaw، Chromium مدیریتشده توسط Playwright در تصویر Docker را روی Linux بهصورت خودکار تشخیص میدهد.
OpenAI Codex OAuth (Docker بدون رابط گرافیکی)
اگر در راهانداز OpenAI Codex OAuth را انتخاب کنید، یک URL مرورگر باز میشود. در Docker یا راهاندازیهای بدون رابط گرافیکی، URL کامل تغییرمسیر صفحهای را که به آن میرسید کپی کنید و آن را دوباره در راهانداز جایگذاری کنید تا احراز هویت کامل شود.
فراداده تصویر پایه
تصویر اصلی زمان اجرای Docker از node:24-bookworm-slim استفاده میکند و tini را بهعنوان فرایند init نقطه ورود (PID 1) شامل میشود تا مطمئن شود فرایندهای zombie جمعآوری میشوند و سیگنالها در کانتینرهای طولانیاجرا بهدرستی مدیریت میشوند. این تصویر annotationهای تصویر پایه OCI را منتشر میکند، از جمله org.opencontainers.image.base.name،
org.opencontainers.image.source، و موارد دیگر. digest پایه Node
از طریق PRهای تصویر پایه Docker در Dependabot بهروزرسانی میشود؛ ساختهای انتشار
لایه ارتقای توزیع را اجرا نمیکنند. ببینید
annotationهای تصویر OCI.
اجرا روی VPS؟
برای مراحل استقرار VM اشتراکی، از جمله گنجاندن binary، ماندگاری، و بهروزرسانیها، Hetzner (Docker VPS) و زمان اجرای Docker VM را ببینید.
سندباکس عامل
وقتی agents.defaults.sandbox با backend مربوط به Docker فعال باشد، Gateway
اجرای ابزارهای عامل (shell، خواندن/نوشتن فایل، و غیره) را داخل کانتینرهای Docker
ایزوله اجرا میکند، در حالی که خود Gateway روی میزبان باقی میماند. این کار یک دیوار سخت
پیرامون نشستهای عامل غیرقابل اعتماد یا چندمستاجری ایجاد میکند، بدون اینکه لازم باشد کل
Gateway را کانتینری کنید.
دامنه سندباکس میتواند برای هر عامل (پیشفرض)، برای هر نشست، یا مشترک باشد. هر دامنه
workspace مخصوص خود را دریافت میکند که در /workspace mount میشود. همچنین میتوانید
سیاستهای مجاز/غیرمجاز ابزار، جداسازی شبکه، محدودیتهای منابع، و کانتینرهای مرورگر را
پیکربندی کنید.
برای پیکربندی کامل، تصاویر، نکات امنیتی، و پروفایلهای چندعاملی، ببینید:
- سندباکسسازی -- مرجع کامل سندباکس
- OpenShell -- دسترسی shell تعاملی به کانتینرهای سندباکس
- سندباکس و ابزارهای چندعاملی -- بازنویسیهای هر عامل
فعالسازی سریع
{ agents: { defaults: { sandbox: { mode: "non-main", // off | non-main | all scope: "agent", // session | agent | shared }, }, },}تصویر پیشفرض سندباکس را بسازید (از یک checkout منبع):
scripts/sandbox-setup.shبرای نصبهای npm بدون checkout منبع، برای دستورهای درونخطی docker build، سندباکسسازی § تصاویر و راهاندازی را ببینید.
عیبیابی
تصویر وجود ندارد یا کانتینر سندباکس شروع نمیشود
تصویر سندباکس را با
scripts/sandbox-setup.sh
(checkout منبع) یا دستور درونخطی docker build از سندباکسسازی § تصاویر و راهاندازی (نصب npm) بسازید،
یا agents.defaults.sandbox.docker.image را روی تصویر سفارشی خود تنظیم کنید.
کانتینرها هنگام نیاز، بهصورت خودکار برای هر نشست ایجاد میشوند.
خطاهای مجوز در سندباکس
docker.user را روی UID:GIDای تنظیم کنید که با مالکیت workspace مانتشده شما مطابقت داشته باشد،
یا مالکیت پوشه workspace را با chown تغییر دهید.
ابزارهای سفارشی در سندباکس پیدا نمیشوند
OpenClaw دستورها را با sh -lc (login shell) اجرا میکند، که
/etc/profile را source میکند و ممکن است PATH را بازنشانی کند. docker.env.PATH را تنظیم کنید تا
مسیرهای ابزار سفارشی شما را در ابتدا قرار دهد، یا در Dockerfile خود یک اسکریپت زیر /etc/profile.d/ اضافه کنید.
در زمان ساخت تصویر بهدلیل OOM کشته شد (خروج 137)
VM به دستکم 2 GB RAM نیاز دارد. از کلاس ماشین بزرگتری استفاده کنید و دوباره تلاش کنید.
غیرمجاز یا نیازمند pairing در Control UI
یک لینک تازه dashboard بگیرید و دستگاه مرورگر را تأیید کنید:
docker compose run --rm openclaw-cli dashboard --no-opendocker compose run --rm openclaw-cli devices listdocker compose run --rm openclaw-cli devices approve <requestId>هدف Gateway مقدار ws://172.x.x.x یا خطاهای pairing از Docker CLI نشان میدهد
حالت و bind مربوط به Gateway را بازنشانی کنید:
docker compose run --rm openclaw-cli config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"}]'docker compose run --rm openclaw-cli devices list --url ws://127.0.0.1:18789مرتبط
- نمای کلی نصب — همه روشهای نصب
- Podman — جایگزین Podman برای Docker
- ClawDock — راهاندازی اجتماعی Docker Compose
- بهروزرسانی — بهروز نگه داشتن OpenClaw
- پیکربندی — پیکربندی Gateway پس از نصب