MAATRIX / Блог / Nexus Repository на Ubuntu 24.04: пошаговая установка

Nexus Repository на Ubuntu 24.04: пошаговая установка

MAATRIX

Когда в проекте уже есть Maven-сборки, приватные npm-пакеты и свой Docker registry, держать три разных сервиса для трёх типов артефактов — это лишняя головная боль: три точки отказа, три бэкапа, три способа настройки доступа. Nexus Repository закрывает это одним сервисом: он умеет быть и Maven-репозиторием, и npm-реестром, и Docker registry, и прокси для PyPI — всё через один веб-интерфейс и один процесс на сервере. Ниже — установка Nexus Repository OSS на чистый Ubuntu 24.04, от подготовки системы до рабочих репозиториев под каждый тип пакетов.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Nexus Repository и когда он нужен

Nexus Repository (Sonatype) — это менеджер артефактов, который решает три задачи одновременно:

  • Hosted-репозитории — место, куда ваша CI/CD публикует собранные пакеты (свои jar, npm-модули, Docker-образы).
  • Proxy-репозитории — кэширующий прокси перед публичными реестрами (Maven Central, npmjs.org, Docker Hub, PyPI). Сборки перестают зависеть от доступности внешних серверов и качают повторно используемые пакеты из локального кэша.
  • Group-репозитории — объединяют hosted и proxy под одним URL, так что клиенту (Maven, npm, docker) не нужно знать, откуда физически пришёл пакет.

Для небольшой команды с одним стеком (например, только Docker) хватило бы отдельного приватного Docker registry. Nexus имеет смысл ставить, когда типов артефактов больше одного и хочется единую точку контроля доступа, единый бэкап и единую систему очистки старых версий (cleanup policies). Есть нюанс: OSS-редакция Nexus Repository 3 не бесплатна навечно в плане поддержки — Sonatype периодически меняет условия лицензирования и состав функций между community и pro версиями, поэтому перед продакшен-внедрением стоит свериться с актуальной лицензией на официальном сайте на момент установки.

Требования к серверу и подготовка Ubuntu 24.04

Nexus — процесс на JVM, и он охотно ест память под кэш метаданных и Java-хип. Официальные рекомендации Sonatype для продакшена — от 8 ГБ RAM, но для тестового стенда или небольшой команды реально запустить и на 4 ГБ, ужав хип. Диск считайте отдельно под каждый тип артефактов: Docker-образы и Maven-снапшоты растут быстрее всего, если не настроить cleanup policies с первого дня.

Минимальный набор для старта:

ПараметрМинимум (тест)Рекомендуется (прод)
CPU2 vCPU4 vCPU
RAM4 ГБ8+ ГБ
Диск30 ГБ SSD100+ ГБ SSD, отдельный раздел под blob store
JavaOpenJDK 17OpenJDK 17

Обновляем систему и ставим Java — актуальные ветки Nexus Repository 3 работают на Java 17, более старые версии Java не подойдут:

apt update && apt upgrade -y
apt install -y openjdk-17-jdk-headless curl wget tar
java -version

Если на сервере уже крутится что-то ещё на JVM с другой версией Java, зафиксируйте нужную через update-alternatives --config java, чтобы Nexus не подхватил чужой JDK случайно.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка Nexus Repository OSS

Sonatype не публикует официальный apt-репозиторий — ставится он из tar.gz-архива. Заходим на страницу загрузок https://help.sonatype.com/repomanager3/product-information/download и берём актуальную ссылку на unix-архив — версия меняется, поэтому вставляйте свежий URL вместо примера ниже:

mkdir -p /opt/nexus-install && cd /opt/nexus-install
wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz -O nexus.tar.gz
tar -xzf nexus.tar.gz -C /opt

После распаковки в /opt появятся две директории: nexus-3.x.x-xx (сам движок) и sonatype-work (данные — конфиги, база метаданных, blob store с артефактами). Делаем симлинк на версию, чтобы обновления не ломали пути в systemd-юните:

ln -s /opt/nexus-3.* /opt/nexus

Nexus нельзя запускать от root — сервис сам откажется стартовать. Создаём отдельного пользователя и отдаём ему обе директории:

useradd -r -s /bin/false nexus
chown -R nexus:nexus /opt/nexus-3.* /opt/sonatype-work

Прописываем пользователя в bin/nexus.rc:

echo 'run_as_user="nexus"' > /opt/nexus/bin/nexus.rc

Теперь systemd-юнит:

# /etc/systemd/system/nexus.service
[Unit]
Description=Nexus Repository Manager
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
TimeoutSec=600

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now nexus

Первый старт долгий — Nexus инициализирует базу метаданных (встроенный OrientDB/H2 в зависимости от версии) и создаёт структуру blob store. Следите за логом:

tail -f /opt/sonatype-work/nexus3/log/nexus.log

Появление строки Started Sonatype Nexus OSS означает, что веб-интерфейс поднялся на порту 8081.

Первый запуск и настройка через веб-интерфейс

Если сервер за файрволом — по умолчанию в Ubuntu 24.04 с ufw всё закрыто, — откройте порт для первичной настройки:

ufw allow 8081/tcp

Идём на http://IP-сервера:8081, логинимся как admin, пароль лежит в файле, который Nexus сгенерировал при первом запуске:

cat /opt/sonatype-work/nexus3/admin.password

Мастер настройки (Setup Wizard) попросит:

  1. Сменить пароль admin на постоянный.
  2. Включить или отключить анонимный доступ (для приватного репозитория — выключить, читать/писать смогут только авторизованные пользователи).
  3. Задать Base URL, если сервис будет доступен не по IP, а по домену за reverse proxy.

Сразу после мастера стоит настроить хип JVM под реальный объём RAM сервера — файл /opt/sonatype-work/nexus3/etc/nexus.vmoptions (если его нет, создаётся автоматически при первом запуске рядом с bin):

-Xms2703m
-Xmx2703m
-XX:MaxDirectMemorySize=2703m

Значения по умолчанию Sonatype считает от объёма RAM автоматически, но на серверах с 4 ГБ лучше явно ограничить хип и оставить памяти системе — иначе JVM может съесть всё и уронить SSH-сессию через OOM killer.

Настройка репозиториев Maven, npm, Docker и PyPI

Всё управление репозиториями — в разделе Administration → Repository → Repositories. Для каждого типа пакетов логика одна и та же: создаёте proxy (кэш к публичному реестру), при необходимости hosted (для своих публикаций) и group (объединённая точка входа).

Maven. По умолчанию в свежей установке уже есть maven-central (proxy), maven-releases и maven-snapshots (hosted), объединённые в maven-public. В ~/.m2/settings.xml указываете mirror на http://nexus-host:8081/repository/maven-public/.

npm. Создаёте proxy на https://registry.npmjs.org, hosted для своих пакетов, group npm-public. У клиента:

npm config set registry http://nexus-host:8081/repository/npm-public/

PyPI. Аналогично: proxy на https://pypi.org, group для чтения. В pip.conf:

[global]
index-url = http://nexus-host:8081/repository/pypi-public/simple/

Docker. Здесь есть особенность: Docker-репозиторий в Nexus требует отдельного HTTP/HTTPS-коннектора с собственным портом (например, 8082 для hosted, 8083 для proxy на Docker Hub) — их задаёте при создании репозитория в поле "HTTP" / "HTTPS". Docker-демон по умолчанию требует TLS для registry, поэтому для теста без сертификата на клиенте нужно добавить хост в insecure-registries:

// /etc/docker/daemon.json
{
  "insecure-registries": ["nexus-host:8082"]
}

Для прод-окружения TLS лучше не пропускать — терминировать его на nginx перед Nexus, как описано ниже.

Nginx reverse proxy, HTTPS и обслуживание

Отдавать Nexus напрямую по 8081 наружу — плохая идея: нет TLS, нет единого домена, порт светится в логах сканеров. Ставим nginx как reverse proxy перед Nexus:

server {
    listen 443 ssl;
    server_name nexus.example.com;

    ssl_certificate     /etc/letsencrypt/live/nexus.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nexus.example.com/privkey.pem;

    client_max_body_size 1G;

    location / {
        proxy_pass http://127.0.0.1:8081;
        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 $scheme;
    }
}

client_max_body_size обязателен большой — иначе загрузка крупных Docker-слоёв или jar-файлов будет обрываться на 413. Docker-registry порты (8082/8083) удобнее вынести на отдельные server-блоки с своими поддоменами, чтобы не путать пути между Maven/npm API и Docker Registry API v2.

После того как трафик пошёл через 443, закрываем 8081 и служебные порты Docker-registry для внешнего мира и оставляем открытым только для nginx (127.0.0.1) и, при необходимости, для CI-раннеров изнутри приватной сети:

ufw delete allow 8081/tcp

Бэкап. Nexus хранит два типа данных отдельно: метаданные (база) и сами файлы (blob store, обычно /opt/sonatype-work/nexus3/blobs). В Administration → System → Tasks создайте задачу типа "Admin - Compact blob store" для регулярного сжатия и отдельно настройте резервное копирование каталога sonatype-work целиком через cron и rsync/restic на внешнее хранилище — штатного "экспорта в один клик" для полного бэкапа в OSS-редакции нет, поэтому проще всего останавливать сервис на время снапшота диска или бэкапить через файловый бэкап с короткой паузой сервиса ночью.

Обновление. Версии выходят часто, механизм тот же, что и установка: скачать новый tar.gz, распаковать рядом, остановить сервис, переключить симлинк /opt/nexus на новую версию, стартовать. Данные в sonatype-work не трогаются и переживают обновление движка.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Nexus не стартует, в логе ошибка про Java.

Проверьте java -version — должна быть Java 17 (или та версия, которую требует ваша конкретная версия Nexus, сверьте с release notes). Старые OpenJDK 8/11 для актуальных релизов Nexus 3 не подходят.

Веб-интерфейс висит на "Nexus is initializing", долго не открывается.

Это нормально при первом запуске на слабом диске — идёт инициализация базы метаданных. Смотрите nexus.log, дождитесь строки Started Sonatype Nexus OSS, обычно занимает от 30 секунд до нескольких минут в зависимости от диска.

Docker push падает с ошибкой TLS / x509.

Либо добавьте registry в insecure-registries для теста, либо (правильный путь для прод) выпустите нормальный сертификат через nginx-проксирование, как в разделе про reverse proxy — Docker Registry API строг к сертификатам и просто так самоподписанные не принимает без явного разрешения на клиенте.

Диск быстро заканчивается из-за старых Docker-образов и SNAPSHOT-сборок.

Настройте Cleanup Policies (Administration → Repository → Cleanup Policies) с условиями по возрасту и количеству версий, привяжите их к нужным репозиториям и запускайте задачу очистки по расписанию — без этого blob store растёт бесконтрольно.

Сколько памяти реально закладывать под маленькую команду (3-5 разработчиков)?

Ориентировочно 4 ГБ хватает для старта с одним-двумя типами репозиториев, но это не измеренный бенчмарк — зависит от количества параллельных сборок и размера кэша прокси, при росте нагрузки стоит закладывать запас и мониторить потребление через jstat или встроенные метрики JVM.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →