Hosting
Kubernetes
نقطة انطلاق بسيطة لتشغيل OpenClaw على Kubernetes، وليست نشرًا جاهزًا للإنتاج. تغطي الموارد الأساسية، والمقصود منها أن تُكيَّف مع بيئتك.
لماذا ليس Helm؟
OpenClaw حاوية واحدة مع بعض ملفات الإعداد. التخصيص المهم يكون في محتوى الوكلاء (ملفات Markdown وSkills وتجاوزات الإعداد)، وليس في قوالب البنية التحتية. يتعامل Kustomize مع الطبقات دون عبء مخطط Helm. إذا أصبح النشر لديك أكثر تعقيدًا، يمكن وضع مخطط Helm فوق هذه البيانات التعريفية.
ما تحتاجه
- عنقود Kubernetes قيد التشغيل (AKS أو EKS أو GKE أو k3s أو kind أو OpenShift، وغير ذلك)
kubectlمتصل بعنقودك- مفتاح API لمزود نماذج واحد على الأقل
البدء السريع
# Replace with your provider: ANTHROPIC, GEMINI, OPENAI, or OPENROUTERexport <PROVIDER>_API_KEY="..."./scripts/k8s/deploy.sh kubectl port-forward svc/openclaw 18789:18789 -n openclawopen http://localhost:18789استرد السر المشترك المكوَّن لواجهة التحكم. ينشئ هذا النص البرمجي للنشر مصادقة رمزية افتراضيًا:
kubectl get secret openclaw-secrets -n openclaw -o jsonpath='{.data.OPENCLAW_GATEWAY_TOKEN}' | base64 -dللتنقيح المحلي، يطبع ./scripts/k8s/deploy.sh --show-token الرمز بعد النشر.
الاختبار المحلي باستخدام Kind
إذا لم يكن لديك عنقود، فأنشئ واحدًا محليًا باستخدام Kind:
./scripts/k8s/create-kind.sh # auto-detects docker or podman./scripts/k8s/create-kind.sh --delete # tear downثم انشر كالمعتاد باستخدام ./scripts/k8s/deploy.sh.
خطوة بخطوة
1) النشر
الخيار أ — مفتاح API في البيئة (خطوة واحدة):
# Replace with your provider: ANTHROPIC, GEMINI, OPENAI, or OPENROUTERexport <PROVIDER>_API_KEY="..."./scripts/k8s/deploy.shينشئ النص البرمجي Kubernetes Secret يحتوي على مفتاح API ورمز Gateway مولَّد تلقائيًا، ثم ينشر. إذا كان Secret موجودًا بالفعل، فإنه يحافظ على رمز Gateway الحالي وأي مفاتيح مزودين لا يجري تغييرها.
الخيار ب — إنشاء السر بشكل منفصل:
export <PROVIDER>_API_KEY="..."./scripts/k8s/deploy.sh --create-secret./scripts/k8s/deploy.shاستخدم --show-token مع أي من الأمرين إذا أردت طباعة الرمز إلى stdout للاختبار المحلي.
2) الوصول إلى Gateway
kubectl port-forward svc/openclaw 18789:18789 -n openclawopen http://localhost:18789ما الذي يُنشر
Namespace: openclaw (configurable via OPENCLAW_NAMESPACE)├── Deployment/openclaw # Single pod, init container + gateway├── Service/openclaw # ClusterIP on port 18789├── PersistentVolumeClaim # 10Gi for agent state and config├── ConfigMap/openclaw-config # openclaw.json + AGENTS.md└── Secret/openclaw-secrets # Gateway token + API keysالتخصيص
تعليمات الوكيل
حرر AGENTS.md في scripts/k8s/manifests/configmap.yaml ثم أعد النشر:
./scripts/k8s/deploy.shإعداد Gateway
حرر openclaw.json في scripts/k8s/manifests/configmap.yaml. راجع إعداد Gateway للمرجع الكامل.
إضافة مزودين
أعد التشغيل مع تصدير مفاتيح إضافية:
export ANTHROPIC_API_KEY="..."export OPENAI_API_KEY="..."./scripts/k8s/deploy.sh --create-secret./scripts/k8s/deploy.shتبقى مفاتيح المزودين الحالية في Secret ما لم تستبدلها.
أو حدّث Secret مباشرة:
kubectl patch secret openclaw-secrets -n openclaw \ -p '{"stringData":{"<PROVIDER>_API_KEY":"..."}}'kubectl rollout restart deployment/openclaw -n openclawمساحة أسماء مخصصة
OPENCLAW_NAMESPACE=my-namespace ./scripts/k8s/deploy.shصورة مخصصة
حرر حقل image في scripts/k8s/manifests/deployment.yaml:
image: ghcr.io/openclaw/openclaw:latest # primary; official Docker Hub mirror: openclaw/openclaw:latestالإتاحة إلى ما بعد port-forward
تربط البيانات التعريفية الافتراضية Gateway بعنوان loopback داخل الحجرة. يعمل ذلك مع kubectl port-forward، لكنه لا يعمل مع Kubernetes Service أو مسار Ingress يحتاج إلى الوصول إلى عنوان IP الخاص بالحجرة.
إذا أردت إتاحة Gateway عبر Ingress أو موازن تحميل:
- غيّر ربط Gateway في
scripts/k8s/manifests/configmap.yamlمنloopbackإلى ربط غير loopback يطابق نموذج النشر لديك - أبقِ مصادقة Gateway مفعّلة واستخدم نقطة دخول مناسبة تنهي TLS
- اضبط واجهة التحكم للوصول البعيد باستخدام نموذج أمان الويب المدعوم (مثل HTTPS/Tailscale Serve والأصول المسموح بها صراحة عند الحاجة)
إعادة النشر
./scripts/k8s/deploy.shيطبق هذا كل البيانات التعريفية ويعيد تشغيل الحجرة لالتقاط أي تغييرات في الإعداد أو الأسرار.
الإزالة
./scripts/k8s/deploy.sh --deleteيحذف هذا مساحة الأسماء وكل الموارد الموجودة فيها، بما في ذلك PVC.
ملاحظات معمارية
- يرتبط Gateway بعنوان loopback داخل الحجرة افتراضيًا، لذلك فإن الإعداد المضمّن مخصص لـ
kubectl port-forward - لا توجد موارد على مستوى العنقود؛ كل شيء موجود في مساحة أسماء واحدة
- الأمان: إمكانات
readOnlyRootFilesystemوdrop: ALLومستخدم غير root (UID 1000) - يحافظ الإعداد الافتراضي على واجهة التحكم في مسار الوصول المحلي الأكثر أمانًا: ربط loopback بالإضافة إلى
kubectl port-forwardإلىhttp://127.0.0.1:18789 - إذا تجاوزت الوصول عبر localhost، فاستخدم النموذج البعيد المدعوم: HTTPS/Tailscale مع ربط Gateway المناسب وإعدادات أصل واجهة التحكم
- تُنشأ الأسرار في دليل مؤقت وتُطبق مباشرة على العنقود؛ لا تُكتب أي مواد سرية إلى نسخة المستودع المحلية
بنية الملفات
scripts/k8s/├── deploy.sh # Creates namespace + secret, deploys via kustomize├── create-kind.sh # Local Kind cluster (auto-detects docker/podman)└── manifests/ ├── kustomization.yaml # Kustomize base ├── configmap.yaml # openclaw.json + AGENTS.md ├── deployment.yaml # Pod spec with security hardening ├── pvc.yaml # 10Gi persistent storage └── service.yaml # ClusterIP on 18789