Как создать APT репозиторий в Sonatype Nexus 3?
Я разворачивал Nexus в docker-контейнере, поэтому буду описывать, как поднять APT репозиторий именно в docker.
Что такое Sonatype Nexus 3?
Sonatype Nexus 3 — это свободно распространяемый менеджер репозиториев, с удобным web-интерфейсом. Менеджер позволяет создавать репозитории, как для хранения конкретных форматов данных (yum, apt, Maven, Docker, npm, PyPl и так далее), так и формат хранения файлов Raw, в котором можно хранить любые типы файлов.
Менеджер репозиториев можно установить, как на обычную физическую или виртуальную машину, так и развернуть в docker-контейнере. Я разворачивал Nexus в docker-контейнере, поэтому буду описывать, как поднять APT репозиторий именно в docker. Доступные docker-образы Sonatype Nexus 3 можно найти по этой ссылке.
Установка зависимостей
Первое что нужно сделать, это подключиться к docker-контейнеру с оболочкой bash:
docker exec -it -u 0 nexus bash
После этого нужно установить пакет pinentry, для того, чтобы можно было дальше сгенерировать ключи для apt репозитория:
yum -y install pinentry
Генерация ключей
После установки пакета pinentry, можно приступать к созданию ключей:
Заполняем поля, вводим O и нажимаем Enter. Далее нужно будет ввести 2 раза пароль, для генерации ключа. Копируем ID, который был сгенерирован 6C44AA9D06EA1B2E805C90FF6935F7FB57FFEF6F. Создаём открытый ключ:
gpg —armor —output public.gpg.key —export 6C44AA9D06EA1B2E805C90FF6935F7FB57FFEF6F
Создаём закрытый ключ:
gpg —armor —output private.gpg.key —export-secret-key 6C44AA9D06EA1B2E805C90FF6935F7FB57FFEF6F
Здесь нужно будет ввести пароль, который вводили при генерации ID.
Выводим содержимое файла, который был сгенерирован при создание закрытого ключа. Копируем содержимое файла.
Создание APT репозитория
Заходим в web-интерфейс менеджера репозиториев Nexus http://10.10.1.1:8080. Авторизуемся с правами администратора и нажимаем на шестерёнку вверху. Далее выбираем раздел Repositories. Нажимаем Create repository и выбираем apt(hosted):
Далее заполняем поля и вставляем в поле Signing Key содержимое из файла private.gpg.key:
В поле Passphrase вводим пароль, который вводили при генерации ID и закрытого ключа. Нажимаем Create repository. После этого будет создан репозиторий APT, в который можно загружать deb-файлы и подключать к Debian/Ubuntu или подобным ОС.
Nexus репозиторий что это
Менеджер репозиториев №1 в мире
— Единый источник достоверных данных обо всех компонентах, бинарных файлах и артефактах сборки;
— Обеспечивает эффективное распределение компонентов и контейнеров между разработчиками;
— Используется в более чем 100 000 организациях по всему миру;
УНИВЕРСАЛЬНЫЙ КОНТРОЛЬ

Поддержка всех популярных форматов.
— Храните и управляйте дистрибуцией компонентов ПО Maven/Java, npm, NuGet, RubyGems, Docker, P2, OBR, APT, GO, YUM и мн. др.;
— Управляйте любыми компонентами во всем цикле от разработки до поставки: бинарными файлами, библиотеками, контейнерами, сборками и итоговым программным продуктом;
— Используйте все возможности расширенной поддержки экосистемы Java Virtual Machine (JVM), включая Gradle, Ant, Maven и Ivy, а также полноценной совместимости с такими популярными инструментами, как Eclipse, IntelliJ, Hudson, Jenkins, Puppet, Chef, Docker и др.;
Контроль и управление компонентами, библиотеками ПО и артефактами сборки в промышленном формате.
— Доставка обновлений в режиме высокой доступности 24x7x365;
— Единый источник достоверных данных обо всех компонентах ПО, используемых в рамках жизненного цикла разработки программного обеспечения, включая контроль качества, подготовку к релизу и эксплуатацию;
— Простая интеграция с существующими корпоративными системами контроля доступа, включая LDAP, Atlassian Crowd и др.;
— Обеспечение защищенности в процессе разработки ПО с помощью зашифрованных соединений SSL;
Контроль работоспособности всей цепочки поставок программного обеспечения.
— Механизм проверки работоспособности репозитория предоставляет актуальные сведения о состоянии компонентов, чтобы все инженерные команды имели возможность оперативно принимать необходимые решения;
— Просмотр компонентов, нуждающихся в замене, в порядке, соответствующем критичности идентифицированных уязвимостей;
— Предотвращение общеизвестных, задекларированных уязвимостей и лицензионных рисков в компонентах Maven/Java, npm, NuGet, и PyPI;
Современные возможности для непрерывного технологического превосходства .
— Разворачивайте напрямую в целевой репозиторий с использованием любого удобного вам инструмента сборки / развертывания, либо напрямую через HTTP;
— Контроллируйте и управляйте релизами программного продукта c помощью автоматизированного механизма реализации правил валидации;
— Используйте прозрачный рабочий процесс и контроль для релиз-кандидатов Вашего ПО;
— Используйте возможность контролируемого обмена и переиспользования бинарных файлов, артефактов и версий программного продукта группами инженеров-разработчиков;
Клиентоориентированная корпоративная
поддержка мирового уровня.
— Мы основываемся на количестве пользователей, а не серверов. Это значит, что Вы масштабируете продукты Sonatype на любое количество серверов и дата-центров, какое захотите, без дополнительных затрат.
— Мы предоставляем детальную документацию и осуществляем оперативную поддержку по вопросам установки, конфигурации, использования и обновления.
— В Вашем распоряжении: обучение через видеокурсы, онлайн чат с технической поддержкой, экспертиза и технологические компетенции наших официальных партнеров;
Установка Sonatype Nexus с SSL

Sonatype Nexus — программный продукт, который представляет собой менеджер репозиториев для хранения артефактов. Поддерживаются такие форматы артефактов, как Maven, образы Docker, Python PyPI, RubyGems, npm, nuget, deb и другие. С полным списком поддерживаемых артефактов можно ознакомиться в официальной документации.
По умолчанию установка происходит без включенного SSL. В данной статье будет описана установка Sonatype Nexus в контейнере Docker с использованием Nginx в качестве обратного прокси сервера, а также будет рассмотрено получение бесплатного доменного имени на сайте freenom.com и создание SSL-сертификата при помощи службы Let’s Encrypt.
Установка будет произведена на операционной системе Ubuntu 20.04.04 LTS.
Установка Nexus при помощи Docker
Первым делом нужно установить Docker. Для этого необходимо воспользоваться инструкцией с официального сайта Docker в разделе установки на ОС Ubuntu.
После того как Docker будет установлен, надо создать директорию, где будут хранится данные Nexus:
mkdir nexus-data
Далее необходимо развернуть контейнер с nexus, пробросив порт 8081 наружу, и примонтировать ранее созданную директорию nexus-data:
docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3

Разворачивание контейнера займёт несколько минут.
Статус развертывания можно проверить с помощью команды:
docker logs -f
Где — уникальный ID (номер) контейнера. Узнать его можно при помощи команды:
docker ps

В данном случае ID контейнера — 1ce41c2632f6.
Контейнер будет запущен, когда в выводе команды docker logs появится строчка:
Started Sonatype Nexus OSS 3.38.1-01

После запуска Nexus будет доступен по адресу http://:8081
В данном примере IP-адреса хоста — 192.168.92.139. Перейдем по данному IP и порту 8081 в браузере, чтобы убедиться, что веб-интерфейс Nexus работает:

Чтобы войти из-под учётной записи администратора с именем admin, необходимо получить пароль. Пароль можно получить из контейнера, выполнив команду:
docker exec -it < ID контейнера>/bin/bash
Где вместо необходимо подставить ID контейнера с Nexus:

Далее внутри контейнера выполнить команду:
cat nexus-data/admin.password

Файл внутри контейнера admin.password будет удален сразу после первого входа.
В веб-интерфейсе Nexus нужно перейти в раздел Sign-in (находится справа сверху) и авторизоваться:

При первом входе Nexus сразу же сообщит, что стандартный пароль необходимо изменить:

На этом установка Nexus завершена.
Создание домена и сертификатов
Для создания домена для хоста, где установлен Nexus, можно воспользоваться одним из нескольких сервисов, которые выдают доменные имена. В качестве примера будет использован сервис под названием Freenom. Одним из его главных преимуществ является то, что он позволяет зарегистрировать бесплатный домен второго уровня в одной из следующих зон: .tk, .ml, .ga, .cf, .gq, который будет действовать один год бесплатно. Также из преимуществ Freenom можно выделить переадресацию URL, предоставление бесплатного DNS-сервиса.
Для получения бесплатного домена необходимо перейти на сайт Freenom и на главной странице ввести имя желаемого домена. В последнее время на сайте проявляется ошибка, которая заключается в том, что доменное имя необходимо вводить сразу вместе с зоной.
Например, если нужен домен с именем my-nexus-repository, то в поле поиска необходимо ввести my-nexus-repository.tk. Вместо .tk можно использовать следующие доменные зоны: .ml, .ga, .cf, .gq. После этого потребуется нажать на кнопку «Проверить доступность»:

Если выбранное вами имя свободно, его можно получить бесплатно, нажав на зелёную кнопку «Оформить заказ»:

На следующем шаге нужно выбрать, в течение какого периода будет доступен выбранный вами домен. Бесплатно пользоваться доменом можно максимум 1 год с момента создания. Для выбора периода необходимо раскрыть меню Period и выбрать нужное значение:

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

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

После авторизации необходимо перейти в меню Services, далее выбрать My Domains:

В открывшемся разделе будут находиться все ваши домены:

Следующий этап – добавление записей типа A и TXT. Для этого нажмите на Manage Domain справа от имени домена и в открывшемся окне перейдите в раздел Manage-Freenom DNS:

Необходимо добавить следующие записи:
A 3600 A 300 WWW A 300 TXT 3600
Узнать внешний IP-адрес можно при помощи утилиты wget:
wget -O - -q icanhazip.com

В итоге должны быть созданы следующие DNS записи:

Чтобы сохранить, необходимо нажать на кнопку «Save Changes».
Установка certbot и let’s encrypt
Следующий шаг – установка пакетов certbot и let’s encrypt.
Certbot — это ACME-клиент, который автоматически создаёт и устанавливает сертификаты, не требуя остановки или перезапуска web-сервера. Данный клиент рекомендует использовать сам let’s encrypt.
Для установки данных пакетов необходимо выполнить команду:
sudo apt -y install certbot letsencrypt

Далее нужно сгенерировать сертификаты для созданного домена. Для этого воспользуйтесь командой:
sudo certbot certonly --manual --agree-tos --email --preferred-challenges=dns -d
Где вместо необходимо прописать свой адрес электронной почты, а вместо — имя домена, который был зарегистрирован.
При появлении сообщения:
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let’s Encrypt project and the non-profit
organization that develops Certbot? We’d like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
в терминале нужно ввести N и нажать на Enter:

При появлении сообщения:
Please deploy a DNS TXT record under the name
_acme-challenge.my-nexus-repository.tk with the following value:
необходимо, не нажимая клавишу «Enter», вернуться в панель регистрации DNS записей freenom и создать TXT запись для домена:
_ACME-CHALLENGE TXT 3600
Вместо требуется вписать значение, которое выведет программа:

DNS запись должна выглядеть следующим образом:

После сохранения изменений надо дождаться, когда запись будет зарегистрирована. Данный процесс может занять 10 минут и более. Проверить, зарегистрирована ли запись, можно с помощью команды:
dig _acme-challenge.my-nexus-repository.tk txt +short

Где вместо my-nexus-repository.tk необходимо вписать свой ранее созданный домен. После того как команда вернет ранее записанное значение из команды при генерации сертификатов, можно нажимать на клавишу «Enter».
В результате будут сгенерированы 4 файла c сертификатами, которые сохранятся в /etc/letsencrypt/live/. В данном случае домен называется my-nexus-repository.tk, поэтому сертификаты находятся по пути /etc/letsencrypt/live/my-nexus-repository.tk:

Настройка Nginx в качестве reverse proxy
Следующий этап – настройка веб-сервера Nginx в качестве обратного прокси.
Обратный прокси-сервер – это компьютер (или сервер), который обрабатывает запросы из сети интернет и перенаправляет их на компьютер(ы) внутренней сети.
Nginx так же, как и Nexus, будет развернут в контейнере Docker.
Для начала создаем директорию, в которой будут хранится все файлы:
mkdir nginx && cd nginx
Далее в данную директорию необходимо скопировать ранее сгенерированные сертификаты. В моем случае сертификаты находятся в директории /etc/letsencrypt/live/my-nexus-repository.tk, поэтому в данном случае команда будет выглядеть следующим образом:
cp *.pem /home/alex/nginx/
Сразу после копирования сертификатов нужно выставить владельца и права на сами сертификаты. В качестве владельца будет задан текущий пользователь сессии, а права будут выставлены как 600 (только владелец файла может читать/записывать):
sudo chown USER *pem chmod 600 *pem
Далее создаем и сохраняем Dockerfile со следующим содержимым:
FROM nginx COPY ./nginx.conf /etc/nginx/nginx.conf
Также необходимо создать конфигурационный файл со следующими настройками для Nginx, который будет проброшен в контейнер:
worker_processes 1; events < worker_connections 1024; >http < error_log /var/log/nginx/error.log warn; access_log /dev/null; proxy_intercept_errors off; proxy_send_timeout 120; proxy_read_timeout 300; server < listen 8080 default_server; server_name my-nexus-repository.tk; return 301 https://request_uri; >server < listen 443 ssl; server_name my-nexus-repository.tk; #Allow upload of large files, #needed if Nexus is going to host large size artifacts #client_max_body_size 20G; #Add the certificate and key generated earlier ssl_certificate /etc/nginx/conf.d/cert.pem; ssl_certificate_key /etc/nginx/conf.d/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; location / < proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto "https"; proxy_pass http://172.17.0.2:8081; >location /v2/ < proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto "https"; proxy_pass http://172.17.0.2:8082; >> >
Здесь необходимо внести следующие правки.
Вместо my-nexus-repository.tk вписать свой ранее зарегистрированный домен (параметр server_name в директивы http и server).
В директиве server в параметре client_max_body_size можно задать необходимый максимально допустимый размер тела запроса клиента. В контексте использования Nexus это будет применимо, если хранимые артефакты занимают много места. В данном примере указано 20 ГБ. Это означает, что загрузить артефакт более 20 ГБ не получится и Nginx вернет ошибку 413 Request Entity Too Large.
В директивах location / и location /v2/ в параметре proxy_set_header X-Forwarded-Proto необходимо прописать IP-адрес контейнера с Nexus.
Для того чтобы узнать IP адрес контейнера, нужно выполнить команду:
docker inspect | grep IP
Где вместо требуется подставить ID контейнера с Nexus. Узнать ID контейнера можно при помощи команды docker ps:

IP-адрес будет находиться в параметре IPAddress.
После того как конфигурационный файл приведен к соответствующему виду, необходимо собрать образ контейнера Nginx, передав ему конфигурационный файл nginx:
docker build -t nginx-ssl .

Как только сборка контейнера будет завершена, можно запустить контейнер с Nginx с публикацией портов 8080 и 443:
docker run -d -p 8080:8080 -p 443:443 --name nginx -v $(pwd):/etc/nginx/conf.d --restart unless-stopped nginx-ssl

Дождаться, когда контейнер с Nginx перейдет в статус Up:

После этого в браузере необходимо перейти по адресу https://имя_вашего_домена. В данном случае имя домена — my-nexus-repository.tk:

Можно увидеть значок защищенного соединения:

и действительный сертификат:
Установка и использование Nexus Repository для хранения артефактов
При разработке программного обеспечения разработчики оперируют таким понятием как «артефакт». Артефакт представляет собой элемент (часть) разрабатываемого программного продукта. К артефактам относятся исполняемые и бинарные файлы, пакеты программ и т.д.
С расширением архитектуры и функционала разрабатываемого продукта количество артефактов начинает неуклонно расти. Появляется потребность в хранение большого количества артефактов. Для решения данной проблемы существует специальный класс программ — менеджеры репозиториев, которые позволяют эффективно хранить и управлять артефактами.
Одним из таких решений является продукт от американской компании Sonatype под названием Nexus Repository. Nexus поддерживает более 15 различных форматов артефактов среди которых можно выделить APT, Docker, Go, Helm, Maven, npm, PyPi и другие. С полным списком поддерживаемых артефактов можно ознакомиться в документации Nexus .
Существует 2 версии Nexus Repository: бесплатная и коммерческая. Отличие коммерческой от бесплатной версии заключается в наличии клиентской поддержки, а также большего числа поддерживаемых артефактов.
В этой статье мы будем устанавливать бесплатную версию.
Предварительные требования
- Сервер с любым дистрибутивом и версией Linux, который поддерживает Java 8 версии. Помимо Linux, Nexus также поддерживает установку на ОС семейства Windows и MacOS.
- Минимум 4-ядерный процессор. Рекомендуется использовать 8-ядерный и более.
- Оперативная память желательно не менее 8 ГБ.
- Наличие минимум 50 ГБ свободного места на жестком диске. В данный минимум не включено место, которое занимает операционная система и сторонние установленные программы. Если места будет недостаточно, Nexus не запустится.
- Наличие предустановленной Java 8 версии. В инструкции мы также опишем этот процесс.
На официальном сайте Sonatype также приведены примеры системных требований для определенного количества репозиториев и хранящихся в них артефактов.
Установка Nexus Repository
1. Первым делом установим Java. Для этого сначала обновляем списки пакетов:
sudo apt update
2. Далее переходим к установке Java 8 версии, используя пакет OpenJDK :
sudo apt -y install openjdk-8-jre-headless
После установки проверяем, что Java установилась корректно, используя команду для вывода версии Java:
java -version
Если у вас установлено несколько версий Java, то необходимо переключиться на 8 версию. На сервере возможно присутствие двух и более версий Java, но использовать можно только одну. Для того чтобы переключиться на 8 версию Java, необходимо выполнить команду:
sudo update-alternatives --config java
В открывшемся интерактивном меню необходимо выбрать нужную версию Java при помощи клавиши TAB, далее подтвердить выбор, нажав Enter.
Следующие шаги относятся непосредственно к установке самого Nexus. Установка будет произведена в директорию /opt .
3. Скачиваем архив с программой из официального сайта при помощи утилиты wget :
sudo wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz
4. Разархивируем скачанный архив в директорию /opt :
sudo tar -zxvf latest-unix.tar.gz -C /opt
5. На выходе будет создано 2 директории: sonatype-work и nexus-3.61.0-02 , где 3.61.0-02 — это текущая версия Nexus. Архив с именем latest-unix всегда содержит последнюю актуальную версию. Со временем версия будет изменяться. В директории sonatype-work содержатся временные файлы, кэш-файлы и лог-файлы. Для удобства, изменяем название директории nexus-3.61.0-02 на nexus :
sudo mv nexus-3.61.0-02/ nexus/
6. Для безопасной работы Nexus необходимо создать пользователя с именем nexus :
sudo adduser nexus
Далее необходимо отключить возможность входа на сервер под этим пользователем. Для этого выполните команду:
usermod nexus -s
Также для пользователя nexus необходимо отключить вход по паролю. Открываем файл sudoers при помощи команды:
sudo visudo
Находим строку с комментарием # User privilege specification и добавляем следующую запись:
nexus ALL=(ALL) NOPASSWD: ALL
Сохраняем файл и выходим из него.
7. Назначаем владельца и группу для директорий /opt/nexus и /opt/sonatype-work , задав в качестве владельца ранее созданного пользователя nexus :
sudo chown -R nexus:nexus nexus/ sonatype-work/
8. Открываем конфигурационный файл nexus.rc , который располагается в /opt/nexus/bin/ , при помощи любого текстового редактора.
sudo nano /opt/nexus/bin/nexus.rc
Удаляем символ # (символ комментария) и указываем пользователя с именем nexus .
Сохраняем файл и выходим из него.
9. Чтобы запускать, останавливать и перезапускать Nexus, необходимо создать systemd unit-файл. Создаем файл с именем nexus.service :
sudo nano /etc/systemd/system/nexus.service
Со следующим содержимым:
[Unit]
Description=nexus service
After=network.target
[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
User=nexus
Restart=on-abort
[Install]
WantedBy=multi-user.target
Сохраняем файл и выходим из него.
10. Запускаем nexus :
sudo systemctl start nexus
И проверяем его статус:
systemctl status nexus
Если в статусе отображается active , значит, Nexus успешно запущен.
11. Далее добавляем Nexus в автозагрузку:
sudo systemctl enable nexus
Полный запуск Nexus занимает в среднем 2-3 минуты. Готовность программы можно проверить в файле nexus.log :
tail -f /opt/sonatype-work/nexus3/log/nexus.log
Started Sonatype Nexus OSS
По умолчанию веб интерфейс Nexus доступен с любых IP-адресов ( 0.0.0.0 ) и слушает порт 8081 :
Главное меню веб-интерфейса Nexus:
Первичная настройка Nexus
При первом входе в веб-интерфейс Nexus нам предложат настроить несколько параметров. Для авторизации необходимо нажать на кнопку « Sign in», которая находится справа сверху.
По умолчанию в Nexus присутствует один пользователь с именем admin , который обладает полномочиями администратора. При первом входе необходимо получить пароль:
Для этого на сервере, где установлен Nexus, необходимо выполнить команду:
cat /opt/sonatype-work/nexus3/admin.password
Полученный пароль используем для входа и нажимаем на кнопку « Sign in» .
Далее необходимо произвести первичную настройку Nexus:
Придумываем новый пароль для пользователя admin:
Далее нам предложат включить или отключить анонимный доступ. При включенном анонимном доступе каждый пользователь, имеющий адрес репозитория, сможет искать, просматривать и скачивать артефакты без аутентификации. Если же анонимный доступ выключить, то для работы с репозиториями потребуется аутентификация при помощи логина и пароля:
На последнем шаге программа уведомляет, что настройка успешно выполнена и можно начать использовать Nexus Repository:
Создание репозитория для хранения Docker-образов
Для того чтобы создать репозиторий для Docker-образов, необходимо перейти в веб-интерфейс Nexus и авторизоваться под учетной записью администратора.
Далее в главном меню нажать на кнопку Server administration and configuration (значок шестеренки):
В левом меню выбрать пункт Repositories :
Далее нажать на кнопку Create repository :
Выбрать из списка репозиторий с именем docker (hosted) :
Nexus поддерживает 3 различных типа репозиториев:
- hosted — тип репозитория, в котором артефакты хранятся напрямую в Nexus;
- proxy — тип репозитория, который проксирует запросы на удаленный репозиторий. Перед отправкой запроса на наличие требуемого артефакта Nexus проверяет локальное содержимое репозитория, и, если артефакт не найден, запрос перенаправляется в удаленный репозиторий. В качестве примера можно привести репозитории APT.
- group — тип репозитория, который объединяет несколько репозиториев одного и того же формата в одну общую группу. Эта общая группа и связанный с ней URL-адрес могут использоваться в качестве единой точки доступа ко всем компонентам в определенном формате, полученным из нескольких репозиториев.
Придумываем имя для репозитория, например docker-images . Напротив параметра HTTP ставим чекбокс и задаем любой порт, который не занят на сервере, где установлен Nexus, например, 8083:
Для взаимодействия с репозиториями Docker Nexus использует коннекторы (connectors), которые позволяют задать порт, тем самым открывая доступ к репозиторию по протоколу HTTP или HTTPS. Однако по умолчанию Nexus доступен только по протоколу HTTP. Если попытаться выполнить команду docker login на хосте, указав адрес реестра и порт репозитория и используя при этом протокол HTTP, то Docker отобразит ошибку http: server gave HTTP response to HTTPS client .
По умолчанию Docker не поддерживает работу с репозиториями, которые используют самоподписанные сертификаты, а также репозитории по протоколу HTTP. Для того чтобы разрешить работу с репозиториями по протоколу HTTP, необходимо создать (если отсутствует) файл daemon.json , который располагается в /etc/docker/ .
sudo nano /etc/docker/daemon.json
И прописать следующий блок:
"insecure-registries" : ["91.100.100.1000:8083"]
>
Где 91.100.100.1000:8083 — адрес, на котором располагается Nexus, и HTTP порт от репозитория Docker, который был задан ранее в веб-интерфейсе.
Сохраняем файл и выходим из него.
После этого необходимо перезапустить демон Docker:
sudo systemctl restart docker
Будьте внимательны, так как перезапуск агента Docker затронет работающие контейнеры. Часть из них не будет запущена автоматически, при условии, что контейнер не был ранее запущен с опцией —restart=always .
Далее выполняем команду docker login , указав в качестве адреса репозитория адрес, на котором находится Nexus, и порт от репозитория:
docker login 91.100.100.1000:8083
В качестве логина можно воспользоваться учетной записью администратора — admin .
Проверим, сможем ли мы сделать push (отправить образ в репозиторий). Для этого возьмем образ с alpine :
Присвоим образу тег. Формат тега для Docker образов имеет следующий вид:
образ:тег адрес реестра:порт репозитория/имя_образа
docker tag alpine:latest 91.100.100.1000:8083/alpine-test
Проверяем, что у нас появился новый образ:
Для того чтобы выполнить push в репозиторий, воспользуемся командой:
docker push 91.100.100.1000:8083/alpine-test
Переходим в веб-интерфейс Nexus, далее в созданный ранее репозиторий и видим, что образ успешно появился:
Настройка HTTPS
Правильным решением при работе с репозиториями Docker является использование протокола HTTPS. Для настройки HTTPS в Nexus выполняем следующие шаги:
1. Переходим в директорию /opt/nexus/etc/ssl :
cd /opt/nexus/etc/ssl
2) Для генерации самоподписанного сертификата воспользуемся утилитой keytool .
keytool представляет собой утилиту командной строки для создания ключей и сертификатов. Также является хранилищем ключей для Java. Воспользуемся следующей командой для создания сертификата:
sudo keytool -genkeypair -keystore keystore.jks -storepass test12345 -keypass test12345 -alias jetty -keyalg RSA -keysize 2048 -validity 1000 -dname "CN=*.$, OU=test, O=test1, L=Unspecified, ST=Unspecified, C=RU" -ext "SAN=DNS:nexus-repo.com,IP:91.10.10.00" -ext "BC=ca:true"
Значения, выделенные красным цветом, необходимо заменить на свои:
- -keystore keystore.jks — имя файла, в котором будет сохранен ключ. Используется формат .jks ;
- -storepass test12345 — задается пароль для доступа к хранилищу ключей;
- -keypass test12345 — задается пароль для доступа к закрытому ключу;
- -ext «SAN=DNS: nexus-repo.com ,IP: 91.10.10.00 » — задается доменное имя и IP-адрес сервера, на котором находится Nexus.
Если в качестве доменного имени будет использоваться локальный домен, то его необходимо прописать в файле /etc/hosts (для Linux) и C:\Windows\System32\drivers\etc\hosts в Windows.
3. Далее извлекаем сертификат сервера из созданного файла с именем keystore.jks при помощи команды:
sudo keytool -export -alias jetty -keystore keystore.jks -rfc -file nexus.cert
nexus.cert — имя файла с сертификатом, которое будет получено на выходе.
4. Далее переходим к редактированию конфигурационного файла nexus-default.properties , который находится в /opt/nexus/etc :
sudo nano /opt/nexus/etc/nexus-default.properties
Находим блок, содержащий строку с комментарием # Jetty section , и прописываем следующий параметр:
application-port-ssl=8443
Так мы задаем порт, на котором будет доступен HTTPS.
В этом же блоке прописываем следующую строчку с параметром:
nexus-args=$/jetty.xml,$/jetty-http.xml,$/jetty-https.xml,$/jetty-requestlog.xml
5. Далее редактируем файл jetty-https.xml , который находится в /opt/nexus/etc/jetty :
sudo nano /opt/nexus/etc/jetty/jetty-https.xml
Находим блок с именем sslContextFactory .
В строках KeyStorePassword , KeyManagerPassword , TrustStorePassword прописываем пароль, который был задан на этапе генерации сертификата. В нашем примере пароль — test12345 .
Также в параметрах KeyStorePath и TrustStorePath можно задать имя сгенерированного сертификата:
6. После внесения всех изменений перезапускаем сервис nexus :
sudo systemctl restart nexus
В ОС Linux сертификат должен быть установлен на уровне ОС, иначе при попытке авторизоваться в репозитории при помощи команды docker login появится ошибка:
x509: certificate signed by unknown authority
Для установки сертификата в системах Ubuntu/Debian выполняем следующие шаги:
1. Устанавливаем пакет ca-certificates :
sudo apt -y install ca-certificates
2. Установить сертификат можно только в формате .crt Другие форматы не поддерживаются. Так как на выходе файл сертификата был с расширением .cert , необходимо изменить расширение на .crt .
Для этого выполняем команду:
sudo mv nexus.cert nexus.crt
Копируем сертификат в директорию /usr/local/share/ca-certificates :
sudo cp nexus.crt /usr/local/share/ca-certificates
3. Установка сертификата выполняется при помощи команды:
sudo update-ca-certificates
Для того чтобы настроить HTTPS в репозитории, необходимо перейти в веб-интерфейс Nexus, авторизоваться под учетной записью администратора. Далее в главном меню нажать на кнопку Server administration and configuration (значок шестеренки). В левом меню выбрать пункт Repositories , далее найти необходимый репозиторий. Напротив параметра HTTPS ставим чекбокс и задаем любой порт, который не занят на сервере, где установлен Nexus, например 8344:
Сохраняем изменения. На сервере выполняем команду docker login , указав в качестве адреса репозитория адрес, на котором находится Nexus, и порт HTTPS от репозитория:
docker login nexus-repo.com:8344
В качестве логина можно воспользоваться учетной записью администратора — admin .
Проверим, сможем ли мы сделать push (отправить образ в репозиторий). Для этого возьмем образ с nginx :
Присвоим образу тег. Формат тега для Docker образов имеет следующий вид:
образ:тег адрес реестра:порт репозитория/имя_образа
docker tag nginx:latest nexus-repo.com:8344/nginx-test
Проверяем, что у нас появился новый образ:
Для того чтобы выполнить push в репозиторий, воспользуемся командой:
docker push nexus-repo.com:8344/nginx-test
Переходим в веб-интерфейс Nexus, далее в созданный ранее репозиторий и видим, что образ успешно появился:
Заключение
Nexus Repository является отличным решением для хранения и управления артефактами. Благодаря поддержке большого количества различных форматов артефактов данный продукт подойдет как небольшим командам разработки, так и более крупным.