安全漏洞升级
This version of Sonatype Nexus Repository is vulnerable to a critical security vulnerability. See the KB article for details.
这个版本的Sonatype Nexus Repository容易受到一个关键的 安全漏洞。 看到 KB文章 获取详细信息。
To remediate, we recommend immediate upgrade to 3.68.1 or later.
要补救,我们建议 立即升级 升级到3.68.1或更高版本。
docker stop nexus docker rm nexus docker run -d -p 8081:8081 --name nexus --restart always -v nexus-data:/nexus-data -v /etc/localtime:/etc/localtime:ro -e INSTALL4J_ADD_VM_PARAMS="-Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=2048m -Djava.util.prefs.userRoot=/nexus-data/javaprefs" sonatype/nexus3:3.68.1
注意
注意:以下采用 特定版本3.28.1 实测可对接COS,最新版本会出现:
【403】【SignatureDoesNotMath】“客户端计算的签名和COS签名不一致的问题”
导致cos能作为S3连接上,但是上传maven依赖会上传失败
国内其他云厂商提供的对象容器,已做尝试,似乎目前就腾讯云的COS支持对接,原因未知,COS免费试用6个月,各厂都有免费试用,感兴趣的话可以自行尝试。

Nexus Repository OSS是开源版本,并且是免费的。你可以从Sonatype的官方网站上找到Nexus Repository OSS的下载链接。官方下载:访问Sonatype的官方下载页面。通常在该页面的下方部分,你会看到“Nexus Repository OSS”版本的下载链接。“Pro”版本收费,可简单自由的切换Blob Stores。
如果你熟悉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)
一、后续发现容器中时间与我所在地不一致,应该是时区的问题
此处可做修正,启动时挂载宿主机的地区时间配置
bashdocker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data -v /etc/localtime:/etc/localtime:ro sonatype/nexus3:3.28.1
如果你的Nexus容器当前正在运行,并且你想同步容器内的时间,可以按照以下步骤进行:
查看容器内的时间: 在当前运行的Nexus容器内,打开一个终端并执行以下命令来查看容器内的时间:
bashdocker exec -it nexus date

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

如果你之前的容器是基于nexus-data数据卷运行的,那么新容器将与之前的容器共享相同的数据卷。这意味着新容器会访问和使用相同的Nexus数据
否则下述的rm操作会导致你的数据丢失,你需要使用Docker的docker cp命令将数据从容器复制到主机上,或者使用其他备份方法,以便在需要时还原数据。
如果容器内的时间与宿主机时间不同步,可以使用以下命令来重新启动Nexus容器,并在启动时挂载主机的/etc/localtime文件:
bashdocker 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容器,并确保容器内的时间与宿主机同步。
验证时间同步: 再次运行以下命令来检查容器内的时间是否与宿主机同步:
bashdocker exec -it nexus date
确保容器内的时间已经同步到正确的时间。

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

二、后续发现容器默认启动内存占比挺大接近3G,这个需要按需调整
调整容器的内存配置:
我需要将其调整为512M,可以在启动命令上添加参数:-e INSTALL4J_ADD_VM_PARAMS="-Xms512m -Xmx512m -XX:MaxDirectMemorySize=512m"

完整配置如下(容器建立后参数就固定了,因此需要rm重建,注意rm前你做好了数据备份):
bashdocker 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)。
为了解决这个问题,您可以:
更改主机上目录的权限:
更改~/Desktop/nexus-data的所有权以匹配容器中的用户ID(UID)。Nexus通常运行为UID 200。
bashsudo chown -R 200:200 ~/Desktop/nexus-data
然后,再次尝试启动Nexus容器。
使用命名卷代替绑定卷:
命名卷是Docker管理的卷,并且通常更易于处理权限问题。
首先,创建一个命名卷:
bashdocker volume create nexus-data
然后使用这个卷运行Nexus容器:
bashdocker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3:3.28.1
使用命名卷可以使Docker自动处理权限问题。
然后就可以通过“IP+端口”进行访问:
点击右上角的登录,就可以输入用户密码进行仓库的管理
Sonatype Nexus 3中,当首次启动Nexus,它会自动生成一个随机的管理员密码。这个密码保存在Nexus的数据目录中,具体地说,它通常在这个位置:/nexus-data/admin.password.
要从容器中检索这个密码,可以执行以下操作:
bashdocker exec nexus cat /nexus-data/admin.password
其中,nexus是您的Nexus容器名称。
这条命令将在控制台显示管理员密码。使用这个密码,您可以通过Web界面登录到Nexus,并在登录后更改密码。
一旦您登录并完成了初次设置,建议删除或重命名admin.password文件,以确保不再次使用它。您可以使用类似的命令来做到这一点:
bashdocker exec nexus rm /nexus-data/admin.password
这样,您将不再能够访问初始管理员密码,但您应该已经为管理员设置了一个新的密码。如果在未来您忘记了管理员密码,您可能需要通过其他方法或者通过重置Nexus的数据来恢复访问权。
这将显示Nexus的默认管理员密码。然后,你可以使用这个密码和admin用户名登录到Nexus的管理界面。
当你选择腾讯云COS存储桶的权限时,选择哪种类型取决于你的需求和安全考虑。但是对于Maven仓库的通常用途,以下是一些建议:
公有读,私有写 (公有读私有写):
私有读,私有写 (私有读写):
公有读,公有写 (公有读写):
综上所述,对于大多数Maven仓库,公有读,私有写 是最常见的选择,它提供了一个良好的公开访问和写入安全性之间的平衡。但最终的选择应基于你的具体需求和使用情境。
然后回到Nexus Repository创建Blob store
Type 选择 S3,并填写 Name、Region、Bucket、Access Key ID、Secret Access Key、Endpoint URL 等信息
Bucket: 输入你在腾讯云COS中创建的存储桶名称
其中 Region 选个中国的 ap-south-1或者默认(3.28.1版本可以手动输入,我填的ap-shanghai)
Access Key ID 和 Secret Access Key 从腾讯云 API 密钥管理 处获取
Endpoint URL 为:(注意不要直接用腾讯云COS提供的带桶ID的url),要使用去掉桶及ID的前缀,否则配置会报错无法连接: https://cos.<Region>.myqcloud.com
然后创建Maven仓库:在Nexus中,导航到Repositories并创建一个新的Maven公共仓库。注意要为仓库选择之前创建的S3 blob存储。
配置仓库的其他设置,如Maven版本、发布策略等。配置你的Maven构建:在你的settings.xml或项目的pom.xml中,添加新创建的Nexus Maven仓库作为仓库源。如果需要,还可以配置Nexus为你的Maven deployment仓库,这样你就可以上传构建到Nexus了。是的,接下来你需要在Nexus上创建一个Maven仓库,并使用之前配置的COS Blob Store作为其存储后端。以下是创建Maven仓库的步骤:
登录Nexus: 打开Nexus的管理界面并登录。
导航至Repositories:
在左侧导航面板中,找到Repositories并点击进入。
创建新仓库:
Create repository按钮。maven2。你可以选择hosted、proxy或group类型的仓库,根据你的需求选择。
hosted: 用于存储你自己的工件。proxy: 用于缓存其他Maven仓库的工件。group: 用于组合多个仓库为一个。配置仓库:
Mixed允许存储snapshot和release版本的工件。Strict。保存:
点击Save按钮以创建仓库。
针对snapshots、public、release、central进行配置,可以参考下图所示:
现在你应该有一个可以使用的Maven仓库,使用腾讯云COS作为后端存储。你可以将此仓库的URL提供给开发人员或CI/CD系统,以便上传和下载Maven工件。
到这里上传如果之前采用最新版本,其实就会连接不上COS报错,我们可以用报错的请求ID(Request ID)去腾讯云COS的自主诊断工具中排查一下(上面也描述得很清楚,就是签名问题):
不要忘记设置仓库的安全策略,特别是如果你的Nexus是公开访问的。确保仅授权必要的用户和系统可以上传工件,并为所有用户提供读取权限(如果你希望仓库是公开的)。
作为Nexus仓库的管理员,你可以创建一个新的用户并为其分配权限,然后使用这个新用户的用户名和密码作为凭证。以下是创建一个新的用户和为其分配权限的大致步骤,基于Nexus Repository Manager 3的版本:
登录到Nexus UI:
创建新用户:
User ID, First Name, Last Name, Email和Password。分配权限给新用户:
nx-repository-admin-*或其他相关角色。现在,你可以使用新创建的用户的User ID和Password作为凭证在你的Maven settings.xml文件中配置。
注意:请确保为新用户分配适当的权限。不要授予不必要的权限,以确保仓库的安全。
此外还可以通过桶的策略对访问用户进行权限细分,这就需要到腾讯云管理控制台中找到我们对应的桶实例进行相应的访问策略控制的添加了: