Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як налаштувати приватний Docker registry (Harbor)?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Harbor** це CNCF graduated, open-source приватний Docker registry. Обгортає OCI Distribution spec з екстрами: vulnerability scanning, RBAC, реплікація, image signing, multi-tenant projects. ```bash # Швидкий setup wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-online-installer-v2.11.0.tgz tar xzf harbor-online-installer-v2.11.0.tgz && cd harbor cp harbor.yml.tmpl harbor.yml # Редагуй hostname, password, серти sudo ./install.sh --with-trivy ``` **Головне:** Harbor це прод-відповідь, коли Docker Hub недостатньо. Self-hosted, повний RBAC, інтегрований CVE scanning, реплікація на інші registry, Helm chart support. Альтернатива ECR/GCR/GHCR для on-prem або air-gapped.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Harbor** це домінантний open-source приватний container-registry. Обгортає базовий OCI Distribution spec (той самий протокол, що Docker Hub) з прод-фічами, що on-prem і enterprise команди реально потребують. ## Теорія ### TL;DR - **Open-source registry**, побудований на CNCF distribution. CNCF graduated з 2020. - **Понад звичайний registry:** RBAC, multi-tenant projects, vulnerability scanning (Trivy/Clair), image signing (Notary, Cosign), replication до інших registry, retention-policies, garbage collection, OIDC/LDAP auth. - **Deploy через Compose** для single-node або **Helm chart** для HA на Kubernetes. - Використовується як on-prem альтернатива AWS ECR / Google GCR / Docker Hub, коли air-gapped, multi-region або compliance-driven. - Говорить звичайним `docker pull/push`, твій існуючий CI/CD не змінюється. ### Архітектура ``` +----------+ +----------+ +-----------+ | nginx / | | core | | registry | | portal | -> | (API) | -> | (CNCF | | | | + jobsvc | | distrib.) | +----------+ +----------+ +-----------+ | | | v v v +-----+ +--------+ +-------+ | UI | | trivy | | redis | +-----+ | scanner| +-------+ +--------+ | v +-----------+ | postgres | +-----------+ ``` Дюжина container, що крутяться разом (web UI, API, DB, Redis, registry, scanner тощо). Compose-installer піднімає усе. ### Single-node install (Compose) ```bash # Завантаження wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-online-installer-v2.11.0.tgz tar xzf harbor-online-installer-v2.11.0.tgz cd harbor # Налаштування cp harbor.yml.tmpl harbor.yml vi harbor.yml # hostname: harbor.example.com # https.port: 443 # https.certificate: /etc/cert/fullchain.pem # https.private_key: /etc/cert/privkey.pem # harbor_admin_password: <сильний-pw> # database.password: <db-pw> # Install з Trivy scanner sudo ./install.sh --with-trivy # Піднімає ~10 container через docker compose ``` Відкрий `https://harbor.example.com` → log in як `admin` з паролем з `harbor.yml`. ### Push/pull ```bash # Log in docker login harbor.example.com -u admin -p <password> # Tag і push docker tag myapp:1.0 harbor.example.com/myproject/myapp:1.0 docker push harbor.example.com/myproject/myapp:1.0 # Pull з іншого host docker pull harbor.example.com/myproject/myapp:1.0 ``` Harbor говорить тим самим протоколом, що Docker Hub. CI/CD-скрипти лише міняють hostname registry. ### Projects і RBAC Harbor групує image у **projects**. Кожен project це namespace зі своїм: - Видимістю: private (auth потрібна) або public (без auth для pull). - Member-ролями: Project Admin, Maintainer, Developer, Guest. - Vulnerability scan policies. - Retention policies. - Replication rules. Типовий multi-tenant setup: один Harbor-інстанс, один project на команду. Project Admins керують image своєї команди; cross-project доступ контролюється. ### Vulnerability scanning З `--with-trivy` Harbor включає вбудований scanner: - Scan на push (налаштовується per project). - Заплановані re-scan усіх image. - CVE-результати видно у UI; gate pull за severity («prevent vulnerable images»). - Tag, marked unsafe, блокують деплої через admission policy. ```yaml # У project-налаштуваннях Vulnerability Scanning: enabled Prevent vulnerable images: HIGH and above Auto-scan on push: true ``` ### Replication Harbor може дзеркалити image **до і з** інших registry: - Pull-through cache: налаштуй Docker Hub як remote, Harbor кешує pull. Прискорює завантаження, переживає Docker Hub rate-limits. - Push до іншого Harbor: multi-region setup'и реплікують прод-image у Harbor кожного регіону. - Push до Docker Hub / ECR / GCR: розподіляй по кількох registry з одного source. ```yaml # Replication rule Name: replicate-to-eu Mode: pull / push / event-based Filter: project=prod, tag=v* Destination: harbor-eu.example.com Trigger: scheduled / manual / on-push ``` ### Image signing Два варіанти: - **Notary v1** (вбудовано, DCT-сумісно) — підписує image-manifest. - **Cosign / Sigstore** (сучасно) — підписує OCI-артефакти. Все частіше дефолт. Enforce «лише підписані image деплояться» через admission control (Kyverno, sigstore-policy-controller). ### Retention-policies Без retention кожен PR-білд накопичується назавжди. Harbor дозволяє ставити правила: ``` Retain: останні 10 push-tag Exclude: tag, що матчать v* (тримай усі release-tag) Apply to: project=staging ``` Garbage collection крутиться у scheduled-job; звільнене місце reclaim'ається. ### HA install (Helm) Для проду крути Harbor на Kubernetes: ```bash helm repo add harbor https://helm.goharbor.io helm upgrade --install harbor harbor/harbor \ --set expose.type=ingress \ --set externalURL=https://harbor.example.com \ --set persistence.enabled=true \ --set persistence.persistentVolumeClaim.registry.size=500Gi ``` Реплікує сервіси між node; персистентні volume для registry-storage і Postgres. Переживає node-failure, якщо backed by network storage. ### Типові помилки **Забути налаштувати TLS** Дефолти `harbor.yml` припускають HTTP для тестування. Прод вимагає HTTPS — Docker daemon відмовляє push на untrusted HTTP-registry за замовчуванням. Згенеруй серти (Let's Encrypt, internal CA) і налаштуй `https:` блок у `harbor.yml`. **Запуск на тому самому host, що критичні навантаження** Registry, що хостить твої прод-image, сам критична інфраструктура. Якщо крашиться, не можеш деплоїти. Крути на dedicated-залізі або своєму K8s-кластері. **Без retention-policy → диск переповнюється** ``` 2 TB CI-білдів накопичено. Backup-вікно: 12 годин. Recovery-вікно: нервово. ``` Став retention-policies з першого дня. Garbage collection scheduled щотижня мінімум. **Відсутність storage-backup** Harbor Postgres має метадані; filesystem registry має реальні blob. Обидва потребують backup. Втрата метаданих = image osirотіли. Втрата blob = метадані вказують у нікуди. **Деплой без scanning** Якщо маєш Harbor з Trivy і не вмикаєш scanning, ти платиш за фічу і не використовуєш. Мінімум: scan-on-push для усіх project. ### Реальне застосування - **On-prem enterprise:** фінанси, healthcare, telecom — Harbor дефолт для self-hosted регульованих середовищ. - **Multi-cloud:** Harbor як центральний registry, з replication до AWS ECR / GCR для region-local pull. - **Air-gapped:** classified мережі, де public-інтернет заборонено; Harbor + Trivy DB-update через offline sync. - **Open-source проекти:** деякі тримають свій Harbor для community-built image. - **Pull-through cache:** Harbor кешував Docker Hub для тисяч CI-runs без удару у rate-limit. ### Питання для поглиблення **Q:** Яка різниця між Harbor і голим `registry:2` image? **A:** `registry:2` це базовий CNCF distribution-server — pull/push, усе. Harbor обгортає auth, RBAC, UI, scanning, signing, replication. Для toy-use або швидкого local-testing бери `registry:2`. Для реального проду Harbor. **Q:** Чи Harbor може scan'ити image з external-registry? **A:** Лише image, збережені у Harbor. Щоб scan'ити external, налаштуй replication, щоб затягувати їх у Harbor. **Q:** Як Harbor обробляє storage? **A:** Filesystem (дефолт), S3-сумісний (AWS S3, Minio, GCS, Azure Blob) або Swift. Налаштовується через storage-секцію `harbor.yml`. **Q:** Чи можу крутити Harbor у HA? **A:** Так — Helm chart з кількома replica, external Postgres (HA), external Redis (HA), shared storage-backend (S3 або NFS). Single-node Compose-install для малих/staging; прод = HA. **Q:** (Senior) Як спроектувати Harbor для глобального multi-region деплою? **A:** Центральний «hub» Harbor, куди CI пушить; «spoke» Harbor у кожному регіоні для low-latency pull. Hub-to-spoke replication on event (push тригерить replica-push за хвилини). Spoke-storage використовує cloud-region-local object-store (S3, GCS). Hub backed up offsite. Прод K8s у кожному регіоні pull'ить зі свого spoke; якщо spoke down, fallback на hub. Audit-логи централізовано через syslog. Дизайн: image авторитетно у hub, розподілено для performance, survive'абельне для resilience. ## Приклади ### Compose-based small install ```bash # Після того, як install.sh завершується, маєш: $ docker compose ps NAME IMAGE STATUS harbor-core goharbor/harbor-core running harbor-db goharbor/harbor-db running harbor-jobservice goharbor/harbor-jobservice running harbor-portal goharbor/harbor-portal running harbor-registry goharbor/registry-photon running harbor-trivy-adapter goharbor/trivy-adapter running nginx goharbor/nginx-photon running redis goharbor/redis-photon running # ... ~10 сервісів $ curl -k https://harbor.example.com/api/v2.0/health {"status":"healthy","components":[...]} ``` ### CI-інтеграція ```yaml # GitHub Actions - uses: docker/login-action@v3 with: registry: harbor.example.com username: ci-robot password: ${{ secrets.HARBOR_TOKEN }} - uses: docker/build-push-action@v5 with: push: true tags: harbor.example.com/myproject/api:${{ github.sha }} ``` Robot-акаунти Harbor (long-lived API-токени) це стандартний CI auth-патерн. ### Replication: Docker Hub pull-through cache ``` Harbor settings → Registries Add registry: type=docker-hub, url=https://hub.docker.com Project "library" → Replications Pull-based replication, source=docker-hub, filter=*nginx* ``` Тепер `docker pull harbor.example.com/library/nginx:1.27` реально pull'ить з Docker Hub (якщо не закешовано), потім обслуговує з Harbor на наступних pull. Rate-limits Docker Hub per-IP, твій Harbor це один IP, значно важче вдарити у ліміти.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.