MAATRIX / Блог / Harbor на Ubuntu 24.04: пошаговая установка

Harbor на Ubuntu 24.04: пошаговая установка

MAATRIX

Если образы вашей команды лежат в Docker Hub на бесплатном тарифе, вы уже упирались в лимит pull-запросов или нервничали из-за приватности кода в чужом облаке. Harbor — open source registry уровня CNCF: свои проекты с ролями доступа, сканирование образов на уязвимости через Trivy, репликация между инстансами и веб-интерфейс, который не стыдно показать команде. Ниже — рабочая установка на Ubuntu 24.04 через официальный Docker Compose-инсталлятор, с SSL и первыми шагами настройки после запуска.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Требования и подготовка сервера

Harbor — это не один контейнер, а связка из десятка сервисов: core, portal, registry, database (PostgreSQL), Redis, job service, Trivy-адаптер и nginx как точка входа. Для комфортной тестовой установки закладывайте от 2 vCPU и 4 GB RAM, для рабочей нагрузки с несколькими проектами и активным CI — от 4 vCPU и 8 GB RAM. Это ориентир, а не точная цифра: реальное потребление зависит от количества образов, частоты сканирования и параллельных push/pull. Диска берите с запасом — образы и слои копятся быстро, от 60 GB на старте разумно.

Что нужно подготовить заранее:

  • Домен или поддомен, указывающий A-записью на IP сервера (например, registry.example.com). Harbor работает и по IP, но тогда придётся городить самоподписанный сертификат без нормального доверия у клиентов — с доменом жизнь проще.
  • Открытые порты 80 и 443 — для HTTP/HTTPS и валидации сертификата, если будете использовать Let's Encrypt.
  • Docker Engine и Docker Compose plugin — сам Harbor разворачивается поверх них, установка описана в следующем разделе.
  • Обновлённая система:
sudo apt update && sudo apt -y upgrade

Если вы поднимаете сервер с нуля именно под эту задачу, разумно сразу закрыть лишние порты файрволом — вернёмся к этому в разделе про RBAC и безопасность.

Установка Docker и Docker Compose

Harbor официально ставится через docker compose, поэтому сначала нужен рабочий Docker. Если у вас уже есть Docker Engine на сервере — пропускайте раздел, только проверьте, что установлен именно compose plugin, а не старый отдельный docker-compose версии 1.x (Harbor 2.x требует Compose v2).

sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Проверка:

docker --version
docker compose version

Если предпочитаете более развёрнутое пошаговое руководство по установке Docker с нуля на Ubuntu 24.04, есть отдельная статья — ubuntu-24-04-ustanovka-docker-s-nulya.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Загрузка и настройка Harbor (harbor.yml)

Скачайте офлайн-инсталлятор с официальной страницы релизов проекта на GitHub (goharbor/harbor) — версии выходят регулярно, берите актуальную стабильную ветку 2.x на момент установки, а не жёстко зашитый номер из старой статьи:

cd /opt
sudo wget https://github.com/goharbor/harbor/releases/download/vX.Y.Z/harbor-offline-installer-vX.Y.Z.tgz
sudo tar xzvf harbor-offline-installer-vX.Y.Z.tgz
cd harbor

Замените vX.Y.Z на реальную версию из релизов. Офлайн-инсталлятор удобнее онлайн-варианта тем, что образы уже включены в архив и не тянутся отдельно при первом запуске — меньше шансов упереться в таймаут на слабом канале.

Скопируйте шаблон конфигурации и откройте его на редактирование:

sudo cp harbor.yml.tmpl harbor.yml
sudo nano harbor.yml

Ключевые параметры, которые нужно поправить:

hostname: registry.example.com

https:
  port: 443
  certificate: /opt/harbor/cert/registry.example.com.crt
  private_key: /opt/harbor/cert/registry.example.com.key

harbor_admin_password: ЗамениНаСложныйПароль

data_volume: /data/harbor

log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor

hostname должен совпадать с доменом в сертификате — иначе клиенты Docker будут ругаться на несовпадение имени. data_volume — каталог, куда лягут образы, база и логи; вынесите его на отдельный диск или раздел, если такой есть, чтобы рост реестра не забил корневой раздел системы.

SSL-сертификат: self-signed или Let's Encrypt

Harbor можно поднять без HTTPS, но тогда docker login и docker push откажутся работать без дополнительной настройки клиентов как с «небезопасным» registry — это создаёт проблемы при каждом новом сервере, который будет ходить в ваш Harbor. Практичнее сразу настроить нормальный сертификат.

Вариант для теста — самоподписанный сертификат:

sudo mkdir -p /opt/harbor/cert
sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 \
  -keyout /opt/harbor/cert/registry.example.com.key \
  -out /opt/harbor/cert/registry.example.com.crt \
  -subj "/CN=registry.example.com"

На каждом клиенте, который будет работать с этим Harbor, потребуется либо добавить корневой сертификат в доверенные, либо явно прописать registry как insecure в /etc/docker/daemon.json:

{
  "insecure-registries": ["registry.example.com"]
}

После правки — sudo systemctl restart docker на клиенте.

Вариант для прода — Let's Encrypt. Получите сертификат через certbot в standalone-режиме (временно останавливая всё, что слушает 80-й порт) или через DNS-плагин, если домен на Cloudflare/другом провайдере с поддержкой ACME DNS-01. Подробный разбор нюансов и типичных ошибок с Let's Encrypt — в статье let-s-encrypt-ssl-na-servere-chastye-oshibki-i-resheniya. Полученные fullchain.pem и privkey.pem укажите в harbor.yml вместо самоподписанных файлов — только не забудьте настроить автопродление и перезапуск Harbor после обновления сертификата (простой cron-хук с docker compose restart nginx в каталоге Harbor решает задачу).

Установка, первый вход и автозапуск

Когда harbor.yml настроен и сертификат на месте, запускайте подготовку и установку:

sudo ./prepare
sudo ./install.sh --with-trivy

Флаг --with-trivy поднимает встроенный сканер уязвимостей — без него Harbor работает как обычный registry, но без анализа образов на CVE, а это одна из главных причин ставить именно Harbor, а не голый Docker Distribution. Установка займёт пару минут: скрипт разворачивает контейнеры через docker compose и проверяет, что все сервисы поднялись.

Проверьте статус:

docker ps --format "table {{.Names}}\t{{.Status}}"

Должны быть запущены harbor-core, harbor-portal, registry, harbor-db, redis, harbor-jobservice, nginx, trivy-adapter и ещё несколько вспомогательных контейнеров — все в статусе Up (healthy).

Откройте https://registry.example.com в браузере и войдите под admin / паролем, который вы задали в harbor.yml (по умолчанию в шаблоне стоит Harbor12345 — если забыли поменять, сделайте это прямо сейчас через профиль администратора).

Автозапуск при перезагрузке сервера обеспечивается двумя вещами: во-первых, все контейнеры Harbor поднимаются с restart: always в сгенерированном docker-compose.yml, во-вторых, сам Docker должен стартовать при загрузке системы:

sudo systemctl enable docker

Этого достаточно — отдельный systemd-юнит для Harbor не нужен, Docker сам поднимет контейнеры при своём запуске.

Проекты, RBAC и сканирование уязвимостей

Пустой Harbor бесполезен, пока в нём нет проектов и людей с правами. Логика простая: проект — это неймспейс для образов (аналог organization/repo в Docker Hub), у каждого проекта свой список участников и ролей.

Роли в проекте, от слабой к сильной:

РольЧто может
Limited GuestТолько просматривать список образов без деталей уязвимостей
GuestPull образов
DeveloperPull + push
MaintainerDeveloper + управление тегами, сканирование, репликация
Project AdminПолный контроль над проектом, включая участников

Создайте первый рабочий проект в разделе Projects → New Project, отметьте галку Public только если действительно хотите открытый pull без авторизации — для приватного реестра оставляйте приватным.

Для CI/CD не заводите людей — используйте robot-аккаунты (Projects → ваш проект → Robot Accounts): у робота ограниченный токен с правами конкретно на push/pull в этот проект, без доступа к остальному Harbor. Это ровно то, что нужно для GitLab CI или другого раннера — если настраиваете конвейер, у нас есть отдельный разбор в статье gitlab-ci-cd-na-vps-nastrojka.

Сканирование на уязвимости включается на уровне проекта (Configuration → вкладка Vulnerability): можно поставить «Automatically scan images on push» — тогда каждый запушенный тег сразу проверяется Trivy, а результат виден прямо в списке образов цветным индикатором severity (critical/high/medium/low). Там же можно включить Prevent vulnerable images from running с порогом severity — если образ содержит уязвимости выше выбранного уровня, Harbor не даст пометить его как «одобренный» для деплоя. Это не блокирует сам docker pull физически, но встраивается в политику CI, если вы проверяете статус через Harbor API перед деплоем.

Отдельно закройте прямой доступ к портам Docker daemon и другим служебным портам файрволом, оставив открытыми только 80/443 наружу:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow OpenSSH
sudo ufw enable

Подробнее про настройку UFW с нуля — в статье faervol-ufw-na-ubuntu-24-04-poshagovaya-ustanovka.

Для проверки, что всё работает сквозным потоком, залогиньтесь и запушьте тестовый образ:

docker login registry.example.com
docker pull alpine:3.20
docker tag alpine:3.20 registry.example.com/myproject/alpine:3.20
docker push registry.example.com/myproject/alpine:3.20

Если push прошёл и образ появился в интерфейсе Harbor со статусом сканирования — установка полностью рабочая.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Как поменять пароль администратора после установки?

Через веб-интерфейс: профиль в правом верхнем углу → Change Password. Пароль из harbor.yml действует только при первом запуске и не синхронизируется с БД повторно при рестарте контейнеров.

Можно ли использовать самоподписанный сертификат в проде?

Технически да, но каждый клиент придётся вручную настраивать через insecure-registries или добавлять корневой сертификат в доверенные — при росте числа серверов это неудобно и менее безопасно, чем нормальный сертификат от Let's Encrypt.

Как перенести Harbor на другой сервер?

Остановите Harbor (docker compose down в каталоге установки), скопируйте весь каталог data_volume (по умолчанию /data/harbor) и файл harbor.yml на новый сервер, поправьте hostname при необходимости и запустите ./prepare && ./install.sh заново на новом месте.

Сколько ресурсов реально нужно Harbor в проде?

Зависит от нагрузки: для команды из 5-10 разработчиков с регулярным CI обычно достаточно 4 vCPU / 8 GB RAM, но при активном параллельном сканировании Trivy и большом количестве репликаций стоит закладывать больше — точную цифру даст только мониторинг под вашей реальной нагрузкой.

Чем Harbor лучше обычного private Docker registry?

Голый registry:2 — это просто хранилище слоёв без веб-интерфейса, RBAC, сканирования и репликации. Если нужен только push/pull без остального функционала, смотрите статью про privatnyj-docker-registry-na-servere-chastye-oshibki-i-resheniya — там разобраны частые проблемы простого варианта.

Нужен ли отдельный сервер под Harbor или можно на том же VPS, что и приложения?

Для тестового окружения — можно совмещать, но в проде Harbor стоит выносить на отдельный VPS: он держит образы всей команды, и его падение или нехватка диска затронет сразу все деплои.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →