NexusRepositoryManager是一个SelfHosted 依赖包仓库,由于一些大家都知道的因素,国内直接访问国外的registry通常是非常缓慢或者根本就无法访问的。而NexusRepository的目的就是把你下载的包缓存到服务器上,第二次下载时就可以直接从NexusRepository服务器上获取,而不需要到远端下载。说白了就是依赖包仓库的一个带缓存管理的代理服务器。但实际上他的功能和更加复杂,但在我的使用中只简单的使用了他包管理这一部分功能。
同时他可以将多个registry聚合为一个registry group,而我们只需要访问这个registry group,NexusRepository会自动访问最快的registry获取我们需要的包。非常nice。
我可以说是NexusRepository(下文称为NRM)的重度用户了,我服务器和电脑上的Npm、Nuget、Maven、Docker、Yum都是通过NexusRepository代理访问真正的远端服务器。这样大大缩减了我等待的时间。
NexusRepository
我们来讲一下怎么能快速的搭建起自己的NRM。
其实到了今天这种时代,容器搭建就基本是快速服务搭建的代名词。这里我们就直接使用Docker搭建NRM,而我的NRM实际也是在群辉Docker上运行的。
Step 1. 最低系统需求
1. CPU
2. Memory
3. Java参数
下面会使用Docker进行安装,这里就不截图了(NexusRepository SystemRequirements)
Step 2. 下载并测试镜像
直接找到NRM的官方Docker镜像,然后把Docker pull命令复制下来(这里默认会pull latest标签):
docker pull sonatype/nexus3
然后在安装Docker的电脑将镜像pull下来:
然后我们可以测试一下镜像:
docker run -d -p 8081:8081 --name nexus sonatype/nexus3
然后我们通过浏览器访问 http://127.0.0.1:8081
就可以直接访问到NRM:
这里我们先把Docker数据持久化设置好再进行NRM的设置。
Step 3.设置数据持久化
首先我们需要先把刚才运行的容器停下来删除掉:
docker stop nexus;
docker rm nexus
这里使用docker 推荐的volume mount 方式创建持久化数据存储卷:
docker volume create –name nexus-data
然后运行并挂载Docker卷:
docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3
稍等一下(初始化数据需要耗费一些时间),可以通过 docker logs nexus
命令监控容器是否正确运行,我是在Kasm里的DinD Ubuntu桌面进行安装测试的,花费了大约6mins时间(Kasm真好用)。
访问 http://127.0.0.1:8081 :
Step 4. 登录NexusRepositoryManager
从右上角Sign In 我们可以看到admin账户的密码在这个位置 /nexus-data/admin.password
,需要注意的是这里是相对于Volume的内部的路径我们需要用下面这条命令查看Volume的绝对路径:
docker volume inspect nexus-data
接下来直接输出密码然后就可以复制登录了:
Step 5. 完成Setup Wizard
首先是设置密码,这个没啥好说的。但最好设置复杂一点,因为以后访问不是通过这个admin账户访问,而是通过创建的其他账户或者anonymous访问。
然后是设置匿名访问权,如果是自己用直接启用就行,因为这样可以不用在使用仓库时输入账户和密码:
Step 6. 创建普通用户
我们先进到Users管理界面:
这里我们其实可以直接使用匿名匿名访问,但是为了演示一下账户创建,我就再创建一个具名账户:
这里的roles我们授权了一个nx-anonymous权限,这里其实是一个基础的读取、搜索和浏览权限,
Step 7. RepositoryGroup理解
我们需要对Nexus对Repository的分类有一个基础的了解,NRM对Repository分为了三类:
第一种是proxy类型,顾名思义就是对远端服务器的一个代理,使用proxy 创建的仓库会把客户端发起的包请求发往远端服务器上,而后将获取到的包缓存到Repository存储空间中而后返回包给客户端,这样就客户端第二次访问就可以直接从缓存内读取并返回。
第二种是hosted类型,这种仓库可以存储客户端上传的包,比如如果我写好了一个LinkCat的npm包插件,我就可以上传到对应的hosted仓库中。
第三种是gourp类型,这种类型可以看做数据库中的视图类型,group类型将上述两种仓库聚合为一个链接,我们在客户端配置时只需要使用这一个链接配置registry,但我们上传包还是需要通过对应registry的源链接上传。group中可以设置不同包仓库的优先级,满足不同的需求。
这里我们以Npm为例,创建一个仓库组,这个仓库组优先我们自建的库(自己上传的包)而后获取npm国外的源站,而如果无法获取则从国内的镜像站获取。
Step 8. Hosted仓库建立及使用
首先到Repository页面,可以看到这里已经有几个默认的maven和nuget仓库组了:
我们首先创建一个hosted类型的npm仓库。blob store就是存储的位置,我们没有更改任何blob的设置,因此只有一个blob store。其他参数就看个人需求,这里我开启了redeploy。自己使用就没必要设置cleanup policy了。
然后我们可以建一个npm包测试一下账户和功能。
快速的装一波nodejs,下次把nodejs自定义到kasm镜像里面:
然后创建一个简单的Package:
看一下默认的registry:
我们先直接用anonymous用户上传一下:
然后我们将我们创建的普通用户登录一下,这里再尝试一下上传:
这里会显示没有权限,因为我们创建用户时使用的是nx-anonymous角色,这个角色没有上传的权限,所以我们需要创建一个新的角色:
这里我们直接把nx-anonymous的权限给nx-normal-user,然后再给添加、修改、删除的权限。
然后将用户账户的角色改变为nx-normal-user:
然后我们就可以publish了,但是我写文章时是使用的Kasm的Ubuntu DinD镜像,不知道是什么原因,我npm adduser一直无法成功。
所以这里就以我本机上的测试来看:
Step 9. Proxy Repository建立
这里我们以npm淘宝镜像为例,注意这里选择创建的是 npm(proxy)。
Step 10. Repository Group创建
现在我们将上面两个仓库通过Group类型的仓库统一访问接口:
这里我还创建了一个npm.org的proxy仓库。
Step 11. 使用NexusRepository作为registry
首先将npm_group的url复制:
然后使用以下命令替换registry:
然后可以下个包尝试一下(这里我直接使用匿名访问):
回到NexusRepository管理页面,然后从Browse菜单里面进入npm_npmorg仓库:
可以看到这里已经缓存了express包:
这样我们整个NexusRepository的安装和基本使用就完成了。
总结
NexusRepository是一个非常优秀的仓库管理应用,支持非常多种的包类型,对于自建服务来说非常友好,配置简单快捷。同时相似的还有JFrog Artifactory,Artifactory也有开源版本可以用于自建,但是我的目的是将这个服务挂载到群辉NAS上长期运行,而Artifactory占用内存比较高(还有莫名崩溃),最终我还是选择NexusRepository作为包仓库。
这里再推荐一下Kasm,我的这篇博客中对NexusRepository的搭建都是在Kasm Ubuntu DinD(Docker in Docker) Desktop镜像中进行的,这里给个Kasm工作空间的图:
左侧是我已经安装的镜像,这些镜像都是可以随时启动和销毁的Docker镜像,而右侧的Live Session则是我写博客使用的一个UbuntuDocker镜像。对于我实验新玩意儿又不想破坏当前系统的需求是非常满足的:
在这几个月的使用下来,感觉Kasm是非常易用方便的,后面会专门写一篇文章介绍Kasm。
v1.0 完成文章基本内容 2022/03/10