Подготавливаем Vagrantfile
servers=[
{:hostname => "harbor",:ip => "192.168.10.50",:ssh_port => 2230}
]
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = 4096
vb.cpus = 2
vb.check_guest_additions = false
config.vm.box_check_update = false
config.vm.box = "bento/ubuntu-22.04"
end
servers.each do |machine|
config.vm.define machine[:hostname] do |node|
node.vm.hostname = machine[:hostname]
node.vm.network "public_network", ip: machine[:ip], bridge: "wlo1"
node.vm.network "forwarded_port", id: "ssh", host: machine[:ssh_port], guest: 22
node.vm.provider "virtualbox" do |vb|
file_to_disk = "./#{machine[:hostname]}_disk.vdi"
vb.customize ['createhd', '--filename', file_to_disk, '--size', 20 * 1024]
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]
end
end
end
end
Далее нужно установить docker на машину:
sudo apt-get update
sudo apt-get install 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-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Далее, если мы хотим использовать https, а мы точно хотим, то нужно либо сгенирировать самоподписанные сертификаты, либо воспользоваться уже существующим центром сертификации и выписать сертификат сервера, ключ сертификата положить сертификат центра сертификации, который это подписал.
Создаем самоподписанные сертификаты:
Генерируем закрытый ключ сертификата СА:
openssl genrsa -out ca.key 4096
Далее генерируем сертификат СА:
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.dev.local" \
-key ca.key \
-out ca.crt
Я брал примеры из официальной документации harbor, меняя только адрес домена.
Генерируем приватный ключ для СА сервера:
openssl genrsa -out harbor.dev.local.key 4096
Запрос на подписание сертификата (CSR):
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.dev.local" \
-key harbor.dev.local.key \
-out harbor.dev.local.csr
Далее нам рекомендуют создать x509 сертификат на основе файла расширения v3.ext:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.dev.local
DNS.2=harbor.dev
DNS.3=harbor
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.dev.local.csr \
-out harbor.dev.local.crt
Конвертим сертификат для docker:
openssl x509 -inform PEM -in yourdomain.com.crt -out harbor.dev.local.cert
Копируем сертификаты в директорию harbor. У меня это /data/cert :
cp harbor.dev.local.crt /data/cert/
cp harbor.dev.local.key /data/cert/
Копируем сертификаты в директория docker «/etc/docker/certs.d/harbor.dev.local»:
cp harbor.dev.local.cert /etc/docker/certs.d/harbor.dev.local/
cp harbor.dev.local.key /etc/docker/certs.d/harbor.dev.local/
cp ca.crt /etc/docker/certs.d/harbor.dev.local/
Перезапускаем docker:
systemctl restart docker
Устанавливаем harbor:
Со странице релизов, нужно забрать архив нужной версии. Я использовал online installer.
Скачиваем и разархивируем:
wget https://github.com/goharbor/harbor/releases/download/v2.7.3/harbor-online-installer-v2.7.3.tgz
tar xvf harbor-online-installer-v2.7.3.tgz
Внутри есть скрипты установки, а также пример файла harbor.yml.tmpl.
Мой конфигурационный файл выглядит так:
hostname: harbor.dev.local
http:
port: 80
https:
port: 443
certificate: /data/cert/harbor.dev.local.crt
private_key: /data/cert/harbor.dev.local.key
harbor_admin_password: admin
database:
password: admin
max_idle_conns: 100
max_open_conns: 900
conn_max_lifetime: 5m
conn_max_idle_time: 0
data_volume: /data
trivy:
ignore_unfixed: false
skip_update: false
offline_scan: false
security_check: false
insecure: false
github_token: xxx
jobservice:
max_job_workers: 10
notification:
webhook_job_max_retry: 10
chart:
absolute_url: disabled
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
_version: 2.7.3
proxy:
http_proxy:
https_proxy:
no_proxy:
components:
- core
- jobservice
- trivy
metric:
enabled: true
port: 9090
path: /metrics
upload_purging:
enabled: true
age: 168h
interval: 24h
dryrun: false
Останавливаться на параметрах нет смысла, часть из них интуитивно понятна, другая часть хорошо описана в документации а также в виде комментариев в оригинальном harbor.yml.tmpl
Запускаем установку:
./install.sh --with-trivy
Под копотом запустится docker-compose up, который из соответствующего файла создаст все необходимое.
У harbor встроен сканер образов trivy, о включении которого мы сказали скрипту при установке. Есть и другие фишки, но уже сейчас они помечены как deprecated, их пробовать не стал.
Финальные штрихи:
Не забудем добавить запись в наш локальный DNS вида «- address=/harbor.{{ local_domain }}/192.168.10.50» и перезапустить машину с ansible provision.
Также нам нужно отредактировать наш daemon.json docker:
$ cat /etc/docker/daemon.json
{
"insecure-registries" : [ "harbor.dev.local" ]
}
Создадим в веб-морде проект docker_local.
Перезапускаем docker и пробуем выполнить docker login, docker push:
docker login harbor.dev.local
docker pull nginx
docker tag nginx harbor.dev.local/docker_local/nginx:test
docker push harbor.dev.local/docker_local/nginx:test
В настройках мы можем включить автоскан образов с помощью trivy для нашего репозитория.
Немного автоматизации:
Вот тут можно забрать ansible роль для развертывания harbor. Роль предполагает, что сертификаты уже есть, их нужно просто положить в files директорию роли.
Файл ./defaults/main.yaml довольно простой, имеет удобное разделение и практически все его параметры относятся к конфигурационному файлу harbor.yml.