الانتقال إلى المحتوى الرئيسي
يقوم هذا الدليل بنشر مجموعة AgentEye الكاملة على مجموعة Kubernetes مخصصة:
  • ClickHouse 24.8 — مخزن تحليلات الأحداث والتقييمات الموثوق (StatefulSet بحجم وحدة تخزين دائمة 100Gi). مطلوب: الخادم يرفض البدء بدونه.
  • PostgreSQL 16 — مخزن البيانات العلائقية/البيانات الوصفية للمنظمات ومفاتيح API والمستخدمين لوحات المعلومات والاستعلامات المحفوظة والمصادقة (StatefulSet بحجم وحدة تخزين دائمة 50Gi)
  • Redis 7.2 — ذاكرة تخزين مؤقت مشتركة اختيارية وخادم تحديد المعدل؛ يتدهور الخادم ولوحة المعلومات بشكل أنيق إذا كان غير متاح
  • خادم AgentEye — واجهة برمجية Rust لالتقاط الأحداث والتحليلات وإدارة المفاتيح (نسختان من البدائل)
  • لوحة معلومات AgentEye — واجهة ويب Next.js (نسختان من البدائل)
  • مساعد AI (خدمة الوكيل) — مساعد اختياري للقراءة فقط داخل لوحة المعلومات على المنفذ 9100؛ خامل حتى يتم تكوين نقطة نهاية LLM
  • Traefik (عام) — وحدة تحكم الإدخال لحركة المجمع، محمية بـ mTLS
  • Traefik (لوحة المعلومات) — وحدة تحكم الإدخال للوحة المعلومات، للشبكة الخاصة فقط/قائمة السماح بـ IP
  • cert-manager — شهادات TLS و CA خاص mTLS
  • وظيفة Backup CronJob — دمج يومي لـ PostgreSQL + ClickHouse في الساعة 03:00 UTC
  • مراقب تجديد الشهادات — تنبيهات عند اقتراب انتهاء صلاحية شهادات العميل
الوقت المقدر: 60-90 دقيقة للنشر الأول. بالنسبة لنموذج النشر المدار حيث تتعامل Exosphere مع كل ذلك نيابة عنك، راجع enterprise-docs/managed-deployment.md.

المتطلبات الأساسية

قم بتشغيل كل أمر تحقق قبل البدء. يجب أن تمر كل فحص.
المتطلبالحد الأدنىأمر التحققالمتوقع
مجموعة Kubernetes1.27+kubectl versionServer Version >= v1.27
Kustomize (مدمج في kubectl)Kustomize v1.14+ (يتم شحنه داخل kubectl 1.27+)kubectl kustomize --helpيطبع نص الاستخدام
Helmv3helm versionVersion:"v3.x.x"
RBAC مسؤول المجموعةkubectl auth can-i create namespacesyes
فئة التخزين الافتراضيةkubectl get storageclassصف واحد على الأقل محددة (default)
دعم LoadBalancerيعتمد على السحابة (EKS و GKE و AKS جميعها تدعم هذا افتراضياً)
GitHub PATecho $AGENTEYE_TOKENغير فارغ (انظر enterprise-docs/github-token.md)
opensslopenssl versionOpenSSL 1.x أو 3.x
دلو التخزين السحابيلـ PostgreSQL + ClickHouse backups (S3 أو GCS أو Azure Blob)
حجم المجموعة: 3 عقد على الأقل، 4 vCPU / 8 GB RAM لكل منها. انظر enterprise-docs/managed-deployment.md للمتطلبات الكاملة.

قم بتشغيل جميع الفحوصات مرة واحدة

شكل النشر

يتم توفير نقطة نهاية الالتقاط على اسم مضيف تتحكم فيه (على سبيل المثال ingest.your-company.example). يطلب cert-manager شهادة TLS موثوقة بشكل علني من Let’s Encrypt عبر HTTP-01، لذلك يتحقق المجمعون من شهادة الخادم مقابل مخزن الثقة بالنظام، بدون تثبيت CA لكل عميل. تعمل نقطة نهاية لوحة المعلومات بنفس الطريقة: يتم توفيرها على اسم مضيف ثانٍ تتحكم فيه (على سبيل المثال agenteye.your-company.example) يشير إلى LoadBalancer Traefik للوحة المعلومات، و cert-manager يصدر شهادة Let’s Encrypt الخاصة به من خلال LoadBalancer هذا. المتصفحات تحصل على شهادة موثوقة بدون تحذير.
يتم التحقق من إصدار واستجابة الشهادة عبر HTTP-01، لذلك يجب أن تكون كلا LoadBalancers قابلة للوصول من الإنترنت العام على المنفذ 80. إذا كنت بحاجة إلى تقييد IP للوحة معلومات LoadBalancer، فقم بتنسيق محلل DNS-01 مع الدعم أولاً - وإلا فإن التجديدات تفشل بصمت وتنتهي صلاحية الشهادة.

احصل على البيانات الوصفية

اختبره:
المتوقع: الملف موجود. إذا لم يكن كذلك، فإن الاستنساخ فشل - تحقق من AGENTEYE_TOKEN الخاص بك. هيكل المجلد:
تحتوي القاعدة على كل مورد مطلوب لنشر كامل، بما في ذلك شهادات Let’s Encrypt لاسمي المضيف العامين اللذين تقوم بتكوينهما في المرحلة 3.1. تراكب يصحح القاعدة لبيئة معينة (مثل علامات الصور المخصصة وحدود الموارد وربط env). يحتوي دليل الجهات الخارجية على ملفات قيم Helm للبنية التحتية الخارجية.
مراقبة الصحة (اختيارية): اختبار جاهزية الخادم بالفعل يعكس صحة Postgres + ClickHouse، و third-party/robusta/ يضيف تنبيهات فشل البروانة المحلية بـ Kubernetes القابلة للاختيار إلى Slack. انظر enterprise-docs/health-monitoring.md.

المرحلة 1 - البنية التحتية الخارجية (~30 دقيقة)

1.1 تثبيت cert-manager

يدير cert-manager شهادات TLS لـ HTTPS و CA الخاص المستخدم لشهادات عملاء mTLS.
اختبره:
المتوقع: 3 بروانات جميعها Runningcert-manager و cert-manager-cainjector و cert-manager-webhook.
المتوقع: على الأقل certificates.cert-manager.io و clusterissuers.cert-manager.io و issuers.cert-manager.io. إذا فشل: عادة ما تعني البروانات في CrashLoopBackOff عدم تثبيت CRDs. قم بإعادة التشغيل باستخدام --set crds.install=true. إذا فشلت بروانات webhook في جاهزية، انتظر 30 ثانية وتحقق مرة أخرى - قد تستغرق بعض الوقت للبدء.

1.2 تثبيت Traefik - وحدة تحكم الإدخال العامة

تتعامل هذه النسخة من Traefik مع حركة المجمع على LoadBalancer خارجي. يقوم بإنهاء TLS وفرض mTLS (التحقق من شهادة العميل) على نقطة نهاية الالتقاط.
اختبره:
المتوقع: 1 برونة Running.
المتوقع: الفئة IngressClass موجودة (إنها ليست الفئة الافتراضية). إذا فشل: تحقق من kubectl describe pod -n traefik-public <pod-name> للأخطاء في سحب الصور أو قيود الموارد.

1.3 تثبيت Traefik - وحدة تحكم لوحة المعلومات

تخدم نسخة Traefik هذه لوحة المعلومات على LoadBalancer مخصص، مقيدة بقائمة السماح بـ IP.
تشحن آليات قائمة السماح المزدوجة لهذه النسخة. يستخدم هذا الدليل values-dashboard.yaml، والذي يقيد الوصول بحقل service.loadBalancerSourceRanges المحمول. يتم توفير values-internal.yaml الموازي أيضاً لبيئات AWS التي تفضل التعليق التوضيحي service.beta.kubernetes.io/aws-load-balancer-source-ranges بدلاً من ذلك. اختر أحدهما واستخدمه بثبات؛ تفترض الخطوات أدناه values-dashboard.yaml.
قبل التثبيت، عدّل third-party/traefik/values-dashboard.yaml لتعيين عناوين IP المسموحة بالمصدر. يتحكم حقل loadBalancerSourceRanges في عناوين IP التي يمكنها الوصول إلى لوحة المعلومات. بشكل افتراضي، يتم تعيينه على 0.0.0.0/0 (جميع عناوين IP)؛ قيده بـ VPN أو مكتب أو معروف عنوان IP للخروج.

قائمة السماح بعنوان IP واحد

قائمة السماح بعناوين IP متعددة

أضف إدخالاً واحداً لكل عنوان IP أو كتلة CIDR. لاحقة /32 تطابق عنوان IPv4 واحد؛ كتلة CIDR (على سبيل المثال /24) تطابق نطاقاً. يمكنك خلط عناوين IP الفردية والنطاقات بحرية:
نصائح عند الحفاظ على القائمة:
  • احفظ إدخالاً واحداً لكل سطر وأضف تعليقاً موجزاً # يحدد مالك أو غرض كل عنوان IP؛ هذا ما يستخدمه المشغلون في المستقبل لتحديد ما إذا كان الإدخال لا يزال مطلوباً.
  • استخدم دائماً تدوين CIDR. عنوان IP عام مثل 203.0.113.10 يتم رفضه من قبل موفر السحابة؛ استخدم 203.0.113.10/32.
  • بالنسبة إلى نطاقات IPv6، استخدم /128 المكافئ (عنوان واحد) أو CIDR أكبر، على سبيل المثال 2001:db8::1/128. لا تدعم جميع موفري السحابة نطاقات مصدر IPv6؛ تحقق من وثائق LoadBalancer لموفرك.
  • القائمة هي OR: يُسمح بالحركة إذا كان المصدر يطابق أي إدخال.
بعد تحرير الملف، تابع helm install أدناه. إذا كانت وحدة التحكم مثبتة بالفعل، فقم بتشغيل helm upgrade بنفس العلامات، أو أصلح الخدمة في وقت التشغيل (القسم التالي).

تحديث قائمة السماح في وقت التشغيل

يمكنك تغيير عناوين IP المسموحة بدون ترقية Helm بإصلاح الخدمة مباشرة. يستبدل الإصلاح القائمة بأكملها؛ قم دائماً بتضمين كل عنوان IP تريد الاحتفاظ به، وليس الآخر الجديد. لاستبدال القائمة بمجموعة جديدة من عناوين IP:
لـ إضافة عنوان IP بأمان دون فقدان الإدخالات الموجودة، اقرأ القائمة الحالية أولاً، ثم أصلح بالمجموعة المدمجة:
لا يتم الاحتفاظ بالإصلاحات في وقت التشغيل مرة أخرى إلى values-dashboard.yaml. للاحتفاظ بالتغيير عبر ترقيات Helm المستقبلية، قم أيضاً بتحديث ملف القيم والالتزام به.
ثم ثبت:
اختبره:
المتوقع: 1 برونة Running.
المتوقع: الفئة IngressClass موجودة.

1.4 انتظر LoadBalancers

تحتاج كلا نسختا Traefik إلى عناوين IP خارجية قبل المتابعة.
اختبره: كلا الخدمتين تظهران EXTERNAL-IP (وليس <pending>). إذا كانت لا تزال قيد الانتظار، راقب التخصيص:
اضغط على Ctrl+C بمجرد ظهور عنوان IP. عادة ما يستغرق تخصيص عنوان IP 2-5 دقائق. إذا فشل: عادة ما يعني <pending> بعد 10 دقائق أن موفر السحابة لا يستطيع توفير LoadBalancer. تحقق من: علامات الشبكة الفرعية (EKS يتطلب kubernetes.io/role/elb)، تكوين VPC، حصص الخدمة، وأن التعليق التوضيحي LB الداخلي الصحيح مضبوط للنسخة الداخلية.

المرحلة 2 - إنشاء الأسرار (~10 دقائق)

يتم إنشاء جميع الأسرار يدويا قبل نشر التطبيق. هذا يضمن عدم ظهور القيم الحساسة في ملفات البيان.

2.1 إنشاء مساحة الأسماء

اختبره:
المتوقع: الحالة Active.

2.2 سر سحب الصور

يقوم هذا السر بالمصادقة على ghcr.io لسحب صور حاوية AgentEye. انظر enterprise-docs/github-token.md لكيفية إنشاء PAT الخاص بك.
اختبره:
المتوقع: kubernetes.io/dockerconfigjson. اختبره (عميق) - تحقق من أن الرمز يمكنه فعلاً سحب الصور: استخدم علامة صورة server المثبتة في تراكب kustomization.yaml الخاص بك (حالياً v0.0.1-beta.48 في كل من تراكب acme المجمع والنشر الأساسي). استبدل العلامة أدناه بالعلامة التي تنشرها حتى لا ينجرف هذا الفحص عبر الإصدارات:
المتوقع: ok مطبوع في السجلات. إذا فشل: ErrImagePull أو 401 Unauthorized يعني أن PAT غير صحيح أو يفتقد النطاق read:packages. أعد التحقق من enterprise-docs/github-token.md.

2.3 بيانات اعتماد PostgreSQL

مهم: نستخدم -hex (وليس -base64) لإنشاء كلمة المرور. يمكن لمخرجات Base64 أن تحتوي على + و / و = التي تقسم سلسلة الاتصال DATABASE_URL. انظر enterprise-docs/troubleshooting.md للتفاصيل.
قم بتخزين POSTGRES_PASSWORD في مدير الأسرار الخاص بك فوراً. ستحتاجه إذا كنت بحاجة إلى الاستعادة من نسخة احتياطية أو الاتصال بقاعدة البيانات مباشرة.
اختبره:
المتوقع: السر موجود.
المتوقع: 48 (24 بايت سادس عشر = 48 حرفاً).

2.4 مفتاح API للإدارة

مفتاح الإدارة هو بيانات اعتماد التمهيد. يقوم الخادم بتحديث أو إدراج جميع الأذونات في كل بدء. استخدمه لإنشاء مفاتيح مجمع محدودة في المرحلة 7. انظر enterprise-docs/api-keys.md لنموذج الأذونات الكامل.
قم بتخزين ADMIN_KEY في مدير الأسرار الخاص بك فوراً.
اختبره:
المتوقع: السر موجود.

2.5 تكوين المصادقة (تسجيل الدخول إلى لوحة المعلومات)

تستخدم لوحة المعلومات البريد الإلكتروني + OTP لتسجيل دخول المستخدم. بدون هذا السر، يبدأ الخادم بشكل طبيعي ويستمر مسار ADMIN_KEY API في العمل، لكن لا يمكن لأي مستخدم تسجيل الدخول عبر الواجهة. تتم الإشارة إلى جميع المفاتيح كـ optional: true في البيان الأساسي، لذا فإن الأسرار الجزئية (أو عدم وجود سر على الإطلاق) جيدة؛ يعود الخادم إلى الافتراضيات الموثقة. جمع كل شيء في سر واحد agenteye-auth يجعل سطح المصادقة قابلاً للدوران في مكان واحد.
المفتاحالغرض
ADMIN_EMAILمستخدم إدارة التمهيد. يتم تحديثه أو إدراجه في كل بدء مع جميع الأذونات وحمايته من الحذف/تعديلات الأذونات عبر لوحة المعلومات. بدونه، لا يتم بذر أي مسؤول ويكون أول تسجيل دخول مستحيلاً.
ALLOWED_EMAILSقائمة السماح المفصول بينها بفواصل. يدعم عناوين دقيقة (user@example.com) وأحرف دومين بدل (*@example.com). بدونها، لا يمكن لأي مستخدم تسجيل الدخول أو إنشاؤه.
SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD, SMTP_FROMمرحل SMTP لإرسال رموز OTP. إذا لم تكن SMTP_HOST مضبوطة، يتم تسجيل رموز OTP في stdout الخادم بدلاً من إرسالها بالبريد الإلكتروني (مفيد لاختبارات التحقق الأولى). قدم جميع مفاتيح SMTP معاً لتسليم البريد الإلكتروني الفعلي.
SMTP_TLSأحد starttls (الافتراضي) أو tls أو none.
DEFAULT_ORG_NAME, DEFAULT_ORG_SLUGاختياري. أعط للمنظمة المدمجة default اسم عرض ودية وشريحة عنوان URL بحيث تعيش على سبيل المثال في /acme بدلاً من /default. يتم تطبيقها فقط عند البدء الأول؛ بمجرد إعادة تسمية المنظمة باستخدام agenteye-orgctl org rename (انظر §7.6) يتم تجاهلها. يجب أن تكون الشريحة 1-40 أحرفاً صغيرة وأرقام مع شرطات داخلية واحدة. اتركهما دون تعيين للاحتفاظ بـ default عام.
قم بتخزين بيانات اعتماد SMTP في مدير الأسرار الخاص بك.
اختبره:
المتوقع: تظهر المفاتيح التي заполнили في الإخراج.

2.6 مفتاح عزل المنظمة متعددة المستأجرين (اختياري)

تخطي هذا للنشر بمستأجر واحد؛ يعمل الخادم على بناء مدمج dev افتراضي ويخدم المنظمة الواحدة default بشكل جيد. قبل إنشاء منظمة ثانية، قم بتعيين ORG_CH_SECRET قوي واستقر: كلمة مرور ClickHouse لكل منظمة مشتقة كـ HMAC(ORG_CH_SECRET, org_id)، لذا فإن الافتراضي المدمج المعروف بالعام سيؤدي إلى بيانات اعتماد محتملة معروفة لكل منظمة. يرفض أمر agenteye-orgctl org create (انظر §7.6 توفير المنظمات) التشغيل بينما الخادم لا يزال في الافتراضي dev المدمج.
يقرأ الخادم هذا عبر secretKeyRef اختياري، لذا فإن مجموعة بمستأجر واحد لا تنشئها أبداً بدء الأمر بشكل طبيعي. حافظ على القيمة مستقرة ومطابقة عبر جميع البدائل؛ تدويرها يلغي كلمة مرور ClickHouse المشتقة من كل منظمة حتى يعيد التوفيق في وقت البدء تزويد المستخدمين (إعادة تشغيل متدرجة مع القيمة المتسقة في كل مكان يشفيها). انظر deploy/base/server/secret.example.yaml.
قم بتخزين ORG_CH_SECRET في مدير الأسرار الخاص بك ولا تقوم بتدويره بشكل عرضي.

2.7 التحقق من جميع الأسرار

الإخراج المتوقع (من بين أي أسرار افتراضية):
يجب أن تكون الأسرار الأربعة الأساسية (agenteye-admin-key و agenteye-auth و agenteye-image-pull و agenteye-postgres) موجودة قبل المتابعة. agenteye-org-ch-secret مطلوب فقط لنشرات متعددة المستأجرين (انظر §2.6).

المرحلة 3 - نشر التطبيق (~5 دقائق)

3.1 تكوين اسم المضيف العام

يحتاج cert-manager إلى اسم المضيف للالتقاط ولوحة المعلومات قبل أن يتمكن من طلب شهادات Let’s Encrypt الخاصة به. انسخ القالب وعيّن كلاهما:
domain.env يتم تجاهله من قبل git؛ يبقى محلياً لكل نشر. بناء kustomize يفشل بصراحة إذا كان أي مفتاح مفقوداً.
يجب أن ينحل DNS أولاً. لا تضطر إلى الإشارة بـ DNS إلى LoadBalancers حتى الآن (فهي غير موجودة حتى تكتمل المرحلة 1.2)، لكن إصدار ACME في الخطوة 3.2 سيحاول مجدداً حتى يحل كل اسم مضيف إلى LoadBalancer الخاص به. يمكنك إما تعيين DNS الآن (باستخدام أسماء مضيف LoadBalancer المجمعة في المرحلة 1.4) أو المتابعة وإضافة السجلات في المرحلة 4.

3.2 تطبيق البيانات الوصفية

قم بتطبيق القاعدة مباشرة لتثبيت جديد، أو تراكب إذا قمت بقطع واحد لهذه البيئة (التراكبات فقط دبابيس علامات الصور و env vars وحدود الموارد؛ يرثون شهادات القاعدة والتوجيه):
يتضمن التراكب القاعدة تلقائياً؛ تطبيق واحد، وليس كليهما.

3.3 انتظر البروانات

ينطبق الانتظار على بروانات مستوى البيانات الأساسي. يأتي البروانات agent (مساعد AI) و redis الاختيارية جنباً إلى جنب معهم؛ المساعد يبقى خاملاً حتى توفر نقطة نهاية LLM الخاصة به (انظر enterprise-docs/assistant.md)، و Redis هو ذاكرة تخزين مؤقت أفضل جهد، لذا لا يحتاج أي منهما إلى أن يكون جاهزاً للخدمة لخدمة البلاتفورم حركة. اختبره:
المتوقع (البروانات agent و redis الاختيارية تظهر أيضاً وتصل إلى Running):
إذا فشل:
حالة البروانةالسبب المحتملأمر التصحيح
ImagePullBackOffسر سحب صورة سيء أو PATkubectl describe pod <name> -n agenteye
CrashLoopBackOffمتغيرات البيئة السيئة (على سبيل المثال DATABASE_URL)kubectl logs <name> -n agenteye
Pendingوحدة المعالجة المركزية / الذاكرة غير كافية أو بدون عقدkubectl describe pod <name> -n agenteye (تحقق من الأحداث)

3.4 التحقق من التخزين

المتوقع، كلاهما بحالة Bound:
PVCالسعةظهره
postgres-data-postgres-050Giمخزن البيانات العلائقية / البيانات الوصفية PostgreSQL
clickhouse-data-clickhouse-0100Giمخزن تحليلات أحداث ClickHouse + التقييمات
يظهر أيضاً PVC redis-data-redis-0 (1Gi) لذاكرة التخزين المؤقت الاختيارية. إذا فشل: Pending يعني أن فئة التخزين لا يمكنها توفير الحجم. تحقق من kubectl get storageclass وتأكد من وجود افتراضي. للإنتاج، ضع حجم ClickHouse على فئة تخزين SSD سريعة (على سبيل المثال gp3 على AWS أو pd-ssd على GCP)؛ يعاني معدل النقابة من الأقراص البطيئة.

3.5 التحقق من الشهادات

المتوقع: 3 شهادات، جميعها Ready: True:
الاسمالمُصدرالغرض
mtls-caselfsignedCA خاص لإصدار شهادات عملاء mTLS (صحة 10 سنوات)
ingest-tlsletsencrypt-prodشهادة TLS عام لنقطة نهاية الالتقاط (90 يوماً، تجديد تلقائي)
dashboard-tlsletsencrypt-prodشهادة TLS عام لوحة المعلومات (90 يوماً، تجديد تلقائي)
إذا لم تكن ingest-tls أو dashboard-tls جاهزة: kubectl describe certificate <name> -n agenteye واقرأ الأحداث. الأسباب الشائعة:
  • DNS لم تشير بعد إلى LB. يحل Let’s Encrypt اسم المضيف ويضرب المنفذ 80 للتحقق - INGEST_DOMAIN يجب أن يحل إلى LoadBalancer العام و DASHBOARD_DOMAIN إلى LoadBalancer لوحة المعلومات. حتى ينتشر CNAME / Alias، تبقى الطلب معلقة. بمجرد أن يكون DNS صحيحاً، يحاول cert-manager مجدداً تلقائياً (لا حاجة لحذف الشهادة).
  • اسم المضيف لم يتم استبداله. إذا كانت dnsNames تقرأ بعد INGEST_DOMAIN_PLACEHOLDER / DASHBOARD_DOMAIN_PLACEHOLDER، فقد تخطيت الخطوة 3.1 - أنشئ base/certificates/domain.env وأعد التطبيق.
  • Traefik لوحة المعلومات لا يمكنه خدمة التحدي (dashboard-tls فقط). يجب تثبيت نسخة Traefik من لوحة المعلومات مع ملف القيم المجمع (المرحلة 1.3)، والذي يمكن موفر الإدخال المحدود الذي يخدم حلال HTTP-01 من cert-manager. نسخة مثبتة بدونها تترك التحدي غير قابل للتوجيه والطلب معلق للأبد.
إذا لم تكن mtls-ca جاهزة: cert-manager نفسه غير صحي. أعد التحقق من بروانات cert-manager من الخطوة 1.1.

3.6 التحقق من CronJobs

المتوقع:
الاسمالجدول الزمنيالغرض
agenteye-backup0 3 * * *النسخ الاحتياطية اليومية Postgres + ClickHouse في 03:00 UTC
cert-renewal-check0 3,15 * * *تنبيهات انتهاء صلاحية الشهادة في 03:00 و 15:00 UTC

3.7 تحقق من بدء الخادم بشكل صحيح

اختبره: ابحث عن سطر بدء يشير إلى أن الخادم يستمع على المنفذ 8080. يجب ألا تكون هناك أخطاء في اتصال قاعدة البيانات (يتطلب الخادم وصول PostgreSQL و ClickHouse قبل أن يبلغ عن Ready). إذا فشل: السبب الأكثر شيوعاً هو POSTGRES_PASSWORD يحتوي على أحرف غير آمنة للعنوان الذي ينقسم DATABASE_URL. انظر enterprise-docs/troubleshooting.md.

3.8 تحقق من لوحة المعلومات المتصلة بالخادم

اختبره: ابحث عن Ready في الإخراج بدون أخطاء ECONNREFUSED أو ما شابه. إذا فشل: تحقق من أن خدمة server موجودة (kubectl get svc server -n agenteye) وأن AGENTEYE_SERVER_URL مضبوطة على http://server:8080 في نشر لوحة المعلومات.

المرحلة 4 - الوصول إلى الشبكة (~5 دقائق)

4.1 استرجع عناوين LoadBalancer

على AWS EKS، تُرجع LoadBalancers اسم مضيف بدلاً من عنوان IP. استبدل .ip بـ .hostname في الأوامر أعلاه.
اختبره:
كلاهما يجب أن يكون غير فارغ.

4.2 أشر DNS إلى LoadBalancers

أنشئ سجلات DNS بحيث تحل أسماء المضيفات من base/certificates/domain.env إلى LoadBalancers الخاصة بهم - INGEST_DOMAIN إلى LoadBalancer Traefik العام، DASHBOARD_DOMAIN إلى LoadBalancer Traefik لوحة المعلومات:
  • AWS Route 53: سجل A مع Alias = Yes، الهدف = اسم مضيف LoadBalancer. لا تستخدم A → IP عادي؛ عناوين ELB IP تدور.
  • أي موفر آخر: CNAME من اسم المضيف إلى اسم مضيف LoadBalancer.
تحقق:
يجب أن تعود نفس العناوين كـ $PUBLIC_IP و $INTERNAL_IP على التوالي (أو، على EKS، حل نفس أسماء مضيفات *.elb.amazonaws.com). بمجرد حل DNS، ينهي cert-manager طلبات ACME المعلقة من المرحلة 3.5 في غضون دقيقة. أعد تشغيل kubectl get certificates -n agenteye حتى تظهر كلا ingest-tls و dashboard-tls Ready: True.

4.3 الوصول إلى نقطة نهاية الالتقاط

تفرض نقطة نهاية الالتقاط العام TLS متبادل، لذا يجب أن يقدم كل طلب (بما في ذلك /health) شهادة عميل. تصدر شهادة عميل أولى في المرحلة 5؛ إذا كان لديك واحدة بالفعل، تحقق من قابلية الوصول الآن:
المتوقع: {"status":"ok"}. لا يلزم -k - شهادة الخادم تربط إلى CA عام لـ INGEST_DOMAIN، لذا فهي صحيحة مقابل مخزن الثقة بالنظام. الوصول إلى نقطة نهاية الالتقاط برمز INGEST_DOMAIN (الذي يطابق الشهادة الصادرة)، وليس برمز LoadBalancer الخام IP / اسم المضيف. يتم توفير نقطة نهاية لوحة المعلومات على DASHBOARD_DOMAIN مع شهادة عام موثوق بها وليست خلف mTLS، لذا لا يلزم -k ولا شهادة عميل:
الوصول إلى لوحة المعلومات برمز - اسم المضيف، وليس عنوان LoadBalancer الخام - الشهادة مرتبطة بـ DASHBOARD_DOMAIN، لذا فإن العنوان الخام يوضح عدم تطابق اسم الشهادة. إذا فشل: إذا كان curl معلقاً، تحقق من أن LoadBalancer قابل للوصول من جهازك (VPN وعناصر الأمان وقواعد الجدار). يعني خطأ مصادقة certificate required على اسم المضيف الالتقاط عدم تقديم شهادة عميل؛ أكمل المرحلة 5 أولاً. يعني خطأ التحقق من TLS على اسم المضيف الالتقاط أن شهادة الخادم لم تنته من الإصدار حتى الآن؛ عد إلى المرحلة 3.5 وحل المشكلة هناك.

المرحلة 5 - إصدار شهادات عملاء mTLS (~10 دقائق لكل مجموعة)

يتحقق المجمعون مع عاملين: شهادة عميل (طبقة النقل، يثبت أن الطلب يأتي من مجموعة مصرح بها) ومفتاح API (طبقة التطبيق، يثبت أن الطلب من مجمع لديه إذن events:add). مفتاح مسرب غير مفيد بدون الشهادة؛ شهادة مسروقة غير مفيدة بدون مفتاح صحيح.

5.1 إصدار شهادة

تحتاج كل مجموعة تشغل مجمعات إلى شهادة عميل خاصة بها. من دليل البيانات الوصفية:
استبدل <cluster-name> بمعرّف ذي مغزى (على سبيل المثال us-east-1-prod أو staging). اختبره: يطبع الكتاب النصي ==> Done! ويسرد ملفات الإخراج.
المتوقع: Ready: True. ملفات الإخراج في issued/<cluster-name>/:
الملفالغرض
client.crtشهادة العميل (صحة 90 يوماً)
client.keyمفتاح خاص العميل
ca.crtشهادة CA للتحقق من الخادم
collector-mtls-secret.yamlسر Kubernetes جاهز للتطبيق لمجموعة المجمع

5.1b توصيل بديل: AWS Secrets Manager

إذا كان المستهلك للشهادة Kubernetes Pod الذي يحتاج client.crt و client.key على القرص - الحالة النموذجية عند تشغيل agenteye-collector كـ sidecar في pod التطبيق الخاص بك - ادفع مجموعة الشهادات إلى AWS Secrets Manager. ثم يمكن لـ pod التطبيق تثبيته عبر Secrets Store CSI Driver مع IRSA، وتجديد الشهادة بالكامل بدون أيدي.
عند إعادة التشغيل (التجديد)، يستدعي الكتاب النصي PutSecretValue على نفس السر، لذا يبقى ARN والاسم مستقراً. يختار CSI Driver النسخة الجديدة في استطلاع دورانها التالي ويعيد كتابة الملفات داخل الـ pod. المتطلبات الأساسية:
  • aws CLI v2 موثق في حسابك AWS.
  • jq مثبت.
  • مجموعة متغير البيئة AWS_REGION.
  • أذونات IAM على هوية المتصل (نطاق Resource إلى arn:aws:secretsmanager:<region>:<account>:secret:agenteye/mtls-client/*):
    • secretsmanager:CreateSecret
    • secretsmanager:DescribeSecret
    • secretsmanager:PutSecretValue
    • secretsmanager:TagResource
ما يفعله الكتاب النصي في هذا الوضع:
الخطوةالإجراء
1يصدر / يعيد استخراج الشهادة عبر cert-manager (نفس الوضع الافتراضي).
2استدعاء DescribeSecret على agenteye/mtls-client/<cluster-name> لقرار الإنشاء مقابل التحديث.
3عند أول تشغيل: CreateSecret بحمول JSON بثلاثة مفاتيح (client.crt و client.key و ca.crt)، وسم AgentEyeCluster=<cluster-name>. عند عمليات تشغيل لاحقة: PutSecretValue لنشر نسخة جديدة؛ الوسم محدث عبر TagResource.
4حذف issued/<cluster-name>/ فقط بعد تحميل ناجح. عند أي فشل، يتم الاحتفاظ بالمجلد حتى تحاول مجدداً.
إذا تم جدولة السر للحذف، يفشل الكتاب النصي برسالة واضحة يخبرك بتشغيل aws secretsmanager restore-secret --secret-id agenteye/mtls-client/<cluster-name> قبل إعادة المحاولة. للأسلاك الـ pod الكاملة (SecretProviderClass و IRSA و سلوك الدوران و استكشاف الأخطاء) انظر enterprise-docs/single-pod-deployment.md.

5.2 تحقق من عمل الشهادة

اختبر الشهادة الصادرة ضد ingress mTLS:
المتوقع: {"status":"ok"} إذا فشل:
خطأالسببالإصلاح
certificate requiredلا يتم تقديم الشهادةتحقق من مسارات الملفات في أم