VK Dev Platform logo
Помощь
Обновлена 17 июля 2026 г. в 15:36

Миграция на Nexus CE 3.77.2

Миграция заключается в переносе данных из Nexus OSS версии 3.68.1, установленного на виртуальных машинах (ВМ), в Nexus CE версии 3.77.2, который устанавливается в Kubernetes.

Предварительные условия

  • Есть SSH-доступ к ВМ nexus-w с master-инстансом Nexus OSS.

  • Есть доступ к кластеру Kubernetes с ролью cluster admin.

  • Обновлены Zalando Postgres Operator до 1.14 и кластер Postgres до 17.

  • Объем свободного дискового пространства в файловой системе ВМ nexus-w превышает суммарный объем файлов blob-хранилища.

    Для проверки выполните команды в терминале ВМ nexus-w:

    $ sudo df -h /data$ sudo du -sh /data/nexus/blobs/

    Если объем недостаточен, увеличьте размер диска, смонтированного в каталог /data, или подключите дополнительный диск.

  • В конфигурации инсталлятора VK Dev Platform 1.7.0 размер Persistent Volume (PV) для хранения данных Nexus как минимум в два раза превышает суммарный объем файлов blob-хранилища.

Подготовка к миграции

  1. Сохраните Ingress nexus-oidc-proxy в файл:

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> get ing nexus-oidc-proxy -o yaml > nexus-oidc-proxy-ingress.yaml

    При необходимости резервная копия позволит восстановить исходное состояние приложения.

  2. Запустите редактирование Ingress nexus-oidc-proxy.

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> edit ing nexus-oidc-proxy
  3. Удалите из списка rules фрагмент:

    - host: nexus.<ДОМЕН>  http:    paths:    - backend:        service:          name: nexus-oidc-proxy          port:            number: 8080      path: /      pathType: Prefix- host: nx.<ДОМЕН>  http:    paths:    - backend:        service:          name: nexus-oidc-proxy          port:            number: 8080      path: /      pathType: Prefix- host: nxa.<ДОМЕН>  http:    paths:    - backend:        service:          name: nexus-oidc-proxy          port:            number: 8080      path: /      pathType: Prefix

    Причины удаления:

    • Хосты nx.<ДОМЕН> и nxa.<ДОМЕН> будут использоваться в Ingress нового экземпляра Nexus.
    • Хост nexus.<ДОМЕН> будет использоваться во временном Ingress, который будет создан далее.
    • Веб-интерфейс старого экземпляра Nexus (его master-инстанса) будет доступен на хосте nexus-master.<ДОМЕН>.

    Это позволит установить новый экземпляр Nexus без удаления компонентов старого, а также создать Ingress для миграции данных, используя существующие DNS-записи и SSL-сертификаты.

  4. Сохраните изменения.

Установка Nexus CE

Установка выполняется инсталлятором VK Dev Platform Shepherd. Подготовка и запуск инсталлятора описана в документе Руководство по установке VK Dev Platform.

Новый экземпляр Nexus CE устанавливается в то же пространство имен Kubernetes, где находятся компоненты старого экземпляра. Чтобы избежать конфликта имен, для нового экземпляра используется имя Helm-релиза nexusce.

После установки:

  1. В административной консоли Keycloak в домене dev-platform откройте свойства клиента nexus-sso-client и добавьте в список Valid Redirect URIs запись https://nexus-master.<ДОМЕН>/*.

    После установки в этом списке остается только запись для хоста nx.<ДОМЕН>. Добавление записи для хоста nexus-master.<ДОМЕН> позволит восстановить доступ к веб-интерфейсу старого экземпляра Nexus.

  2. Создайте манифест временного Ingress ingress.yaml для доступа к новому экземпляру Nexus в обход OIDC-прокси.

    Шаблон манифеста временного Ingress ingress.yaml:

    apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: nexuscespec:  ingressClassName: nginx  rules:    - host: nexus.<ДОМЕН>      http:        paths:          - backend:              service:                name: "nexusce-nxrm-ha"                port:                  number: 8081            path: /            pathType: Prefix  tls:    - secretName: wildcard-tls-secret      hosts:        - "*.<ДОМЕН>"

    Здесь <ДОМЕН> — основной домен, в котором существует конечное доменное имя Nexus. Пример: для nexus.example.com основной домен — example.com.

    При необходимости отредактируйте блок tls: имя секрета, список имен хостов.

  3. Создайте временный Ingress:

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> create -f ingress.yaml
  4. Остановите бэкенд VK Dev Platform:

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_DEV_PLATFORM> scale deployment samsara --replicas=0

Копирование репозиториев, пользователей, ролей и привилегий

Для копирования данных используйте скрипт, который копирует объекты сериями запросов к REST API старого и нового экземпляров Nexus.

Ограничения:

  • Nexus API не позволяет выгружать пароли пользователей, а также пароли из настроек HTTP-аутентификации в прокси-репозиториях.

    При миграции всем пользователям устанавливается одинаковый пароль, который можно найти в коде скрипта.

    В настройках HTTP-аутентификации прокси-репозиториев устанавливается пустой пароль — пустая строка.

  • Пользователям без ролей при миграции назначается системная роль nx-anonymous.

Чтобы скопировать данные:

  1. Убедитесь, что установлен интерпретатор Python 3, который нужен для запуска скрипта.

    Подробнее — в официальной документации Python 3.

  2. Получите скрипт для копирования nexus-migrator.py в разделе Скрипт nexus-migrator.py.

  3. Запустите скрипт на хосте, который имеет сетевой доступ:

    • по HTTP к внутреннему IP-адресу ВМ nexus-w на порту 8081;
    • по HTTPS к балансировщику Ingress-контроллера в кластере Kubernetes.

    Для этой задачи лучше всего подходит сама ВМ nexus-w.

    Пример запуска скрипта:

    $ python3 nexus-migrator.py \    --source-url "http://<IP_АДРЕС>:8081" \    --source-user "admin" \    --source-password "<ПАРОЛЬ_АДМИНИСТРАТОРА>" \    --target-url "https://nexus.<ДОМЕН>" \    --target-user "admin" \    --target-password "<ПАРОЛЬ_АДМИНИСТРАТОРА>"

    Здесь:

    • <IP_АДРЕС> — актуальный внутренний IP-адрес ВМ nexus-w.
    • <ДОМЕН> — основной домен, в котором существует конечное доменное имя Nexus.
    • <ПАРОЛЬ_АДМИНИСТРАТОРА> — пароли учетных записей администраторов.

    Во время работы скрипт выводит диагностические сообщения и статистику копирования объектов.

  4. После завершения работы скрипта проанализируйте вывод и убедитесь в отсутствии критических ошибок.

  5. Зайдите в веб-интерфейсы экземпляров Nexus по адресам https://nexus-master.<ДОМЕН> и https://nx.<ДОМЕН>/.

  6. Убедитесь, что в новом экземпляре созданы такие же наборы объектов, как в старом.

Перенос файлов blob-хранилища

Чтобы перенести файлы blob-хранилища с ВМ nexus-w на PV нового экземпляра Nexus:

  1. Остановите старый экземпляр Nexus, выполнив в терминале ВМ nexus-w:

    $ sudo systemctl stop nexus
  2. Остановите новый экземпляр Nexus:

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> scale statefulset nexusce-nxrm-ha --replicas=0
  3. Создайте манифест временного Deployment deployment.yaml для копирования данных на PV нового экземпляра Nexus.

    Шаблон манифеста временного Deployment deployment.yaml:

    apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app.kubernetes.io/instance: nexusce-migrate-data    app.kubernetes.io/name: nexusce-migrate-data  name: nexusce-migrate-dataspec:  replicas: 1  selector:    matchLabels:      app.kubernetes.io/instance: nexusce-migrate-data      app.kubernetes.io/name: nexusce-migrate-data  template:    metadata:      labels:        app.kubernetes.io/instance: nexusce-migrate-data        app.kubernetes.io/name: nexusce-migrate-data    spec:      containers:        - image: <ДОМЕН_DOCKER_REGISTRY>/<ПУТЬ_К_ОБРАЗУ>/curl:v1.6.0          imagePullPolicy: IfNotPresent          name: container-0          command:          - /bin/sh          - -c          - while true; do echo "ping..."; sleep 10; done          volumeMounts:            - mountPath: /nexus-data              name: nexus-data      securityContext:        runAsUser: 0      volumes:      - name: nexus-data        persistentVolumeClaim:          claimName: nexus-data-nexusce-nxrm-ha-0
  4. Создайте временный Deployment:

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> create -f deployment.yaml
  5. Заархивируйте файлы blob-хранилища на ВМ nexus-w:

    $ cd /data/nexus$ sudo tar -zcvf nexus-blobs.tgz blobs/
  6. Скопируйте архив blob-хранилища на PV нового экземпляра Nexus.

    Рекомендуется скопировать на ВМ исполняемый файл kubectl и административный kubeconfig, а затем выполнить команду в терминале этой ВМ:

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> cp nexus-blobs.tgz nexusce-migrate-data-xxxxxxxxxx-yyyyy:/nexus-data/nexus-blobs.tgz

    В этом случае копирование выполняется напрямую с ВМ в под.

    Возможны и другие способы копирования. Например:

    • Загрузите архив в S3-бакет — на ВМ nexus-w должен быть установлен клиент AWS CLI. Затем в поде nexusce-migrate-data скачайте архив с помощью curl по прямой ссылке.

    • Загрузите архив в RAW-репозиторий инфраструктурного Nexus и скачайте его с помощью curl.

  7. Распакуйте архив:

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> exec nexusce-migrate-data-xxxxxxxxxx-yyyyy -it -- sh/ # cd /nexus-data// # mv blobs blobs.bak/ # tar -zxvf nexus-blobs.tgz/ # chown -R 200:200 blobs/ # rm -f nexus-blobs.tgz/ # exit
  8. Удалите временный Deployment:

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> delete deployment nexusce-migrate-data
  9. Запустите Nexus CE:

    $ kubectl -n <ПРОСТРАНСТВО_ИМЕН_NEXUS> scale statefulset nexusce-nxrm-ha --replicas=1
  10. Импортируйте компоненты из blob-хранилища:

    1. Откройте веб-интерфейс Nexus CE.
    2. Перейдите в раздел SettingsSystemTasks.
    3. Нажмите кнопку Create task.
    4. Выберите тип задачи Repair - Reconcile component database from blob store.
    5. В открывшейся форме заполните все обязательные поля.
    6. В поле Task frequency выберите Manual.
    7. Сохраните изменения.
    8. Запустите созданную задачу.

    После выполнения задачи содержимое blob-хранилища будет загружено в БД и станет доступным для просмотра в разделе Browse и для скачивания.

  11. Если в системе более одного blob-хранилища, повторите импорт для каждого из них.

  12. После успешной миграции удалите старые Ingress и Deployment OIDC Proxy:

    $ kubectl -n <nexus_namespace> delete deployment nexus-oidc-proxy$ kubectl -n <nexus_namespace> delete ing nexus-oidc-proxy