编辑
2023-09-12
环境部署
00

目录

为 Sonatype Nexus 开启无限存储(对接腾讯云储存COS)
前言 - 介绍
1、Docker部署:
2、记得开放防火墙对应的端口
3、腾讯云COS配置桶
4、Nexus创建Blob store
5、检验是否连接成功
6、权限相关

为 Sonatype Nexus 开启无限存储(对接腾讯云储存COS)

注意

注意:以下采用 特定版本3.28.1 实测可对接COS,最新版本会出现:

【403】【SignatureDoesNotMath】“客户端计算的签名和COS签名不一致的问题”

导致cos能作为S3连接上,但是上传maven依赖会上传失败

国内其他云厂商提供的对象容器,已做尝试,似乎目前就腾讯云的COS支持对接,原因未知COS免费试用6个月,各厂都有免费试用,感兴趣的话可以自行尝试。

image.png

前言 - 介绍

Nexus Repository OSS是开源版本,并且是免费的。你可以从Sonatype的官方网站上找到Nexus Repository OSS的下载链接。官方下载:访问Sonatype的官方下载页面。通常在该页面的下方部分,你会看到“Nexus Repository OSS”版本的下载链接。“Pro”版本收费,可简单自由的切换Blob Stores。

1、Docker部署:

如果你熟悉Docker,Nexus Repository OSS也提供了Docker镜像。你可以从Docker Hub下载并运行。以下用Docker方式举例:

bash
## 这会下载最新版本(可对接亚马逊云和谷歌云的对象存储,但是国内云厂商实测新版本不支持) docker run -d -p 8081:8081 --name nexus sonatype/nexus3 ## 因此我们采用指定版本:(首先,确保创建一个目录来保存Nexus的数据,然后拉取镜像并启动) ## 以下操作都是必要指令 mkdir ~/Desktop/nexus-data sudo chown -R 200:200 ~/Desktop/nexus-data docker volume create nexus-data ## 关于内部的参数新增了宿主机时间挂载(0915 up)和内存配置(0918 up) docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data -v /etc/localtime:/etc/localtime:ro -e INSTALL4J_ADD_VM_PARAMS="-Xms512m -Xmx512m -XX:MaxDirectMemorySize=512m" sonatype/nexus3:3.28.1

2023补充:宿主机时间挂载(0915)和内存配置(0918)

一、后续发现容器中时间与我所在地不一致,应该是时区的问题

此处可做修正,启动时挂载宿主机的地区时间配置

bash
docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data -v /etc/localtime:/etc/localtime:ro sonatype/nexus3:3.28.1

如果你的Nexus容器当前正在运行,并且你想同步容器内的时间,可以按照以下步骤进行:

  1. 查看容器内的时间: 在当前运行的Nexus容器内,打开一个终端并执行以下命令来查看容器内的时间:

    bash
    docker exec -it nexus date

    image.png

    这里能看到,docker中的事件和我们系统盘时间的确是相差了时区

    image.png

  1. 如果容器内的时间不正确

如果你之前的容器是基于nexus-data数据卷运行的,那么新容器将与之前的容器共享相同的数据卷。这意味着新容器会访问和使用相同的Nexus数据

否则下述的rm操作会导致你的数据丢失,你需要使用Docker的docker cp命令将数据从容器复制到主机上,或者使用其他备份方法,以便在需要时还原数据。

  • 如果容器内的时间与宿主机时间不同步,可以使用以下命令来重新启动Nexus容器,并在启动时挂载主机的/etc/localtime文件:

    bash
    docker stop nexus docker rm nexus docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data -v /etc/localtime:/etc/localtime:ro sonatype/nexus3:3.28.1

    这将重新创建并启动Nexus容器,并确保容器内的时间与宿主机同步。

  1. 验证时间同步: 再次运行以下命令来检查容器内的时间是否与宿主机同步:

    bash
    docker exec -it nexus date

    确保容器内的时间已经同步到正确的时间。

    date

    查看Nexus仓库时,也能看到时间变成了中国标准时间:

    image.png

二、后续发现容器默认启动内存占比挺大接近3G,这个需要按需调整

  1. 调整容器的内存配置: 我需要将其调整为512M,可以在启动命令上添加参数:-e INSTALL4J_ADD_VM_PARAMS="-Xms512m -Xmx512m -XX:MaxDirectMemorySize=512m"

    image.png

  2. 完整配置如下(容器建立后参数就固定了,因此需要rm重建,注意rm前你做好了数据备份)

    bash
    docker stop nexus docker rm nexus docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data -v /etc/localtime:/etc/localtime:ro -e INSTALL4J_ADD_VM_PARAMS="-Xms512m -Xmx512m -XX:MaxDirectMemorySize=512m" sonatype/nexus3:3.28.1

    调整后

bash
## 查看是否启动nexus成功 docker ps ## 如果没有nexus进程,情况有几种,已经有nexus同名的服务启动了,或者缺少文件读取权限,具体我们可以查看日志 docker logs nexus ## 同名服务占用,则删掉重新启动 docker stop nexus docker rm nexus

如果前面未授权data目录,就会启动失败,原因从docker logs的输出可以看出,nexus容器遇到了权限问题,无法创建和写入所需的目录和文件。这些问题通常是由于在Docker容器内运行的用户(在这种情况下可能是Nexus)没有足够的权限来写入主机上的绑定目录(在这里是~/Desktop/nexus-data)。

为了解决这个问题,您可以:

  1. 更改主机上目录的权限

    更改~/Desktop/nexus-data的所有权以匹配容器中的用户ID(UID)。Nexus通常运行为UID 200

    bash
    sudo chown -R 200:200 ~/Desktop/nexus-data

    然后,再次尝试启动Nexus容器。

  2. 使用命名卷代替绑定卷

    命名卷是Docker管理的卷,并且通常更易于处理权限问题。

    首先,创建一个命名卷:

    bash
    docker volume create nexus-data

    然后使用这个卷运行Nexus容器:

    bash
    docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3:3.28.1

    使用命名卷可以使Docker自动处理权限问题。

2、记得开放防火墙对应的端口

然后就可以通过“IP+端口”进行访问:

点击右上角的登录,就可以输入用户密码进行仓库的管理

Sonatype Nexus 3中,当首次启动Nexus,它会自动生成一个随机的管理员密码。这个密码保存在Nexus的数据目录中,具体地说,它通常在这个位置:/nexus-data/admin.password.

要从容器中检索这个密码,可以执行以下操作:

bash
docker exec nexus cat /nexus-data/admin.password

其中,nexus是您的Nexus容器名称。

这条命令将在控制台显示管理员密码。使用这个密码,您可以通过Web界面登录到Nexus,并在登录后更改密码。

一旦您登录并完成了初次设置,建议删除或重命名admin.password文件,以确保不再次使用它。您可以使用类似的命令来做到这一点:

bash
docker exec nexus rm /nexus-data/admin.password

这样,您将不再能够访问初始管理员密码,但您应该已经为管理员设置了一个新的密码。如果在未来您忘记了管理员密码,您可能需要通过其他方法或者通过重置Nexus的数据来恢复访问权。

这将显示Nexus的默认管理员密码。然后,你可以使用这个密码和admin用户名登录到Nexus的管理界面。

3、腾讯云COS配置桶

  1. 成功登录了Nexus Repository Manager。接下来的步骤是为了将Nexus结合腾讯云的对象存储(COS)作为Maven的公共云仓库管理:设置腾讯云COS:请登录到腾讯云控制台,创建一个新的COS存储桶或使用现有的存储桶。

  1. 当你选择腾讯云COS存储桶的权限时,选择哪种类型取决于你的需求和安全考虑。但是对于Maven仓库的通常用途,以下是一些建议:

    1. 公有读,私有写 (公有读私有写):

      • 这是Maven公共仓库的常见设置。这意味着任何人都可以从你的仓库中读取和下载构件,但只有授权的用户(例如CI/CD系统或开发人员)才能上传新的构件。
      • 如果你希望你的库或工件被公众访问和使用,但又不希望随便有人可以修改或添加内容,那么这是一个好选择。
    2. 私有读,私有写 (私有读写):

      • 这意味着只有经过授权的用户才能读取或写入仓库。这适用于内部团队仓库,其中你不希望外部人员访问你的构件。
      • 如果你的仓库存储私有或敏感的工件,选择此选项。
    3. 公有读,公有写 (公有读写):

      • 通常不建议这样做,除非你有特殊的理由。这意味着任何人都可以修改或添加到你的仓库,这可能导致安全风险或不希望的内容被上传。

      综上所述,对于大多数Maven仓库,公有读,私有写 是最常见的选择,它提供了一个良好的公开访问和写入安全性之间的平衡。但最终的选择应基于你的具体需求和使用情境。

4、Nexus创建Blob store

  1. 然后回到Nexus Repository创建Blob store

  2. Type 选择 S3,并填写 Name、Region、Bucket、Access Key ID、Secret Access Key、Endpoint URL 等信息

  3. Bucket: 输入你在腾讯云COS中创建的存储桶名称

  4. 其中 Region 选个中国的 ap-south-1或者默认(3.28.1版本可以手动输入,我填的ap-shanghai

  5. Access Key ID 和 Secret Access Key 从腾讯云 API 密钥管理 处获取

  6. Endpoint URL 为:(注意不要直接用腾讯云COS提供的带桶ID的url),要使用去掉桶及ID的前缀,否则配置会报错无法连接: https://cos.<Region>.myqcloud.com

5、检验是否连接成功

  1. 配置成功后,就可以在对应桶目录看到写入了两个配置文件,或者上传一些文件返回nexus管理页面查看容量是否有变化,如下图所示:

  1. 然后创建Maven仓库:在Nexus中,导航到Repositories并创建一个新的Maven公共仓库。注意要为仓库选择之前创建的S3 blob存储

  2. 配置仓库的其他设置,如Maven版本、发布策略等。配置你的Maven构建:在你的settings.xml或项目的pom.xml中,添加新创建的Nexus Maven仓库作为仓库源。如果需要,还可以配置Nexus为你的Maven deployment仓库,这样你就可以上传构建到Nexus了。是的,接下来你需要在Nexus上创建一个Maven仓库,并使用之前配置的COS Blob Store作为其存储后端。以下是创建Maven仓库的步骤:

    1. 登录Nexus: 打开Nexus的管理界面并登录。

    2. 导航至Repositories: 在左侧导航面板中,找到Repositories并点击进入。

    3. 创建新仓库:

      • 点击Create repository按钮。
      • 选择仓库的格式为maven2。你可以选择hostedproxygroup类型的仓库,根据你的需求选择。
        • hosted: 用于存储你自己的工件。
        • proxy: 用于缓存其他Maven仓库的工件。
        • group: 用于组合多个仓库为一个。
    4. 配置仓库:

      • Name: 输入仓库的名称。
      • Blob Store: 选择你之前为COS创建的Blob Store。
      • Version Policy: 根据你的需求选择。例如,Mixed允许存储snapshot和release版本的工件。
      • Deployment Policy: 根据你的发布策略选择。
      • Layout Policy: 通常选择Strict
      • 其他设置: 根据你的需求进行配置。例如,你可以启用或禁用Redeploy、Blobstore、Negative Cache等。
    5. 保存: 点击Save按钮以创建仓库。

针对snapshots、public、release、central进行配置,可以参考下图所示

现在你应该有一个可以使用的Maven仓库,使用腾讯云COS作为后端存储。你可以将此仓库的URL提供给开发人员或CI/CD系统,以便上传和下载Maven工件。

到这里上传如果之前采用最新版本,其实就会连接不上COS报错,我们可以用报错的请求ID(Request ID)去腾讯云COS的自主诊断工具中排查一下(上面也描述得很清楚,就是签名问题):

6、权限相关

不要忘记设置仓库的安全策略,特别是如果你的Nexus是公开访问的。确保仅授权必要的用户和系统可以上传工件,并为所有用户提供读取权限(如果你希望仓库是公开的)。

作为Nexus仓库的管理员,你可以创建一个新的用户并为其分配权限,然后使用这个新用户的用户名和密码作为凭证。以下是创建一个新的用户和为其分配权限的大致步骤,基于Nexus Repository Manager 3的版本:

  1. 登录到Nexus UI:

    • 打开你的Nexus仓库的web界面。
    • 使用管理员凭证登录。
  2. 创建新用户:

    • 在左侧的导航菜单中,点击"Security" 下的 "Users".
    • 点击右上角的 "Create user" 按钮。
    • 选择对应的"Realm",例如"Local"。
    • 填写必要的详细信息,如User ID, First Name, Last Name, EmailPassword
    • 点击 "Create" 按钮。
  3. 分配权限给新用户:

    • 在用户列表中,找到并点击你刚创建的用户。
    • 在“Roles”选项卡下,你可以为该用户分配特定的角色,这将授予他们一组预定义的权限。例如,要允许用户部署到仓库,你可能需要分配nx-repository-admin-*或其他相关角色。
    • 保存更改。

现在,你可以使用新创建的用户的User IDPassword作为凭证在你的Maven settings.xml文件中配置。

注意:请确保为新用户分配适当的权限。不要授予不必要的权限,以确保仓库的安全。

此外还可以通过桶的策略对访问用户进行权限细分,这就需要到腾讯云管理控制台中找到我们对应的桶实例进行相应的访问策略控制的添加了:

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Golovin

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!