Что такое Nexus Repository?

Nexus Repository — это универсальный менеджер репозиториев от Sonatype, который поддерживает множество форматов артефактов включая Maven, NPM, Docker, PyPI, NuGet и многие другие. Nexus обеспечивает централизованное управление зависимостями и артефактами сборки.

Основные возможности Nexus Repository

  • Множественные форматы — поддержка 30+ форматов репозиториев
  • Proxy репозитории — кеширование внешних зависимостей
  • Hosted репозитории — хранение собственных артефактов
  • Group репозитории — объединение нескольких репозиториев
  • Security — сканирование уязвимостей и управление доступом
  • REST API — программное управление и интеграция

Когда использовать Nexus Repository

Nexus Repository идеально подходит для:

  • Централизованного управления зависимостями в enterprise среде
  • Кеширования внешних репозиториев для ускорения сборок
  • Хранения приватных артефактов и библиотек
  • Обеспечения безопасности supply chain
  • Интеграции с CI/CD пайплайнами

Установка Nexus Repository

Установка через Docker:

1# Запуск Nexus в Docker
2docker run -d -p 8081:8081 \
3  -v nexus-data:/nexus-data \
4  --name nexus \
5  sonatype/nexus3
6
7# Получение admin пароля
8docker exec nexus cat /nexus-data/admin.password

Docker Compose конфигурация:

 1version: '3.8'
 2services:
 3  nexus:
 4    image: sonatype/nexus3:latest
 5    container_name: nexus
 6    ports:
 7      - "8081:8081"
 8    volumes:
 9      - nexus-data:/nexus-data
10    environment:
11      - INSTALL4J_ADD_VM_PARAMS=-Xms2g -Xmx2g -XX:MaxDirectMemorySize=3g
12    restart: unless-stopped
13
14volumes:
15  nexus-data:

Настройка Maven репозитория

Конфигурация settings.xml для Maven:

 1<?xml version="1.0" encoding="UTF-8"?>
 2<settings>
 3  <mirrors>
 4    <mirror>
 5      <id>nexus</id>
 6      <mirrorOf>*</mirrorOf>
 7      <url>http://localhost:8081/repository/maven-public/</url>
 8    </mirror>
 9  </mirrors>
10  
11  <servers>
12    <server>
13      <id>nexus-snapshots</id>
14      <username>admin</username>
15      <password>admin123</password>
16    </server>
17    <server>
18      <id>nexus-releases</id>
19      <username>admin</username>
20      <password>admin123</password>
21    </server>
22  </servers>
23</settings>

Настройка в pom.xml:

 1<distributionManagement>
 2  <repository>
 3    <id>nexus-releases</id>
 4    <url>http://localhost:8081/repository/maven-releases/</url>
 5  </repository>
 6  <snapshotRepository>
 7    <id>nexus-snapshots</id>
 8    <url>http://localhost:8081/repository/maven-snapshots/</url>
 9  </snapshotRepository>
10</distributionManagement>

Настройка NPM репозитория

1# Настройка npm registry
2npm config set registry http://localhost:8081/repository/npm-group/
3
4# Настройка аутентификации
5npm login --registry=http://localhost:8081/repository/npm-hosted/
6
7# Публикация пакета
8npm publish --registry=http://localhost:8081/repository/npm-hosted/

Настройка Docker Registry

1# Логин в Nexus Docker registry
2docker login localhost:8082
3
4# Тегирование и push образа
5docker tag nginx:latest localhost:8082/nginx:latest
6docker push localhost:8082/nginx:latest
7
8# Pull образа
9docker pull localhost:8082/nginx:latest

Работа с REST API

Примеры использования REST API:

 1# Получение списка репозиториев
 2curl -u admin:admin123 \
 3  "http://localhost:8081/service/rest/v1/repositories"
 4
 5# Поиск компонентов
 6curl -u admin:admin123 \
 7  "http://localhost:8081/service/rest/v1/search?repository=maven-central&name=junit"
 8
 9# Загрузка артефакта
10curl -u admin:admin123 \
11  -F "maven2.groupId=com.example" \
12  -F "maven2.artifactId=my-app" \
13  -F "maven2.version=1.0.0" \
14  -F "maven2.asset1=@target/my-app-1.0.0.jar" \
15  -F "maven2.asset1.extension=jar" \
16  "http://localhost:8081/service/rest/v1/components?repository=maven-releases"

Настройка безопасности

Создание пользователей и ролей через API:

 1# Создание роли
 2curl -u admin:admin123 \
 3  -H "Content-Type: application/json" \
 4  -d '{
 5    "id": "developer",
 6    "name": "Developer",
 7    "description": "Developer role",
 8    "privileges": ["nx-repository-view-*-*-read", "nx-repository-view-*-*-add"]
 9  }' \
10  "http://localhost:8081/service/rest/v1/security/roles"
11
12# Создание пользователя
13curl -u admin:admin123 \
14  -H "Content-Type: application/json" \
15  -d '{
16    "userId": "developer1",
17    "firstName": "John",
18    "lastName": "Doe",
19    "emailAddress": "john.doe@example.com",
20    "password": "password123",
21    "status": "active",
22    "roles": ["developer"]
23  }' \
24  "http://localhost:8081/service/rest/v1/security/users"

Интеграция с CI/CD

Пример Jenkins pipeline:

 1pipeline {
 2  agent any
 3  
 4  stages {
 5    stage('Build') {
 6      steps {
 7        sh 'mvn clean compile'
 8      }
 9    }
10    
11    stage('Test') {
12      steps {
13        sh 'mvn test'
14      }
15    }
16    
17    stage('Deploy to Nexus') {
18      steps {
19        sh 'mvn deploy -s settings.xml'
20      }
21    }
22  }
23}

Мониторинг и метрики

Nexus предоставляет JMX метрики и health check endpoints:

1# Health check
2curl http://localhost:8081/service/rest/v1/status
3
4# Metrics (требует Nexus Pro)
5curl -u admin:admin123 \
6  http://localhost:8081/service/rest/v1/metrics

Best Practices

  • Используй proxy репозитории для кеширования внешних зависимостей
  • Настраивай cleanup policies для управления дисковым пространством
  • Регулярно создавай резервные копии blob store
  • Мониторь использование ресурсов и производительность
  • Используй LDAP/AD интеграцию для управления пользователями

FAQ

Подходит ли Nexus Repository для продакшена?

Да, Nexus Repository широко используется в корпоративных средах и поддерживает миллионы разработчиков по всему миру.

Какие требования к инфраструктуре?

Минимальные требования: 4 ГБ RAM, 2 CPU cores, 100 ГБ дискового пространства. Для production рекомендуется больше ресурсов в зависимости от нагрузки.

В чем разница между OSS и Pro версиями?

Pro версия включает дополнительные функции: сканирование уязвимостей, staging репозитории, расширенные метрики, поддержку высокой доступности.