نشر الحاويات

نشر Decision Gate في بيئة حاوية محدودة.

تصف هذه الدليل عقد حاوية Decision Gate OSS الحالي وتوفر خطوات المشغل لبناء وتشغيل صورة خادم MCP.

صورة الحاوية هي أثر خادم. تقوم بتشغيل decision-gate serve وهي مناسبة للعملية التكاملية والتأهيلية الشبيهة بالإنتاج. إنها ليست دليلاً على أن الالتزام الدائم، أو الاسترداد، أو ملف تعريف التعيين متعدد العقد مؤهل للإطلاق.

عقد الحاوية الحالي

  • نقطة الدخول: decision-gate
  • الأمر الافتراضي: serve --config CONFIG_PATH --allow-non-loopback، حيث يستخدم إعداد الحاوية /etc/decision-gate/decision-gate.toml.
  • تركيب التكوين: /etc/decision-gate/decision-gate.toml
  • النقل: HTTP (SSE اختياري)
  • المصادقة: تتطلب مصادقة حامل؛ لا تكون الشهادات التي يتحكم فيها المتصل أو رؤوس موضوع الوكيل هي سلطات الهوية أبداً.
  • TLS: تم إنهاؤه في الجهة العليا بشكل افتراضي (server.tls_termination = "upstream")
  • الاستمرارية: لا يوجد تخزين لحالة التشغيل الدائم بشكل افتراضي؛ SQLite هو تكوين استمرارية محلي صريح
  • وقت التشغيل: غير جذر، امتيازات محدودة، سجلات stdout/stderr
  • مسارات قابلة للكتابة: /var/lib/decision-gate (فقط عند تمكين SQLite)

غياب التخزين المحلي لا يجعل تحولات المقيم غير متصلة RunKey(namespace, run_id)أو آمنة لتوجيه الكتابة المتعددة باستخدام نفس RunKey. يحتوي الكود الحالي على آليات رأس/استمرارية دقيقة، ولكن لم يتم تحسينها ضد نموذج التشغيل المقبول PF-03 ولا يحتوي ملف تعريف عمر العملية على ادعاء استمرارية إعادة التشغيل. يجب أن يوجه نشر مستضاف التحول لواحد RunKey(namespace, run_id) من خلال عملية واحدة محددة وتثبيت بايتات قانون السيناريو المتطابقة لتلك الهوية. هذه قيود على المشغل، وليست نقل سلطة دائم أو فشل. تثبيت مساحة أسماء كاملة على عملية واحدة هو توجيه محافظ حالي، وليس مفتاح تسلسل دائم. يوجه الهدف المستقر للتعيين متعدد العقد كل إلى سلطة مقيم/تشغيل مقبول متواجد في نفس المكان ويستهلك شهود منصة خارجية دقيقة؛ انظر معيار تكامل النشر.

لا يمكن لتكوين الملف الشخصي الأولي الحالي تمثيل اكتساب أدلة الشبكة، أو مصادر أدلة MCP البعيدة، أو تنفيذ العمليات الفرعية/المخصصة، أو التقييم عن بُعد. يحمل نقل خادم HTTP/SSE طلبات الأدوات إلى عقدة DG ولا يمكّن تلك العائلات المستبعدة من الاكتساب.

بناء الصورة

البناء المحلي:

docker build -t decision-gate:dev .

بناء متعدد المعمارية (amd64 + arm64):

IMAGE_REPO=ghcr.io/your-org/decision-gate IMAGE_TAG=dev \
  scripts/container/build_container.sh

ادفع متعدد المعمارية:

IMAGE_REPO=ghcr.io/your-org/decision-gate IMAGE_TAG=dev PUSH=1 \
  scripts/container/build_container.sh

ملاحظات:

  • IMAGE_REPO=ghcr.io/your-org/decision-gate هو عنصر نائب. استبدل your-org بمنظمة GitHub الخاصة بك أو اسم المستخدم (على سبيل المثال، ghcr.io/decision-gate/decision-gate).
  • IMAGE_TAG=dev هو مثال محلي/تطوير. للإصدارات، استخدم علامة إصدار (على سبيل المثال، vX.Y.Z) ويفضل نشر latest.

العلامات وسياسة الإصدار

محلي/تطوير:

  • decision-gate:dev للاختبار العشوائي.
  • علامات Local/dev ليست مواد إصدار بمستوى السياسة.

الإصدار:

  • لا توجد صورة رسمية من GHCR منشورة حالياً من هذا المستودع.
  • يجب على المشغلين الذين يرغبون في الحصول على صورة سجل بناء ودفع صورتهم الخاصة إلى سجل تتحكم فيه المنظمة والاحتفاظ بأثرهم الخاص.
  • لا تزال سير العمل للإصدارات تصدر أدلة سلسلة التوريد للإصدارات المميزة الأولى من المصدر والتحقق من توازن الإصدار المحلي.

التكوين

تتوقع الحاوية وجود ملف تكوين في /etc/decision-gate/decision-gate.toml.

استخدم إعداد الحاوية كخط أساس: configs/presets/container-prod.toml.

المتطلبات الرئيسية:

  • server.bind يجب أن يكون غير حلقي (على سبيل المثال، 0.0.0.0:8080).
  • server.auth.mode يجب أن يكون bearer_token أو mtls.
  • server.tls_termination = "upstream" عندما يتم إنهاء TLS خارج الحاوية.

تشغيل الحاوية

أدنى تشغيل (مصادقة رمز الحامل، إنهاء TLS العلوي):

docker run --rm -p 8080:8080 \
  -v "$(pwd)/configs/presets/container-prod.toml:/etc/decision-gate/decision-gate.toml:ro" \
  decision-gate:dev

ملاحظات:

  • استبدل رمز العرض التوضيحي في الإعدادات قبل استخدامه في الإنتاج.
  • --allow-non-loopback هو جزء من الأمر الافتراضي للحاوية. إذا قمت بتجاوز الأمر، قم بتضمين --allow-non-loopback أو قم بتعيين DECISION_GATE_ALLOW_NON_LOOPBACK=1.

TLS داخل الحاوية (اختياري)

إذا كنت بحاجة إلى TLS داخل الحاوية، قم بتعيين:

[server]
tls_termination = "server"

[server.tls]
cert_path = "/etc/decision-gate/tls/server.crt"
key_path = "/etc/decision-gate/tls/server.key"

قم بتركيب الشهادات وتحديث وقت تشغيل الحاوية الخاص بك وفقًا لذلك.

وضع المتانة (SQLite)

بشكل افتراضي، يستخدم إعداد الحاوية تخزين البيانات في الذاكرة.

لتمكين متانة SQLite، قم بتحديث الإعدادات:

[schema_registry]
type = "sqlite"
path = "/var/lib/decision-gate/schema-registry.db"

[accepted_run_store]
type = "sqlite"
path = "/var/lib/decision-gate/decision-gate.db"
busy_timeout_ms = 5000

تشغيل مع وحدة تخزين قابلة للكتابة:

docker run --rm -p 8080:8080 \
  -v "$(pwd)/configs/presets/container-prod.toml:/etc/decision-gate/decision-gate.toml:ro" \
  -v decision-gate-data:/var/lib/decision-gate \
  decision-gate:dev

توقعات المصادقة

مثال على رمز الحامل:

curl -sS -X POST http://127.0.0.1:8080/rpc \
  -H "Authorization: Bearer dg-container-demo-token" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

رؤوس شهادة الموضوع التي يصرح بها المتصل غير مدعومة عمداً. عندما ينهي وكيل أو مدخل TLS، يجب عليه إزالة رؤوس التوجيه غير الموثوقة وتمرير بيانات الاعتماد المراجعة دون تغيير. يحمي TLS المنتهي من الخادم الاتصال ولكنه لا ينشئ آلية هوية تطبيق منفصلة.

نقاط النهاية الصحية

يظهر Decision Gate مجسات Kubernetes القياسية:

  • GET /healthz للتحقق من الحيادية
  • GET /readyz للتحقق من الجاهزية

هذه النقاط النهائية غير مصادق عليها عن عمد وتعيد حالة الحد الأدنى فقط. /readyz يقوم بإجراء فحوصات جاهزية خفيفة (تخزين الحالة + سجل المخطط) ويعيد HTTP 503 مع {"status":"not_ready"} إذا كانت التبعيات غير متاحة.

curl -sS http://127.0.0.1:8080/healthz
curl -sS http://127.0.0.1:8080/readyz

كلا نقطتي النهاية ترجعان HTTP 200 مع حمولة JSON.

مثال على Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: decision-gate
spec:
  replicas: 1
  selector:
    matchLabels:
      app: decision-gate
  template:
    metadata:
      labels:
        app: decision-gate
    spec:
      containers:
        - name: decision-gate
          image: ghcr.io/your-org/decision-gate:your-tag
          ports:
            - containerPort: 8080
          securityContext:
            runAsNonRoot: true
            runAsUser: 10001
            readOnlyRootFilesystem: true
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /readyz
              port: 8080
            initialDelaySeconds: 2
            periodSeconds: 5
          volumeMounts:
            - name: config
              mountPath: /etc/decision-gate/decision-gate.toml
              subPath: decision-gate.toml
              readOnly: true
            - name: data
              mountPath: /var/lib/decision-gate
      volumes:
        - name: config
          configMap:
            name: decision-gate-config
        - name: data
          emptyDir: {}

لضمان ديمومة SQLite، استبدل emptyDir بمطالبة حجم دائم.

آثار سلسلة التوريد

تولد سير العمل في Decision Gate وتتحقق من آثار سلسلة التوريد لعلامات المصدر أولاً وفحوصات التماثل المحلية. تظل الأوامر أدناه مفيدة للتحقق اليدوي من الصور التي تم إنشاؤها بواسطة المشغل.

حاوية SBOM (مثال باستخدام syft):

syft packages decision-gate:dev -o spdx-json > decision-gate.sbom.spdx.json

توقيع الكائن أو الأثر (cosign):

cosign sign-blob decision-gate.sbom.spdx.json

بيان مصدر التوقيع:

cosign sign-blob decision-gate.provenance.intoto.json

تمنع سياسة الإصدار عندما:

  • أي ثغرة عالية/حرجة موجودة.
  • أي CVE معروف تم استغلاله موجود.
  • فشل التحقق من التوقيع أو الأصل.