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. Такой порядок позволяет понять поток артефактов до того, как появятся десятки проектов и гигабайты кэша.