Приватный Docker Registry на Harbor: внедрение с RBAC и сканированием

Команда растёт, и общий реестр образов превращается в свалку, где непонятно, кто и что выложил. Мы настраиваем приватный Docker Registry на Harbor под ключ: права доступа, автоматическое сканирование уязвимостей, регламенты выкладки. Выкладка ускоряется в разы, а число инцидентов из-за «чужого» образа падает.
Часто задаваемые вопросы

Почему приватный Docker Registry ломается при росте команды

Пока образы тянутся из публичного источника, выкладка зависит от чужого сервиса. Лимиты на скачивание образов срабатывают в самый неудачный момент — когда параллельно собираются несколько веток и агенты разом запрашивают базовые слои. Сборка не падает сразу: она замедляется, часть шагов падает по таймауту, и конвейер приходится перезапускать вручную.

Второй сбой тише и поэтому дороже. Теги перезаписываются, и под одним именем на разных стендах оказываются разные байты: тестировщик проверяет не то, что соберёт релиз. Рассинхрон образов между стендами не видно в логах, он видно в инцидентах — «на тесте работало, в продакшене нет». Воспроизводимость сборки теряется, потому что никто не знает, что именно лежит в образе.

Дальше ломается откат релиза по образу. Пока нужные слои лежат в локальном кеше агента, всё держится; при переезде агента или перезаписи тега предыдущей версии просто нет. Остаётся пересобирать прошлый коммит по памяти и надеяться, что зависимости подтянутся в тех же версиях.

Цена — часы простоя на команду и потерянные релизные окна. Лечится это не дисциплиной, а сменой точки хранения: свой реестр образов с неизменяемыми тегами, разграничением прав и проверкой образов до выкладки. Разбираем, как это закрывается.

Что даёт управляемый реестр образов

Единая точка выдачи образов убирает главную причину расхождений между стендами. Приватный Docker Registry собирает артефакты в одном месте: приложение собирается один раз, а дальше все среды — разработка, тестирование, продуктив — получают один и тот же неизменяемый слой. Спор «у меня работает» заканчивается, потому что сравнивать нечего: идентификатор артефакта одинаков на всех контурах, а не пересобирается заново на каждой машине.

Кеш слоёв рядом с вычислительными ресурсами сокращает время выкладки релиза. Базовые слои скачиваются один раз, при обновлении приложения передаётся только изменённая часть, и развёртывание перестаёт зависеть от доступности публичных хранилищ. Типичный эффект — выкладка укладывается в единицы минут вместо десятков, а команды перестают дублировать трафик при параллельных сборках.

Контроль версий держится на политике тегов: релиз получает неизменяемую метку, а подвижные метки закрываются для записи, чтобы под одним именем не оказался другой артефакт. Из этого вырастает воспроизводимый откат — возврат на предыдущий релиз делается переключением метки и занимает минуты, без пересборки и без поиска нужной сборки в чьём-то каталоге.

Сканирование при загрузке и по расписанию меняет картину с уязвимостями: политика не пропускает в продуктив образ с критичными находками, поэтому доля артефактов с известными уязвимостями падает, а не растёт вместе с числом сервисов. Ролевая модель доступа добавляет порядок: команда видит и выкладывает только свои проекты, действия попадают в журнал, а доступы отзываются вместе с уходом сотрудника.

Варианты хранения образов: сравнение режимов

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

Вариант Когда подходит Ограничения
Локальный реестр на своём железе Данные не должны покидать ваш контур; есть свои машины и инженеры, готовые сопровождать сервис Обновления, резервные копии и место на дисках — на вашей стороне; отказ узла останавливает сборки, пока не поднят второй экземпляр
Облачный управляемый реестр Команда распределена, держать инфраструктуру не хочется; нужен быстрый старт и доступ из разных сетей Настройка прав и сканирование ограничены возможностями провайдера; объём реестра и число обращений требуют дисциплины по очистке
Гибридная схема с репликацией Сборка идёт внутри сети, а раздача — внешним площадкам; нужны и скорость, и доступность Две точки хранения: рассинхрон тегов при сбое репликации, сложнее разбирать инциденты, нужна политика «кто источник»

Ограничения у всех трёх режимов проявляются одинаково: кончилось место или лёг узел — сборки встали, а откатываться некуда. Поэтому рядом с реестром сразу настраивают роли и области видимости, а не выдают команде общий доступ на запись.

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

Этапы внедрения: от аудита до передачи

Работы идём в порядке, при котором реестр включается без остановки текущих выкладок: сначала фиксируем, что уже есть, затем проектируем хранение и права, и только потом переносим образы.

  1. Аудит сборочных конвейеров и инвентаризация образов. Какие сервисы собираются, откуда берутся базовые слои, кто и как пушит, сколько тегов живёт в старом хранилище. Результат — список репозиториев и единое правило именования.
  2. Схема реестра. Проекты и квоты, политики жизненного цикла (сколько тегов держим, когда чистим), размещение хранилища и репликация. Схему согласуем до развёртывания, иначе данные придётся переносить повторно.
  3. Развёртывание и подключение. Поднимаем Harbor в отказоустойчивой конфигурации, настраиваем TLS, интеграцию с корпоративным каталогом пользователей и резервное копирование.
  4. Права доступа. Роли по проектам, отдельные служебные учётные записи для конвейеров, разделение чтения и записи, анонимный доступ закрыт.
  5. Миграция образов. Переносим с сохранением дайджестов и проверкой целостности — пересобирать ничего не нужно, выкладки не прерываются.
  6. Проверка выкладки. Прогоняем реальные сборки и развёртывания: сканирование уязвимостей, политика блокировки критичных находок, откат на предыдущий тег.
  7. Передача реестра команде. Регламенты, схема, порядок восстановления и обучение на живом стенде — дальше команда ведёт реестр сама.

Конфигурации Registry, политики доступа и регламенты

После внедрения у команды заказчика остаётся не только работающий реестр, но и полный набор артефактов, по которым его можно развивать и сопровождать без нас. Файлы конфигурации хранятся в git рядом с манифестами развёртывания, поэтому различия между средами задаются значениями, а не правкой шаблонов вручную. Что именно передаём:

  • Конфигурации реестра: параметры хранилища, внешние подключения, лимиты на размер загрузки, включённые проверки уязвимостей и сроки хранения слоёв.
  • Политики доступа: правила на уровне проектов и репозиториев, требования к подписанным образам, запрет перезаписи неизменяемых тегов.
  • Роли и права команд: матрица «команда — проект — действие», привязка к корпоративному каталогу, отдельные учётные записи для сборочных агентов.
  • Регламент обновления образов: периодичность пересборки базовых слоёв, порядок выпуска исправлений безопасности, ответственные за подтверждение.
  • Правила очистки и хранения: сколько последних образов на тег остаётся, что уходит из реестра автоматически, как сохранить возможность отката.
  • Схема резервного копирования: какие метаданные и артефакты копируются, с какой периодичностью, как проверяется восстановление на отдельном контуре.
  • Инструкции для команд: как получить доступ, как опубликовать образ, куда обращаться при инциденте и как читать отчёт сканирования.

Каждый документ привязан к конкретному файлу и версии, а не описывает желаемое состояние. Передача сопровождается прогоном: разворачиваем реестр с нуля по этим материалам и сверяем результат с рабочим контуром.

Кейс: как сократили время выкладки и число инцидентов

Команда сопровождала около сорока сервисов: сборка шла в конвейере непрерывной интеграции, а образы складывались в публичный реестр без политик доступа. Выкладка на тестовый стенд занимала в среднем 35–40 минут, и половина времени уходила на ручную подстановку тегов и повторные сборки после невнятных ошибок.

На стендах расходились версии: разработчик отправлял latest, тестировщик поднимал не тот образ, дежурный не мог быстро понять, что именно работает сейчас. Расхождения между окружениями всплывали три-четыре раза в неделю, а разбор инцидента с образом — откат не той версии, несовместимая библиотека — занимал два-три часа.

Мы развернули приватный реестр на Harbor: проекты по командам и окружениям, роли в RBAC, отдельные служебные учётные записи для конвейера, неизменяемые теги и правило хранения, которое чистит старые слои, но оставляет последние сборки для отката. Сканирование уязвимостей идёт при отправке образа, сборка с критичными находками блокируется до исправления, исключение оформляется явно и на ограниченный срок.

Через три месяца: выкладка на стенд — около шести минут вместо сорока, потому что стенд тянет образ по неизменяемому тегу. Расхождения версий между окружениями сократились до нуля. Доля образов с известными критичными уязвимостями упала с 22% до 0,4% — остались единичные случаи, где обновление зависит от внешнего поставщика. Инцидентов, связанных с образами, за два квартала не зафиксировано.

Откат при этом остаётся управляемым: нужные сборки хранятся, журнал реестра показывает, кто и когда отправил образ, поэтому разбор занимает минуты, а не часы.

Что делать, если реестр образов уже развёрнут вручную

Работающий самодельный реестр не нужно пересобирать с нуля — его переносят на управляемую платформу, сохранив прежние адреса выдачи образов. Начинаем с инвентаризации: без неё перенос превращается в перебор тегов наугад. Дальше — поэтапное переключение, при котором выкладки не останавливаются.

Инвентаризация образов идёт от факта, а не от списка в голове инженера: реестр отдаёт перечень репозиториев и тегов, и его сверяют с журналами обращений, ссылками в конфигурациях кластеров и шагами сборки. На выходе видно, какие образы тянут боевые и тестовые контуры, какие дублируют друг друга по слоям, а какие не запрашивались ни разу. Обычно заметная часть тегов оказывается балластом — и это сразу задаёт реальный объём работ.

Перенос существующего реестра делаем с периодом двойной работы: Harbor поднимается рядом, настраивается проксирование к старому адресу, и он остаётся источником, пока не переключится последний потребитель. Сборки переводят на служебные учётные записи, ограниченные своим проектом, а общие ключи отзываются по мере миграции — бесшовный переход без окна простоя.

Права и хранилище приводим в порядок сразу: проекты по командам, роли от «только чтение» до администратора реестра, синхронизация с каталогом пользователей, квоты и правило хранения — последние десять тегов на репозиторий, релизные теги неизменяемы. Легаси-теги не удаляем вслепую: их гасят по метрике обращений, а освободившиеся слои собирает сборщик мусора.

Частые технические сомнения при переходе на свой реестр

Главное сомнение при уходе от внешнего реестра — не «как настроить», а «что будет, когда он перестанет отвечать». Ниже прямые ответы про доступность, переписывание сборочных конвейеров и ответственность после передачи.

Что произойдёт, если реестр станет недоступен?

Развёрнутые контейнеры продолжают работать: образ уже лежит на узле, перезапуск идёт из локального кэша. Реестр держим в двух экземплярах на разных площадках, состояние — в реплицируемом хранилище. Отказ одной машины не останавливает сборки и выкладки, а проверка доступности выводит узел из балансировки сама.

Придётся ли переписывать сборочные конвейеры?

Нет. Адрес реестра и учётные данные вынесены в переменные окружения — меняется строка в настройках агента сборки, логика шагов остаётся прежней. На время перехода старое зеркало работает параллельно, поэтому переключение идёт без остановки выкладок.

Насколько защищён приватный реестр?

Доступ строится на ролях: команда видит только свои проекты, права на чтение и запись разделены. Образы сканируются на уязвимости при загрузке, политика блокирует выкладку сборок с критичными находками, а для автоматики используются короткоживущие учётные данные вместо общего пароля на всех.

Что с поддержкой после передачи?

Передаём конфигурации, схемы размещения, регламенты обновления и восстановления, доступы оформляются на вашу сторону. Инженеры остаются на сопровождении с согласованным временем реакции, но не как единственные, кто умеет обслуживать реестр: после обучения операцию проводит ваша команда.

Обсудим задачу и вернёмся с оценкой и планом

Чтобы вернуться с оценкой и планом работ по реестру, нужен минимум вводных: где сейчас лежат образы, сколько команд публикует, какие требования к доступам и хранению. Обычно достаточно разговора с нашим инженером и доступа к текущей конфигурации — разбирать весь контур целиком не требуется.

  • Перечень сервисов и команд, которые публикуют и забирают образы — от него зависит схема проектов и изоляция между ними.
  • Объёмы и текущее хранение: сколько тегов живёт в реестре и что обязательно сохранить при переносе.
  • Требования к ролям: кто только читает, кто публикует, кому нужны права администратора и на какой срок.
  • Правила хранения: сколько последних версий держать, что уходит из реестра без возможности отката.
  • Политика проверки образов на уязвимости: блокировать публикацию или только фиксировать результат.
  • Ответственный со стороны заказчика и окно, в которое допустимы работы на общем контуре.

В ответ приходит план работ по реестру: этапы, изменения в существующих сборках, точки проверки и критерии приёмки, а также оценка внедрения с разбивкой по этапам — без работ «по факту». План согласуется с вашим техлидом, при необходимости — с безопасностью.

После согласования стартуем с тестового контура: поднимаем реестр, переводим пилотную команду, смотрим на скорость сборки и выгрузки образов. Дальше — поэтапный перевод остальных команд, обучение дежурных и передача документации. Опишите задачу в двух словах — вернёмся с оценкой и планом.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139