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 相关文章推荐
fastdfs+nginx集群搭建的实现
Mar 31 Servers
Nginx进程管理和重载原理详解
Apr 22 Servers
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
Jul 07 Servers
nginx请求限制配置方法
Jul 09 Servers
使用Nginx搭载rtmp直播服务器的方法
Oct 16 Servers
Apache Pulsar集群搭建部署详细过程
Feb 12 Servers
Apache Hudi集成Spark SQL操作hide表
Mar 31 Servers
Nginx虚拟主机的配置步骤过程全解
Mar 31 Servers
Tomcat执行startup.bat出现闪退的原因及解决办法
Apr 20 Servers
Windows Server 2016 配置 IIS 的详细步骤
Apr 28 Servers
Tomcat配置访问日志和线程数
May 06 Servers
教你使用Ubuntu搭建DNS服务器
Sep 23 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
C# Assembly类访问程序集信息
2009/06/13 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
python 多个参数不为空校验方法
2019/02/14 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
python logging.info在终端没输出的解决
2020/05/12 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
详细分析Python垃圾回收机制
2020/07/01 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
类、抽象类、接口的差异
2016/06/13 面试题
区域销售经理职责
2013/12/22 职场文书
师恩难忘教学反思
2014/04/27 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL
配置nginx负载均衡
2022/05/06 Servers