• Русский
  • Как выполнить резервное копирование и восстановление nexus с помощью Nexus

    Содержание

    Предварительные требованияРезервное копированиеСоздание задачи резервного копирования в веб-интерфейсе NexusУдаление сервиса инстанса nexus для предотвращения изменений данных во время резервного копированияРезервное копирование данных nexus и проверка резервной копииРезервное копирование blob-хранилищаРезервное копирование хранилища ключей node IDЭкспорт и резервное копирование базы данныхПроверка содержимого резервной копииПосле успешного резервного копирования восстановите сервис инстанса nexusВосстановлениеПредварительные требованияУдаление Nexus ce operator из кластера, если это ещё не сделаноУдаление сервиса инстанса nexus для предотвращения изменений данных во время восстановленияУдаление существующих данных из целевого инстансаПерезапуск pod для восстановления Nexus из резервной копииИмпорт данных резервной копииПерезапуск pod для восстановленияОчистка временных данных и восстановление нормальной работы сервисаУстранение неполадокЗадача резервного копирования завершается с ошибкой AccessDeniedException

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

    Удалите Nexus operator из кластера.

    kubectl get subscription --all-namespaces | grep nexus-ce-operator | awk '{print "kubectl delete subscription "$2" -n "$1}' | sh
    
    # Output:
    # subscription.operators.coreos.com "nexus-ce-operator" deleted
    Почему нужно удалить Nexus operator?

    Во время резервного копирования и восстановления Operator может выполнять согласование ресурсов Nexus и мешать процессу. Если Operator не будет удалён, могут возникнуть следующие проблемы:

    1. Operator может воссоздавать или перезапускать рабочие нагрузки на основе Nexus CR, прерывая процедуру резервного копирования/восстановления и потенциально вызывая несогласованность данных.
    2. Некоторые ресурсы, которые вы временно удаляете (например, Service), могут быть воссозданы или конфликтовать с ресурсами, восстановленными из резервной копии (например, Ingress).
    Влияние удаления Nexus operator

    После удаления Operator изменения в Nexus CR не будут применяться, например, изменение ресурсов или размера хранилища.

    Удаление Operator не приведёт к сбоям в работе существующих инстансов.

    Резервное копирование

    Резервное копирование состоит из четырёх шагов:

    1. Создать задачу резервного копирования в веб-интерфейсе Nexus.
    2. Удалить сервис инстанса nexus, чтобы предотвратить изменения данных.
    3. Выполнить резервное копирование данных nexus и проверить резервную копию.
    4. Восстановить сервис инстанса nexus после завершения резервного копирования.

    Создание задачи резервного копирования в веб-интерфейсе Nexus

    Войдите в веб-интерфейс Nexus под пользователем с правами администратора. Перейдите в Settings -> System -> Tasks -> Create task -> выберите Admin - Backup H2 Database, заполните:

    • Task enabled: true
    • Task name: nexus-backup (или любое другое имя)
    • Notification email: (опционально) user@example.com
    • Send Notification on: (опционально) Failure
    • Location: любой подкаталог внутри /nexus-data (например, /nexus-data/backup-dir)
    • Task frequency: Manual

    Удаление сервиса инстанса nexus для предотвращения изменений данных во время резервного копирования

    Чтобы предотвратить запись данных во время резервного копирования, временно остановите сервисный эндпоинт инстанса, удалив Service, который направляет трафик на pod(ы):

    export NEXUS_NAMESPACE=<namespace of the NEXUS instance to be backed up>
    export NEXUS_NAME=<name of the NEXUS instance to be backed up>
    export NEXUS_BACKUP_DIR=<the backup task location you set in the previous step>
    export POD_NAME=$(kubectl -n ${NEXUS_NAMESPACE} get pod ${NEXUS_NAME}-nxrm-ha-0 -o jsonpath='{.metadata.name}')
    
    kubectl delete service -l release=${NEXUS_NAME} -n ${NEXUS_NAMESPACE}
    
    #output:
    # service "nexus-nxrm-ha" deleted
    # service "nexus-nxrm-ha-hl" deleted

    Это не удаляет pod или данные; останавливается только внешний трафик.

    Резервное копирование данных nexus и проверка резервной копии

    Резервное копирование blob-хранилища

    mkdir -p nexus-backup/blobs
    kubectl -n ${NEXUS_NAMESPACE} cp ${POD_NAME}:/nexus-data/blobs nexus-backup/blobs

    Резервное копирование хранилища ключей node ID

    mkdir -p nexus-backup/node
    kubectl -n $NEXUS_NAMESPACE cp ${POD_NAME}:/nexus-data/keystores/node nexus-backup/node

    Экспорт и резервное копирование базы данных

    export NEXUS_ADMIN_USER=admin
    export NEXUS_ADMIN_PASSWORD=<admin-password>
    
    kubectl exec -ti $POD_NAME -n $NEXUS_NAMESPACE -- curl -u $NEXUS_ADMIN_USER:$NEXUS_ADMIN_PASSWORD 'localhost:8081/service/rest/v1/tasks?type=h2.backup.task'
    
    # output:
    #{
    #  "items" : [ {
    #    "id" : "b379f8cb-ea52-4bae-9eed-84aed7686a63",
    #    "name" : "nexus-backup",
    #    "type" : "h2.backup.task",
    #    "message" : null,
    #    "currentState" : "WAITING",
    #    "lastRunResult" : null,
    #    "nextRun" : null,
    #    "lastRun" : null
    #  } ],
    #  "continuationToken" : null
    #}
    
    export TASK_ID=b379f8cb-ea52-4bae-9eed-84aed7686a63 # замените на ваш task id из вывода выше
    kubectl exec -ti $POD_NAME -n $NEXUS_NAMESPACE -- curl -s -o /dev/null -w "%{http_code}\n" -u $NEXUS_ADMIN_USER:$NEXUS_ADMIN_PASSWORD -X POST localhost:8081/service/rest/v1/tasks/${TASK_ID}/run
    
    # Code	Description
    # 204	Задача выполнена
    # 404	Задача не найдена
    # 405	Задача отключена
    # output:
    # 204
    
    kubectl exec -ti $POD_NAME -n $NEXUS_NAMESPACE -- curl -u $NEXUS_ADMIN_USER:$NEXUS_ADMIN_PASSWORD localhost:8081/service/rest/v1/tasks/${TASK_ID}
    
    #output(lastRun и lastRunResult будут различаться):
    # {
    #   "id" : "b379f8cb-ea52-4bae-9eed-84aed7686a63",
    #   "name" : "nexus-backup",
    #   "type" : "h2.backup.task",
    #   "message" : "Backup embedded h2 database to the specified location",
    #   "currentState" : "WAITING",
    #   "lastRunResult" : "OK",
    #   "nextRun" : null,
    #   "lastRun" : "2025-11-03T15:21:50.302+00:00"
    # }
    
    kubectl exec -ti $POD_NAME -n $NEXUS_NAMESPACE -- ls $NEXUS_BACKUP_DIR
    
    # output:
    # nexus-2025-11-03-15-12-34.zip

    Затем скопируйте экспортированные файлы из pod:

    mkdir -p nexus-backup/restore-from-backup
    kubectl -n $NEXUS_NAMESPACE cp ${POD_NAME}:$NEXUS_BACKUP_DIR nexus-backup/restore-from-backup

    Проверка содержимого резервной копии

    После завершения копирования в директории резервной копии должны находиться как минимум следующие папки:

    • nexus-backup/blobs
    • nexus-backup/node
    • nexus-backup/restore-from-backup

    Внутри этих директорий имена файлов могут отличаться в зависимости от вашего инстанса.

    nexus-backup
    ├── blobs
       └── default
           ├── content
    ...
    ├── node
       ├── private.ks
       └── trusted.ks
    └── restore-from-backup
        └── nexus-2025-11-03-15-12-04.zip

    После успешного резервного копирования восстановите сервис инстанса nexus

    Перейдите на страницу Administrator -> Marketplace -> Operator Hub, переключитесь на целевой кластер и затем повторно разверните Alauda Build of Nexus Operator.

    Восстановление

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

    Определите целевой namespace и решите, будете ли вы восстанавливать в исходный инстанс (с перезаписью данных) или в новый инстанс. Убедитесь, что Operator остаётся удалённым во время восстановления, чтобы избежать вмешательства.

    Восстановление состоит из пяти шагов:

    1. Удалить Nexus ce operator из кластера, если это ещё не сделано.
    2. Удалить сервис инстанса nexus, чтобы предотвратить изменения данных во время восстановления.
    3. Удалить существующие данные из целевого инстанса.
    4. Перезапустить pod, чтобы Nexus восстановился из резервной копии.
    5. Очистить временные данные и восстановить нормальную работу сервиса.

    Удаление Nexus ce operator из кластера, если это ещё не сделано

    kubectl get subscription --all-namespaces | grep nexus-ce-operator | awk '{print "kubectl delete subscription "$2" -n "$1}' | sh
    
    # Output:
    # subscription.operators.coreos.com "nexus-ce-operator" deleted

    Удаление сервиса инстанса nexus для предотвращения изменений данных во время восстановления

    export NEXUS_NAMESPACE=<namespace of the NEXUS instance to be restore>
    export NEXUS_NAME=<name of the NEXUS instance to be restore up>
    export POD_NAME=$(kubectl -n ${NEXUS_NAMESPACE} get pod ${NEXUS_NAME}-nxrm-ha-0 -o jsonpath='{.metadata.name}')
    
    kubectl delete service -n $NEXUS_NAMESPACE -l release=$NEXUS_NAME
    
    # output:
    # service "kychen-nxrm-ha" deleted
    # service "kychen-nxrm-ha-hl" deleted

    Удаление существующих данных из целевого инстанса

    Удалите существующие данные из целевого pod, чтобы избежать смешивания старых и восстановленных данных. Если права не позволяют удалить данные внутри pod, удалите данные напрямую из смонтированного тома согласно инструкциям вашего класса хранилища.

    kubectl -n $NEXUS_NAMESPACE exec -it ${POD_NAME} -- \
      rm -rf /nexus-data/blobs \
             /nexus-data/keystores/node \
             /nexus-data/db/

    Если необходимо удалить данные напрямую на узле/PV, удалите те же директории там.

    Перезапуск pod для восстановления Nexus из резервной копии

    Импорт данных резервной копии

    kubectl -n $NEXUS_NAMESPACE cp nexus-backup/blobs ${POD_NAME}:/nexus-data
    kubectl -n $NEXUS_NAMESPACE cp nexus-backup/node ${POD_NAME}:/nexus-data/keystores
    unzip nexus-backup/restore-from-backup/nexus-*.zip -d /tmp/nexus-restore
    kubectl -n $NEXUS_NAMESPACE cp /tmp/nexus-restore ${POD_NAME}:/nexus-data/db

    Проверьте, что в pod присутствуют следующие директории с данными:

    • /nexus-data/blobs
    • /nexus-data/keystores/node
    • /nexus-data/restore-from-backup

    Перезапуск pod для восстановления

    kubectl -n $NEXUS_NAMESPACE delete pod ${POD_NAME}

    Дождитесь запуска нового pod и завершения внутреннего процесса восстановления Nexus.

    Очистка временных данных и восстановление нормальной работы сервиса

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

    kubectl -n $NEXUS_NAMESPACE exec -it ${POD_NAME} -- rm -rf /nexus-data/restore-from-backup

    Перейдите на страницу Administrator -> Marketplace -> Operator Hub, переключитесь на целевой кластер и затем повторно разверните Alauda Build of Nexus Operator.

    Войдите в Nexus Web и проверьте, что все репозитории и данные на месте.

    Устранение неполадок

    Задача резервного копирования завершается с ошибкой AccessDeniedException

    Если при проверке статуса задачи вы видите, что lastRunResult равен FAILED:

    kubectl exec -ti $POD_NAME -n $NEXUS_NAMESPACE -- curl -u $NEXUS_ADMIN_USER:$NEXUS_ADMIN_PASSWORD localhost:8081/service/rest/v1/tasks/${TASK_ID}
    Defaulted container "nxrm-app" out of: nxrm-app, request-log, audit-log, tasks-log, chown-nexusdata-owner-to-nexus-and-init-log-dir (init)
    {
      "id" : "0a8a4597-1cee-4f4c-8d86-6d81eb2cd8eb",
      "name" : "nexus-backup",
      "type" : "h2.backup.task",
      "message" : "Backup embedded h2 database to the specified location",
      "currentState" : "WAITING",
      "lastRunResult" : "FAILED",
      "nextRun" : null,
      "lastRun" : "2025-11-05T06:23:31.010+00:00"
    }

    Вы можете проверить лог задачи для получения подробностей:

    kubectl logs $POD_NAME -n $NEXUS_NAMESPACE | grep $TASK_ID -A 10 -B 10
    Defaulted container "nxrm-app" out of: nxrm-app, request-log, audit-log, tasks-log, chown-nexusdata-owner-to-nexus-and-init-log-dir (init)
    2025-11-05 06:23:31,023+0000 INFO  [quartz-8-thread-20] *TASK org.sonatype.nexus.internal.datastore.task.H2BackupTask - Task configuration: {.name=nexus-backup, .id=0a8a4597-1cee-4f4c-8d86-6d81eb2cd8eb, .typeName=Admin - Backup H2 Database, .visible=true, .typeId=h2.backup.task, .notificationCondition=FAILURE, .updated=2025-11-05T06:19:54.814Z, .recoverable=false, .enabled=true, .message=Backup embedded h2 database to the specified location, location=/nexus/backup, .exposed=true, .created=2025-11-05T06:19:54.814Z}
    2025-11-05 06:23:31,023+0000 INFO  [quartz-8-thread-20] *TASK org.sonatype.nexus.internal.datastore.task.H2BackupTask - Task log: /opt/sonatype/sonatype-work/nexus3/log/tasks/allTasks.log
    2025-11-05 06:23:31,024+0000 ERROR [quartz-8-thread-20] *TASK org.sonatype.nexus.bootstrap.entrypoint.configuration.ApplicationDirectoriesImpl - Failed to create directory: /nexus/backup
    2025-11-05 06:23:31,031+0000 WARN  [quartz-8-thread-20] *TASK org.sonatype.nexus.quartz.internal.task.QuartzTaskJob - Task 0a8a4597-1cee-4f4c-8d86-6d81eb2cd8eb : 'nexus-backup' [h2.backup.task] execution failure
    java.lang.RuntimeException: java.nio.file.AccessDeniedException: /nexus

    Это означает, что Nexus не имеет прав на запись в указанную директорию резервного копирования. Убедитесь, что директория резервного копирования находится внутри /nexus-data.

    Перейдите на страницу Administrator -> Marketplace -> Operator Hub, переключитесь на целевой кластер, затем повторно разверните Alauda Build of Nexus Operator и в веб-интерфейсе Nexus измените задачу резервного копирования, указав директорию внутри /nexus-data, например /nexus-data/backup.