دليل عملي

هاربور ريجيستري على خادم خاص VPS: الدليل الشامل

النشر8 دقائق للقراءةعدد الخطوات: 7

منذ أن هزّت CVE-2026-21589 سلسلة توريد Atlassian، باتت فرق DevOps تبحث عن استعادة السيطرة الكاملة على كل artifact يمر عبر pipeline الإنتاج. يفرض Docker Hub حد 100 سحب كل 6 ساعات على الحسابات المجانية، ويربط GHCR صورك بسياسة الاحتفاظ الخاصة بـ GitHub، ولا يوقّع أيٌّ منهما الصور أو يفحصها تلقائيًا. Harbor، سجل الـ CNCF مفتوح المصدر، يحل المشاكل الثلاث بنشر واحد: فحص الثغرات Trivy المدمج، توقيع Cosign، RBAC دقيق وسجلات تدقيق كاملة. يرافقك هذا الدليل من تثبيت Docker Compose حتى سياسات القبول في الإنتاج، على خادم VPS بـ 4 vCPU و8 جيجابايت RAM.

المحتويات· لماذا سجل Docker خاص مع Harbor1/9
  1. 01لماذا سجل Docker خاص مع Harbor
  2. 02الفوائد الرئيسية لـ Harbor
  3. 03المتطلبات الأساسية بالأرقام
  4. 04تثبيت Harbor v2‎.15 مع Docker Compose
  5. 05الإعداد: المشاريع والمستخدمون وOIDC (ZITADEL)
  6. 06فحص الصور مع Trivy
  7. 07نصيحة أمنية: سياسات قبول Kubernetes
  8. 08استكشاف الأخطاء: 5 أخطاء حقيقية وأسبابها
  9. 09Harbor مقابل Docker Hub مقابل GHCR مقابل Gitea Registry

لماذا سجل 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

  1. تنزيل المثبّت غير المتصل

    اتصل بخادم 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
  2. إعداد شهادات 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‎.

  3. ‏ضبط ‎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
  4. تشغيل المثبّت

    يتيح Harbor مكوّنات اختيارية. شغّل Trivy (الفاحص) وNotary (التوقيعات):

    ‎./install‎.sh --with-trivy --with-notary

    يُولّد المثبّت ملف ‎docker-compose‎.yml ويشغّل جميع الحاويات. تحقق أنها جميعًا healthy:

    docker compose ps
    # الحالة المتوقعة لكل خدمة: healthy
  5. أول تسجيل دخول وتغيير كلمة المرور

    افتح https://registry‎.example‎.com في متصفحك. سجّل دخولك بـ admin وكلمة المرور من ‎harbor‎.yml. انتقل إلى Administration → Users → admin وغيّر كلمة المرور فورًا.

    من محطتك أو runner الـ CI:

    docker login registry‎.example‎.com
    # أدخل بيانات admin أو حساب الخدمة
  6. إنشاء مشروع ودفع أول صورة

    في واجهة 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
  7. تفعيل التجديد التلقائي لـ 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-hostedDocker HubGHCRGitea Registry
الاستضافةخادمك (بيانات في الاتحاد الأوروبي)خوادم Docker Inc.‏ (USA)خوادم GitHub/Microsoft (USA/EU اختياري)خادمك
فحص الثغراتTrivy مدمج، تلقائي عند الدفعDocker Scout (مدفوع)لا يوجد أصليلا يوجد أصلي
توقيع الصورCosign + Notary v2DCT (متوقف)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/ProVPS مشترك مع Gitea

انشر سجل Harbor على خادم ServOrbit VPS

خادم VPS بـ 4 vCPU و8 جيجابايت RAM يكفي لتشغيل Harbor في الإنتاج لفريق من 10 مطورين. يُسلّم ServOrbit الخادم في أقل من 90 ثانية مع وصول root عبر SSH ونسخ احتياطية تلقائية.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة