Nexus 迁移指南:3.69.0 到 3.76.0(Alauda Build of Nexus Operator 版本 v3.76.z)

Deprecated: Nexus 3.81 (nexus-ce-operator v3.81.1 和 v3.81.2)

由于 Nexus 3.81 Community Edition 的限制性限制,该版本已停止维护。一旦使用达到配额限制(总组件数 100,000 和每日请求数 200,000),实例将无法正常运行。

如果您已经升级到 3.81 版本,请按照回滚到 Nexus 3.76指南进行降级。

有关 Community Edition 限制的更多信息,请参见 Community Edition Limitations

概述

本文档提供了从 Nexus Repository Manager 3.69.0 版本迁移到 3.76.0 版本的详细操作步骤。由于 Nexus 在 3.70 版本后停止支持 OrientDB,迁移过程中需要手动进行数据迁移。

先决条件

迁移流程

1. 数据备份

创建备份目录(确保本地磁盘空间充足以存储备份):

mkdir -p nexus-backup

设置环境变量:

export INSTANCE_NAME=<nexus 实例名称> 
export INSTANCE_NAMESPACE=<nexus 实例命名空间>
export POD_NAME=$(kubectl -n ${INSTANCE_NAMESPACE} get pod -l release=${INSTANCE_NAME} | grep ${INSTANCE_NAME} | awk '{print $1}')

1.1 服务关闭

删除之前,必须先卸载旧版本 operator,否则删除后服务会被自动重建。

kubectl -n ${INSTANCE_NAMESPACE} delete service -l release=${INSTANCE_NAME}

1.2 备份 Blob 存储

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

1.3 数据库备份

  1. 进入:Admin Dashboard > System > Tasks
  2. 创建新任务:
    • 类型:Admin - Export databases for backup
    • 任务名称:[自定义]
    • 备份位置:[指定路径] - 目录路径必须在 Nexus 数据卷目录内。
    • 频率:手动
  3. 执行任务并确认完成状态

2. 数据库迁移

2.1 OrientDB 到 H2 转换

设置环境变量:

export INSTANCE_NAME=<旧 nexus 实例名称> 
export INSTANCE_NAMESPACE=<旧 nexus 实例命名空间>
export POD_NAME=$(kubectl -n ${INSTANCE_NAMESPACE} get pod -l release=${INSTANCE_NAME} | grep ${INSTANCE_NAME} | awk '{print $1}')

进入容器并下载迁移工具:

kubectl -n ${INSTANCE_NAMESPACE} exec -it ${POD_NAME} -- bash
cd /nexus-data/backup
wget https://download.sonatype.com/nexus/nxrm3-migrator/nexus-db-migrator-3.70.3-01.jar -O nexus-db-migrator.jar

如果无法直接联网下载,可以先在本地下载文件,再复制到容器中:

kubectl -n ${INSTANCE_NAMESPACE} cp nexus-db-migrator.jar ${POD_NAME}:/nexus-data/backup

执行迁移:

# 迁移完成后,backup 目录下会生成 nexus.mv.db 文件
java -Xmx16G -Xms16G -XX:+UseG1GC -XX:MaxDirectMemorySize=28672M -jar nexus-db-migrator.jar --migration_type=h2

备份转换后的数据库:

kubectl -n ${INSTANCE_NAMESPACE} cp ${POD_NAME}:/nexus-data/backup/nexus.mv.db nexus-backup/nexus.mv.db

3. 新实例部署

由于数据和存储均从原实例导入,部署新实例时只需保持与原实例相同的访问方式。

注意: 使用与旧版本相同的 NodePort 和 Ingress 配置会导致冲突,无法创建。请配置新的值,迁移成功后删除旧版本实例,再修改外部暴露配置。

3.1 配置选项

NodePort 访问示例:

helmValues:
   service:
     nexus:
       enabled: true
       nodePort: <端口>

HTTP ingress 示例:

service:
  nexus:
    enabled: true
    type: ClusterIP

ingress:
  enabled: true
  host: <域名>
  defaultRule: true

HTTPS ingress 示例:

helmValues:
   service:
     nexus:
       enabled: true
       type: ClusterIP
   
   ingress:
     enabled: true
     host: <域名>
     defaultRule: true
     tls:
       - secretName: <tls-secret>
         hosts:
         - <域名>

3.2 数据导入

设置新实例变量:

export INSTANCE_NAME=<新 nexus 实例名称> 
export INSTANCE_NAMESPACE=<新 nexus 实例命名空间>
export POD_NAME=$(kubectl -n ${INSTANCE_NAMESPACE} get pod -l app.kubernetes.io/instance=${INSTANCE_NAME} | grep ${INSTANCE_NAME} | awk '{print $1}')

清理已有数据(如果新数据卷为空可跳过此步骤):

kubectl -n ${INSTANCE_NAMESPACE} exec -it ${POD_NAME} -- rm -rf /nexus-data/blobs /nexus-data/db/nexus.mv.db 

导入备份数据:

kubectl -n ${INSTANCE_NAMESPACE} cp nexus-backup/blobs ${POD_NAME}:/nexus-data
kubectl -n ${INSTANCE_NAMESPACE} cp nexus-backup/nexus.mv.db ${POD_NAME}:/nexus-data/db

然后重启 Nexus Pod。

4. 验证步骤

  1. 检查 Pod 状态:

    kubectl -n ${INSTANCE_NAMESPACE} get pods -l app.kubernetes.io/instance=${INSTANCE_NAME}
  2. 验证清单:

    • Web UI 可访问
    • 仓库可见
    • 构件上传功能正常
    • 构件下载功能正常
    • 用户认证正常
    • 仓库权限正常
  3. 迁移后清理:

    • 验证成功后删除旧实例(需重新安装旧版本 operator 以完成旧实例资源清理)
    • 按照保留策略归档备份数据