使用 docker-compose 部署 golang 的 Athens 私有代理
go中私有代理搭建
前言
最近公司的代理出现问题了,刚好借这个机会来学习下,athens 如何构建私有代理
为什么选择 athens
私有化代理的选取标准无非就是下面的几点
1、托管私有模块;
2、排除对公有模块的访问;
3、存储公有模块;
athens 的特点:
Athens 首先可以配置访问私有仓库;
Athens 的会存储每次拉取的包,如果该模块之前没有通过 athens,athens 会向目标地址请求数据,在返回给客户端的时候,会存储该模块到存储中,这样实现了 go mod download
永远只会发生一次;
Athens 处理存储的策略为仅追加,一个模块被保存,它就永远不会改变,即使开发人员对 tag 进行了强推,那么也不会被删除;
Athens 也可以配置下载策略,过滤一些有安全隐患的包。
Athens 支持 disk, mongo, gcs, s3, minio, 外部存储/自定义,不过一般建议使用 disk。
使用 docker-compose 部署
官方网站已经,提供了通过 docker 和 二进制部署的方案,这里秉着好记性不如烂笔头的原则,这里自己也做了记录
配置私有仓库的认证信息
通过 .netrc
文件来配置,里面可以放自己的私有仓库的地址,以及用户,密码认证信息
# cat .netrc
machine gitlab.test.com login test-name password test-pass
有几个私有仓库,配置几个就可以了
配置下载模式
通过 The download mode
(下载模式配置策略)是现在 ATHENS 中比较推崇的,之前通过 Filtering modules
(过滤模式)的方法,目前已经被弃用了。
来看下如何配置
# DownloadMode defines how Athens behaves when a module@version
# is not found in storage. There are 4 options:
# 1. "sync" (default): download the module synchronously and
# return the results to the client.
# 2. "async": return 404, but asynchronously store the module
# in the storage backend.
# 3. "redirect": return a 301 redirect status to the client
# with the base URL as the DownloadRedirectURL from below.
# 4. "async_redirect": same as option number 3 but it will
# asynchronously store the module to the backend.
# 5. "none": return 404 if a module is not found and do nothing.
# 6. "file:<path>": will point to an HCL file that specifies
# any of the 5 options above based on different import paths.
# 7. "custom:<base64-encoded-hcl>" is the same as option 6
# but the file is fully encoded in the option. This is
# useful for using an environment variable in serverless
# deployments.
# Env override: ATHENS_DOWNLOAD_MODE
DownloadMode = "sync"
通过环境变量 ATHENS_DOWNLOAD_MODE 可指定,也可以修改指定的 config.dev.toml
来配置,默认是 sync
ATHENS_DOWNLOAD_MODE 可指定的内容:
1、通过 file:<path>
指定一个 hcl 文件,里面可以对不同的仓库,设置下载模式;
2、通过 custom:<base64-encoded-hcl>
指定一个 base64 编码的 HCL 文件;
3、指定具体的全局策略,sync, async, none, redirect, or async_redirect
,这是一个全局的设置,上面的两种是可以定制策略组的。
来看下具体的下载模式
sync: 通过 同步从 VCS 下载模块
go mod download
,将其持久化到存储中,并立即将其返回给用户。请注意,这是默认行为;async:向客户端返回 404,并异步下载
module@version
并将其持久化到存储中;none:返回 404 并且什么也不做;
redirect:重定向到上游代理(例如proxy.golang.org),之后什么也不做;
async_redirect:重定向到上游代理(例如
proxy.golang.org
)并异步下载module@version
并将其持久化到存储中;
下面看下配置策略的 hcl 文件
# cat download.hcl
downloadURL = "https://goproxy.cn"
mode = "async_redirect"
download "gitlab.test.com/*" {
mode = "sync"
}
部署
这里使用 docker-composer 部署
version: '2'
services:
athens:
image: gomods/athens:v0.11.0
restart: always
container_name: athens_proxy
ports:
- "3000:3000"
volumes:
- ./.netrc:/root/.netrc
- ./athens-storage:/var/lib/athens
- ./download.hcl:/root/download.hcl
environment:
- ATHENS_NETRC_PATH=/root/.netrc
- ATHENS_STORAGE_TYPE=disk
- ATHENS_DISK_STORAGE_ROOT=/var/lib/athens
- ATHENS_GOGET_WORKERS=100
- ATHENS_DOWNLOAD_MODE=file:/root/download.hcl
- ATHENS_GONOSUM_PATTERNS=gitlab.test.com
ATHENS_GONOSUM_PATTERNS:配置为私库地址,配置的仓库地址,不会进行安全向校验。
go 处于安全性考虑,为了保证开发者的依赖库不被人恶意劫持篡改,所以引入了 GOSUMDB 环境变量来设置校验服务器
当你在本地对依赖进行变动(更新/添加)操作时,Go 会自动去这个服务器进行数据校验,保证你下的这个代码库和世界上其他人下的代码库是一样的。如果有问题,会有个大大的安全提示。当然背后的这些操作都已经集成在 Go 里面了,开发者不需要进行额外的操作。
对于我们的私有仓库,去公共安全校验库校验,肯定是不能通过校验的,我们可以通过 ATHENS_GONOSUM_PATTERNS 这个环境变量来设置不做校验的代码仓库, 它可以设置多个匹配路径,用逗号相隔。
启动 docker-compose up -d
客户端设置代理 export GOPROXY=http://xxxx:3000
这样就能使用我们的代理服务了
因为选择的 ATHENS_STORAGE_TYPE 为 disk,athens 服务会在拉取资源包的同时,也会下载资源包到配置的 ATHENS_DISK_STORAGE_ROOT 中。
使用秘钥的方式认证私有仓库
上面通过 .netrc
的方式来认证私有仓库,因为账号密码是铭文的总归不太好,可以使用秘钥的方式来认证
1、配置秘钥
首先查看电脑有没有秘钥
# cd .ssh
# ls
id_rsa id_rsa.pub
没有的话通过下面的命令的生成
# ssh-keygen -t rsa -C "youremail@example.com"
邮箱换成自己的,一路回车即可
然后将 id_rsa.pub
公钥的内容添加到自己的私有仓库中,如何添加自己 google 吧,比较简单
2、配置 HTTP 与 SSH 重写规则
# cat gitconfig
[url "ssh://git@gitlab.test.com"]
insteadOf = https://gitlab.test.com
3、配置 SSH 来绕过主机 SSH 键验证
# cat config
Host gitlab.test.com
Hostname gitlab.test.com
StrictHostKeyChecking no
IdentityFile /root/.ssh/id_rsa
将上面配置的认证信息,映射到容器中即可
version: '2'
services:
athens:
image: gomods/athens:v0.11.0
restart: always
container_name: athens_proxy
ports:
- "3000:3000"
volumes:
- ./athens-storage:/var/lib/athens
- ./download.hcl:/root/download.hcl
- ./gitconfig:/root/.gitconfig
- ./ssh-keys:/root/.ssh
environment:
- ATHENS_STORAGE_TYPE=disk
- ATHENS_DISK_STORAGE_ROOT=/var/lib/athens
- ATHENS_GOGET_WORKERS=100
- ATHENS_DOWNLOAD_MODE=file:/root/download.hcl
- ATHENS_GONOSUM_PATTERNS=gitlab.test.com
这样即可实现秘钥的认证了
需要注意私钥的权限,刚开始没注意,执行报了下面的错误
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/root/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/root/.ssh/id_rsa": bad permissions
git@gitlab.test.com: Permission denied (publickey).
fatal: Could not read from remote repository.
看报错就可推断出,是权限太大了,需要私钥文件不能被其他人所访问。
修改权限就可以了
ssh-keys # chmod 600 id_rsa
具体的 demo 地址,可参见athens私有代理部署
参考
【介绍 ATHENS】https://gomods.io/zh/intro/
【download】https://github.com/gomods/athens/blob/main/docs/content/configuration/download.md
【athens构建golang私有代理】https://github.com/boilingfrog/Go-POINT/blob/master/golang/go_environment/athens构建golang私有代理.md
【使用 docker-compose 部署 golang 的 Athens 私有代理】https://github.com/boilingfrog/Go-POINT/blob/master/golang/go_environment/athens构建golang私有代理.md
使用 docker-compose 部署 golang 的 Athens 私有代理的更多相关文章
- 使用Docker Compose部署基于Sentinel的高可用Redis集群
使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...
- Docker Compose 部署前后端分离应用
部署前后端分离应用 容器化 Abp 应用 关于 Abp 应用的容器化,其实和普通的 ASP.NET Core 应用差不多,大家可以参考我此前的文章. 唯一需要注意的是:因为 Abp 解决方案中有多个项 ...
- Docker Compose部署项目到容器-基于Tomcat和mysql的项目yml配置文件代码
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- 在Windows Server 2019通过Docker Compose部署Asp.Net Core
一.安装Docker Enterprise 安装文档是: https://docs.docker.com/install/windows/docker-ee/ 安装完成后,如下图 二.首先,拉取一个W ...
- 使用Docker Compose 部署Nexus后初次登录账号密码不正确,并且在nexus-data下没有admin,password
场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...
- Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程)
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- Docker Compose部署Nexus3时的docker-compose,yml代码
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程)
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- 使用Docker Compose 部署Nexus后提示:Unable to create directory /nexus-data/instance
场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...
随机推荐
- 假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以 某个固定的已知的前缀开头的,如果将它们全部找出来?
使用 keys 指令可以扫出指定模式的 key 列表. 对方接着追问:如果这个 redis 正在给线上的业务提供服务,那使用 keys 指令会 有什么问题? 这个时候你要回答 redis 关键的一个特 ...
- nginx反向代理失败,又是 fastdfs 的锅
fdfs问题记录 [root@hostcad logs]# systemctl status fdfs_trackerd.service ● fdfs_trackerd.service - LSB: ...
- kafka 的高可用机制是什么?
这个问题比较系统,回答出 kafka 的系统特点,leader 和 follower 的关系,消息 读写的顺序即可.
- 学习 Haproxy (一)
haproxy是一个开源的.高性能的基于tcp和http应用代理的HA的.LB服务软件,它支持双机热备.HA.LB.虚拟主机.图形界面查看状态信息等功能,其配置简单.维护方便,而且后端RS的healt ...
- ctfhub web信息泄露备份文件下载(vim缓存 Ds-Store)
Vim缓存 进入环境由于不懂得vim是什么借鉴大佬的博客 网页提示flag在index.php中我们按着这个思路去找 将文件保存下来因为是swp文件我们用kail进行打开 使用vim -r index ...
- 简单的多选框选择功能js代码
最近没事写了个特别基础的多选框功能代码,代码如下:js部分: //获取所有class为checkbox的多选按钮(需要以下功能需要先写出对应功能的元素). var checkBoxList = doc ...
- 微信小程序 使用filter过滤器几种方式
由于微信小程序 技术生态比较闭合,导致很多 现代前端框架很多积累出的成果都没有实现(可能未来会逐一实现). 用惯了现代 再耍小程序 总感觉很不顺手. 需要结果的请直接看最后的WXS View Filt ...
- 第一天·浏览器内核及Web标准
一·浏览器及浏览器内核 1.常见的浏览器 (1)IE浏览器 IE是微软公司旗下浏览器,是目国内用户量最多的浏览器.IE诞生于1994年,当时微软为了对抗市场份额占据将近百分之九十的网景Netscape ...
- CCF201912-2 回收站选址
解题思路:这道题唬人的在于坐标有正有负哈,刚开始不知道怎么下爪,仔细思考过后,我可是会面向对象编程的啊哈哈哈哈,我可是最喜欢封装了哈哈哈哈. 1.首先可以把每个点用一个结构体来定义,包含他的x,y坐标 ...
- 安卓xml布局中 android:paddingBottom="@dimen/activity_vertical_margin"是什么意思?
@dimen/activity_vertical_margin 是什么意思? @dimen/activity_vertical_margin这个的意思就是在你的values文件夹下面的dimens文件 ...