لماذا سجل Docker خاص مع Harbor
Docker Hub وGHCR خدمتان عامتان مريحتان، لكنهما تُشكّلان ثلاث مشاكل حقيقية حين تنمو مؤسستك أو تحتاج إلى الامتثال لـ NIS2 (المادة 21 § 2 و – أمن سلسلة التوريد) أو GDPR (بيانات البنية التحتية خارج الاتحاد الأوروبي). يعالج Harbor كل نقطة مباشرةً.
الفوائد الرئيسية لـ Harbor
- فحص Trivy المدمج — كل push يُطلق تحليل CVE؛ سياسات القبول تحجب نشر الصور التي تتجاوز عتبة الخطورة المحددة.
- توقيع Cosign / Notary — سلسلة الثقة من بناء CI حتى مجموعة Kubernetes؛ تمر فقط الصور الموقّعة بمفتاحك.
- RBAC متعدد المشاريع — عزل لكل فريق أو بيئة (dev/staging/prod) أو عميل، مع أدوار Guest وDeveloper وMaintainer وProjectAdmin.
- نسخ متزامن بين السجلات — تزامن مع خادم VPS ثانٍ أو AWS ECR أو Docker Hub للتوزيع.
- سجلات تدقيق غير قابلة للتغيير — كل pull وpush وحذف وتسجيل دخول مسجّل مع IP المصدر؛ امتثال لـ NIS2 المادة 21 § 2 د.
- لا حدود للسحب — تسحب runners الـ CI صورًا بقدر ما تحتاج دون تأخير أو حصص.
- OIDC أصلي — اربط Harbor بـ ZITADEL أو أي مزود OpenID Connect؛ صفر حسابات محلية للإدارة.
المتطلبات الأساسية بالأرقام
يعمل Harbor بكفاءة على خادم VPS من المواصفات التالية:
- المعالج: 4 vCPU (الحد الأدنى 2 vCPU، لكن Trivy يستهلك 1–2 نواة أثناء الفحص)
- الذاكرة: 8 جيجابايت (الحد الأدنى 4 جيجابايت؛ خصص 2 لـ PostgreSQL، 1 لـ Redis، 2 لـ Harbor core، 1 هامش أمان)
- القرص: 100 جيجابايت SSD (طبقات Docker تتراكم بسرعة؛ خصص 40 للسجل، 20 لسجلات Trivy، 20 للنظام)
- نظام التشغيل: Debian 12 أو Ubuntu 22.04 LTS
- Docker: ≥ 24.0، Docker Compose: ≥ 2.20
- DNS: نطاق فرعي يشير إلى خادمك (registry.example.com) يعمل بالفعل
- TLS: شهادة صالحة — Let's Encrypt عبر Certbot أو Traefik ACME
تثبيت Harbor v2.15 مع Docker Compose
تنزيل المثبّت غير المتصل
اتصل بخادم VPS عبر SSH. احضر حزمة Harbor v2.15.4 offline (الأكثر استقرارًا في 2026-10-13) من GitHub:
export HARBOR_VERSION=v2.15.4 wget https://github.com/goharbor/harbor/releases/download/${HARBOR_VERSION}/harbor-offline-installer-${HARBOR_VERSION}.tgz wget https://github.com/goharbor/harbor/releases/download/${HARBOR_VERSION}/harbor-offline-installer-${HARBOR_VERSION}.tgz.asc # التحقق من توقيع GPG gpg --keyserver keyserver.ubuntu.com --recv-keys 7722D168DAEC457894C2988818B80B4B2D318C8A gpg --verify harbor-offline-installer-${HARBOR_VERSION}.tgz.asc tar xvf harbor-offline-installer-${HARBOR_VERSION}.tgz cd harborإعداد شهادات TLS
يشترط Harbor وجود TLS. باستخدام Certbot:
apt install -y certbot certbot certonly --standalone -d registry.example.com # الشهادات في /etc/letsencrypt/live/registry.example.com/ mkdir -p /data/cert cp /etc/letsencrypt/live/registry.example.com/fullchain.pem /data/cert/registry.example.com.crt cp /etc/letsencrypt/live/registry.example.com/privkey.pem /data/cert/registry.example.com.keyإذا كنت تستخدم Traefik كـ reverse proxy (راجع مقال Traefik v3)، فوّض إنهاء TLS إلى Traefik وضبط Harbor على HTTP داخليًا على المنفذ 8080.
ضبط harbor.yml
انسخ النموذج وعدّل القيم الأساسية:
cp harbor.yml.tmpl harbor.ymlعدّل
harbor.yml:hostname: registry.example.com https: port: 443 certificate: /data/cert/registry.example.com.crt private_key: /data/cert/registry.example.com.key harbor_admin_password: غيّرهذاالمرور! database: password: غيّرهذاأيضًا! data_volume: /data trivy: ignore_unfixed: false skip_update: false offline_scan: false security_check: vuln insecure: falseتشغيل المثبّت
يتيح Harbor مكوّنات اختيارية. شغّل Trivy (الفاحص) وNotary (التوقيعات):
./install.sh --with-trivy --with-notaryيُولّد المثبّت ملف
docker-compose.ymlويشغّل جميع الحاويات. تحقق أنها جميعًاhealthy:docker compose ps # الحالة المتوقعة لكل خدمة: healthyأول تسجيل دخول وتغيير كلمة المرور
افتح
https://registry.example.comفي متصفحك. سجّل دخولك بـadminوكلمة المرور من harbor.yml. انتقل إلى Administration → Users → admin وغيّر كلمة المرور فورًا.من محطتك أو runner الـ CI:
docker login registry.example.com # أدخل بيانات admin أو حساب الخدمةإنشاء مشروع ودفع أول صورة
في واجهة Harbor، أنشئ مشروع
my-project(خاص). ثم من آلة البناء:docker pull nginx:alpine docker tag nginx:alpine registry.example.com/my-project/nginx:1.27-alpine docker push registry.example.com/my-project/nginx:1.27-alpine # في Harbor → my-project → Repositories: تظهر الصورة مع حالة Trivyتفعيل التجديد التلقائي لـ TLS
أنشئ hook ما بعد التجديد في Certbot لإعادة تحميل Harbor:
cat > /etc/letsencrypt/renewal-hooks/post/harbor-reload.sh << 'EOF' #!/bin/bash cp /etc/letsencrypt/live/registry.example.com/fullchain.pem /data/cert/registry.example.com.crt cp /etc/letsencrypt/live/registry.example.com/privkey.pem /data/cert/registry.example.com.key cd /opt/harbor && docker compose restart proxy EOF chmod +x /etc/letsencrypt/renewal-hooks/post/harbor-reload.sh
الإعداد: المشاريع والمستخدمون وOIDC (ZITADEL)
المشاريع وRBAC
يُنظّم Harbor الصور حسب المشاريع. كل مشروع يمكن أن يكون عامًا أو خاصًا، بسياسة احتفاظ مستقلة. أنشئ مشروعًا لكل فريق أو بيئة: frontend وbackend وinfra. عيّن أعضاء بأدوار دقيقة:
- Guest: سحب فقط
- Developer: دفع + سحب
- Maintainer: إدارة العلامات والـ webhooks وسياسات الاحتفاظ
- ProjectAdmin: إدارة الأعضاء
تكامل OIDC مع ZITADEL
إن كنت نشرت ZITADEL بالفعل (راجع المقال المخصص)، فربط Harbor يتم ببضع نقرات. في ZITADEL، أنشئ تطبيق harbor من نوع *Web*، دوّن Client ID وClient Secret. في Harbor → Administration → Configuration → Authentication:
- Auth Mode: OIDC
- OIDC Provider Name: ZITADEL
- OIDC Endpoint: https://sso.example.com
- OIDC Client ID / Secret: من ZITADEL
- OIDC Scope: openid profile email groups
- فعّل Verify Certificate
عند أول تسجيل دخول OIDC، يُنشئ Harbor حساب المستخدم تلقائيًا. ثم أوقف إنشاء الحسابات المحلية (Administration → Configuration → Allow Self-Registration → Off).
فحص الصور مع Trivy
يُدمج Harbor Trivy مباشرة في pipeline الدفع. فور دفع صورة، يُطلق Harbor فحصًا غير متزامن يستعلم قاعدة CVE الخاصة بـ Trivy (تُحدَّث يوميًا). تظهر النتيجة في الواجهة: عدد الثغرات حسب الخطورة (CRITICAL وHIGH وMEDIUM وLOW وUNKNOWN).
تفعيل الفحص التلقائي عند الدفع: في Harbor → Administration → Configuration → Vulnerability → فعّل *Automatically scan images on push*.
عرض تقرير: افتح مستودعًا، انقر على tag → تبويب *Vulnerabilities*. كل CVE تُدرج الحزمة المتأثرة والإصدار المُصلَح ورابطًا للـ NVD.
إصدار Trivy في Harbor v2.15: يتضمن Harbor v2.15.4 محوّل trivy-adapter متوافقًا مع Trivy v0.55.x، يدعم قواعد بيانات نظام التشغيل (Alpine وDebian وRHEL وUbuntu)، ومديري الحزم التطبيقية (npm وpip وcargo وgo.mod) وملفات القفل.
سياسات الامتثال لكل مشروع: في Harbor → *مشروعك* → Policy → *Deployment Security* → اختر مستوى الخطورة الذي يحجب السحب. مثلًا: حجب أي سحب لصورة بها CVE CRITICAL غير مُصلَحة.
نصيحة أمنية: سياسات قبول Kubernetes
اجمع Harbor مع متحكم القبول Cosign (عبر Kyverno أو Connaisseur) لمنع أي صورة غير موقّعة أو تحتوي CVE CRITICAL من دخول مجموعتك. في pipeline الـ CI:
# توقيع الصورة بـ Cosign بعد البناء
cosign sign --key cosign.key registry.example.com/my-project/nginx:1.27-alpine
# التحقق في CI قبل النشر
cosign verify --key cosign.pub registry.example.com/my-project/nginx:1.27-alpineاضبط سياسة Kyverno تشترط توقيع Harbor: أي pod صورته غير موقّعة بمفتاحك تُرفض عند القبول. هذا يُغلق الثغرة الأكثر استغلالًا في هجمات سلسلة التوريد عقب CVE-2026-21589.
استكشاف الأخطاء: 5 أخطاء حقيقية وأسبابها
1. Error response from daemon: Get https://registry.example.com/v2/: x509: certificate signed by unknown authority
السبب: شهادة Let's Encrypt لم تنتشر بعد أو تستخدم شهادة موقّعة ذاتيًا.
الحل: على كل عقدة Docker عميلة، انسخ fullchain.pem إلى /etc/docker/certs.d/registry.example.com/ca.crt ثم systemctl restart docker.
2. harbor-core يُعيد التشغيل في حلقة مع Error 1045 (28000): Access denied for user 'root'@'localhost'
السبب: يحتوي volume PostgreSQL على بيانات من تثبيت سابق بكلمة مرور مختلفة.
الحل: docker compose down -v (⚠️ يحذف البيانات)، عدّل كلمة المرور في harbor.yml، ثم أعد تشغيل ./prepare && docker compose up -d.
3. فحص Trivy عالق على Fetching vulnerability DB لأكثر من 10 دقائق
السبب: الخادم لا يصل إلى ghcr.io (جدار حماية خارجي مقيّد) لتنزيل قاعدة Trivy.
الحل: اسمح بالخروج HTTPS إلى ghcr.io وpkg.dev، أو فعّل offline_scan: true بعد تحميل القاعدة مسبقًا بـ trivy image --download-db-only.
4. unauthorized: unauthorized to access repository في CI رغم نجاح docker login
السبب: حساب الخدمة لا يملك دور Developer على المشروع المستهدف.
الحل: في Harbor → *مشروعك* → Members → أضف حساب الـ robot أو المستخدم بدور Developer أو أعلى.
5. واجهة Harbor لا تستجيب بعد تجديد شهادة Let's Encrypt
السبب: حاوية proxy (nginx) لا تزال تقدم الشهادة القديمة المحمّلة في الذاكرة.
الحل: docker compose restart proxy من مجلد تثبيت Harbor. من الأفضل أتمتة ذلك عبر hook ما بعد التجديد المذكور في الخطوة السابعة.
Harbor مقابل Docker Hub مقابل GHCR مقابل Gitea Registry
مرّر الجدول أفقيًا
| المعيار | Harbor self-hosted | Docker Hub | GHCR | Gitea Registry |
|---|---|---|---|---|
| الاستضافة | خادمك (بيانات في الاتحاد الأوروبي) | خوادم Docker Inc. (USA) | خوادم GitHub/Microsoft (USA/EU اختياري) | خادمك |
| فحص الثغرات | Trivy مدمج، تلقائي عند الدفع | Docker Scout (مدفوع) | لا يوجد أصلي | لا يوجد أصلي |
| توقيع الصور | Cosign + Notary v2 | DCT (متوقف) | Cosign خارجي | لا يوجد أصلي |
| RBAC دقيق | 5 أدوار لكل مشروع | أدوار تنظيم محدودة | أدوار GitHub (خشنة) | أدوار Gitea أساسية |
| حد السحب | لا يوجد | 100/6 ساعات (مجاني)، 5000/يوم (Pro) | مرتبط بحدود GitHub | لا يوجد |
| OIDC/SSO أصلي | نعم (LDAP، OIDC، SAML) | لا (SSO مؤسسي مدفوع) | SSO GitHub فقط | OIDC جزئي |
| سجلات تدقيق كاملة | نعم (IP، مستخدم، إجراء، tag) | محدود | جزئي عبر تدقيق GitHub | محدود |
| امتثال NIS2/GDPR | كامل (بيانات on-premise) | تعاقدي فقط | DPA Microsoft متاح | كامل (on-premise) |
| التكلفة | VPS (~15–30 يورو/شهر) | مجاني / Pro ~5$/شهر | مضمّن في GitHub Free/Pro | VPS مشترك مع Gitea |