Nexus Repository — менеджер артефактов от Sonatype. Он выступает прокси-кэшем для внешних репозиториев, хранилищем собственных сборок и группой, которая объединяет несколько источников под одним адресом. Для команды это означает независимость от доступности Maven Central, сохранность версий и единые правила доступа. Разберём установку, типы репозиториев, Docker-реестр, резервное копирование и диагностику.

Зачем нужен свой репозиторий

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

В закрытом контуре Nexus часто остаётся единственным способом доставлять зависимости. Внешний трафик отсутствует, поэтому администратор заранее наполняет hosted-репозитории, а прокси настраивает через разрешённый шлюз.

Установка

Самый быстрый путь — контейнер. Образ содержит JVM, поэтому отдельно ставить Java не нужно. Данные выносятся в том, иначе обновление образа сотрёт всё.

docker run -d --name nexus -p 8081:8081 -p 8082:8082 \
  -v nexus-data:/nexus-data \
  -e INSTALL4J_ADD_VM_PARAMS="-Xms2g -Xmx2g" \
  sonatype/nexus3

Для сервера без Docker ставят tar.gz и systemd-юнит. Каталог sonatype-work создаётся рядом с установкой; его нельзя класть на сетевую файловую систему без проверки блокировок.

sudo useradd -r -d /opt/nexus nexus
sudo tar -xzf nexus-*-linux-x64.tar.gz -C /opt
sudo chown -R nexus:nexus /opt/nexus /opt/sonatype-work
sudo systemctl enable --now nexus

В юните поднимите LimitNOFILE до 65536: при интенсивной сборке Nexus открывает много файлов и без запаса начинает отвечать ошибками.

Первый вход

Пароль администратора генерируется при старте и лежит в /nexus-data/admin.password. Смените его сразу и удалите файл. Анонимный доступ по умолчанию включён: для внутреннего репозитория это удобно, для публичного — нет.

Проверьте состояние через REST: код 200 и строка в поле status означают, что сервис готов. Если приходит 503, подождите — миграции схемы при первом запуске занимают минуты, а health-проверка всё это время будет красной.

NEXUS=http://localhost:8081
docker exec nexus cat /nexus-data/admin.password
curl -s -u admin:$NEXUS_PASS $NEXUS/service/rest/v1/status

Типы репозиториев

Proxy кэширует внешний источник. Hosted хранит ваши артефакты. Group объединяет несколько репозиториев и отдаёт их по одному URL в заданном порядке. Для Maven обычно создают group из maven-central, maven-releases и maven-snapshots.

Формат определяет протокол: maven2, npm, pypi, docker, raw, apt, yum. Для файлов, не подходящих ни под один формат, есть raw — он же используется для скриптов и установщиков.

curl -X POST -u admin:$NEXUS_PASS \
  -H 'Content-Type: application/json' \
  -d '{"name":"maven-group","storage":{"blobStoreName":"default"},"group":{"memberNames":["maven-central","maven-releases"]}}' \
  $NEXUS/service/rest/v1/repositories/maven/group

Docker-реестр

Docker hosted-репозиторий слушает отдельный порт, по умолчанию 8082. Если порт не проброшен, клиенты получат connection refused, хотя веб-интерфейс работает. Для HTTPS нужен либо reverse proxy, либо коннектор с сертификатом.

Тег должен строго соответствовать имени репозитория: сначала адрес и порт, затем имя репозитория, затем образ. Без этого docker push вернёт 404, а в логах останется невнятная ошибка.

docker login localhost:8082 -u admin
docker tag app:latest localhost:8082/docker-hosted/app:1.4.0
docker push localhost:8082/docker-hosted/app:1.4.0

Публикация артефактов

Через REST удобно заливать единичные файлы и автоматизировать релизы. Для Maven достаточно прописать distributionManagement в pom.xml, для npm — registry в .npmrc. В обоих случаях Nexus проверяет права по ролям, а при включённых content selectors — и по путям.

Не храните пароль в открытом виде в репозитории: используйте settings.xml с шифрованием или переменные CI.

curl -u admin:$NEXUS_PASS --upload-file app-1.4.0.jar \
  $NEXUS/repository/maven-releases/com/example/app/1.4.0/app-1.4.0.jar
npm config set registry $NEXUS/repository/npm-group/

Доступ и reverse proxy

Наружу Nexus отдают через nginx с TLS. Обязательно передавайте X-Forwarded-Proto и Host, иначе ссылки в интерфейсе и редиректы будут указывать на внутренний адрес. Порты 8081 и 8082 при этом закрывают файрволом.

Роли строятся из привилегий: чтение, запись, удаление, администрирование. Для CI заведите отдельного пользователя с правом записи только в нужный hosted-репозиторий. Пароли не переиспользуйте между средами.

server {
  listen 443 ssl;
  server_name nexus.example.ru;
  client_max_body_size 1g;
  location / {
    proxy_pass http://127.0.0.1:8081;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto https;
  }
}

Обслуживание и бэкап

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

Cleanup policies удаляют снапшоты и старые версии по расписанию. Без них диск заполняется за год: кэш растёт быстрее, чем кажется. Следите за свободным местом и включите компактизацию blob store. Проверяйте задания экспорта в разделе Tasks.

df -h /nexus-data
curl -s -u admin:$NEXUS_PASS $NEXUS/service/rest/v1/status/check

Диагностика

Логи лежат в sonatype-work/nexus3/log/nexus.log и karaf.log. Рост heap виден в метриках JVM, а ошибки вида «No space left on device» обычно означают, что blob store и метаданные на одном разделе.

  • 503 при старте — идёт миграция или не хватает памяти;
  • 401 в REST — неверный пароль или отключён realm;
  • 404 при push — имя репозитория не совпадает с путём;
  • медленная выдача — проверьте размер heap и диск.
docker logs --tail=100 nexus
curl -s -u admin:$NEXUS_PASS $NEXUS/service/rest/v1/status/check

Чек-лист

  • данные вынесены в том или отдельный раздел;
  • сменён пароль администратора, файл admin.password удалён;
  • настроены group-репозитории для сборки;
  • есть бэкап метаданных и blob store;
  • работают cleanup policies и мониторинг места;
  • TLS и ограничение портов на файрволе.

Итог

Nexus — не просто кэш, а точка контроля над зависимостями. Он делает сборки воспроизводимыми и снимает зависимость от внешних сервисов, но требует дисциплины: бэкапов, политик очистки и разделения прав.

Начните с одного proxy и одного hosted-репозитория, затем добавьте group и Docker. Такой порядок позволяет понять поток артефактов до того, как появятся десятки проектов и гигабайты кэша.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте