通过Nexus私服代理外网仓库提供给内网使用

Nexus设置代理仓库

前言

内网开发,拉取依赖库比较麻烦,通过Nexus私服代理外网仓库提供给内网使用。Nexus仓库分为proxy,代理仓库用于代理远程的公共仓库;hosted,宿主仓库部署自己的jar到这个类型的仓库,包括releases和snapshot两部分;group,仓库组用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组。

安装

官网下载解压运行nexus.exe程序即可,默认访问地址为http://localhost:8081/

image-20240819165515921

默认登录密码如图所示,修改登录密码。

image-20240819165803055

设置匿名访问为打开,用户无需登录即可拉取资源。

image-20240819165838865

设置Http代理

设置代理使Nexus能拉取外网仓库资源。

image-20240819165952346

设置角色和用户

新建用户角色,添加文件上传菜单权限,Maven仓库的view权限,设置后能在页面和通过mvn命令上传Jar包。

image-20240819170234619

新增用户,选择刚刚新建的角色。

image-20240819170830009

新增Pypi仓库

创建仓库,选择pypi(proxy)类型,Remote storage设置为阿里源https://mirrors.aliyun.com/pypi,或清华大学源https://pypi.tuna.tsinghua.edu.cn,或中科大源https://mirrors.ustc.edu.cn/pypi/web

image-20240819171347659

创建仓库,选择pypi(group)类型,Member repositories设置刚刚新建的proxy类型仓库。

image-20240819172026460

查看pypi-public仓库的url为http://10.122.10.20:8081/repository/pypi-public/,使用时需要添加/simple,否则无法拉取资源,全称为http://10.122.10.20:8081/repository/pypi-public/simple

image-20240819174650690

Python设置私服仓库,新建%APPDATA%\pip\pip.ini文件,设置内容如下:

[global]
index-url = http://10.122.10.20:8081/repository/pypi-public/simple
trusted-host = 10.122.10.20

或者直接通过pip install --trusted-host [10.122.10.20](http://10.122.10.20/) -i http://10.122.10.20:8081/repository/pypi-public/simple flask命令拉取资源。

新增Npm仓库

创建仓库,选择npm(proxy)类型,Remote storage设置为阿里源https://registry.npmmirror.com

image-20240819174949014

创建仓库,选择npm(group)类型,Member repositories设置刚刚新建的proxy类型仓库。

image-20240819175025374

npm设置私服仓库命令如下:

npm config get registry
npm config set registry http://10.122.10.20:8081/repository/npm-public/
npm config delete registry
npm install react

新增Docker仓库

创建仓库,选择docker(proxy)类型,Remote storage设置为自行搭建的Docker镜像站点https://docker.lideyu.top

image-20240819180917968

创建仓库,选择docker(group)类型,设置单独的Http端口为8082,Member repositories设置刚刚新建的proxy类型仓库。

image-20240819181011517

Nexus打开Docker Bearer Token Realm配置,否则使用docker login命令会提示Error response from daemon: login attempt to http://xxx.xxx.xxx.xxx:xxxx/v2/ failed with status: 401 Unauthorized异常。

image-20240820110914765

Docker设置私服仓库,通过vim /etc/docker/daemon.json修改配置文件。

{
  "insecure-registries":["10.122.10.20:8082"],
  "registry-mirrors":["http://10.122.10.20:8082"],
  "ipv6":false,
  "debug":true
}

Docker常用命令如下:

# 重新加载某个服务的配置文件
systemctl daemon-reload
# 重启Docker服务
systemctl restart docker
# 查看Docker服务状态
systemctl status docker
# 查看Docker日期
journalctl -u docker
# 登录Docker镜像,登录之后才能拉取镜像
docker login 10.122.10.20:8082
# 拉取镜像,可以省略私服地址
docker pull bash
docker pull 10.122.10.20:8082/python
# 查看Docker已经拉取的镜像
docker images
# 搜索Docker镜像,必须带私服地址,否则无法搜索到镜像
docker search bash
docker search 10.122.10.20:8082/phpmyadmin
# 移除镜像
docker rmi phpmyadmin
# 移除带bash的镜像
docker rmi -f $(docker images bash* -q | sort | uniq)
# 可用Docker镜像地址:
# https://docker.lideyu.top/
# https://docker.rainbond.cc/

新增Maven仓库

Nexus默认带maven-central、maven-releases、maven-snapshots、maven-public四个仓库,修改仓库,maven(proxy)类型的maven-central,Remote storage设置为阿里源https://maven.aliyun.com/repository/public

image-20240820111307256

Java使用私服配置如下,使用maven(group)类型的maven-public仓库:

<!-- Java项目工程pom.xml添加如下配置 -->
<!-- 设置Maven仓库为私服 -->
<repositories>
	<repository>
		<id>Nexus-repos</id>
		<name>Nexus Repository</name>
		<url>http://10.122.10.20:8081/repository/maven-public/</url>
	</repository>
</repositories>

<!-- 设置Maven插件仓库为私服 -->
<pluginRepositories>
	<pluginRepository>
		<id>Nexus-plugin-repos</id>
		<name>Nexus pluginRepositories</name>
		<url>http://10.122.10.20:8081/repository/maven-public/</url>
	</pluginRepository>
</pluginRepositories>

<!-- 或者Maven的setting配置文件添加如下配置 -->
<mirrors>
	<mirror>
		<id>Nexus-repos</id>
		<name>Nexus Repository</name>
		<url>http://10.122.10.20:8081/repository/maven-public/</url>
		<mirrorOf>central</mirrorOf>
	</mirror>
</mirrors>

Maven 3.8.1开始禁止对http仓库的访问,修改Idea的Maven配置文件支持对http仓库的访问,Idea自带Maven插件配置文件地址为‪C:\Program Files\JetBrains\IntelliJ IDEA 2023.2.5\plugins\maven\lib\maven3\conf\settings.xml,注释mirrors中的mirror部分即可。

<mirrors>
	<!--
    <mirror>
      <id>maven-default-http-blocker</id>
      <mirrorOf>external:http:*</mirrorOf>
      <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
      <url>http://0.0.0.0/</url>
      <blocked>true</blocked>
    </mirror>
	-->
  </mirrors>

Nexus界面上可以手动上传release和hosted的包,但是无法手动上传snapshots的包,在release仓库上传snapshots的包会报错。

image-20240820112552119

手动上传Jar包命令如下,支持上传snapshots的包,Windows上需要用双引号包裹参数:

.\mvn.cmd deploy:deploy-file "-DgroupId=com.dcits.luna" "-DartifactId=nbl-mcs-business-repository" "-Dversion=1.0.0-dev-6-SNAPSHOT" "-Dpackaging=jar" "-Dfile=D:\Repository\com\dcits\luna\nbl-mcs-business-repository\1.0.0-dev-6-SNAPSHOT\nbl-mcs-business-repository-1.0.0-dev-6-SNAPSHOT.jar" "-Durl=http://10.122.10.20:8081/repository/maven-snapshots/" "-DrepositoryId=nexus-snapshots"

.\mvn.cmd deploy:deploy-file "-DgroupId=com.dcits.lcdp.comet" "-DartifactId=comet-dao-api" "-Dversion=4.0.1" "-Dpackaging=jar" "-Dfile=D:\Repository\com\dcits\lcdp\comet\comet-dao-api\4.0.1\comet-dao-api-4.0.1.jar" "-Durl=http://10.122.10.20:8081/repository/maven-releases/" "-DrepositoryId=nexus-releases"

.\mvn.cmd deploy:deploy-file "-DgroupId=com.dcits.lcdp.comet" "-DartifactId=comet-dao" "-Dversion=4.0.1" "-Dpackaging=pom" "-Dfile=D:\Repository\com\dcits\lcdp\comet\comet-dao\4.0.1\comet-dao-4.0.1.pom" "-Durl=http://10.122.10.20:8081/repository/maven-releases/" "-DrepositoryId=nexus-releases"

-DrepositoryId 指的是maven settings.xml中的server id一致,server是配置Nexus的用户和密码。

<servers>
    <server>
        <id>nexus-snapshots</id>
        <username>Shenma</username>
        <password>xxxxxx</password>
    </server>
    <server>
        <id>nexus-releases</id>
        <username>Shenma</username>
        <password>xxxxxx</password>
    </server>
</servers>

批量上传可以单独新建一个hosted类型的仓库,Version policy选择Mixed,则可以同时上传release和snapshots的资源。如果Windows安装了Git,还可以通过Git bash执行脚本批量上传Jar包到Nexus。

#!/bin/bash
# 将此脚本复制并运行在包含待上传文件的仓库目录下
# 脚本会排除上传自身以及其他特定文件
# 获取命令行参数

while getopts ":r:u:p:" opt; do
    case $opt in
        r) REPO_URL="$OPTARG"       # 设置远程仓库URL
        ;;
        u) USERNAME="$OPTARG"       # 设置用户名
        ;;
        p) PASSWORD="$OPTARG"       # 设置密码
        ;;
    esac
done

# 查找当前目录及其子目录下的所有普通文件,但不包括脚本本身和其他Maven元数据文件
# find . -type f -not -path './mavenimport\.sh*' -not -path '*/\.*' -not -path '*/\^archetype-catalog\.xml*' -not -path '*/\^maven-metadata-local*\.xml' -not -path '*/\^maven-metadata-deployment*\.xml' |

# 只匹配jar文件和pom文件
find . -type f -path '*/*.jar' -or -path '*/*.pom' -or -path '*/*.sha1' |

# 删除路径中的起始点'./'
sed "s|^\./||" |

# 使用curl命令将找到的文件逐个上传到Nexus仓库
xargs -I '{}' curl -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}{} ;

# 测试打印所有匹配的路径
# xargs -I '{}' echo {} ;

# Windows上,右键Git bash here上传命令
# ./mavenimport.sh -u Shenma -p sm@147 -r http://10.122.10.20:8081/repository/maven-mixed/

新增Yum仓库

创建仓库,选择yum(proxy)类型,Remote storage设置为阿里源https://mirrors.aliyun.com/centos/,目前还不需要切换到Vault仓库。

image-20240821090430733

由于Centos系统已经停止维护,官方仓库安装软件包已经切换到Vault仓库,像网易163源、清华源都是同步的官方仓库,所以Remote storage也可设置为https://mirrors.163.com/centos-vault/https://mirrors.tuna.tsinghua.edu.cn/centos-vault/

创建仓库,选择yum(group)类型,Member repositories设置刚刚新建的proxy类型仓库。

image-20240821093139131

修改Centos系统私有源步骤如下:

# 放在/etc/yum.repos.d目录下,先将原来目录下的文件备份到其他地方
cd /etc/yum.repos.d
mkdir bak
mv * bak
# 新建或者复制仓库文件
vim Nexus.repo
# 创建缓存
yum clean all
yum makecache
# 安装常见库
yum install net-tools
yum install vim
yum install lrzsz
yum install telnet
yum install lsof

新建私有源配置文件Nexus.repo内容如下,一般只需要第一节base即可:

[base]
name=Nexus Repository base
baseurl=http://10.122.10.20:8081/repository/yum-public/$releasever/os/$basearch/
enabled=1
gpgcheck=0

[updates]
name=Nexus Repository updates
baseurl=http://10.122.10.20:8081/repository/yum-public/$releasever/updates/$basearch/
enabled=1
gpgcheck=0

[extras]
name=Nexus Repository extras
baseurl=http://10.122.10.20:8081/repository/yum-public/$releasever/extras/$basearch/
enabled=1
gpgcheck=0

[base-vault]
name=Nexus Repository base
baseurl=http://10.122.10.20:8081/repository/yum-public/7.9.2009/os/$basearch/
enabled=1
gpgcheck=0

[updates-vault]
name=Nexus Repository updates
baseurl=http://10.122.10.20:8081/repository/yum-public/7.9.2009/updates/$basearch/
enabled=1
gpgcheck=0

[extras-vault]
name=Nexus Repository extras
baseurl=http://10.122.10.20:8081/repository/yum-public/7.9.2009/extras/$basearch/
enabled=1
gpgcheck=0

其中,$releasever指当前系统的发行版本,通过rpm -qi centos-release命令查看,Version:7就是当前系统的发行版本。

image-20240821092305022

$basearch指系统硬件架构(CPU指令集),通过arch命令查看,x86_64说明这台设备系统是64位的。

image-20240821092511796

内网安装Docker,依赖比较多,新建yum(proxy)类型仓库,Remote storage设置为清华源https://mirrors.tuna.tsinghua.edu.cn/docker-ce,参考官方https://download.docker.com/linux/centos/docker-ce.repo私有源配置文件,新建Nexus-Docker-Ce,内容如下:

[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=http://10.122.10.20:8081/repository/yum-public/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=http://10.122.10.20:8081/repository/yum-public/linux/centos/gpg

[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=http://10.122.10.20:8081/repository/yum-public/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=http://10.122.10.20:8081/repository/yum-public/linux/centos/gpg

[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=http://10.122.10.20:8081/repository/yum-public/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=http://10.122.10.20:8081/repository/yum-public/linux/centos/gpg

[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=http://10.122.10.20:8081/repository/yum-public/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=http://10.122.10.20:8081/repository/yum-public/linux/centos/gpg

[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=http://10.122.10.20:8081/repository/yum-public/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=http://10.122.10.20:8081/repository/yum-public/linux/centos/gpg

[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=http://10.122.10.20:8081/repository/yum-public/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=http://10.122.10.20:8081/repository/yum-public/linux/centos/gpg

[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=http://10.122.10.20:8081/repository/yum-public/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=http://10.122.10.20:8081/repository/yum-public/linux/centos/gpg

[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=http://10.122.10.20:8081/repository/yum-public/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=http://10.122.10.20:8081/repository/yum-public/linux/centos/gpg

[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=http://10.122.10.20:8081/repository/yum-public/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=http://10.122.10.20:8081/repository/yum-public/linux/centos/gpg

执行yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin安装Docker。