docker compose 部署 golang 的 Athens 私有代理问题


Posted in Servers onApril 28, 2022

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 私有代理的文章就介绍到这了!


Tags in this post...

Servers 相关文章推荐
Nginx优化服务之网页压缩的实现方法
Mar 31 Servers
nginx反向代理时如何保持长连接
Mar 31 Servers
Nginx+SpringBoot实现负载均衡的示例
Mar 31 Servers
详解Nginx启动失败的几种错误处理
Apr 01 Servers
Nginx配置https的实现
Nov 27 Servers
CentOS7和8下安装Maven3.8.4
Apr 07 Servers
nginx location 带斜杠【 / 】与不带的区别
Apr 13 Servers
Apache Hudi 加速传统的批处理模式
Apr 24 Servers
Tomcat弱口令复现及利用
May 06 Servers
利用nginx搭建RTMP视频点播、直播、HLS服务器
May 25 Servers
Ubuntu安装Mysql+启用远程连接的完整过程
Jun 21 Servers
Linux在两个服务器直接传文件的操作方法
Aug 05 Servers
Nginx 安装SSL证书完成HTTPS部署
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 #Servers
Windows Server 2019 安装DHCP服务及相关配置
Windows Server 2019 域控制器安装图文教程
阿里云 Windows server 2019 配置FTP
Windows Server 2012 修改远程默认端口3389的方法
Windows Server 2008 修改远程登录端口以及配置防火墙
You might like
PHP 事件机制(2)
2011/03/23 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
php session的锁和并发
2016/01/22 PHP
JavaScript 创建对象
2009/07/17 Javascript
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
Python3中bytes类型转换为str类型
2018/09/27 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
零基础学python应该从哪里入手
2020/08/11 Python
python map比for循环快在哪
2020/09/21 Python
实习教师个人的自我评价
2013/11/08 职场文书
大学自我评价
2014/02/12 职场文书
建筑安全责任书范本
2014/07/24 职场文书
党员目标管理责任书
2014/07/25 职场文书
委托书如何写
2014/08/30 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
务虚会发言材料
2014/12/25 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
高二语文教学反思
2016/02/16 职场文书
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
在 Python 中利用 Pool 进行多线程
2022/04/24 Python