Настройка приватного Docker Registry (Harbor) на VPS: безопасность и управление образами
TL;DR
В этом подробном гайде мы шаг за шагом настроим приватный Docker Registry с использованием Harbor на вашем виртуальном или выделенном сервере. Harbor — это мощная платформа с открытым исходным кодом, которая предоставляет не только хранилище для образов Docker, но и расширенные функции безопасности, сканирование уязвимостей, управление политиками и контроль доступа. В итоге вы получите полностью контролируемое, безопасное и масштабируемое решение для хранения и распространения ваших контейнерных образов, критически важное для CI/CD пайплайнов и обеспечения приватности.
- Установка и настройка Harbor на Ubuntu 24.04 LTS.
- Обеспечение HTTPS-доступа к Registry с помощью Caddy для автоматического получения и обновления TLS-сертификатов.
- Конфигурация базовых политик безопасности и управления доступом.
- Рекомендации по выбору VPS-конфигурации и оптимизации ресурсов.
- Стратегии резервного копирования и обслуживания для долгосрочной стабильности.
- Решение типичных проблем и ответы на часто задаваемые вопросы.
Что мы настраиваем и зачем
Мы будем настраивать Harbor — мощный, облачный, приватный реестр контейнеров с открытым исходным кодом, который хранит, подписывает и сканирует образы. Harbor расширяет функциональность стандартного Docker Registry, добавляя к нему корпоративные функции, такие как безопасность, управление проектами, контроль доступа на основе ролей (RBAC), сканирование уязвимостей, репликацию образов и интеграцию с LDAP/AD. Это решение позволяет командам разработчиков безопасно управлять своими контейнерными образами, обеспечивая их целостность и соответствие корпоративным стандартам.
В итоге, вы получите полностью функциональный, безопасный и управляемый приватный Docker Registry, который будет служить центральным хранилищем для всех ваших контейнерных образов. Это особенно важно для CI/CD пайплайнов, где образы должны быть доступны быстро и надежно, а также для сред, где требуется строгий контроль над тем, что развертывается. Вы сможете хранить проприетарные образы, защищать их от несанкционированного доступа, сканировать на наличие уязвимостей до развертывания и контролировать, кто может публиковать или извлекать образы.
Какие альтернативы существуют? Можно использовать облачные managed-сервисы, такие как AWS ECR, Google Container Registry (GCR) / Artifact Registry, Azure Container Registry (ACR) или GitLab Container Registry. Они предлагают удобство, масштабируемость и часто интегрированы с другими облачными сервисами. Однако, self-hosted решение на VPS имеет свои преимущества:
- Полный контроль: Вы полностью контролируете данные, безопасность и инфраструктуру. Это критически важно для компаний с жесткими регуляторными требованиями или для тех, кто не хочет зависеть от конкретного облачного провайдера.
- Экономическая эффективность: Для средних и крупных объемов хранения и трафика self-hosted решение может оказаться значительно дешевле облачных аналогов, особенно если у вас уже есть свободные ресурсы на VPS/dedicated сервере.
- Кастомизация: Возможность тонкой настройки под специфические нужды вашей инфраструктуры, интеграция с внутренними системами аутентификации или уникальными инструментами безопасности.
- Приватность: Образы хранятся на вашей инфраструктуре, что снижает риски утечки данных через сторонние сервисы.
Выбор self-hosted Harbor на VPS идеально подходит для команд, которым нужен баланс между контролем, безопасностью и стоимостью, а также для тех, кто хочет избежать вендор-лока.
Какой VPS-конфиг нужен под эту задачу
Выбор правильной конфигурации сервера критически важен для стабильной и производительной работы Harbor. Harbor — это не просто хранилище, а целый комплекс сервисов (PostgreSQL, Redis, Notary, Clair, Trivy, Portal), которые потребляют ресурсы.
Минимальные требования (для небольших команд / тестовых сред):
- CPU: 2 ядра. Harbor выполняет много фоновых задач, таких как сканирование уязвимостей, что может быть ресурсоемким.
- RAM: 4 ГБ. Это абсолютный минимум, рекомендуется 6-8 ГБ для стабильной работы всех компонентов.
- Диск: 100 ГБ SSD. Основное потребление дискового пространства приходится на хранение образов. SSD значительно ускоряет операции с файлами и базами данных.
- Сеть: 100 Мбит/с. Для начального использования этого достаточно, но для активной работы CI/CD или большого количества пользователей потребуется более широкий канал.
Рекомендуемый VPS-план (для продакшн-среды средней нагрузки):
- CPU: 4 ядра. Обеспечит достаточную производительность для обработки запросов, сканирования и фоновых задач.
- RAM: 8-16 ГБ. Позволит всем компонентам Harbor работать без своппинга, что критично для производительности.
- Диск: 250-500 ГБ NVMe/SSD. Объем зависит от количества и размера хранимых образов. NVMe предлагает максимальную скорость ввода-вывода. Важно выбирать диск с возможностью расширения или использовать внешнее хранилище, если планируется очень много образов.
- Сеть: 1 Гбит/с. Высокоскоростной канал необходим для быстрой загрузки и скачивания образов, что существенно влияет на время сборки и развертывания.
Для аренды VPS с указанными характеристиками, например, 4 ядра CPU, 8-16 ГБ RAM, 250-500 ГБ NVMe/SSD и 1 Гбит/с сетью, можно рассмотреть VPS с указанными характеристиками.
Когда нужен dedicated, а не VPS
Выделенный сервер (dedicated server) становится предпочтительным выбором, когда:
- Очень высокая нагрузка: Если вы планируете хранить тысячи образов, обслуживать сотни разработчиков, или ваш CI/CD пайплайн постоянно пушит/пуллит образы.
- Требования к производительности: Когда требуется гарантированная производительность CPU, RAM и дисковой подсистемы без "соседского эффекта" (noisy neighbor) от других пользователей на том же гипервизоре.
- Большой объем хранилища: Если вам нужно несколько терабайт для образов и долгосрочного хранения.
- Строгие SLA и изоляция: Для критически важных систем, где требуется максимальная изоляция и контроль над аппаратным обеспечением.
В таких случаях, подходящий dedicated сервер обеспечит необходимую мощь и надежность.
Локация: на что влияет
Расположение вашего VPS или dedicated сервера влияет на несколько факторов:
- Латентность (ping): Чем ближе сервер к вашим разработчикам и CI/CD агентам, тем меньше задержка при загрузке/выгрузке образов. Это напрямую влияет на скорость работы.
- Региональные регуляции: В некоторых случаях, из-за законодательства (например, GDPR), данные должны храниться в определенном географическом регионе.
- Стоимость: Цены на VPS могут варьироваться в зависимости от региона.
Выбирайте локацию, которая минимизирует задержку для большинства ваших пользователей и соответствует всем законодательным требованиям.
Подготовка сервера
Предполагается, что вы используете свежеустановленный сервер с Ubuntu 24.04 LTS. Эти шаги обеспечат базовую безопасность и подготовят систему к установке Harbor.
1. Обновление системы
Всегда начинайте с обновления пакетного менеджера и установленных пакетов, чтобы убедиться в актуальности системы и доступности последних исправлений безопасности.
sudo apt update # Обновление списка пакетов
sudo apt upgrade -y # Обновление всех установленных пакетов
sudo apt autoremove -y # Удаление неиспользуемых пакетов
2. Создание нового пользователя и настройка SSH-ключей
Не рекомендуется работать под учетной записью root. Создайте нового пользователя с правами sudo и настройте аутентификацию по SSH-ключам для повышения безопасности.
sudo adduser harboradmin # Создание нового пользователя "harboradmin"
sudo usermod -aG sudo harboradmin # Добавление пользователя в группу sudo
sudo mkdir /home/harboradmin/.ssh # Создание директории для SSH-ключей
sudo chmod 700 /home/harboradmin/.ssh # Установка правильных прав доступа
sudo cp ~/.ssh/authorized_keys /home/harboradmin/.ssh/ # Копирование вашего публичного ключа
sudo chown -R harboradmin:harboradmin /home/harboradmin/.ssh # Установка владельца для директории
Важно: После выполнения этих шагов выйдите из текущей сессии root и войдите под новым пользователем harboradmin, используя ваш SSH-ключ. Затем отключите вход по паролю для root и обычным пользователям в файле /etc/ssh/sshd_config.
sudo nano /etc/ssh/sshd_config
Найдите и измените следующие строки:
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
Перезапустите SSH-сервис для применения изменений:
sudo systemctl restart sshd
3. Установка и настройка Firewall (UFW)
Настройте базовый файрвол для разрешения только необходимых портов. Harbor будет использовать порты 80 (HTTP, для редиректа), 443 (HTTPS) и возможно другие для внутренних сервисов.
sudo apt install ufw -y # Установка UFW
sudo ufw default deny incoming # Запретить все входящие соединения по умолчанию
sudo ufw default allow outgoing # Разрешить все исходящие соединения по умолчанию
sudo ufw allow OpenSSH # Разрешить SSH (порт 22)
sudo ufw allow http # Разрешить HTTP (порт 80)
sudo ufw allow https # Разрешить HTTPS (порт 443)
sudo ufw enable # Включить UFW
sudo ufw status verbose # Проверить статус UFW
4. Установка Fail2Ban
Fail2Ban помогает защититься от атак перебора паролей (brute-force) на SSH и другие сервисы.
sudo apt install fail2ban -y # Установка Fail2Ban
sudo systemctl enable fail2ban # Включение автозапуска Fail2Ban
sudo systemctl start fail2ban # Запуск Fail2Ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Создание локальной конфигурации
Откройте /etc/fail2ban/jail.local и убедитесь, что секция [sshd] активна (enabled = true) и настройте параметры по своему усмотрению (например, bantime, findtime, maxretry).
sudo nano /etc/fail2ban/jail.local
Пример настройки:
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
bantime = 1h
findtime = 10m
maxretry = 5
Перезапустите Fail2Ban для применения изменений:
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd # Проверить статус SSH-фильтра
5. Установка базовых утилит
Некоторые утилиты могут быть полезны в процессе установки и отладки.
sudo apt install curl wget git nano htop net-tools -y # Установка полезных утилит
Теперь ваш сервер готов к установке Docker и Harbor.
Установка ПО — пошагово
На этом этапе мы установим Docker Engine, Docker Compose и Harbor. Мы будем использовать актуальные версии, доступные в 2026 году. Для Ubuntu 24.04 LTS это, скорее всего, будет Docker Engine 25.x/26.x и Docker Compose v2.x, а Harbor версии 2.x или 3.x.
1. Установка Docker Engine
Установим Docker из официального репозитория Docker, чтобы всегда иметь актуальные версии.
# Удаляем старые версии Docker, если они есть
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt remove $pkg; done
# Устанавливаем необходимые пакеты для использования репозитория HTTPS
sudo apt install ca-certificates curl gnupg lsb-release -y
# Добавляем официальный GPG ключ Docker
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
# Добавляем репозиторий Docker в APT sources
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
# Обновляем список пакетов и устанавливаем Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Проверим, что Docker установлен и запущен:
sudo systemctl status docker # Проверка статуса Docker
sudo docker run hello-world # Запуск тестового контейнера
Добавим вашего пользователя в группу docker, чтобы не использовать sudo при каждой команде Docker (необходимо перелогиниться после этого шага):
sudo usermod -aG docker harboradmin # Добавление пользователя в группу docker
Выйдите и снова войдите в систему, чтобы изменения вступили в силу. Затем проверьте:
docker run hello-world # Запуск тестового контейнера без sudo
2. Установка Docker Compose
Docker Compose плагин уже установлен вместе с Docker Engine, но для удобства можно создать символическую ссылку на docker compose как docker-compose.
sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose # Создание символической ссылки
docker-compose version # Проверка версии Docker Compose
3. Загрузка и подготовка Harbor
Harbor распространяется в виде архива с Docker Compose файлами. Мы загрузим последнюю стабильную версию (предполагаем Harbor 2.x или 3.x для 2026 года) с GitHub releases.
# Создаем директорию для Harbor
mkdir -p ~/harbor && cd ~/harbor
# Загружаем последнюю стабильную версию Harbor installer (например, v2.10.x или v3.x)
# Проверьте актуальную версию на GitHub Releases: https://github.com/goharbor/harbor/releases
# Предположим, что в 2026 году актуальной является версия 2.10.0
HARBOR_VERSION="2.10.0" # Замените на актуальную версию
wget https://github.com/goharbor/harbor/releases/download/v${HARBOR_VERSION}/harbor-offline-installer-v${HARBOR_VERSION}.tgz
# Распаковываем архив
tar xvf harbor-offline-installer-v${HARBOR_VERSION}.tgz
# Переходим в директорию с распакованным Harbor
cd harbor
4. Конфигурация Harbor Installer
Основной файл конфигурации Harbor — harbor.yml.tmpl. Мы скопируем его в harbor.yml и отредактируем.
cp harbor.yml.tmpl harbor.yml # Создание файла конфигурации из шаблона
nano harbor.yml # Редактирование файла конфигурации
В файле harbor.yml необходимо изменить следующие параметры (примеры):
hostname: your.domain.com— укажите доменное имя, по которому будет доступен ваш Harbor Registry. Убедитесь, что для этого домена настроена A-запись, указывающая на IP-адрес вашего VPS.http.port: 80— порт для HTTP-доступа (будет перенаправлен на HTTPS).https.port: 443— порт для HTTPS-доступа.harbor_admin_password: YourSecurePassword123— задайте надежный пароль для администратора Harbor.data_volume: /data/harbor— путь, где будут храниться все данные Harbor (образы, база данных и т.д.). Рекомендуется использовать отдельный диск или раздел для данных.external_url: https://your.domain.com— URL, который будет использоваться для доступа к Harbor.
Пример фрагмента harbor.yml:
hostname: your.domain.com
http:
port: 80
https:
port: 443
# Укажем, что TLS будет управляться Caddy, а Harbor будет работать без прямого TLS
# Для этого мы настроим Caddy как обратный прокси.
# Пока оставим эти поля закомментированными или пустыми, если Caddy будет обрабатывать TLS.
# Если бы Harbor сам генерировал сертификаты, то здесь были бы пути к ним.
# certificate: /your/path/to/server.crt
# private_key: /your/path/to/server.key
harbor_admin_password: YourSecurePassword123
data_volume: /data/harbor
external_url: https://your.domain.com
Важно: Для продакшн-среды рекомендуется использовать внешнюю базу данных PostgreSQL и Redis для лучшей масштабируемости и управляемости, но для этого гайда мы будем использовать встроенные в Harbor контейнеры.
5. Установка Harbor
После сохранения harbor.yml можно запустить установку. Инсталлятор настроит все необходимые Docker Compose файлы и запустит сервисы.
# Запускаем скрипт установки
sudo ./install.sh --with-clair --with-chartmuseum --with-trivy # Установка с модулями сканирования и ChartMuseum
Скрипт install.sh выполнит следующие действия:
- Сгенерирует необходимые файлы Docker Compose.
- Создаст и запустит все контейнеры Harbor.
- Настроит базовую конфигурацию.
Процесс может занять несколько минут, так как Docker будет скачивать все необходимые образы.
После завершения установки вы можете проверить статус запущенных контейнеров:
docker-compose ps # Проверка статуса всех контейнеров Harbor
Убедитесь, что все контейнеры находятся в состоянии "Up".
Конфигурация
Теперь, когда Harbor установлен, нам нужно настроить HTTPS доступ и убедиться, что все работает корректно. Мы будем использовать Caddy как обратный прокси с автоматическим получением TLS-сертификатов от Let's Encrypt.
1. Настройка DNS
Прежде чем настраивать Caddy, убедитесь, что ваш домен (например, your.domain.com) имеет A-запись, указывающую на публичный IP-адрес вашего VPS. Это критически важно для работы Let's Encrypt.
2. Установка Caddy
Caddy — это мощный веб-сервер, который упрощает настройку HTTPS благодаря встроенной поддержке Let's Encrypt.
# Устанавливаем Caddy из официального репозитория
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy -y
3. Конфигурация Caddy для Harbor
Создадим файл конфигурации Caddy (Caddyfile) для работы с Harbor. Caddy будет проксировать запросы к Harbor и автоматически управлять TLS.
sudo nano /etc/caddy/Caddyfile
Удалите существующее содержимое и добавьте следующее, заменив your.domain.com на ваше доменное имя:
your.domain.com {
reverse_proxy 127.0.0.1:8080 { # Harbor по умолчанию работает на 8080 внутри контейнера
header_up Host {host}
header_up X-Real-IP {remote_ip}
header_up X-Forwarded-For {remote_ip}
header_up X-Forwarded-Proto {scheme}
}
# Опционально: включение сжатия Gzip
encode gzip
# Опционально: логирование
log {
output file /var/log/caddy/harbor_access.log
format json
}
# Опционально: базовый Rate Limiting для защиты от DoS
# rate_limit {
# burst 10
# rate 5r/s
# }
}
Создайте директорию для логов Caddy, если вы включили логирование:
sudo mkdir -p /var/log/caddy
sudo chown caddy:caddy /var/log/caddy
Перезапустите Caddy для применения изменений:
sudo systemctl restart caddy
sudo systemctl enable caddy # Включить автозапуск Caddy
sudo systemctl status caddy # Проверить статус Caddy
Убедитесь, что Caddy успешно запустился и получил TLS-сертификаты. Вы можете проверить логи Caddy: sudo journalctl -u caddy --no-pager.
4. Проверка работоспособности Harbor
Теперь, когда Caddy настроен, Harbor должен быть доступен по HTTPS.
- Доступ через браузер: Откройте
https://your.domain.comв браузере. Вы должны увидеть интерфейс Harbor. Войдите с именем пользователяadminи паролем, который вы указали вharbor.yml(harbor_admin_password). - Проверка через
curl:
curl -I https://your.domain.com/api/v2.0/health # Проверка доступности API Harbor
Вы должны получить HTTP-статус 200 OK. Если нет, проверьте логи Caddy и Harbor.
5. Настройка Docker клиента
Для работы с вашим приватным реестром Docker на локальной машине или CI/CD агентах, вам нужно войти в него:
docker login your.domain.com # Введите имя пользователя (например, admin) и пароль
После успешного входа вы сможете пушить и пуллить образы:
# Пример: пометим существующий образ и загрузим его в Harbor
docker tag hello-world your.domain.com/myproject/hello-world:latest
docker push your.domain.com/myproject/hello-world:latest
# Пример: скачаем образ из Harbor
docker pull your.domain.com/myproject/hello-world:latest
Важно: Создайте проект myproject в веб-интерфейсе Harbor перед тем, как пытаться загрузить в него образы.
6. Секреты и переменные окружения
Пароль администратора Harbor, который вы указали в harbor.yml, является чувствительной информацией. В продакшн-средах рекомендуется использовать Docker Secrets или внешние системы управления секретами. Для Harbor, который запускается через docker-compose, можно использовать файл .env. Хотя Harbor installer не использует его напрямую, вы можете отредактировать сгенерированный docker-compose.yml и использовать переменные окружения для чувствительных данных. Однако, для простоты этого гайда мы оставили пароль в harbor.yml.
Пример использования .env для пароля администратора (не применяется автоматически Harbor installer, но демонстрирует принцип):
# В вашем .env файле (рядом с docker-compose.yml)
HARBOR_ADMIN_PASSWORD=MySuperSecurePassword123
# В docker-compose.yml или harbor.yml (если бы он поддерживал)
# harbor_admin_password: ${HARBOR_ADMIN_PASSWORD}
Для Harbor более безопасным подходом является изменение пароля администратора через веб-интерфейс после установки, а также использование LDAP/OIDC для аутентификации пользователей вместо локальных учетных записей.
Бэкапы и обслуживание
Регулярное резервное копирование и обслуживание — это основа надежной работы любого сервиса, включая Harbor. Потеря данных образов или конфигурации может привести к серьезным проблемам.
1. Что бэкапить
Для Harbor критически важны следующие данные:
- Данные реестра: Сами образы Docker, хранящиеся в
/data/harbor/registry(или другом пути, указанном вdata_volume). - База данных PostgreSQL: Содержит метаданные образов, пользователей, проектов, политики и т.д. Хранится в
/data/harbor/database. - Конфигурационные файлы:
harbor.ymlи другие файлы в директории установки Harbor (~/harbor/harbor). - Сертификаты TLS: Если вы управляете ими вручную. В нашем случае Caddy управляет ими автоматически, но если вы используете Harbor с собственными сертификатами, их нужно бэкапить.
2. Простой скрипт автобэкапа
Мы создадим простой скрипт, который остановит Harbor, сделает бэкап данных и снова запустит Harbor. Для этого потребуется утилита rsync или tar.
sudo nano /usr/local/bin/backup_harbor.sh
Содержимое скрипта (замените your.domain.com и /path/to/backup/destination):
#!/bin/bash
# Путь к директории Harbor
HARBOR_DIR="/home/harboradmin/harbor/harbor" # Убедитесь, что это правильный путь к распакованной директории Harbor
HARBOR_DATA_VOLUME="/data/harbor" # Путь к тому данных Harbor
# Директория для хранения бэкапов
BACKUP_DESTINATION="/path/to/backup/destination" # Например, /mnt/backup/harbor_backups
BACKUP_TIMESTAMP=$(date +%Y%m%d%H%M%S)
FULL_BACKUP_PATH="${BACKUP_DESTINATION}/harbor_backup_${BACKUP_TIMESTAMP}"
echo "Starting Harbor backup at ${BACKUP_TIMESTAMP}..."
# 1. Останавливаем Harbor сервисы
echo "Stopping Harbor services..."
cd ${HARBOR_DIR}
docker-compose down # Останавливаем все контейнеры Harbor
# 2. Создаем директорию для текущего бэкапа
echo "Creating backup directory: ${FULL_BACKUP_PATH}"
mkdir -p ${FULL_BACKUP_PATH}
# 3. Копируем конфигурационные файлы
echo "Backing up Harbor configuration files..."
cp ${HARBOR_DIR}/harbor.yml ${FULL_BACKUP_PATH}/
cp ${HARBOR_DIR}/docker-compose.yml ${FULL_BACKUP_PATH}/ # Можно добавить другие конфиги, если есть
# 4. Копируем данные Harbor (образы, БД)
echo "Backing up Harbor data volume: ${HARBOR_DATA_VOLUME}"
# Используем rsync для инкрементальных бэкапов или tar для полного архива
# rsync -avh --delete ${HARBOR_DATA_VOLUME}/ ${FULL_BACKUP_PATH}/data/
tar -czvf ${FULL_BACKUP_PATH}/harbor_data.tar.gz ${HARBOR_DATA_VOLUME}
# 5. Запускаем Harbor сервисы
echo "Starting Harbor services..."
docker-compose up -d # Запускаем контейнеры Harbor в фоновом режиме
echo "Harbor backup completed. Backup saved to ${FULL_BACKUP_PATH}"
Сделаем скрипт исполняемым:
sudo chmod +x /usr/local/bin/backup_harbor.sh
Внимание: Остановка Harbor приведет к временной недоступности реестра. Планируйте бэкапы на время наименьшей активности или рассмотрите более сложные методы бэкапа без простоя, если Harbor критичен 24/7.
3. Куда складывать бэкапы
Бэкапы должны храниться отдельно от основного сервера, чтобы избежать потери данных в случае отказа сервера.
- Внешний S3-совместимый объектный сторадж: AWS S3, MinIO, DigitalOcean Spaces и т.д. Это надежный и масштабируемый вариант. Для этого можно использовать утилиты типа
awscliилиs3cmdв скрипте бэкапа. - Отдельный VPS: Выделенный небольшой VPS для хранения бэкапов, доступный по SSH/SFTP. Можно использовать
rsyncдля копирования бэкапов на него. - NFS/SMB хранилище: Если у вас есть централизованное сетевое хранилище.
Пример добавления отправки бэкапа на S3 (требует настройки awscli):
# Добавить в скрипт после tar -czvf ...
echo "Uploading backup to S3..."
aws s3 cp ${FULL_BACKUP_PATH}/harbor_data.tar.gz s3://your-s3-bucket-name/harbor_backups/ --recursive
aws s3 cp ${FULL_BACKUP_PATH}/harbor.yml s3://your-s3-bucket-name/harbor_backups/ --recursive
4. Настройка Cron для автоматического бэкапа
Добавим скрипт в планировщик Cron для ежедневного выполнения (например, в 3 часа ночи).
sudo crontab -e
Добавьте следующую строку в конец файла:
0 3 * /usr/local/bin/backup_harbor.sh >> /var/log/harbor_backup.log 2>&1
Это будет запускать скрипт каждый день в 03:00 и перенаправлять вывод в лог-файл /var/log/harbor_backup.log.
5. Обновления: rolling vs maintenance window
Поддержание ПО в актуальном состоянии критически важно для безопасности и стабильности. Обновлять нужно:
- Операционную систему: Регулярно запускайте
sudo apt update && sudo apt upgrade -y. - Docker Engine и Docker Compose: Обновляйте их из официального репозитория Docker.
- Harbor: Обновления Harbor обычно требуют использования нового инсталлятора и выполнения процедуры миграции. Это часто влечет за собой простой сервиса.
Стратегии обновления Harbor:
- Maintenance Window: Самый простой подход для большинства self-hosted инсталляций. Планируйте окно обслуживания (например, раз в месяц или квартал), во время которого Harbor будет недоступен. Это позволяет выполнить обновление, протестировать его и откатиться в случае проблем.
- Rolling Updates (для кластерных развертываний): Если Harbor развернут в кластере (например, Kubernetes), можно выполнять rolling updates без простоя. Однако это значительно усложняет архитектуру и выходит за рамки данного гайда.
Всегда читайте официальную документацию Harbor перед обновлением, так как процедура может меняться между версиями.
Troubleshooting + FAQ
Что делать, если Harbor не запускается после установки?
В первую очередь проверьте логи Docker-контейнеров Harbor. Перейдите в директорию установки Harbor (~/harbor/harbor) и выполните docker-compose logs. Это покажет логи всех сервисов. Если проблема с конкретным сервисом (например, core или registry), можно посмотреть его логи отдельно: docker-compose logs core. Частые проблемы включают конфликты портов, неправильную конфигурацию доменного имени или проблемы с доступом к данным.
Почему я не могу получить доступ к Harbor по доменному имени?
Проверьте следующие пункты: 1) Убедитесь, что DNS-запись (A-запись) для вашего домена корректно указывает на IP-адрес вашего VPS. 2) Проверьте статус Caddy (sudo systemctl status caddy) и его логи (sudo journalctl -u caddy --no-pager) — возможно, Caddy не смог получить TLS-сертификат. 3) Убедитесь, что порты 80 и 443 открыты в вашем фаерволе (UFW: sudo ufw status). 4) Проверьте, что hostname в harbor.yml совпадает с вашим доменным именем.
Не могу войти в Harbor через Docker CLI (docker login)
Убедитесь, что вы используете правильное доменное имя (например, your.domain.com) и учетные данные (по умолчанию admin и пароль, указанный в harbor.yml). Если Harbor использует самоподписанные сертификаты (чего мы избежали с Caddy), вам может потребоваться добавить сертификат Harbor в список доверенных сертификатов Docker на вашей клиентской машине. Также проверьте, что Harbor запущен и доступен по HTTPS.
Какой VPS-конфиг минимально подойдёт?
Для тестовых сред или очень небольших команд с минимальным количеством образов и пользователей, минимальный конфиг должен включать 2 ядра CPU, 4 ГБ RAM и как минимум 100 ГБ SSD диска. Однако, такой конфигурации может не хватить при активном сканировании уязвимостей или высокой нагрузке. Для стабильной работы в продуктивной среде рекомендуется 4 ядра CPU, 8-16 ГБ RAM и 250-500 ГБ NVMe/SSD.
Что выбрать — VPS или dedicated для этой задачи?
Выбор между VPS и dedicated сервером зависит от масштаба вашей задачи. VPS достаточен для большинства средних команд и проектов, предлагая хороший баланс стоимости и производительности. Dedicated сервер следует выбирать, если у вас очень большой объем образов (терабайты), высокая и постоянная нагрузка от сотен пользователей или CI/CD агентов, а также если требуются максимальная производительность, изоляция ресурсов и строгие SLA, которые могут быть не гарантированы на VPS из-за "соседского эффекта".
Как обновить Harbor до новой версии?
Обновление Harbor обычно включает скачивание нового инсталлятора для целевой версии, остановку текущих сервисов Harbor, резервное копирование данных, запуск скрипта prepare из нового инсталлятора для миграции базы данных и затем запуск install.sh. Всегда внимательно читайте официальную документацию по обновлению для конкретной версии Harbor, так как шаги могут отличаться.
Harbor выдает ошибку "no such host" при попытке пуша/пулла образов.
Эта ошибка обычно означает, что Docker клиент не может разрешить доменное имя вашего Harbor Registry. Убедитесь, что DNS-серверы, используемые вашей клиентской машиной, правильно разрешают ваш домен. Проверьте это командой ping your.domain.com или nslookup your.domain.com. Если домен не разрешается, проблема в DNS. Если разрешается, проверьте, что порт 443 открыт и Caddy/Harbor доступны.
Выводы и следующие шаги
Поздравляем! Вы успешно настроили приватный Docker Registry (Harbor) на вашем VPS. Теперь у вас есть безопасное и управляемое хранилище для ваших контейнерных образов, обеспечивающее контроль доступа, сканирование уязвимостей и возможности аудита. Это значительно улучшит ваш CI/CD пайплайн и общую безопасность развертываний.
Следующие шаги для дальнейшего развития вашей инфраструктуры Harbor:
- Интеграция с CI/CD: Настройте ваши CI/CD системы (Jenkins, GitLab CI, GitHub Actions) для автоматической сборки, пуша и пулла образов из вашего приватного Harbor Registry.
- Управление пользователями и RBAC: Настройте интеграцию Harbor с вашей корпоративной системой аутентификации (LDAP/AD, OIDC) и создайте проекты с соответствующими ролями для команд разработчиков, чтобы обеспечить гранулярный контроль доступа.
- Репликация и высокая доступность: Для критически важных продакшн-сред рассмотрите настройку репликации образов между несколькими инсталляциями Harbor или развертывание Harbor в кластере Kubernetes для обеспечения высокой доступности и устойчивости к отказам.